instavm 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +86 -9
  2. package/dist/InstaVM-DjkmUcaP.d.mts +1393 -0
  3. package/dist/InstaVM-DjkmUcaP.d.ts +1393 -0
  4. package/dist/_instavmToolsCore-34H4iqVZ.d.mts +26 -0
  5. package/dist/_instavmToolsCore-BuaJyxXB.d.ts +26 -0
  6. package/dist/cli.js +5821 -2296
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.d.mts +12 -919
  9. package/dist/index.d.ts +12 -919
  10. package/dist/index.js +1464 -140
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +1449 -135
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/integrations/azure-openai.d.mts +18 -0
  15. package/dist/integrations/azure-openai.d.ts +18 -0
  16. package/dist/integrations/azure-openai.js +332 -0
  17. package/dist/integrations/azure-openai.js.map +1 -0
  18. package/dist/integrations/azure-openai.mjs +299 -0
  19. package/dist/integrations/azure-openai.mjs.map +1 -0
  20. package/dist/integrations/langchain.d.mts +7 -0
  21. package/dist/integrations/langchain.d.ts +7 -0
  22. package/dist/integrations/langchain.js +364 -0
  23. package/dist/integrations/langchain.js.map +1 -0
  24. package/dist/integrations/langchain.mjs +327 -0
  25. package/dist/integrations/langchain.mjs.map +1 -0
  26. package/dist/integrations/llamaindex.d.mts +11 -0
  27. package/dist/integrations/llamaindex.d.ts +11 -0
  28. package/dist/integrations/llamaindex.js +415 -0
  29. package/dist/integrations/llamaindex.js.map +1 -0
  30. package/dist/integrations/llamaindex.mjs +378 -0
  31. package/dist/integrations/llamaindex.mjs.map +1 -0
  32. package/dist/integrations/ollama.d.mts +35 -0
  33. package/dist/integrations/ollama.d.ts +35 -0
  34. package/dist/integrations/ollama.js +421 -0
  35. package/dist/integrations/ollama.js.map +1 -0
  36. package/dist/integrations/ollama.mjs +391 -0
  37. package/dist/integrations/ollama.mjs.map +1 -0
  38. package/dist/integrations/openai.d.mts +19 -0
  39. package/dist/integrations/openai.d.ts +19 -0
  40. package/dist/integrations/openai.js +302 -0
  41. package/dist/integrations/openai.js.map +1 -0
  42. package/dist/integrations/openai.mjs +272 -0
  43. package/dist/integrations/openai.mjs.map +1 -0
  44. package/package.json +44 -3
  45. package/dist/integrations/openai/index.d.mts +0 -16
  46. package/dist/integrations/openai/index.d.ts +0 -16
  47. package/dist/integrations/openai/index.js +0 -38
  48. package/dist/integrations/openai/index.js.map +0 -1
  49. package/dist/integrations/openai/index.mjs +0 -12
  50. package/dist/integrations/openai/index.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/HTTPClient.ts","../src/errors/BaseError.ts","../src/utils/retry.ts","../src/client/BrowserSession.ts","../src/client/BrowserManager.ts","../src/utils/path.ts","../src/client/VMsManager.ts","../src/client/SnapshotsManager.ts","../src/client/SharesManager.ts","../src/client/CustomDomainsManager.ts","../src/client/ComputerUseManager.ts","../src/client/APIKeysManager.ts","../src/client/AuditManager.ts","../src/client/WebhooksManager.ts","../src/client/VolumesManager.ts","../src/client/InstaVM.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport FormData from 'form-data';\nimport {\n InstaVMError,\n AuthenticationError,\n RateLimitError,\n QuotaExceededError,\n NetworkError,\n} from '../errors/BaseError';\nimport { withRetry } from '../utils/retry';\nimport type { HttpClientConfig, RequestConfig } from '../types/api';\n\n/**\n * HTTP client with authentication, retry logic, and error handling\n */\nexport class HTTPClient {\n private client: AxiosInstance;\n private config: HttpClientConfig;\n\n get apiKey(): string {\n return this.config.apiKey;\n }\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n \n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'instavm-js-sdk/0.16.0',\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Request interceptor - add authentication\n this.client.interceptors.request.use(\n (config) => {\n // Add API key to headers for browser endpoints\n if (config.url?.includes('/browser/')) {\n config.headers['X-API-Key'] = this.config.apiKey;\n }\n \n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Response interceptor - handle errors\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const axiosError = error;\n const status = axiosError.response?.status;\n const data = axiosError.response?.data;\n const message = data?.message || data?.error || data?.detail || axiosError.message;\n\n switch (status) {\n case 401:\n throw new AuthenticationError(message, {\n statusCode: status,\n response: data,\n });\n case 402:\n throw new QuotaExceededError(message, {\n statusCode: status,\n response: data,\n });\n case 429: {\n const retryAfter = parseInt(\n axiosError.response?.headers['retry-after'] || '60'\n );\n // Use detail from response if available, otherwise use default message\n const rateLimitMessage = data?.detail || message;\n throw new RateLimitError(rateLimitMessage, retryAfter, {\n statusCode: status,\n response: data,\n });\n }\n case 500:\n case 502:\n case 503:\n case 504:\n throw new NetworkError(message, {\n statusCode: status,\n response: data,\n });\n default:\n if (axiosError.code === 'ECONNABORTED') {\n throw new NetworkError('Request timeout', {\n code: axiosError.code,\n });\n }\n throw new InstaVMError(message, {\n statusCode: status,\n response: data,\n code: axiosError.code,\n });\n }\n }\n );\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n async request<T = any>(requestConfig: RequestConfig): Promise<T> {\n const axiosConfig: AxiosRequestConfig = {\n method: requestConfig.method,\n url: requestConfig.url,\n headers: requestConfig.headers,\n data: requestConfig.data,\n params: requestConfig.params,\n timeout: requestConfig.timeout || this.config.timeout,\n };\n\n const makeRequest = async (): Promise<T> => {\n const response: AxiosResponse<T> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n\n /**\n * POST request with JSON body\n */\n async post<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers,\n timeout,\n });\n }\n\n /**\n * POST request for code execution (uses X-API-Key header like Python client)\n */\n async postExecution<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n timeout,\n });\n }\n\n /**\n * POST request with form data (for file uploads)\n */\n async postFormData<T = any>(\n url: string,\n formData: FormData,\n headers?: Record<string, string>\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...formData.getHeaders(),\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: formData,\n headers: requestHeaders,\n });\n }\n\n /**\n * POST request with URL-encoded form data (like Python requests data= parameter)\n */\n async postFormUrlEncoded<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>\n ): Promise<T> {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(data)) {\n params.append(key, String(value));\n }\n\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: params.toString(),\n headers: requestHeaders,\n });\n }\n\n /**\n * GET request\n */\n async get<T = any>(\n url: string,\n params?: Record<string, any>,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url,\n params,\n headers,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T = any>(\n url: string,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n url,\n headers,\n });\n }\n\n /**\n * PUT request\n */\n async put<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n url,\n data,\n headers,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n url,\n data,\n headers,\n });\n }\n\n /**\n * OPTIONS request\n */\n async options<T = any>(\n url: string,\n headers?: Record<string, string>,\n params?: Record<string, any>\n ): Promise<T> {\n return this.request<T>({\n method: 'OPTIONS',\n url,\n headers,\n params,\n });\n }\n\n /**\n * POST request that returns raw binary data (for file downloads)\n */\n async postRaw(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<ArrayBuffer> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n const axiosConfig: AxiosRequestConfig = {\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n responseType: 'arraybuffer',\n timeout: this.config.timeout,\n };\n\n const makeRequest = async (): Promise<ArrayBuffer> => {\n const response: AxiosResponse<ArrayBuffer> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n}\n","/**\n * Base error class for all InstaVM SDK errors\n */\nexport class InstaVMError extends Error {\n public readonly name: string;\n public readonly code?: string;\n public readonly statusCode?: number;\n public readonly response?: any;\n\n constructor(\n message: string,\n options?: {\n code?: string;\n statusCode?: number;\n response?: any;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = options?.code;\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n\n // Capture stack trace, excluding constructor call from it\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication-related errors (401, invalid API key, etc.)\n */\nexport class AuthenticationError extends InstaVMError {\n constructor(message: string = 'Authentication failed', options?: any) {\n super(message, { ...options, statusCode: 401 });\n }\n}\n\n/**\n * Rate limiting errors (429)\n */\nexport class RateLimitError extends InstaVMError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter?: number,\n options?: any\n ) {\n super(message, { ...options, statusCode: 429 });\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Quota/usage limit exceeded errors\n */\nexport class QuotaExceededError extends InstaVMError {\n constructor(message: string = 'Usage quota exceeded', options?: any) {\n super(message, { ...options, statusCode: 402 });\n }\n}\n\n/**\n * Network-related errors (timeouts, connection issues, 5xx errors)\n */\nexport class NetworkError extends InstaVMError {\n constructor(message: string = 'Network error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Code execution errors\n */\nexport class ExecutionError extends InstaVMError {\n public readonly executionOutput?: string;\n public readonly executionTime?: number;\n\n constructor(\n message: string,\n executionOutput?: string,\n executionTime?: number,\n options?: any\n ) {\n super(message, options);\n this.executionOutput = executionOutput;\n this.executionTime = executionTime;\n }\n}\n\n/**\n * Session management errors\n */\nexport class SessionError extends InstaVMError {\n constructor(message: string = 'Session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser automation base error\n */\nexport class BrowserError extends InstaVMError {\n constructor(message: string = 'Browser error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser session management errors\n */\nexport class BrowserSessionError extends BrowserError {\n constructor(message: string = 'Browser session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser interaction errors (click, type, etc.)\n */\nexport class BrowserInteractionError extends BrowserError {\n constructor(message: string = 'Browser interaction error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser timeout errors\n */\nexport class BrowserTimeoutError extends BrowserError {\n constructor(message: string = 'Browser operation timed out', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser navigation errors\n */\nexport class BrowserNavigationError extends BrowserError {\n constructor(message: string = 'Browser navigation error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Element not found errors\n */\nexport class ElementNotFoundError extends BrowserError {\n public readonly selector?: string;\n\n constructor(\n message: string = 'Element not found',\n selector?: string,\n options?: any\n ) {\n super(message, options);\n this.selector = selector;\n }\n}\n\n/**\n * Unsupported operation error (e.g., operations not available in local mode)\n */\nexport class UnsupportedOperationError extends InstaVMError {\n constructor(message: string = 'Operation not supported', options?: any) {\n super(message, options);\n }\n}","import { NetworkError, RateLimitError } from '../errors/BaseError';\n\nexport interface RetryOptions {\n retries: number;\n retryDelay: number;\n maxRetryDelay?: number;\n retryCondition?: (error: any) => boolean;\n}\n\n/**\n * Default retry condition - retry on network errors and 5xx server errors\n */\nexport function defaultRetryCondition(error: any): boolean {\n if (error instanceof NetworkError) return true;\n if (error instanceof RateLimitError) return true;\n \n // Axios error with status code\n if (error.response?.status >= 500) return true;\n \n // Network/timeout errors\n if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') return true;\n if (error.code === 'ECONNRESET' || error.code === 'ENOTFOUND') return true;\n \n return false;\n}\n\n/**\n * Calculate exponential backoff delay\n */\nexport function calculateRetryDelay(\n attempt: number,\n baseDelay: number,\n maxDelay = 30000\n): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n const jitteredDelay = exponentialDelay * (0.5 + Math.random() * 0.5);\n return Math.min(jitteredDelay, maxDelay);\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n const {\n retries,\n retryDelay,\n maxRetryDelay = 30000,\n retryCondition = defaultRetryCondition,\n } = options;\n\n let lastError: any;\n\n for (let attempt = 1; attempt <= retries + 1; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry on last attempt\n if (attempt === retries + 1) {\n break;\n }\n\n // Check if we should retry this error\n if (!retryCondition(error)) {\n break;\n }\n\n // Calculate delay for this attempt\n const delay = calculateRetryDelay(attempt, retryDelay, maxRetryDelay);\n \n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}","import { EventEmitter } from 'eventemitter3';\nimport type { HTTPClient } from './HTTPClient';\nimport {\n BrowserError,\n BrowserInteractionError,\n BrowserNavigationError,\n BrowserTimeoutError,\n ElementNotFoundError,\n} from '../errors/BaseError';\nimport type {\n NavigateOptions,\n NavigationResult,\n ClickOptions,\n TypeOptions,\n FillOptions,\n ScrollOptions,\n ScreenshotOptions,\n WaitCondition,\n ExtractedElement,\n ExtractOptions,\n ExtractContentOptions,\n ExtractedContent,\n} from '../types/browser';\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Browser session for automation\n */\nexport class BrowserSession extends EventEmitter {\n public readonly sessionId: string;\n private httpClient: HTTPClient;\n private _isActive: boolean = true;\n\n constructor(sessionId: string, httpClient: HTTPClient) {\n super();\n this.sessionId = sessionId;\n this.httpClient = httpClient;\n }\n\n /**\n * Navigate to a URL\n */\n async navigate(\n url: string,\n options: NavigateOptions = {}\n ): Promise<NavigationResult> {\n this.ensureActive();\n\n const requestData = {\n url,\n session_id: this.sessionId,\n wait_timeout: options.waitTimeout || 30000,\n wait_until: options.waitUntil || 'load',\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/navigate',\n requestData\n );\n\n const result: NavigationResult = {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n\n this.emit('navigation', result);\n return result;\n } catch (error) {\n const navigationError = new BrowserNavigationError(\n `Navigation failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n this.emit('error', navigationError);\n throw navigationError;\n }\n }\n\n /**\n * Click an element\n */\n async click(selector: string, options: ClickOptions = {}): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n button: options.button || 'left',\n click_count: options.clickCount || 1,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/click',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Click timeout: ${selector}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Click failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Type text into an element\n */\n async type(\n selector: string,\n text: string,\n options: TypeOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n text,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n delay: options.delay || 0,\n clear: options.clear !== false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/type',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Type failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Fill a form field\n */\n async fill(\n selector: string,\n value: string,\n options: FillOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n value,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/fill',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Fill failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Scroll the page\n */\n async scroll(options: ScrollOptions = {}): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n x: options.x || 0,\n y: options.y || 500,\n behavior: options.behavior || 'auto',\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/scroll',\n requestData\n );\n } catch (error) {\n throw new BrowserInteractionError(\n `Scroll failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Take a screenshot\n */\n async screenshot(options: ScreenshotOptions = {}): Promise<string> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n full_page: options.fullPage !== false,\n format: options.format || 'png',\n quality: options.quality || 90,\n clip: options.clip,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/screenshot',\n requestData\n );\n\n if (!response.screenshot) {\n throw new BrowserError('Screenshot data not returned');\n }\n\n return response.screenshot;\n } catch (error) {\n throw new BrowserInteractionError(\n `Screenshot failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract elements from the page\n */\n async extractElements(\n selector: string,\n attributes: string[] = ['text'],\n options: ExtractOptions = {}\n ): Promise<ExtractedElement[]> {\n this.ensureActive();\n\n const requestData = {\n selector,\n attributes,\n session_id: this.sessionId,\n max_results: options.maxResults || 100,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/extract',\n requestData\n );\n\n return response.elements || [];\n } catch (error) {\n throw new BrowserInteractionError(\n `Element extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract LLM-friendly content from the current page\n *\n * Returns clean article content, interactive elements, and content anchors\n * for intelligent browser automation with LLMs.\n *\n * @param options - Content extraction options\n * @returns Extracted content with readable text, interactive elements, and content anchors\n *\n * @example\n * ```typescript\n * const content = await session.extractContent();\n *\n * // LLM reads clean content\n * const article = content.readableContent.content;\n *\n * // LLM finds \"Sign Up\" in content and uses anchors to get selector\n * const signUpAnchor = content.contentAnchors?.find(\n * anchor => anchor.text.toLowerCase().includes('sign up')\n * );\n * if (signUpAnchor) {\n * await session.click(signUpAnchor.selector);\n * }\n * ```\n */\n async extractContent(\n options: ExtractContentOptions = {}\n ): Promise<ExtractedContent> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/content',\n requestData\n );\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n throw new BrowserInteractionError(\n `Content extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Wait for a condition\n */\n async wait(condition: WaitCondition, timeout = 10000): Promise<void> {\n this.ensureActive();\n\n let requestData: any = {\n session_id: this.sessionId,\n timeout,\n };\n\n if (condition.type === 'timeout') {\n // Simple timeout wait\n await new Promise(resolve => setTimeout(resolve, condition.ms));\n return;\n }\n\n requestData = {\n ...requestData,\n condition: condition.type,\n selector: 'selector' in condition ? condition.selector : undefined,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/wait',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Wait condition timeout: ${condition.type}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Wait failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close the browser session\n */\n async close(): Promise<void> {\n if (!this._isActive) {\n return;\n }\n\n try {\n await this.httpClient.delete(`/v1/browser/sessions/${this.sessionId}`);\n } catch (error) {\n // Don't throw on close errors - session might already be closed\n console.warn(`Failed to close browser session ${this.sessionId}:`, getErrorMessage(error));\n } finally {\n this._isActive = false;\n this.emit('close');\n }\n }\n\n /**\n * Check if session is active\n */\n get isActive(): boolean {\n return this._isActive;\n }\n\n /**\n * Ensure session is active before operations\n */\n private ensureActive(): void {\n if (!this._isActive) {\n throw new BrowserError('Browser session is not active');\n }\n }\n}","import type { HTTPClient } from './HTTPClient';\nimport { BrowserSession } from './BrowserSession';\nimport { BrowserSessionError, BrowserNavigationError, BrowserInteractionError, UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n BrowserSessionOptions,\n BrowserSessionInfo,\n NavigateOptions,\n NavigationResult,\n ExtractContentOptions,\n ExtractedContent,\n} from '../types/browser';\n\n/**\n * Browser automation manager\n */\nexport class BrowserManager {\n private httpClient: HTTPClient;\n private activeSessions: Map<string, BrowserSession> = new Map();\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n /**\n * Create a new browser session\n */\n async createSession(\n options: BrowserSessionOptions = {}\n ): Promise<BrowserSession> {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Browser session management is not supported in local mode. Use navigate() or extractContent() with URL directly.'\n );\n }\n\n const requestData = {\n viewport_width: options.viewportWidth || 1920,\n viewport_height: options.viewportHeight || 1080,\n user_agent: options.userAgent,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/sessions/',\n requestData\n );\n\n if (!response.session_id) {\n throw new BrowserSessionError('No session ID returned from server');\n }\n\n const session = new BrowserSession(response.session_id, this.httpClient);\n this.activeSessions.set(response.session_id, session);\n\n // Clean up session from our tracking when it's closed\n session.on('close', () => {\n this.activeSessions.delete(response.session_id);\n });\n\n return session;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(\n `Failed to create browser session: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get information about a specific session\n */\n async getSession(sessionId: string): Promise<BrowserSessionInfo> {\n try {\n const response = await this.httpClient.get<any>(\n `/v1/browser/sessions/${sessionId}`\n );\n\n return {\n sessionId: response.session_id,\n status: response.status || 'active',\n createdAt: response.created_at,\n viewportWidth: response.viewport_width,\n viewportHeight: response.viewport_height,\n userAgent: response.user_agent,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(\n `Failed to get session info: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * List all browser sessions\n */\n async listSessions(): Promise<BrowserSessionInfo[]> {\n try {\n const response = await this.httpClient.get<any>('/v1/browser/sessions/');\n\n if (!Array.isArray(response.sessions)) {\n return [];\n }\n\n return response.sessions.map((session: any) => ({\n sessionId: session.session_id,\n status: session.status || 'active',\n createdAt: session.created_at,\n viewportWidth: session.viewport_width,\n viewportHeight: session.viewport_height,\n userAgent: session.user_agent,\n }));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(\n `Failed to list sessions: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get a locally tracked session\n */\n getLocalSession(sessionId: string): BrowserSession | undefined {\n return this.activeSessions.get(sessionId);\n }\n\n /**\n * Get all locally tracked sessions\n */\n getLocalSessions(): BrowserSession[] {\n return Array.from(this.activeSessions.values());\n }\n\n /**\n * Close all active sessions\n */\n async closeAllSessions(): Promise<void> {\n const sessions = Array.from(this.activeSessions.values());\n \n await Promise.allSettled(\n sessions.map(session => session.close())\n );\n \n this.activeSessions.clear();\n }\n\n /**\n * Navigate to a URL (local mode support - no session required)\n */\n async navigate(\n url: string,\n options: NavigateOptions = {}\n ): Promise<NavigationResult> {\n if (!this.local) {\n throw new UnsupportedOperationError(\n 'navigate() without session is only supported in local mode. In cloud mode, create a session first.'\n );\n }\n\n const requestData = {\n url,\n wait_timeout: options.waitTimeout || 30000,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/navigate',\n requestData\n );\n\n return {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserNavigationError(\n `Navigation failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract LLM-friendly content (local mode support - no session required)\n */\n async extractContent(\n options: ExtractContentOptions = {}\n ): Promise<ExtractedContent> {\n if (!this.local) {\n throw new UnsupportedOperationError(\n 'extractContent() without session is only supported in local mode. In cloud mode, create a session first.'\n );\n }\n\n if (!options.url) {\n throw new BrowserInteractionError('url is required in local mode');\n }\n\n const requestData = {\n url: options.url,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/content',\n requestData\n );\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(\n `Content extraction failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Clean up resources\n */\n async dispose(): Promise<void> {\n await this.closeAllSessions();\n }\n}","export function encodePathSegment(value: string | number): string {\n const segment = String(value);\n if (segment === '.' || segment === '..') {\n throw new Error('Path traversal not allowed in path segment');\n }\n return encodeURIComponent(segment);\n}\n\nexport function encodePathSegments(path: string): string {\n const segments = path\n .replace(/^\\/+/, '')\n .split('/')\n .filter((segment) => segment.length > 0 && segment !== '.');\n\n if (segments.some((segment) => segment === '..')) {\n throw new Error('Path traversal not allowed in proxy path');\n }\n\n return segments.map((segment) => encodeURIComponent(segment)).join('/');\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VMCreateRequest,\n VMUpdateRequest,\n VMCloneRequest,\n VMSnapshotRequest,\n VMVolumeMountRequest,\n VMMountedVolumeResponse,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VMsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VMCreateRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM creation');\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: '/v1/vms',\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listAll(): Promise<JsonMap[]> {\n return this.listAllRecords();\n }\n\n /**\n * Calls GET /v1/vms/ (trailing slash), a distinct route from GET /v1/vms.\n */\n async listAllRecords(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: string | number): Promise<JsonMap> {\n this.ensureCloud('VM lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<JsonMap>(\n `/v1/vms/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(vmId: string, payload: VMUpdateRequest = {}): Promise<JsonMap> {\n this.ensureCloud('VM update');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.patch<JsonMap>(\n `/v1/vms/${safeVmId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(vmId: string): Promise<JsonMap> {\n this.ensureCloud('VM deletion');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.delete<JsonMap>(\n `/v1/vms/${safeVmId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async clone(vmId: string, payload: VMCloneRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM clone');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/clone`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async snapshot(vmId: string, payload: VMSnapshotRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM snapshot');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/snapshot`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async mountVolume(\n vmId: string,\n payload: VMVolumeMountRequest,\n wait: boolean = true\n ): Promise<VMMountedVolumeResponse> {\n this.ensureCloud('VM volume mount');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<VMMountedVolumeResponse>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/volumes`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async listVolumes(vmId: string): Promise<VMMountedVolumeResponse[]> {\n this.ensureCloud('VM volume listing');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.get<VMMountedVolumeResponse[]>(\n `/v1/vms/${safeVmId}/volumes`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async unmountVolume(\n vmId: string,\n volumeId: string,\n mountPath: string,\n wait: boolean = true\n ): Promise<JsonMap> {\n this.ensureCloud('VM volume unmount');\n const safeVmId = encodePathSegment(vmId);\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/vms/${safeVmId}/volumes/${safeVolumeId}`,\n params: { mount_path: mountPath, wait },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n SnapshotCreateRequest,\n SnapshotQueryOptions,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SnapshotsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: SnapshotCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Snapshot creation');\n return this.httpClient.post<JsonMap>(\n '/v1/snapshots',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(options: SnapshotQueryOptions = {}): Promise<JsonMap[]> {\n this.ensureCloud('Snapshot listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/snapshots',\n options,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot lookup');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.get<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot deletion');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.delete<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { SessionError, UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n ShareCreateRequest,\n ShareUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SharesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getSessionId: () => string | null;\n\n constructor(\n httpClient: HTTPClient,\n local: boolean = false,\n getSessionId: () => string | null = () => null\n ) {\n this.httpClient = httpClient;\n this.local = local;\n this.getSessionId = getSessionId;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: ShareCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Share creation');\n\n const body: ShareCreateRequest = { ...payload };\n if (!body.session_id && !body.vm_id) {\n const sid = this.getSessionId();\n if (!sid) {\n throw new SessionError(\n 'Provide session_id/vm_id or create a session before creating a share.'\n );\n }\n body.session_id = sid;\n }\n\n return this.httpClient.post<JsonMap>(\n '/v1/shares',\n body,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(shareId: string, payload: ShareUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Share update');\n const safeShareId = encodePathSegment(shareId);\n return this.httpClient.patch<JsonMap>(\n `/v1/shares/${safeShareId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { JsonMap, CustomDomainCreateRequest } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class CustomDomainsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: CustomDomainCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Custom domain creation');\n return this.httpClient.post<JsonMap>(\n '/v1/custom-domains',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('Custom domain listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/custom-domains',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async health(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain health');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.get<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/health`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verify(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain verification');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.post<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain deletion');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.delete<JsonMap>(\n `/v1/custom-domains/${safeDomainId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { ComputerUseProxyOptions, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment, encodePathSegments } from '../utils/path';\n\ntype ProxyMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport class ComputerUseManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async viewerUrl(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use viewer URL');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/viewer-url`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async proxy(\n sessionId: string,\n path: string,\n method: ProxyMethod = 'GET',\n options: ComputerUseProxyOptions = {}\n ): Promise<any> {\n this.ensureCloud('Computer-use proxy');\n const safeSessionId = encodePathSegment(sessionId);\n const cleanPath = encodePathSegments(path);\n\n return this.httpClient.request<any>({\n method,\n url: `/v1/computeruse/${safeSessionId}/${cleanPath}`,\n params: options.params,\n data: options.body,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async get(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'GET', { params });\n }\n\n async post(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'POST', { body });\n }\n\n async put(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PUT', { body });\n }\n\n async patch(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PATCH', { body });\n }\n\n async delete(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'DELETE', { params });\n }\n\n async options(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'OPTIONS', { params });\n }\n\n async head(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'HEAD', { params });\n }\n\n /**\n * Get the VNC WebSocket URL for a computer-use session.\n * Returns the URL to connect to; the actual connection requires a WebSocket client.\n */\n async vncWebsockify(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use VNC websockify');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/vnc/websockify`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { APIKey, APIKeyCreateRequest, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class APIKeysManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: APIKeyCreateRequest = {}): Promise<APIKey> {\n this.ensureCloud('API key creation');\n return this.httpClient.post<APIKey>(\n '/v1/api-keys/',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<APIKey[]> {\n this.ensureCloud('API key listing');\n return this.httpClient.get<APIKey[]>(\n '/v1/api-keys/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: number): Promise<APIKey> {\n this.ensureCloud('API key lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(itemId: number, payload: APIKeyCreateRequest): Promise<APIKey> {\n this.ensureCloud('API key update');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.patch<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(itemId: number): Promise<JsonMap> {\n this.ensureCloud('API key deletion');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.delete<JsonMap>(\n `/v1/api-keys/${safeItemId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { AuditEventQuery, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class AuditManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async catalog(): Promise<JsonMap> {\n this.ensureCloud('Audit catalog');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/catalog',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async events(query: AuditEventQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Audit event listing');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/events',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEvent(eventId: string): Promise<JsonMap> {\n this.ensureCloud('Audit event lookup');\n const safeEventId = encodePathSegment(eventId);\n return this.httpClient.get<JsonMap>(\n `/v1/audit/events/${safeEventId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n WebhookDeliveryQuery,\n WebhookEndpointCreateRequest,\n WebhookEndpointUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class WebhooksManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async createEndpoint(payload: WebhookEndpointCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint creation');\n return this.httpClient.post<JsonMap>(\n '/v1/webhooks/endpoints',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listEndpoints(): Promise<JsonMap[]> {\n this.ensureCloud('Webhook endpoint listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/webhooks/endpoints',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint lookup');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.get<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async updateEndpoint(endpointId: string, payload: WebhookEndpointUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint update');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.patch<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint deletion');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.delete<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async rotateSecret(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook secret rotation');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/rotate-secret`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async sendTestEvent(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook test event');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/test`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verifyEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint verification');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listDeliveries(query: WebhookDeliveryQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery listing');\n return this.httpClient.get<JsonMap>(\n '/v1/webhooks/deliveries',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async replayDelivery(deliveryId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery replay');\n const safeDeliveryId = encodePathSegment(deliveryId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/deliveries/${safeDeliveryId}/replay`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport FormData from 'form-data';\nimport type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VolumeCreateRequest,\n VolumeUpdateRequest,\n VolumeResponse,\n VolumeCheckpointCreateRequest,\n VolumeCheckpointResponse,\n VolumeFileEntry,\n VolumeFileUploadRequest,\n VolumeFileDownloadResponse,\n VolumeFileListQuery,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VolumesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VolumeCreateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume creation');\n\n return this.httpClient.post<VolumeResponse>(\n '/v1/volumes',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(refreshUsage: boolean = false): Promise<VolumeResponse[]> {\n this.ensureCloud('Volume listing');\n\n return this.httpClient.get<VolumeResponse[]>(\n '/v1/volumes',\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(volumeId: string, refreshUsage: boolean = false): Promise<VolumeResponse> {\n this.ensureCloud('Volume lookup');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(volumeId: string, payload: VolumeUpdateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume update');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.patch<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(volumeId: string): Promise<JsonMap> {\n this.ensureCloud('Volume deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async createCheckpoint(\n volumeId: string,\n payload: VolumeCheckpointCreateRequest = {}\n ): Promise<VolumeCheckpointResponse> {\n this.ensureCloud('Volume checkpoint creation');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.post<VolumeCheckpointResponse>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listCheckpoints(volumeId: string): Promise<VolumeCheckpointResponse[]> {\n this.ensureCloud('Volume checkpoint listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeCheckpointResponse[]>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteCheckpoint(volumeId: string, checkpointId: string): Promise<JsonMap> {\n this.ensureCloud('Volume checkpoint deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n const safeCheckpointId = encodePathSegment(checkpointId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}/checkpoints/${safeCheckpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async uploadFile(volumeId: string, payload: VolumeFileUploadRequest): Promise<VolumeFileEntry> {\n this.ensureCloud('Volume file upload');\n\n if (!payload.path || payload.path.trim().length === 0) {\n throw new Error('payload.path is required');\n }\n\n const hasFilePath = typeof payload.filePath === 'string' && payload.filePath.length > 0;\n const hasFileContent = payload.fileContent !== undefined;\n\n if (hasFilePath === hasFileContent) {\n throw new Error('Provide exactly one of payload.filePath or payload.fileContent');\n }\n\n const safeVolumeId = encodePathSegment(volumeId);\n const formData = new FormData();\n\n if (hasFilePath) {\n const sourcePath = payload.filePath as string;\n const filename = payload.filename || path.basename(sourcePath);\n formData.append('file', fs.createReadStream(sourcePath), { filename });\n } else {\n const filename = payload.filename || 'upload.bin';\n const raw = payload.fileContent as Buffer | string;\n const buffer = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n formData.append('file', buffer, { filename });\n }\n\n formData.append('path', payload.path);\n if (payload.overwrite !== undefined) {\n formData.append('overwrite', String(payload.overwrite));\n }\n\n return this.httpClient.postFormData<VolumeFileEntry>(\n `/v1/volumes/${safeVolumeId}/files/upload`,\n formData\n );\n }\n\n async downloadFile(volumeId: string, path: string): Promise<VolumeFileDownloadResponse> {\n this.ensureCloud('Volume file download');\n const safeVolumeId = encodePathSegment(volumeId);\n\n const response = await this.httpClient.post<{\n path: string;\n filename: string;\n size: number;\n content: string;\n }>(\n `/v1/volumes/${safeVolumeId}/files/download`,\n { path },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n path: response.path,\n filename: response.filename,\n size: response.size,\n content: Buffer.from(response.content || '', 'base64'),\n };\n }\n\n async listFiles(\n volumeId: string,\n options: VolumeFileListQuery = {}\n ): Promise<VolumeFileEntry[]> {\n this.ensureCloud('Volume file listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeFileEntry[]>(\n `/v1/volumes/${safeVolumeId}/files`,\n {\n prefix: options.prefix ?? '',\n recursive: options.recursive ?? true,\n limit: options.limit ?? 1000,\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteFile(volumeId: string, targetPath: string): Promise<JsonMap> {\n this.ensureCloud('Volume file deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/volumes/${safeVolumeId}/files`,\n params: { path: targetPath },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import { HTTPClient } from './HTTPClient';\nimport { BrowserManager } from './BrowserManager';\nimport { VMsManager } from './VMsManager';\nimport { SnapshotsManager } from './SnapshotsManager';\nimport { SharesManager } from './SharesManager';\nimport { CustomDomainsManager } from './CustomDomainsManager';\nimport { ComputerUseManager } from './ComputerUseManager';\nimport { APIKeysManager } from './APIKeysManager';\nimport { AuditManager } from './AuditManager';\nimport { WebhooksManager } from './WebhooksManager';\nimport { VolumesManager } from './VolumesManager';\nimport FormData from 'form-data';\nimport {\n SessionError,\n ExecutionError,\n UnsupportedOperationError,\n AuthenticationError,\n RateLimitError,\n NetworkError,\n} from '../errors/BaseError';\nimport type {\n ExecuteOptions,\n ExecutionResult,\n AsyncExecutionResult,\n TaskResult,\n FileUpload,\n UploadOptions,\n UploadResult,\n UsageStats,\n DownloadOptions,\n DownloadResult,\n} from '../types/execution';\nimport type { EgressPolicy, EgressPolicyOptions } from '../types/egress';\nimport type { SSHKey } from '../types/ssh';\nimport type { CurrentUserResponse, SessionStatusResponse } from '../types/account';\n\nexport interface InstaVMOptions {\n baseURL?: string;\n /**\n * Timeout in milliseconds. Used for HTTP request timeout and sent to API as VM lifetime (in seconds).\n * Default: 300000 (5 minutes)\n */\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n local?: boolean;\n localURL?: string;\n /** VM memory in megabytes (optional). Range: 128-8192 MB */\n memory_mb?: number;\n /** VM vCPU count (optional). Valid values: 1, 2, 4, 6, 8 */\n cpu_count?: number;\n /** Optional user-defined metadata for filtering */\n metadata?: Record<string, any>;\n /** Optional environment variables to set in the VM */\n env?: Record<string, any>;\n}\n\n/**\n * Main InstaVM client class\n */\nexport class InstaVM {\n private httpClient: HTTPClient;\n private _sessionId: string | null = null;\n public readonly browser: BrowserManager;\n public readonly vms: VMsManager;\n public readonly snapshots: SnapshotsManager;\n public readonly shares: SharesManager;\n public readonly customDomains: CustomDomainsManager;\n public readonly computerUse: ComputerUseManager;\n public readonly apiKeys: APIKeysManager;\n public readonly audit: AuditManager;\n public readonly webhooks: WebhooksManager;\n public readonly volumes: VolumesManager;\n public readonly local: boolean;\n private readonly timeout: number;\n public readonly memory_mb?: number;\n public readonly cpu_count?: number;\n public readonly metadata?: Record<string, any>;\n public readonly env?: Record<string, any>;\n private _vmUsed: boolean = false;\n\n constructor(apiKey: string, options: InstaVMOptions = {}) {\n this.local = options.local || false;\n this.timeout = options.timeout || 300000; // 300000 milliseconds (5 minutes)\n this.memory_mb = options.memory_mb;\n this.cpu_count = options.cpu_count;\n this.metadata = options.metadata;\n this.env = options.env;\n\n // In local mode, API key is optional\n if (!this.local && !apiKey) {\n throw new AuthenticationError('API key is required for cloud mode');\n }\n\n const config = {\n baseURL: this.local\n ? (options.localURL || 'http://coderunner.local:8222')\n : (options.baseURL || 'https://api.instavm.io'),\n timeout: this.timeout,\n maxRetries: options.maxRetries || 3,\n retryDelay: options.retryDelay || 1000,\n apiKey: apiKey || '',\n };\n\n this.httpClient = new HTTPClient(config);\n this.browser = new BrowserManager(this.httpClient, this.local);\n this.vms = new VMsManager(this.httpClient, this.local);\n this.snapshots = new SnapshotsManager(this.httpClient, this.local);\n this.shares = new SharesManager(this.httpClient, this.local, () => this._sessionId);\n this.customDomains = new CustomDomainsManager(this.httpClient, this.local);\n this.computerUse = new ComputerUseManager(this.httpClient, this.local);\n this.apiKeys = new APIKeysManager(this.httpClient, this.local);\n this.audit = new AuditManager(this.httpClient, this.local);\n this.webhooks = new WebhooksManager(this.httpClient, this.local);\n this.volumes = new VolumesManager(this.httpClient, this.local);\n }\n\n /**\n * Ensure operation is not called in local mode\n */\n private ensureNotLocal(operationName: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operationName} is not supported in local mode. This operation is only available when using the cloud API.`\n );\n }\n }\n\n /**\n * Execute code synchronously\n *\n * @param command - Command to execute\n * @param options - Execution options\n * @param options.timeout - Request timeout in milliseconds (used for HTTP request timeout and sent to API in seconds)\n * @returns Execution result\n */\n async execute(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<ExecutionResult> {\n // In local mode, session_id is not required\n let sessionId = options.sessionId || this._sessionId;\n if (!this.local && !sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData: any = {\n command,\n language: options.language || 'python',\n };\n\n // Add timeout to request data if provided (convert milliseconds to seconds for API)\n if (options.timeout !== undefined) {\n requestData.timeout = Math.floor(options.timeout / 1000);\n }\n\n // Only include session_id in cloud mode\n if (!this.local && sessionId) {\n requestData.session_id = sessionId;\n }\n\n // Use custom timeout for this request, or fall back to instance default (in milliseconds)\n const requestTimeout = options.timeout !== undefined ? options.timeout : this.timeout;\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute',\n requestData,\n undefined,\n requestTimeout\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n if (!this.local) {\n this._vmUsed = true;\n }\n\n return {\n stdout: response.stdout || '',\n stderr: response.stderr || '',\n success: response.success !== false,\n executionTime: response.execution_time,\n cpuTime: response.cpu_time,\n createdAt: response.created_at,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Execute code asynchronously\n */\n async executeAsync(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<AsyncExecutionResult> {\n this.ensureNotLocal('Async execution');\n\n // Auto-create session if none exists (like Python client)\n let sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData = {\n command,\n language: options.language || 'python',\n timeout: options.timeout || 15,\n session_id: sessionId,\n };\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute_async',\n requestData\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n this._vmUsed = true;\n\n return {\n taskId: response.task_id,\n status: response.status || 'pending',\n output: response.stdout || response.output,\n success: response.success,\n executionTime: response.execution_time,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Async code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Poll for async task result\n *\n * @param taskId - The task ID from executeAsync\n * @param pollInterval - Seconds between polls (default: 1)\n * @param timeout - Maximum seconds to wait (default: 60)\n * @returns Task result with stdout, stderr, execution time, etc.\n * @throws Error if task doesn't complete within timeout\n */\n async getTaskResult(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 60\n ): Promise<TaskResult> {\n this.ensureNotLocal('Async task result retrieval');\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout * 1000) {\n try {\n const response = await this.httpClient.get<any>(\n `/v1/executions/${taskId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n if (response.is_complete) {\n // Output is already decoded as string (not base64 despite field name)\n return {\n stdout: response.serialized_stdout || '',\n stderr: response.serialized_stderr || '',\n cpuTime: response.cpu_time,\n executionTime: response.execution_time,\n createdAt: response.created_at,\n };\n }\n\n // Wait before polling again\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n } catch (error) {\n // Don't retry on auth, rate limit, or network errors\n if (\n error instanceof AuthenticationError ||\n error instanceof RateLimitError ||\n error instanceof NetworkError\n ) {\n throw error;\n }\n\n // Continue polling on transient errors\n if (Date.now() - startTime >= timeout * 1000) {\n throw new ExecutionError(\n `Failed to get task result: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n }\n }\n\n throw new ExecutionError(`Task ${taskId} timed out after ${timeout}s`);\n }\n\n /**\n * Upload files to the execution environment\n */\n async upload(\n files: FileUpload[],\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n this.ensureNotLocal('File upload');\n\n // Require explicit session (matches Python SDK behavior)\n const sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n throw new SessionError('Session ID not set. Please create a session first using createSession().');\n }\n\n const formData = new FormData();\n\n // Add files to form data\n for (const file of files) {\n if (Buffer.isBuffer(file.content)) {\n formData.append('files', file.content, file.name);\n } else {\n formData.append('files', Buffer.from(file.content), file.name);\n }\n\n if (file.path) {\n formData.append('paths', file.path);\n }\n }\n\n // Add options\n formData.append('session_id', sessionId);\n if (options.remotePath) {\n formData.append('remote_path', options.remotePath);\n }\n if (options.recursive !== undefined) {\n formData.append('recursive', String(options.recursive));\n }\n\n try {\n const response = await this.httpClient.postFormData<any>(\n '/upload',\n formData\n );\n\n return {\n success: response.success !== false,\n files: response.files || [],\n message: response.message,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File upload failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Create a new execution session\n */\n async createSession(): Promise<string> {\n this.ensureNotLocal('Session management');\n\n try {\n // Send API key and VM lifetime in JSON body for session creation\n // Convert timeout from milliseconds to seconds for the API\n const requestBody: Record<string, any> = {\n api_key: this.httpClient.apiKey,\n vm_lifetime_seconds: Math.floor(this.timeout / 1000),\n };\n\n if (this.memory_mb !== undefined) {\n requestBody.memory_mb = this.memory_mb;\n }\n if (this.cpu_count !== undefined) {\n requestBody.vcpu_count = this.cpu_count;\n }\n if (this.metadata !== undefined) {\n requestBody.metadata = this.metadata;\n }\n if (this.env !== undefined) {\n requestBody.env = this.env;\n }\n\n const response = await this.httpClient.post<any>(\n '/v1/sessions/session',\n requestBody\n );\n\n if (response.session_id) {\n this._sessionId = response.session_id;\n return response.session_id;\n }\n\n throw new SessionError('Session creation failed: No session ID returned');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Session creation failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close a session\n * Note: Sessions auto-expire on the server side. This just clears local state.\n */\n async closeSession(sessionId?: string): Promise<void> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return; // No session to close\n }\n\n // Clear local session state\n // Sessions will auto-expire on server side, no API call needed\n if (targetSessionId === this._sessionId) {\n this._sessionId = null;\n }\n }\n\n /**\n * Check if current session is still active by checking VM status\n *\n * @returns true if session is active, false otherwise\n */\n async isSessionActive(sessionId?: string): Promise<boolean> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return false;\n }\n\n try {\n const response = await this.httpClient.get<any>(\n `/v1/sessions/status/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response.vm_status === 'active';\n } catch (error) {\n if (\n error instanceof SessionError ||\n error instanceof AuthenticationError ||\n error instanceof NetworkError\n ) {\n return false;\n }\n return false;\n }\n }\n\n /**\n * Get the app URL for a session\n *\n * @param sessionId - Session ID (uses current session if not provided)\n * @param port - Port to expose (1-65535, default: 80)\n */\n async getSessionAppUrl(\n sessionId?: string,\n port?: number\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Session app URL');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const params: Record<string, any> = {};\n if (port !== undefined) {\n params.port = port;\n }\n\n return this.httpClient.get<Record<string, any>>(\n `/v1/sessions/app-url/${targetSessionId}`,\n params,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * List sandbox records with optional filtering\n *\n * @param options.metadata - JSON-serializable metadata filters\n * @param options.limit - Maximum number of results (1-1000, default: 100)\n */\n async listSandboxes(options: {\n metadata?: Record<string, any>;\n limit?: number;\n } = {}): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Sandbox listing');\n\n const params: Record<string, any> = {};\n if (options.metadata !== undefined) {\n params.metadata = JSON.stringify(options.metadata);\n }\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n\n return this.httpClient.get<Record<string, any>[]>(\n '/v1/sessions/sandboxes',\n params,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get usage statistics for a session\n */\n async getUsage(sessionId?: string): Promise<UsageStats> {\n this.ensureNotLocal('Usage tracking');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to get usage for');\n }\n\n try {\n const response = await this.httpClient.get<any>(\n `/v1/sessions/usage/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n sessionsUsed: response.sessions_used || 0,\n executionTime: response.execution_time || 0,\n quotaRemaining: response.quota_remaining || 0,\n quotaLimit: response.quota_limit || 0,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to get usage stats: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current user profile.\n */\n async getCurrentUser(): Promise<CurrentUserResponse> {\n this.ensureNotLocal('User profile lookup');\n\n return this.httpClient.get<CurrentUserResponse>(\n '/v1/users/me',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get the current status of a session.\n */\n async getSessionStatus(sessionId?: string): Promise<SessionStatusResponse> {\n this.ensureNotLocal('Session management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n return this.httpClient.get<SessionStatusResponse>(\n `/v1/sessions/status/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Download a file from the remote VM\n */\n async download(\n filename: string,\n options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n this.ensureNotLocal('File download');\n\n const targetSessionId = options.sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to download from');\n }\n\n try {\n // Use postFormUrlEncoded to match Python SDK behavior (sends form-urlencoded data)\n const response = await this.httpClient.postFormUrlEncoded<any>('/download', {\n filename,\n session_id: targetSessionId,\n });\n\n // Parse and decode base64 content from JSON response\n const encodedContent = response.content || '';\n const content = encodedContent\n ? Buffer.from(encodedContent, 'base64')\n : Buffer.from(response); // Fallback for backward compatibility\n\n return {\n success: true,\n filename,\n content,\n size: content.length,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File download failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current session ID\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Kill the VM associated with a session\n *\n * @param sessionId - The session UUID whose VM should be killed. If not provided, uses current sessionId\n * @returns Result containing success message and killed VM ID\n */\n async kill(sessionId?: string): Promise<{ success: boolean; killed: string }> {\n this.ensureNotLocal('VM kill operation');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please provide a sessionId or start a session first.');\n }\n\n try {\n const response = await this.httpClient.post<{ success: boolean; killed: string }>(\n '/kill',\n { session_id: targetSessionId },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n // Clear session_id if we killed the current session\n if (!sessionId && this._sessionId === targetSessionId) {\n this._sessionId = null;\n }\n\n return response;\n } catch (error) {\n if (error instanceof Error && 'statusCode' in error) {\n const statusCode = (error as { statusCode?: number }).statusCode;\n if (statusCode === 403) {\n throw new AuthenticationError(\"You don't own this session\", { cause: error });\n }\n if (statusCode === 404) {\n throw new SessionError(\"Session not found or no VM assigned to session (has execute() been called?)\", { cause: error });\n }\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to kill VM: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n // --- Egress Policy Methods ---\n\n /**\n * Set egress policy for a session\n */\n async setSessionEgress(\n options: EgressPolicyOptions = {},\n sessionId?: string\n ): Promise<{ status: string; sessionId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const response = await this.httpClient.post<any>(\n `/v1/egress/session/${targetSessionId}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a session\n */\n async getSessionEgress(sessionId?: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const response = await this.httpClient.get<any>(\n `/v1/egress/session/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n /**\n * Set egress policy for a specific VM\n */\n async setVmEgress(\n vmId: string,\n options: EgressPolicyOptions = {}\n ): Promise<{ status: string; vmId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const response = await this.httpClient.post<any>(\n `/v1/egress/vm/${vmId}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a specific VM\n */\n async getVmEgress(vmId: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const response = await this.httpClient.get<any>(\n `/v1/egress/vm/${vmId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n // --- SSH Key Methods ---\n\n /**\n * Add an SSH public key\n */\n async addSshKey(publicKey: string): Promise<SSHKey> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.post<any>(\n '/v1/ssh-keys',\n { public_key: publicKey },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n id: response.id,\n fingerprint: response.fingerprint,\n keyType: response.key_type,\n comment: response.comment ?? null,\n createdAt: response.created_at,\n };\n }\n\n /**\n * List all active SSH keys\n */\n async listSshKeys(): Promise<SSHKey[]> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.get<any>(\n '/v1/ssh-keys',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n const keys = response.keys || [];\n return keys.map((k: any) => ({\n id: k.id,\n fingerprint: k.fingerprint,\n keyType: k.key_type,\n comment: k.comment ?? null,\n createdAt: k.created_at,\n }));\n }\n\n /**\n * Delete an SSH key by ID\n */\n async deleteSshKey(keyId: number): Promise<{ status: string }> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.delete<any>(\n `/v1/ssh-keys/${keyId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Clean up resources\n */\n async dispose(): Promise<void> {\n if (this._sessionId && !this.local && this._vmUsed) {\n try {\n await this.kill();\n } catch (e) {\n // Ignore kill errors during disposal\n }\n } else if (this._sessionId) {\n await this.closeSession();\n }\n await this.browser.dispose();\n }\n}\n"],"mappings":"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","names":["path","path","path","FormData","FormData"]}
1
+ {"version":3,"sources":["../src/client/HTTPClient.ts","../src/errors/BaseError.ts","../src/utils/retry.ts","../src/version.ts","../src/client/BrowserSession.ts","../src/utils/path.ts","../src/client/BrowserManager.ts","../src/client/VMsManager.ts","../src/client/SnapshotsManager.ts","../src/client/SharesManager.ts","../src/client/CustomDomainsManager.ts","../src/client/ComputerUseManager.ts","../src/client/APIKeysManager.ts","../src/client/AuditManager.ts","../src/client/WebhooksManager.ts","../src/client/VolumesManager.ts","../src/client/TapesManager.ts","../src/client/VaultsManager.ts","../src/client/PTYManager.ts","../src/client/RecordingsManager.ts","../src/client/CreditsManager.ts","../src/client/TapeContext.ts","../src/client/ToolCallRecorder.ts","../src/client/InstaVM.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport FormData from 'form-data';\nimport {\n InstaVMError,\n AuthenticationError,\n RateLimitError,\n QuotaExceededError,\n ForbiddenError,\n NetworkError,\n} from '../errors/BaseError';\nimport { withRetry } from '../utils/retry';\nimport type { HttpClientConfig, RequestConfig } from '../types/api';\nimport { INSTAVM_JS_SDK_VERSION } from '../version';\n\n/**\n * HTTP client with authentication, retry logic, and error handling\n */\nexport class HTTPClient {\n private client: AxiosInstance;\n private config: HttpClientConfig;\n\n get apiKey(): string {\n return this.config.apiKey;\n }\n\n get baseURL(): string {\n return this.config.baseURL;\n }\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n \n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': `instavm-js-sdk/${INSTAVM_JS_SDK_VERSION}`,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Request interceptor - add authentication\n this.client.interceptors.request.use(\n (config) => {\n // Add API key to headers for browser endpoints\n if (config.url?.includes('/browser/')) {\n config.headers['X-API-Key'] = this.config.apiKey;\n }\n \n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Response interceptor - handle errors\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const axiosError = error;\n const status = axiosError.response?.status;\n const data = axiosError.response?.data;\n const message = data?.message || data?.error || data?.detail || axiosError.message;\n\n switch (status) {\n case 401:\n throw new AuthenticationError(message, {\n statusCode: status,\n response: data,\n });\n case 402:\n throw new QuotaExceededError(message, {\n statusCode: status,\n response: data,\n });\n case 403:\n throw new ForbiddenError(message, {\n statusCode: status,\n response: data,\n });\n case 429: {\n const retryAfter = parseInt(\n axiosError.response?.headers['retry-after'] || '60'\n );\n // Use detail from response if available, otherwise use default message\n const rateLimitMessage = data?.detail || message;\n throw new RateLimitError(rateLimitMessage, retryAfter, {\n statusCode: status,\n response: data,\n });\n }\n case 500:\n case 502:\n case 503:\n case 504:\n throw new NetworkError(message, {\n statusCode: status,\n response: data,\n });\n default:\n if (axiosError.code === 'ECONNABORTED') {\n throw new NetworkError('Request timeout', {\n code: axiosError.code,\n });\n }\n throw new InstaVMError(message, {\n statusCode: status,\n response: data,\n code: axiosError.code,\n });\n }\n }\n );\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n async request<T = any>(requestConfig: RequestConfig): Promise<T> {\n const axiosConfig: AxiosRequestConfig = {\n method: requestConfig.method,\n url: requestConfig.url,\n headers: requestConfig.headers,\n data: requestConfig.data,\n params: requestConfig.params,\n timeout: requestConfig.timeout || this.config.timeout,\n };\n\n const makeRequest = async (): Promise<T> => {\n const response: AxiosResponse<T> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n\n /**\n * POST request with JSON body\n */\n async post<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers,\n timeout,\n });\n }\n\n /**\n * POST request for code execution (uses X-API-Key header like Python client)\n */\n async postExecution<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n timeout,\n });\n }\n\n /**\n * POST request with form data (for file uploads)\n */\n async postFormData<T = any>(\n url: string,\n formData: FormData,\n headers?: Record<string, string>\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...formData.getHeaders(),\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: formData,\n headers: requestHeaders,\n });\n }\n\n /**\n * POST request with URL-encoded form data (like Python requests data= parameter)\n */\n async postFormUrlEncoded<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>\n ): Promise<T> {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(data)) {\n params.append(key, String(value));\n }\n\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: params.toString(),\n headers: requestHeaders,\n });\n }\n\n /**\n * GET request\n */\n async get<T = any>(\n url: string,\n params?: Record<string, any>,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url,\n params,\n headers,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T = any>(\n url: string,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n url,\n headers,\n });\n }\n\n /**\n * PUT request\n */\n async put<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n url,\n data,\n headers,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n url,\n data,\n headers,\n });\n }\n\n /**\n * OPTIONS request\n */\n async options<T = any>(\n url: string,\n headers?: Record<string, string>,\n params?: Record<string, any>\n ): Promise<T> {\n return this.request<T>({\n method: 'OPTIONS',\n url,\n headers,\n params,\n });\n }\n\n /**\n * POST request that returns raw binary data (for file downloads)\n */\n async postRaw(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<ArrayBuffer> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n const axiosConfig: AxiosRequestConfig = {\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n responseType: 'arraybuffer',\n timeout: this.config.timeout,\n };\n\n const makeRequest = async (): Promise<ArrayBuffer> => {\n const response: AxiosResponse<ArrayBuffer> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n}\n","/**\n * Base error class for all InstaVM SDK errors\n */\nexport class InstaVMError extends Error {\n public readonly name: string;\n public readonly code?: string;\n public readonly statusCode?: number;\n public readonly response?: any;\n\n constructor(\n message: string,\n options?: {\n code?: string;\n statusCode?: number;\n response?: any;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = options?.code;\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n\n // Capture stack trace, excluding constructor call from it\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication-related errors (401, invalid API key, etc.)\n */\nexport class AuthenticationError extends InstaVMError {\n constructor(message: string = 'Authentication failed', options?: any) {\n super(message, { ...options, statusCode: 401 });\n }\n}\n\n/**\n * Rate limiting errors (429)\n */\nexport class RateLimitError extends InstaVMError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter?: number,\n options?: any\n ) {\n super(message, { ...options, statusCode: 429 });\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Quota/usage limit exceeded errors\n */\nexport class QuotaExceededError extends InstaVMError {\n constructor(message: string = 'Usage quota exceeded', options?: any) {\n super(message, { ...options, statusCode: 402 });\n }\n}\n\n/**\n * Forbidden errors (403, tier limits, ownership mismatch).\n */\nexport class ForbiddenError extends InstaVMError {\n constructor(message: string = 'Forbidden', options?: any) {\n super(message, { ...options, statusCode: 403 });\n }\n}\n\n/**\n * Network-related errors (timeouts, connection issues, 5xx errors)\n */\nexport class NetworkError extends InstaVMError {\n constructor(message: string = 'Network error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Code execution errors\n */\nexport class ExecutionError extends InstaVMError {\n public readonly executionOutput?: string;\n public readonly executionTime?: number;\n\n constructor(\n message: string,\n executionOutput?: string,\n executionTime?: number,\n options?: any\n ) {\n super(message, options);\n this.executionOutput = executionOutput;\n this.executionTime = executionTime;\n }\n}\n\n/**\n * Session management errors\n */\nexport class SessionError extends InstaVMError {\n constructor(message: string = 'Session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser automation base error\n */\nexport class BrowserError extends InstaVMError {\n constructor(message: string = 'Browser error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser session management errors\n */\nexport class BrowserSessionError extends BrowserError {\n constructor(message: string = 'Browser session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser interaction errors (click, type, etc.)\n */\nexport class BrowserInteractionError extends BrowserError {\n constructor(message: string = 'Browser interaction error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser timeout errors\n */\nexport class BrowserTimeoutError extends BrowserError {\n constructor(message: string = 'Browser operation timed out', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser navigation errors\n */\nexport class BrowserNavigationError extends BrowserError {\n constructor(message: string = 'Browser navigation error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Element not found errors\n */\nexport class ElementNotFoundError extends BrowserError {\n public readonly selector?: string;\n\n constructor(\n message: string = 'Element not found',\n selector?: string,\n options?: any\n ) {\n super(message, options);\n this.selector = selector;\n }\n}\n\n/**\n * Unsupported operation error (e.g., operations not available in local mode)\n */\nexport class UnsupportedOperationError extends InstaVMError {\n constructor(message: string = 'Operation not supported', options?: any) {\n super(message, options);\n }\n}","import { NetworkError, RateLimitError } from '../errors/BaseError';\n\nexport interface RetryOptions {\n retries: number;\n retryDelay: number;\n maxRetryDelay?: number;\n retryCondition?: (error: any) => boolean;\n}\n\n/**\n * Default retry condition - retry on network errors and 5xx server errors\n */\nexport function defaultRetryCondition(error: any): boolean {\n if (error instanceof NetworkError) return true;\n if (error instanceof RateLimitError) return true;\n \n // Axios error with status code\n if (error.response?.status >= 500) return true;\n \n // Network/timeout errors\n if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') return true;\n if (error.code === 'ECONNRESET' || error.code === 'ENOTFOUND') return true;\n \n return false;\n}\n\n/**\n * Calculate exponential backoff delay\n */\nexport function calculateRetryDelay(\n attempt: number,\n baseDelay: number,\n maxDelay = 30000\n): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n const jitteredDelay = exponentialDelay * (0.5 + Math.random() * 0.5);\n return Math.min(jitteredDelay, maxDelay);\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n const {\n retries,\n retryDelay,\n maxRetryDelay = 30000,\n retryCondition = defaultRetryCondition,\n } = options;\n\n let lastError: any;\n\n for (let attempt = 1; attempt <= retries + 1; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry on last attempt\n if (attempt === retries + 1) {\n break;\n }\n\n // Check if we should retry this error\n if (!retryCondition(error)) {\n break;\n }\n\n // Calculate delay for this attempt\n const delay = calculateRetryDelay(attempt, retryDelay, maxRetryDelay);\n \n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}","/** Keep in sync with root `package.json` `version`. */\nexport const INSTAVM_JS_SDK_VERSION = '0.17.0';\n","import { EventEmitter } from 'eventemitter3';\nimport type { HTTPClient } from './HTTPClient';\nimport {\n BrowserError,\n BrowserInteractionError,\n BrowserNavigationError,\n BrowserTimeoutError,\n ElementNotFoundError,\n} from '../errors/BaseError';\nimport type {\n NavigateOptions,\n NavigationResult,\n ClickOptions,\n TypeOptions,\n FillOptions,\n ScrollOptions,\n ScreenshotOptions,\n WaitCondition,\n ExtractedElement,\n ExtractOptions,\n ExtractContentOptions,\n ExtractedContent,\n} from '../types/browser';\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Browser session for automation\n */\nexport class BrowserSession extends EventEmitter {\n public readonly sessionId: string;\n private httpClient: HTTPClient;\n private _isActive: boolean = true;\n\n constructor(sessionId: string, httpClient: HTTPClient) {\n super();\n this.sessionId = sessionId;\n this.httpClient = httpClient;\n }\n\n /**\n * Navigate to a URL\n */\n async navigate(\n url: string,\n options: NavigateOptions = {}\n ): Promise<NavigationResult> {\n this.ensureActive();\n\n const requestData = {\n url,\n session_id: this.sessionId,\n wait_timeout: options.waitTimeout || 30000,\n wait_until: options.waitUntil || 'load',\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/navigate',\n requestData\n );\n\n const result: NavigationResult = {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n\n this.emit('navigation', result);\n return result;\n } catch (error) {\n const navigationError = new BrowserNavigationError(\n `Navigation failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n this.emit('error', navigationError);\n throw navigationError;\n }\n }\n\n /**\n * Click an element\n */\n async click(selector: string, options: ClickOptions = {}): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n button: options.button || 'left',\n click_count: options.clickCount || 1,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/click',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Click timeout: ${selector}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Click failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Type text into an element\n */\n async type(\n selector: string,\n text: string,\n options: TypeOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n text,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n delay: options.delay || 0,\n clear: options.clear !== false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/type',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Type failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Fill a form field\n */\n async fill(\n selector: string,\n value: string,\n options: FillOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n value,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/fill',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Fill failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Scroll the page\n */\n async scroll(options: ScrollOptions = {}): Promise<void> {\n this.ensureActive();\n\n if (!options.selector && options.x == null && options.y == null) {\n throw new BrowserInteractionError(\n \"At least one of 'selector', 'x', or 'y' must be provided for scrolling.\"\n );\n }\n\n const requestData: Record<string, any> = {\n session_id: this.sessionId,\n behavior: options.behavior || 'auto',\n };\n if (options.selector) {\n requestData.selector = options.selector;\n }\n if (options.x != null) {\n requestData.x = options.x;\n }\n if (options.y != null) {\n requestData.y = options.y;\n }\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/scroll',\n requestData\n );\n } catch (error) {\n throw new BrowserInteractionError(\n `Scroll failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Take a screenshot\n */\n async screenshot(options: ScreenshotOptions = {}): Promise<string> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n full_page: options.fullPage !== false,\n format: options.format || 'png',\n quality: options.quality || 90,\n clip: options.clip,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/screenshot',\n requestData\n );\n\n if (!response.screenshot) {\n throw new BrowserError('Screenshot data not returned');\n }\n\n return response.screenshot;\n } catch (error) {\n throw new BrowserInteractionError(\n `Screenshot failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract elements from the page\n */\n async extractElements(\n selector?: string | null,\n attributes: string[] = ['text'],\n options: ExtractOptions = {}\n ): Promise<ExtractedElement[]> {\n this.ensureActive();\n\n const requestData: Record<string, any> = {\n attributes,\n session_id: this.sessionId,\n max_results: options.maxResults || 100,\n };\n if (selector) {\n requestData.selector = selector;\n }\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/extract',\n requestData\n );\n\n return response.elements || [];\n } catch (error) {\n throw new BrowserInteractionError(\n `Element extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract LLM-friendly content from the current page\n *\n * Returns clean article content, interactive elements, and content anchors\n * for intelligent browser automation with LLMs.\n *\n * @param options - Content extraction options\n * @returns Extracted content with readable text, interactive elements, and content anchors\n *\n * @example\n * ```typescript\n * const content = await session.extractContent();\n *\n * // LLM reads clean content\n * const article = content.readableContent.content;\n *\n * // LLM finds \"Sign Up\" in content and uses anchors to get selector\n * const signUpAnchor = content.contentAnchors?.find(\n * anchor => anchor.text.toLowerCase().includes('sign up')\n * );\n * if (signUpAnchor) {\n * await session.click(signUpAnchor.selector);\n * }\n * ```\n */\n async extractContent(\n options: ExtractContentOptions = {}\n ): Promise<ExtractedContent> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/content',\n requestData\n );\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n throw new BrowserInteractionError(\n `Content extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Wait for a string condition (parity with Python ``wait_for``).\n */\n async waitFor(\n condition: string,\n selector?: string | null,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureActive();\n const requestData: Record<string, any> = {\n session_id: this.sessionId,\n condition,\n timeout,\n };\n if (selector) {\n requestData.selector = selector;\n }\n try {\n return await this.httpClient.post<any>('/v1/browser/interactions/wait', requestData);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(`Wait condition timeout: ${condition}`, { cause: error as Error });\n }\n throw new BrowserInteractionError(`Wait failed: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Wait for a condition\n */\n async wait(condition: WaitCondition, timeout = 10000): Promise<void> {\n this.ensureActive();\n\n let requestData: any = {\n session_id: this.sessionId,\n timeout,\n };\n\n if (condition.type === 'timeout') {\n // Simple timeout wait\n await new Promise(resolve => setTimeout(resolve, condition.ms));\n return;\n }\n\n requestData = {\n ...requestData,\n condition: condition.type,\n selector: 'selector' in condition ? condition.selector : undefined,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/wait',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Wait condition timeout: ${condition.type}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Wait failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close the browser session\n */\n async close(): Promise<void> {\n if (!this._isActive) {\n return;\n }\n\n try {\n await this.httpClient.delete(`/v1/browser/sessions/${this.sessionId}`);\n } catch (error) {\n // Don't throw on close errors - session might already be closed\n console.warn(`Failed to close browser session ${this.sessionId}:`, getErrorMessage(error));\n } finally {\n this._isActive = false;\n this.emit('close');\n }\n }\n\n /**\n * Check if session is active\n */\n get isActive(): boolean {\n return this._isActive;\n }\n\n /**\n * Ensure session is active before operations\n */\n private ensureActive(): void {\n if (!this._isActive) {\n throw new BrowserError('Browser session is not active');\n }\n }\n}","export function encodePathSegment(value: string | number): string {\n const segment = String(value);\n if (segment === '.' || segment === '..') {\n throw new Error('Path traversal not allowed in path segment');\n }\n return encodeURIComponent(segment);\n}\n\nexport function encodePathSegments(path: string): string {\n const segments = path\n .replace(/^\\/+/, '')\n .split('/')\n .filter((segment) => segment.length > 0 && segment !== '.');\n\n if (segments.some((segment) => segment === '..')) {\n throw new Error('Path traversal not allowed in proxy path');\n }\n\n return segments.map((segment) => encodeURIComponent(segment)).join('/');\n}\n","import type { HTTPClient } from './HTTPClient';\nimport type { InstaVM } from './InstaVM';\nimport { BrowserSession } from './BrowserSession';\nimport {\n BrowserSessionError,\n BrowserNavigationError,\n BrowserInteractionError,\n UnsupportedOperationError,\n} from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n BrowserSessionOptions,\n BrowserSessionInfo,\n NavigateOptions,\n NavigationResult,\n ExtractContentOptions,\n ExtractedContent,\n ExtractedElement,\n ExtractOptions,\n} from '../types/browser';\n\n/**\n * Browser automation manager (parity with Python ``BrowserManager``).\n */\nexport class BrowserManager {\n private httpClient: HTTPClient;\n private activeSessions: Map<string, BrowserSession> = new Map();\n private local: boolean;\n private getClient?: () => InstaVM;\n private _defaultBrowserSessionId: string | null = null;\n private _defaultSessionPromise: Promise<BrowserSession> | null = null;\n\n constructor(httpClient: HTTPClient, local: boolean = false, getClient?: () => InstaVM) {\n this.httpClient = httpClient;\n this.local = local;\n this.getClient = getClient;\n }\n\n private async ensureDefaultBrowserSessionId(): Promise<string> {\n if (this._defaultBrowserSessionId) {\n return this._defaultBrowserSessionId;\n }\n if (!this._defaultSessionPromise) {\n this._defaultSessionPromise = this.createSession().catch((err) => {\n this._defaultSessionPromise = null;\n throw err;\n });\n }\n const session = await this._defaultSessionPromise;\n this._defaultBrowserSessionId = session.sessionId;\n return this._defaultBrowserSessionId;\n }\n\n /**\n * Create a new browser session\n */\n async createSession(options: BrowserSessionOptions = {}): Promise<BrowserSession> {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Browser session management is not supported in local mode. Use navigate() or extractContent() with URL directly.'\n );\n }\n\n const requestData = {\n viewport_width: options.viewportWidth || 1920,\n viewport_height: options.viewportHeight || 1080,\n user_agent: options.userAgent,\n };\n\n try {\n const response = await this.httpClient.post<any>('/v1/browser/sessions/', requestData);\n\n if (!response.session_id) {\n throw new BrowserSessionError('No session ID returned from server');\n }\n\n const session = new BrowserSession(response.session_id, this.httpClient);\n this.activeSessions.set(response.session_id, session);\n\n session.on('close', () => {\n this.activeSessions.delete(response.session_id);\n if (this._defaultBrowserSessionId === response.session_id) {\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n });\n\n return session;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to create browser session: ${errorMessage}`, {\n cause: error as Error,\n });\n }\n }\n\n /**\n * Get information about a specific session\n */\n async getSession(sessionId: string): Promise<BrowserSessionInfo> {\n try {\n const safe = encodePathSegment(sessionId);\n const response = await this.httpClient.get<any>(`/v1/browser/sessions/${safe}`);\n\n return {\n sessionId: response.session_id,\n status: response.status || 'active',\n createdAt: response.created_at,\n viewportWidth: response.viewport_width,\n viewportHeight: response.viewport_height,\n userAgent: response.user_agent,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to get session info: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * List all browser sessions\n */\n async listSessions(): Promise<BrowserSessionInfo[]> {\n try {\n const response = await this.httpClient.get<any>('/v1/browser/sessions/');\n\n const sessions = Array.isArray(response) ? response : response?.sessions;\n if (!Array.isArray(sessions)) {\n return [];\n }\n\n return sessions.map((session: any) => ({\n sessionId: session.session_id,\n status: session.status || 'active',\n createdAt: session.created_at,\n viewportWidth: session.viewport_width,\n viewportHeight: session.viewport_height,\n userAgent: session.user_agent,\n }));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to list sessions: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n getLocalSession(sessionId: string): BrowserSession | undefined {\n return this.activeSessions.get(sessionId);\n }\n\n attachSession(sessionId: string): BrowserSession {\n const existing = this.activeSessions.get(sessionId);\n if (existing) {\n return existing;\n }\n\n const session = new BrowserSession(sessionId, this.httpClient);\n this.activeSessions.set(sessionId, session);\n session.on('close', () => {\n this.activeSessions.delete(sessionId);\n if (this._defaultBrowserSessionId === sessionId) {\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n });\n return session;\n }\n\n getLocalSessions(): BrowserSession[] {\n return Array.from(this.activeSessions.values());\n }\n\n async closeAllSessions(): Promise<void> {\n const sessions = Array.from(this.activeSessions.values());\n\n await Promise.allSettled(sessions.map((session) => session.close()));\n\n this.activeSessions.clear();\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n\n /**\n * Navigate to a URL (local: no session; cloud: auto default browser session)\n */\n async navigate(url: string, options: NavigateOptions = {}): Promise<NavigationResult> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = await this.ensureDefaultBrowserSessionId();\n const raw = await client.browserNavigate(url, sid, options.waitTimeout ?? 30000);\n return {\n success: raw.success !== false,\n url: (raw.url as string) || url,\n title: raw.title as string | undefined,\n status: raw.status as number | undefined,\n };\n }\n\n const requestData = {\n url,\n wait_timeout: options.waitTimeout || 30000,\n };\n\n try {\n const response = await this.httpClient.post<any>('/v1/browser/interactions/navigate', requestData);\n\n return {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserNavigationError(`Navigation failed: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n async click(\n selector: string,\n sessionId?: string,\n force: boolean = false,\n timeout: number = 30000\n ): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserClick(selector, sid, force, timeout);\n return;\n }\n throw new UnsupportedOperationError('click() without session is only supported in cloud mode via InstaVM.');\n }\n\n async type(\n selector: string,\n text: string,\n sessionId?: string,\n delay: number = 100,\n timeout: number = 30000\n ): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserType(selector, text, sid, delay, timeout);\n return;\n }\n throw new UnsupportedOperationError('type() requires cloud mode with InstaVM client.');\n }\n\n async fill(selector: string, value: string, sessionId?: string, timeout: number = 30000): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserFill(selector, value, sid, timeout);\n return;\n }\n throw new UnsupportedOperationError('fill() requires cloud mode with InstaVM client.');\n }\n\n async scroll(\n options: { sessionId?: string; selector?: string; x?: number; y?: number } = {}\n ): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = options.sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserScroll(sid, options.selector ?? null, options.x ?? null, options.y ?? null);\n return;\n }\n throw new UnsupportedOperationError('scroll() cloud convenience requires InstaVM client.');\n }\n\n async waitFor(\n condition: string,\n selector?: string,\n sessionId?: string,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n return client.browserWait(condition, sid, selector ?? null, timeout);\n }\n throw new UnsupportedOperationError('waitFor() requires cloud mode with InstaVM client.');\n }\n\n async extractElements(\n selector?: string,\n sessionId?: string,\n attributes?: string[],\n options: ExtractOptions = {}\n ): Promise<ExtractedElement[]> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n const attrs = attributes ?? ['text'];\n const result = await client.browserExtractElements(sid, selector ?? null, attrs);\n if (options.maxResults !== undefined && Array.isArray(result)) {\n return result.slice(0, options.maxResults);\n }\n return result as ExtractedElement[];\n }\n throw new UnsupportedOperationError('extractElements() requires cloud mode with InstaVM client.');\n }\n\n /**\n * Extract LLM-friendly content (local: URL required; cloud: optional session)\n */\n async extractContent(options: ExtractContentOptions = {}): Promise<ExtractedContent> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n let sid: string | undefined = options.sessionId;\n if (!sid) {\n sid = await this.ensureDefaultBrowserSessionId();\n }\n const raw = await client.browserExtractContent(\n sid,\n options.url ?? null,\n options.includeInteractive !== false,\n options.includeAnchors !== false,\n options.maxAnchors ?? 50\n );\n return {\n readableContent: {\n ...(raw.readable_content || {}),\n content: raw.readable_content?.content || '',\n },\n interactiveElements: raw.interactive_elements,\n contentAnchors: raw.content_anchors,\n };\n }\n\n if (!options.url) {\n throw new BrowserInteractionError('url is required in local mode');\n }\n\n const requestData = {\n url: options.url,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>('/v1/browser/interactions/content', requestData);\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Content extraction failed: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Closes the default browser session if one was created for cloud convenience.\n */\n async close(): Promise<void> {\n if (!this._defaultBrowserSessionId) {\n return;\n }\n const sid = this._defaultBrowserSessionId;\n const session = this.activeSessions.get(sid);\n if (session) {\n try {\n await session.close();\n } catch {\n // ignore\n }\n }\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n\n async dispose(): Promise<void> {\n await this.close();\n await this.closeAllSessions();\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VMCreateRequest,\n VMUpdateRequest,\n VMCloneRequest,\n VMSnapshotRequest,\n VMVolumeMountRequest,\n VMMountedVolumeResponse,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VMsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VMCreateRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM creation');\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: '/v1/vms',\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listAll(): Promise<JsonMap[]> {\n return this.listAllRecords();\n }\n\n /**\n * Calls GET /v1/vms/ (trailing slash), a distinct route from GET /v1/vms.\n */\n async listAllRecords(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: string | number): Promise<JsonMap> {\n this.ensureCloud('VM lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<JsonMap>(\n `/v1/vms/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(vmId: string, payload: VMUpdateRequest = {}): Promise<JsonMap> {\n this.ensureCloud('VM update');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.patch<JsonMap>(\n `/v1/vms/${safeVmId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(vmId: string): Promise<JsonMap> {\n this.ensureCloud('VM deletion');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.delete<JsonMap>(\n `/v1/vms/${safeVmId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async clone(vmId: string, payload: VMCloneRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM clone');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/clone`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async snapshot(vmId: string, payload: VMSnapshotRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM snapshot');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/snapshot`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async mountVolume(\n vmId: string,\n payload: VMVolumeMountRequest,\n wait: boolean = true\n ): Promise<VMMountedVolumeResponse> {\n this.ensureCloud('VM volume mount');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<VMMountedVolumeResponse>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/volumes`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async listVolumes(vmId: string): Promise<VMMountedVolumeResponse[]> {\n this.ensureCloud('VM volume listing');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.get<VMMountedVolumeResponse[]>(\n `/v1/vms/${safeVmId}/volumes`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async unmountVolume(\n vmId: string,\n volumeId: string,\n mountPath: string,\n wait: boolean = true\n ): Promise<JsonMap> {\n this.ensureCloud('VM volume unmount');\n const safeVmId = encodePathSegment(vmId);\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/vms/${safeVmId}/volumes/${safeVolumeId}`,\n params: { mount_path: mountPath, wait },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n SnapshotCreateRequest,\n SnapshotQueryOptions,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SnapshotsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: SnapshotCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Snapshot creation');\n return this.httpClient.post<JsonMap>(\n '/v1/snapshots',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(options: SnapshotQueryOptions = {}): Promise<JsonMap[]> {\n this.ensureCloud('Snapshot listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/snapshots',\n options,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot lookup');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.get<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot deletion');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.delete<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { SessionError, UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n ShareCreateRequest,\n ShareUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SharesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getSessionId: () => string | null;\n\n constructor(\n httpClient: HTTPClient,\n local: boolean = false,\n getSessionId: () => string | null = () => null\n ) {\n this.httpClient = httpClient;\n this.local = local;\n this.getSessionId = getSessionId;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: ShareCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Share creation');\n\n const body: ShareCreateRequest = { ...payload };\n if (!body.session_id && !body.vm_id) {\n const sid = this.getSessionId();\n if (!sid) {\n throw new SessionError(\n 'Provide session_id/vm_id or create a session before creating a share.'\n );\n }\n body.session_id = sid;\n }\n\n return this.httpClient.post<JsonMap>(\n '/v1/shares',\n body,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(shareId: string, payload: ShareUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Share update');\n const safeShareId = encodePathSegment(shareId);\n return this.httpClient.patch<JsonMap>(\n `/v1/shares/${safeShareId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { JsonMap, CustomDomainCreateRequest } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class CustomDomainsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: CustomDomainCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Custom domain creation');\n return this.httpClient.post<JsonMap>(\n '/v1/custom-domains',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('Custom domain listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/custom-domains',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async health(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain health');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.get<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/health`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verify(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain verification');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.post<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain deletion');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.delete<JsonMap>(\n `/v1/custom-domains/${safeDomainId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { ComputerUseProxyOptions, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment, encodePathSegments } from '../utils/path';\n\ntype ProxyMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport class ComputerUseManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async viewerUrl(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use viewer URL');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/viewer-url`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async proxy(\n sessionId: string,\n path: string,\n method: ProxyMethod = 'GET',\n options: ComputerUseProxyOptions = {}\n ): Promise<any> {\n this.ensureCloud('Computer-use proxy');\n const safeSessionId = encodePathSegment(sessionId);\n const cleanPath = encodePathSegments(path);\n\n return this.httpClient.request<any>({\n method,\n url: `/v1/computeruse/${safeSessionId}/${cleanPath}`,\n params: options.params,\n data: options.body,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async get(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'GET', { params });\n }\n\n async post(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'POST', { body });\n }\n\n async put(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PUT', { body });\n }\n\n async patch(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PATCH', { body });\n }\n\n async delete(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'DELETE', { params });\n }\n\n async options(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'OPTIONS', { params });\n }\n\n async head(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'HEAD', { params });\n }\n\n /**\n * Get the VNC WebSocket URL for a computer-use session.\n * Returns the URL to connect to; the actual connection requires a WebSocket client.\n */\n async vncWebsockify(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use VNC websockify');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/vnc/websockify`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { APIKey, APIKeyCreateRequest, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class APIKeysManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: APIKeyCreateRequest = {}): Promise<APIKey> {\n this.ensureCloud('API key creation');\n return this.httpClient.post<APIKey>(\n '/v1/api-keys/',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<APIKey[]> {\n this.ensureCloud('API key listing');\n return this.httpClient.get<APIKey[]>(\n '/v1/api-keys/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: number): Promise<APIKey> {\n this.ensureCloud('API key lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(itemId: number, payload: APIKeyCreateRequest): Promise<APIKey> {\n this.ensureCloud('API key update');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.patch<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(itemId: number): Promise<JsonMap> {\n this.ensureCloud('API key deletion');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.delete<JsonMap>(\n `/v1/api-keys/${safeItemId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { AuditEventQuery, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class AuditManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async catalog(): Promise<JsonMap> {\n this.ensureCloud('Audit catalog');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/catalog',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async events(query: AuditEventQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Audit event listing');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/events',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEvent(eventId: string): Promise<JsonMap> {\n this.ensureCloud('Audit event lookup');\n const safeEventId = encodePathSegment(eventId);\n return this.httpClient.get<JsonMap>(\n `/v1/audit/events/${safeEventId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n WebhookDeliveryQuery,\n WebhookEndpointCreateRequest,\n WebhookEndpointUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class WebhooksManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async createEndpoint(payload: WebhookEndpointCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint creation');\n return this.httpClient.post<JsonMap>(\n '/v1/webhooks/endpoints',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listEndpoints(): Promise<JsonMap[]> {\n this.ensureCloud('Webhook endpoint listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/webhooks/endpoints',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint lookup');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.get<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async updateEndpoint(endpointId: string, payload: WebhookEndpointUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint update');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.patch<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint deletion');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.delete<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async rotateSecret(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook secret rotation');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/rotate-secret`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async sendTestEvent(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook test event');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/test`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verifyEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint verification');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listDeliveries(query: WebhookDeliveryQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery listing');\n return this.httpClient.get<JsonMap>(\n '/v1/webhooks/deliveries',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async replayDelivery(deliveryId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery replay');\n const safeDeliveryId = encodePathSegment(deliveryId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/deliveries/${safeDeliveryId}/replay`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport FormData from 'form-data';\nimport type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VolumeCreateRequest,\n VolumeUpdateRequest,\n VolumeResponse,\n VolumeCheckpointCreateRequest,\n VolumeCheckpointResponse,\n VolumeFileEntry,\n VolumeFileUploadRequest,\n VolumeFileDownloadResponse,\n VolumeFileListQuery,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VolumesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VolumeCreateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume creation');\n\n return this.httpClient.post<VolumeResponse>(\n '/v1/volumes',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(refreshUsage: boolean = false): Promise<VolumeResponse[]> {\n this.ensureCloud('Volume listing');\n\n return this.httpClient.get<VolumeResponse[]>(\n '/v1/volumes',\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(volumeId: string, refreshUsage: boolean = false): Promise<VolumeResponse> {\n this.ensureCloud('Volume lookup');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(volumeId: string, payload: VolumeUpdateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume update');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.patch<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(volumeId: string): Promise<JsonMap> {\n this.ensureCloud('Volume deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async createCheckpoint(\n volumeId: string,\n payload: VolumeCheckpointCreateRequest = {}\n ): Promise<VolumeCheckpointResponse> {\n this.ensureCloud('Volume checkpoint creation');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.post<VolumeCheckpointResponse>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listCheckpoints(volumeId: string): Promise<VolumeCheckpointResponse[]> {\n this.ensureCloud('Volume checkpoint listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeCheckpointResponse[]>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteCheckpoint(volumeId: string, checkpointId: string): Promise<JsonMap> {\n this.ensureCloud('Volume checkpoint deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n const safeCheckpointId = encodePathSegment(checkpointId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}/checkpoints/${safeCheckpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async uploadFile(volumeId: string, payload: VolumeFileUploadRequest): Promise<VolumeFileEntry> {\n this.ensureCloud('Volume file upload');\n\n if (!payload.path || payload.path.trim().length === 0) {\n throw new Error('payload.path is required');\n }\n\n const hasFilePath = typeof payload.filePath === 'string' && payload.filePath.length > 0;\n const hasFileContent = payload.fileContent !== undefined;\n\n if (hasFilePath === hasFileContent) {\n throw new Error('Provide exactly one of payload.filePath or payload.fileContent');\n }\n\n const safeVolumeId = encodePathSegment(volumeId);\n const formData = new FormData();\n\n if (hasFilePath) {\n const sourcePath = payload.filePath as string;\n const filename = payload.filename || path.basename(sourcePath);\n formData.append('file', fs.createReadStream(sourcePath), { filename });\n } else {\n const filename = payload.filename || 'upload.bin';\n const raw = payload.fileContent as Buffer | string;\n const buffer = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n formData.append('file', buffer, { filename });\n }\n\n formData.append('path', payload.path);\n if (payload.overwrite !== undefined) {\n formData.append('overwrite', String(payload.overwrite));\n }\n\n return this.httpClient.postFormData<VolumeFileEntry>(\n `/v1/volumes/${safeVolumeId}/files/upload`,\n formData\n );\n }\n\n async downloadFile(volumeId: string, path: string): Promise<VolumeFileDownloadResponse> {\n this.ensureCloud('Volume file download');\n const safeVolumeId = encodePathSegment(volumeId);\n\n const response = await this.httpClient.post<{\n path: string;\n filename: string;\n size: number;\n content: string;\n }>(\n `/v1/volumes/${safeVolumeId}/files/download`,\n { path },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n path: response.path,\n filename: response.filename,\n size: response.size,\n content: Buffer.from(response.content || '', 'base64'),\n };\n }\n\n async listFiles(\n volumeId: string,\n options: VolumeFileListQuery = {}\n ): Promise<VolumeFileEntry[]> {\n this.ensureCloud('Volume file listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeFileEntry[]>(\n `/v1/volumes/${safeVolumeId}/files`,\n {\n prefix: options.prefix ?? '',\n recursive: options.recursive ?? true,\n limit: options.limit ?? 1000,\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteFile(volumeId: string, targetPath: string): Promise<JsonMap> {\n this.ensureCloud('Volume file deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/volumes/${safeVolumeId}/files`,\n params: { path: targetPath },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n TapeAppendEventOptions,\n TapeBranchOptions,\n TapeBranchResponse,\n TapeDiffResponse,\n TapeEvent,\n TapeEventsQuery,\n TapeExportBundle,\n TapeLanesResponse,\n TapeListQuery,\n TapeRecord,\n TapeStartOptions,\n} from '../types/tape';\n\ntype JsonMap = Record<string, any>;\n\nexport class TapesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n private authHeaders(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n async start(sessionId: string, options: TapeStartOptions = {}): Promise<TapeRecord> {\n this.ensureCloud('Tape start');\n const safe = encodePathSegment(sessionId);\n return this.httpClient.post<TapeRecord>(\n `/v1/sessions/${safe}/tape/start`,\n {\n record_egress_content: options.recordEgressContent ?? false,\n record_fs: options.recordFs ?? true,\n retention_days: options.retentionDays ?? 7,\n },\n this.authHeaders()\n );\n }\n\n async stop(tapeId: string): Promise<TapeRecord> {\n this.ensureCloud('Tape stop');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.post<TapeRecord>(\n `/v1/tapes/${safe}/stop`,\n undefined,\n this.authHeaders()\n );\n }\n\n async list(query: TapeListQuery = {}): Promise<TapeRecord[]> {\n this.ensureCloud('Tape listing');\n const params: Record<string, any> = {\n limit: query.limit ?? 50,\n offset: query.offset ?? 0,\n };\n if (query.sessionId !== undefined) params.session_id = query.sessionId;\n if (query.vmId !== undefined) params.vm_id = query.vmId;\n if (query.status !== undefined) params.status = query.status;\n\n const result = await this.httpClient.get<any>(\n '/v1/tapes',\n params,\n this.authHeaders()\n );\n return Array.isArray(result) ? result : [];\n }\n\n async get(tapeId: string): Promise<TapeRecord> {\n this.ensureCloud('Tape lookup');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeRecord>(\n `/v1/tapes/${safe}`,\n undefined,\n this.authHeaders()\n );\n }\n\n async events(tapeId: string, query: TapeEventsQuery = {}): Promise<TapeEvent[]> {\n this.ensureCloud('Tape events');\n const safe = encodePathSegment(tapeId);\n const params: Record<string, any> = { limit: query.limit ?? 200 };\n if (query.afterStep !== undefined) params.after_step = query.afterStep;\n if (query.kind !== undefined) params.kind = query.kind;\n\n const result = await this.httpClient.get<any>(\n `/v1/tapes/${safe}/events`,\n params,\n this.authHeaders()\n );\n return Array.isArray(result) ? result : [];\n }\n\n async appendEvent(\n tapeId: string,\n kind: string,\n options: TapeAppendEventOptions = {}\n ): Promise<TapeEvent> {\n this.ensureCloud('Tape append event');\n const safe = encodePathSegment(tapeId);\n const body: Record<string, any> = { kind, payload: options.payload || {} };\n if (options.stepId !== undefined) body.step_id = options.stepId;\n if (options.parentStepId !== undefined) body.parent_step_id = options.parentStepId;\n if (options.checkpointId !== undefined) body.checkpoint_id = options.checkpointId;\n return this.httpClient.post<TapeEvent>(\n `/v1/tapes/${safe}/events`,\n body,\n this.authHeaders()\n );\n }\n\n async lanes(tapeId: string): Promise<TapeLanesResponse> {\n this.ensureCloud('Tape lanes');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeLanesResponse>(\n `/v1/tapes/${safe}/lanes`,\n undefined,\n this.authHeaders()\n );\n }\n\n async diff(tapeId: string, fromStep: number, toStep: number): Promise<TapeDiffResponse> {\n this.ensureCloud('Tape diff');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeDiffResponse>(\n `/v1/tapes/${safe}/diff`,\n { from: fromStep, to: toStep },\n this.authHeaders()\n );\n }\n\n async branch(\n tapeId: string,\n atStep: number,\n options: TapeBranchOptions = {}\n ): Promise<TapeBranchResponse> {\n this.ensureCloud('Tape branch');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.post<TapeBranchResponse>(\n `/v1/tapes/${safe}/branch`,\n { at_step: atStep, mode: options.mode || 'live' },\n this.authHeaders()\n );\n }\n\n async delete(tapeId: string): Promise<JsonMap> {\n this.ensureCloud('Tape deletion');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.delete<JsonMap>(\n `/v1/tapes/${safe}`,\n this.authHeaders()\n );\n }\n\n async export(tapeId: string): Promise<TapeExportBundle> {\n this.ensureCloud('Tape export');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeExportBundle>(\n `/v1/tapes/${safe}/export`,\n undefined,\n this.authHeaders()\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n AddVaultCredentialOptions,\n AddVaultServiceOptions,\n UpdateVaultOptions,\n VaultCatalogTemplate,\n VaultCredential,\n VaultDiscoverResponse,\n VaultRecord,\n VaultRequestLog,\n VaultService,\n} from '../types/vault';\n\ntype JsonMap = Record<string, any>;\n\nexport class VaultsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Vault management is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n async list(): Promise<VaultRecord[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>('/v1/vaults', undefined, this.auth());\n if (Array.isArray(result)) return result;\n return result?.vaults || [];\n }\n\n async create(name: string, description?: string): Promise<VaultRecord> {\n this.ensureCloud();\n const body: JsonMap = { name };\n if (description !== undefined) body.description = description;\n return this.httpClient.post<VaultRecord>('/v1/vaults', body, this.auth());\n }\n\n async get(vaultId: string): Promise<VaultRecord> {\n this.ensureCloud();\n return this.httpClient.get<VaultRecord>(\n `/v1/vaults/${encodePathSegment(vaultId)}`,\n undefined,\n this.auth()\n );\n }\n\n async update(vaultId: string, updates: UpdateVaultOptions): Promise<VaultRecord> {\n this.ensureCloud();\n const body: JsonMap = {};\n if (updates.name !== undefined) body.name = updates.name;\n if (updates.description !== undefined) body.description = updates.description;\n return this.httpClient.patch<VaultRecord>(\n `/v1/vaults/${encodePathSegment(vaultId)}`,\n body,\n this.auth()\n );\n }\n\n async delete(vaultId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}`,\n this.auth()\n );\n }\n\n async discover(vaultId: string): Promise<VaultDiscoverResponse> {\n this.ensureCloud();\n return this.httpClient.get<VaultDiscoverResponse>(\n `/v1/vaults/${encodePathSegment(vaultId)}/discover`,\n undefined,\n this.auth()\n );\n }\n\n async listCredentials(vaultId: string): Promise<VaultCredential[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.credentials || [];\n }\n\n async addCredential(\n vaultId: string,\n name: string,\n value: string,\n options: AddVaultCredentialOptions = {}\n ): Promise<VaultCredential> {\n this.ensureCloud();\n const body: JsonMap = {\n name,\n value,\n credential_type: options.credentialType ?? 'api_key',\n };\n if (options.description !== undefined) body.description = options.description;\n return this.httpClient.post<VaultCredential>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials`,\n body,\n this.auth()\n );\n }\n\n async rotateCredential(\n vaultId: string,\n credentialId: string,\n value: string\n ): Promise<VaultCredential> {\n this.ensureCloud();\n return this.httpClient.post<VaultCredential>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials/${encodePathSegment(credentialId)}/rotate`,\n { value },\n this.auth()\n );\n }\n\n async deleteCredential(vaultId: string, credentialId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials/${encodePathSegment(credentialId)}`,\n this.auth()\n );\n }\n\n async listServices(vaultId: string): Promise<VaultService[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.services || [];\n }\n\n async addService(\n vaultId: string,\n host: string,\n authConfig: Record<string, any>,\n options: AddVaultServiceOptions = {}\n ): Promise<VaultService> {\n this.ensureCloud();\n const body: JsonMap = {\n host,\n auth_config: authConfig,\n enabled: options.enabled ?? true,\n };\n if (options.description !== undefined) body.description = options.description;\n return this.httpClient.post<VaultService>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services`,\n body,\n this.auth()\n );\n }\n\n async addServicesFromTemplates(vaultId: string, templateIds: string[]): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.post<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services:from_template`,\n { template_ids: templateIds },\n this.auth()\n );\n }\n\n async deleteService(vaultId: string, serviceId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services/${encodePathSegment(serviceId)}`,\n this.auth()\n );\n }\n\n async getCatalog(): Promise<VaultCatalogTemplate[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n '/v1/vaults/catalog',\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.templates || [];\n }\n\n async getRequestLogs(vaultId: string, limit: number = 100): Promise<VaultRequestLog[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vaults/${encodePathSegment(vaultId)}/request-logs`,\n { limit },\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.logs || result?.request_logs || [];\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type { PTYCreateOptions, PTYRecord } from '../types/pty';\n\ntype JsonMap = Record<string, any>;\n\nexport class PTYManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getBaseURL: () => string;\n\n constructor(httpClient: HTTPClient, local: boolean, getBaseURL: () => string) {\n this.httpClient = httpClient;\n this.local = local;\n this.getBaseURL = getBaseURL;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'PTY management is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n private buildPayload(options: PTYCreateOptions): JsonMap {\n const payload: JsonMap = {\n cols: options.cols ?? 80,\n rows: options.rows ?? 24,\n };\n if (options.command !== undefined) payload.shell = options.command;\n if (options.ptyId !== undefined) payload.id = options.ptyId;\n return payload;\n }\n\n private buildWsUrl(path: string): string {\n const trimmedBase = this.getBaseURL().replace(/\\/+$/, '');\n const base = trimmedBase.replace(/^http:\\/\\//, 'ws://').replace(/^https:\\/\\//, 'wss://');\n const apiKey = encodeURIComponent(this.httpClient.apiKey || '');\n return `${base}${path}?api_key=${apiKey}`;\n }\n\n // -- Session-scoped --------------------------------------------------------\n\n async create(sessionId: string, options: PTYCreateOptions = {}): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.post<PTYRecord>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions`,\n this.buildPayload(options),\n this.auth()\n );\n }\n\n async list(sessionId: string): Promise<PTYRecord[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.sessions || [];\n }\n\n async get(sessionId: string, ptyId: string): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.get<PTYRecord>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n undefined,\n this.auth()\n );\n }\n\n async resize(sessionId: string, ptyId: string, cols: number, rows: number): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.post<JsonMap>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions/${encodePathSegment(ptyId)}/resize`,\n { cols, rows },\n this.auth()\n );\n }\n\n async kill(sessionId: string, ptyId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n this.auth()\n );\n }\n\n wsUrl(sessionId: string, ptyId: string): string {\n return this.buildWsUrl(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/${encodePathSegment(ptyId)}/connect`\n );\n }\n\n // -- VM-scoped (docker exec -it pattern) -----------------------------------\n\n async createForVm(vmId: string, options: PTYCreateOptions = {}): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.post<PTYRecord>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions`,\n this.buildPayload(options),\n this.auth()\n );\n }\n\n async listForVm(vmId: string): Promise<PTYRecord[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.sessions || [];\n }\n\n async getForVm(vmId: string, ptyId: string): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.get<PTYRecord>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n undefined,\n this.auth()\n );\n }\n\n async resizeForVm(vmId: string, ptyId: string, cols: number, rows: number): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.post<JsonMap>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions/${encodePathSegment(ptyId)}/resize`,\n { cols, rows },\n this.auth()\n );\n }\n\n async killForVm(vmId: string, ptyId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n this.auth()\n );\n }\n\n wsUrlForVm(vmId: string, ptyId: string): string {\n return this.buildWsUrl(\n `/v1/vms/${encodePathSegment(vmId)}/pty/${encodePathSegment(ptyId)}/connect`\n );\n }\n}\n","import fs from 'fs';\nimport { stat, unlink } from 'fs/promises';\nimport { pipeline } from 'stream/promises';\nimport axios from 'axios';\nimport { INSTAVM_JS_SDK_VERSION } from '../version';\nimport type { HTTPClient } from './HTTPClient';\nimport { InstaVMError, UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n RecordingDownloadResult,\n RecordingListQuery,\n RecordingRecord,\n} from '../types/recording';\n\ntype JsonMap = Record<string, any>;\n\nexport class RecordingsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getBaseURL: () => string;\n\n constructor(httpClient: HTTPClient, local: boolean, getBaseURL: () => string) {\n this.httpClient = httpClient;\n this.local = local;\n this.getBaseURL = getBaseURL;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Recording management is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n private sdkHeaders(): Record<string, string> {\n return { 'User-Agent': `instavm-js-sdk/${INSTAVM_JS_SDK_VERSION}` };\n }\n\n async list(query: RecordingListQuery = {}): Promise<RecordingRecord[]> {\n this.ensureCloud();\n const params: JsonMap = {\n limit: query.limit ?? 50,\n offset: query.offset ?? 0,\n };\n if (query.sessionId !== undefined) params.session_id = query.sessionId;\n if (query.status !== undefined) params.status = query.status;\n const result = await this.httpClient.get<any>('/v1/recordings', params, this.auth());\n return Array.isArray(result) ? result : [];\n }\n\n async get(recordingId: string): Promise<RecordingRecord> {\n this.ensureCloud();\n return this.httpClient.get<RecordingRecord>(\n `/v1/recordings/${encodePathSegment(recordingId)}`,\n undefined,\n this.auth()\n );\n }\n\n /**\n * Resolve the presigned download URL for a recording without following the\n * 302 redirect. The returned URL is short-lived and pre-authorised.\n */\n async getDownloadUrl(recordingId: string): Promise<string> {\n this.ensureCloud();\n const url = `${this.getBaseURL().replace(/\\/+$/, '')}/v1/recordings/${encodePathSegment(recordingId)}/download`;\n const response = await axios.request({\n method: 'GET',\n url,\n headers: {\n ...this.auth(),\n ...this.sdkHeaders(),\n },\n maxRedirects: 0,\n validateStatus: (status) => status >= 200 && status < 400,\n });\n\n if ([301, 302, 303, 307, 308].includes(response.status)) {\n const location = response.headers?.location || response.headers?.Location;\n if (!location) {\n throw new InstaVMError('Recording download response missing Location header');\n }\n return location;\n }\n\n throw new InstaVMError(\n `Server did not redirect to a presigned URL (status=${response.status})`\n );\n }\n\n /**\n * Stream a recording to a local file using the presigned URL. The S3 URL\n * must NOT carry our X-API-Key header — fetch it with a clean axios call.\n */\n async download(recordingId: string, outputPath: string): Promise<RecordingDownloadResult> {\n this.ensureCloud();\n const presignedUrl = await this.getDownloadUrl(recordingId);\n const response = await axios.request<NodeJS.ReadableStream>({\n method: 'GET',\n url: presignedUrl,\n responseType: 'stream',\n headers: this.sdkHeaders(),\n });\n\n const writer = fs.createWriteStream(outputPath);\n try {\n await pipeline(response.data, writer);\n } catch (error) {\n await unlink(outputPath).catch(() => undefined);\n throw error;\n }\n\n const fileStat = await stat(outputPath);\n\n return { recordingId, path: outputPath, bytes: fileStat.size };\n }\n\n async delete(recordingId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/recordings/${encodePathSegment(recordingId)}`,\n this.auth()\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n CreditAllocation,\n CreditCheckResponse,\n CreditForecastResponse,\n CreditPeriod,\n CreditRates,\n CreditSummary,\n CreditTrendsGranularity,\n CreditTrendsPeriod,\n CreditTrendsResponse,\n CreditUsageEntry,\n} from '../types/credits';\n\nexport class CreditsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Credits API is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n async allocation(): Promise<CreditAllocation> {\n this.ensureCloud();\n return this.httpClient.get<CreditAllocation>(\n '/v1/credits/allocation',\n undefined,\n this.auth()\n );\n }\n\n async usage(\n period: CreditPeriod = 'current_month',\n options: { usageType?: string; limit?: number } = {}\n ): Promise<CreditUsageEntry[]> {\n this.ensureCloud();\n const params: Record<string, any> = { period, limit: options.limit ?? 100 };\n if (options.usageType !== undefined) params.usage_type = options.usageType;\n const result = await this.httpClient.get<any>('/v1/credits/usage', params, this.auth());\n return Array.isArray(result) ? result : [];\n }\n\n async summary(period: CreditPeriod = 'current_month'): Promise<CreditSummary> {\n this.ensureCloud();\n return this.httpClient.get<CreditSummary>(\n '/v1/credits/summary',\n { period },\n this.auth()\n );\n }\n\n async check(usageType: string, requiredCredits: number): Promise<CreditCheckResponse> {\n this.ensureCloud();\n return this.httpClient.get<CreditCheckResponse>(\n '/v1/credits/check',\n { usage_type: usageType, required_credits: requiredCredits },\n this.auth()\n );\n }\n\n async rates(): Promise<CreditRates> {\n this.ensureCloud();\n return this.httpClient.get<CreditRates>(\n '/v1/credits/rates',\n undefined,\n this.auth()\n );\n }\n\n async usageTrends(\n period: CreditTrendsPeriod = '30d',\n granularity: CreditTrendsGranularity = 'daily'\n ): Promise<CreditTrendsResponse> {\n this.ensureCloud();\n return this.httpClient.get<CreditTrendsResponse>(\n '/v1/credits/usage/trends',\n { period, granularity },\n this.auth()\n );\n }\n\n async usageForecast(): Promise<CreditForecastResponse> {\n this.ensureCloud();\n return this.httpClient.get<CreditForecastResponse>(\n '/v1/credits/usage/forecasting',\n undefined,\n this.auth()\n );\n }\n}\n","import type { TapesManager } from './TapesManager';\nimport { SessionError } from '../errors/BaseError';\nimport type { TapeRecord, TapeStartOptions } from '../types/tape';\n\n/**\n * Start/stop a tape for a session (parity with Python ``TapeContext``).\n *\n * Usage:\n * ```ts\n * const ctx = client.tape(sessionId, { recordFs: true });\n * await ctx.start();\n * try {\n * // ...\n * } finally {\n * await ctx.stop();\n * }\n * ```\n */\nexport class TapeContext {\n public info: TapeRecord | null = null;\n\n constructor(\n private readonly tapes: TapesManager,\n private readonly sessionId: string | undefined,\n private readonly startOpts: TapeStartOptions\n ) {}\n\n get id(): string | undefined {\n return this.info?.id;\n }\n\n async start(): Promise<void> {\n if (!this.sessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n this.info = await this.tapes.start(this.sessionId, this.startOpts);\n }\n\n async stop(): Promise<void> {\n if (!this.info?.id) {\n return;\n }\n this.info = await this.tapes.stop(this.info.id);\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.stop();\n }\n}\n","import type { TapesManager } from './TapesManager';\nimport type { TapeEvent } from '../types/tape';\n\n/**\n * Record tool-call spans into an active tape (parity with Python ``ToolCallRecorder``).\n */\nexport class ToolCallRecorder {\n constructor(\n private readonly tapes: TapesManager,\n private readonly tapeId: string\n ) {}\n\n async event(\n kind: string,\n payload?: Record<string, any>,\n stepId?: number\n ): Promise<TapeEvent> {\n return this.tapes.appendEvent(this.tapeId, kind, {\n payload: payload || {},\n stepId,\n });\n }\n\n span(name: string, payload?: Record<string, any>): ToolCallSpan {\n return new ToolCallSpan(this, name, payload || {});\n }\n}\n\nexport class ToolCallSpan {\n private endPayload: Record<string, any> = {};\n private stepId: number | undefined;\n\n constructor(\n private readonly recorder: ToolCallRecorder,\n private readonly name: string,\n private readonly startPayload: Record<string, any>\n ) {}\n\n attach(payload: Record<string, any>): void {\n Object.assign(this.endPayload, payload);\n }\n\n async enter(): Promise<void> {\n const result = await this.recorder.event('tool_call_start', {\n name: this.name,\n ...this.startPayload,\n });\n this.stepId = result.step_id;\n }\n\n async exit(err?: unknown): Promise<void> {\n const payload: Record<string, any> = {\n name: this.name,\n ok: err === undefined || err === null,\n ...this.endPayload,\n };\n if (err) {\n payload.error = err instanceof Error ? err.message : String(err);\n }\n await this.recorder.event('tool_call_end', payload, this.stepId);\n }\n}\n","import { HTTPClient } from './HTTPClient';\nimport { BrowserManager } from './BrowserManager';\nimport { VMsManager } from './VMsManager';\nimport { SnapshotsManager } from './SnapshotsManager';\nimport { SharesManager } from './SharesManager';\nimport { CustomDomainsManager } from './CustomDomainsManager';\nimport { ComputerUseManager } from './ComputerUseManager';\nimport { APIKeysManager } from './APIKeysManager';\nimport { AuditManager } from './AuditManager';\nimport { WebhooksManager } from './WebhooksManager';\nimport { VolumesManager } from './VolumesManager';\nimport { TapesManager } from './TapesManager';\nimport { VaultsManager } from './VaultsManager';\nimport { PTYManager } from './PTYManager';\nimport { RecordingsManager } from './RecordingsManager';\nimport { CreditsManager } from './CreditsManager';\nimport { TapeContext } from './TapeContext';\nimport { ToolCallRecorder } from './ToolCallRecorder';\nimport FormData from 'form-data';\nimport {\n SessionError,\n ExecutionError,\n UnsupportedOperationError,\n AuthenticationError,\n RateLimitError,\n NetworkError,\n InstaVMError,\n BrowserSessionError,\n BrowserNavigationError,\n BrowserTimeoutError,\n BrowserInteractionError,\n ElementNotFoundError,\n} from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n ExecuteOptions,\n ExecutionResult,\n AsyncExecutionResult,\n TaskResult,\n FileUpload,\n UploadOptions,\n UploadResult,\n UsageStats,\n DownloadOptions,\n DownloadResult,\n} from '../types/execution';\nimport type { EgressPolicy, EgressPolicyOptions } from '../types/egress';\nimport type { SSHKey } from '../types/ssh';\nimport type { CurrentUserResponse, SessionStatusResponse } from '../types/account';\nimport type { TapeStartOptions } from '../types/tape';\nimport type {\n AddVaultCredentialOptions,\n AddVaultServiceOptions,\n UpdateVaultOptions,\n VaultCatalogTemplate,\n VaultCredential,\n VaultDiscoverResponse,\n VaultRecord,\n VaultRequestLog,\n VaultService,\n} from '../types/vault';\n\nexport interface InstaVMOptions {\n baseURL?: string;\n /**\n * Timeout in milliseconds. Used for HTTP request timeout and sent to API as VM lifetime (in seconds).\n * Default: 300000 (5 minutes)\n */\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n local?: boolean;\n localURL?: string;\n /** VM memory in megabytes (optional). Range: 128-8192 MB */\n memory_mb?: number;\n /** VM vCPU count (optional). Valid values: 1, 2, 4, 6, 8 */\n cpu_count?: number;\n /** Optional user-defined metadata for filtering */\n metadata?: Record<string, any>;\n /** Optional environment variables to set in the VM */\n env?: Record<string, any>;\n /**\n * When true (default), start a cloud execution session during construction (mirrors Python).\n * Set false for management-only CLI commands.\n */\n auto_start_session?: boolean;\n}\n\n/**\n * Main InstaVM client class\n */\nexport class InstaVM {\n private httpClient: HTTPClient;\n private _sessionId: string | null = null;\n public readonly browser: BrowserManager;\n public readonly vms: VMsManager;\n public readonly snapshots: SnapshotsManager;\n public readonly shares: SharesManager;\n public readonly customDomains: CustomDomainsManager;\n public readonly computerUse: ComputerUseManager;\n public readonly apiKeys: APIKeysManager;\n public readonly audit: AuditManager;\n public readonly webhooks: WebhooksManager;\n public readonly volumes: VolumesManager;\n public readonly tapes: TapesManager;\n public readonly vaults: VaultsManager;\n public readonly pty: PTYManager;\n public readonly recordings: RecordingsManager;\n public readonly credits: CreditsManager;\n public readonly local: boolean;\n private readonly timeout: number;\n public readonly memory_mb?: number;\n public readonly cpu_count?: number;\n public readonly metadata?: Record<string, any>;\n public readonly env?: Record<string, any>;\n private _vmUsed: boolean = false;\n private readonly _autoStartSession: boolean;\n private sessionBootstrap?: Promise<string>;\n\n constructor(apiKey: string, options: InstaVMOptions = {}) {\n this.local = options.local || false;\n this.timeout = options.timeout || 300000; // 300000 milliseconds (5 minutes)\n this.memory_mb = options.memory_mb;\n this.cpu_count = options.cpu_count;\n this.metadata = options.metadata;\n this.env = options.env;\n this._autoStartSession = options.auto_start_session !== false;\n\n // In local mode, API key is optional\n if (!this.local && !apiKey) {\n throw new AuthenticationError('API key is required for cloud mode');\n }\n\n const config = {\n baseURL: this.local\n ? (options.localURL || 'http://coderunner.local:8222')\n : (options.baseURL || 'https://api.instavm.io'),\n timeout: this.timeout,\n maxRetries: options.maxRetries || 3,\n retryDelay: options.retryDelay || 1000,\n apiKey: apiKey || '',\n };\n\n this.httpClient = new HTTPClient(config);\n this.browser = new BrowserManager(this.httpClient, this.local, () => this);\n this.vms = new VMsManager(this.httpClient, this.local);\n this.snapshots = new SnapshotsManager(this.httpClient, this.local);\n this.shares = new SharesManager(this.httpClient, this.local, () => this._sessionId);\n this.customDomains = new CustomDomainsManager(this.httpClient, this.local);\n this.computerUse = new ComputerUseManager(this.httpClient, this.local);\n this.apiKeys = new APIKeysManager(this.httpClient, this.local);\n this.audit = new AuditManager(this.httpClient, this.local);\n this.webhooks = new WebhooksManager(this.httpClient, this.local);\n this.volumes = new VolumesManager(this.httpClient, this.local);\n this.tapes = new TapesManager(this.httpClient, this.local);\n this.vaults = new VaultsManager(this.httpClient, this.local);\n this.pty = new PTYManager(this.httpClient, this.local, () => this.httpClient.baseURL);\n this.recordings = new RecordingsManager(this.httpClient, this.local, () => this.httpClient.baseURL);\n this.credits = new CreditsManager(this.httpClient, this.local);\n\n if (this._autoStartSession && !this.local && apiKey) {\n this.sessionBootstrap = this.createSession();\n void this.sessionBootstrap.catch(() => undefined);\n }\n }\n\n private async awaitSessionBootstrap(): Promise<void> {\n if (this.sessionBootstrap) {\n try {\n await this.sessionBootstrap;\n } finally {\n this.sessionBootstrap = undefined;\n }\n }\n }\n\n /**\n * Ensure operation is not called in local mode\n */\n private ensureNotLocal(operationName: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operationName} is not supported in local mode. This operation is only available when using the cloud API.`\n );\n }\n }\n\n private authHeaders(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n /**\n * Execute code synchronously\n *\n * @param command - Command to execute\n * @param options - Execution options\n * @param options.timeout - Request timeout in milliseconds (used for HTTP request timeout and sent to API in seconds)\n * @returns Execution result\n */\n async execute(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<ExecutionResult> {\n if (!this.local) {\n await this.awaitSessionBootstrap();\n }\n // In local mode, session_id is not required\n let sessionId = options.sessionId || this._sessionId;\n if (!this.local && !sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData: any = {\n command,\n language: options.language || 'python',\n };\n\n // Add timeout to request data if provided (convert milliseconds to seconds for API)\n if (options.timeout !== undefined) {\n requestData.timeout = Math.floor(options.timeout / 1000);\n }\n\n // Only include session_id in cloud mode\n if (!this.local && sessionId) {\n requestData.session_id = sessionId;\n }\n\n // Use custom timeout for this request, or fall back to instance default (in milliseconds)\n const requestTimeout = options.timeout !== undefined ? options.timeout : this.timeout;\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute',\n requestData,\n undefined,\n requestTimeout\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n if (!this.local) {\n this._vmUsed = true;\n }\n\n return {\n stdout: response.stdout || '',\n stderr: response.stderr || '',\n success: response.success !== false,\n executionTime: response.execution_time,\n cpuTime: response.cpu_time,\n createdAt: response.created_at,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Execute code asynchronously\n */\n async executeAsync(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<AsyncExecutionResult> {\n this.ensureNotLocal('Async execution');\n await this.awaitSessionBootstrap();\n\n // Auto-create session if none exists (like Python client)\n let sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData = {\n command,\n language: options.language || 'python',\n timeout: options.timeout || 15,\n session_id: sessionId,\n };\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute_async',\n requestData\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n this._vmUsed = true;\n\n return {\n taskId: response.task_id,\n status: response.status || 'pending',\n output: response.stdout || response.output,\n success: response.success,\n executionTime: response.execution_time,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Async code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Poll for async task result\n *\n * @param taskId - The task ID from executeAsync\n * @param pollInterval - Seconds between polls (default: 1)\n * @param timeout - Maximum seconds to wait (default: 60)\n * @returns Task result with stdout, stderr, execution time, etc.\n * @throws Error if task doesn't complete within timeout\n */\n async getTaskResult(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 60\n ): Promise<TaskResult> {\n this.ensureNotLocal('Async task result retrieval');\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout * 1000) {\n try {\n const response = await this.httpClient.get<any>(\n `/v1/executions/${taskId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n if (response.is_complete) {\n // Output is already decoded as string (not base64 despite field name)\n return {\n stdout: response.serialized_stdout || '',\n stderr: response.serialized_stderr || '',\n cpuTime: response.cpu_time,\n executionTime: response.execution_time,\n createdAt: response.created_at,\n };\n }\n\n // Wait before polling again\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n } catch (error) {\n // Don't retry on auth, rate limit, or network errors\n if (\n error instanceof AuthenticationError ||\n error instanceof RateLimitError ||\n error instanceof NetworkError\n ) {\n throw error;\n }\n\n // Continue polling on transient errors\n if (Date.now() - startTime >= timeout * 1000) {\n throw new ExecutionError(\n `Failed to get task result: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n }\n }\n\n throw new ExecutionError(`Task ${taskId} timed out after ${timeout}s`);\n }\n\n /**\n * Upload files to the execution environment\n */\n async upload(\n files: FileUpload[],\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n this.ensureNotLocal('File upload');\n await this.awaitSessionBootstrap();\n\n // Require explicit session (matches Python SDK behavior)\n const sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n throw new SessionError('Session ID not set. Please create a session first using createSession().');\n }\n\n const formData = new FormData();\n\n // Add files to form data\n for (const file of files) {\n if (Buffer.isBuffer(file.content)) {\n formData.append('files', file.content, file.name);\n } else {\n formData.append('files', Buffer.from(file.content), file.name);\n }\n\n if (file.path) {\n formData.append('paths', file.path);\n }\n }\n\n // Add options\n formData.append('session_id', sessionId);\n if (options.remotePath) {\n formData.append('remote_path', options.remotePath);\n }\n if (options.recursive !== undefined) {\n formData.append('recursive', String(options.recursive));\n }\n\n try {\n const response = await this.httpClient.postFormData<any>(\n '/upload',\n formData\n );\n\n return {\n success: response.success !== false,\n files: response.files || [],\n message: response.message,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File upload failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Create a new execution session\n */\n async createSession(): Promise<string> {\n this.ensureNotLocal('Session management');\n\n try {\n // Send API key and VM lifetime in JSON body for session creation\n // Convert timeout from milliseconds to seconds for the API\n const requestBody: Record<string, any> = {\n api_key: this.httpClient.apiKey,\n vm_lifetime_seconds: Math.floor(this.timeout / 1000),\n };\n\n if (this.memory_mb !== undefined) {\n requestBody.memory_mb = this.memory_mb;\n }\n if (this.cpu_count !== undefined) {\n requestBody.vcpu_count = this.cpu_count;\n }\n if (this.metadata !== undefined) {\n requestBody.metadata = this.metadata;\n }\n if (this.env !== undefined) {\n requestBody.env = this.env;\n }\n\n const response = await this.httpClient.post<any>(\n '/v1/sessions/session',\n requestBody\n );\n\n if (response && response.session_id) {\n this._sessionId = response.session_id;\n return response.session_id;\n }\n\n throw new SessionError('Session creation failed: No session ID returned');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Session creation failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close a session\n * Note: Sessions auto-expire on the server side. This just clears local state.\n */\n async closeSession(sessionId?: string): Promise<void> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return; // No session to close\n }\n\n // Clear local session state\n // Sessions will auto-expire on server side, no API call needed\n if (targetSessionId === this._sessionId) {\n this._sessionId = null;\n }\n }\n\n /**\n * Check if current session is still active by checking VM status\n *\n * @returns true if session is active, false otherwise\n */\n async isSessionActive(sessionId?: string): Promise<boolean> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return false;\n }\n\n try {\n const response = await this.httpClient.get<any>(\n `/v1/sessions/status/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response.vm_status === 'active';\n } catch (error) {\n if (\n error instanceof SessionError ||\n error instanceof AuthenticationError ||\n error instanceof NetworkError\n ) {\n return false;\n }\n return false;\n }\n }\n\n /**\n * Get the app URL for a session\n *\n * @param sessionId - Session ID (uses current session if not provided)\n * @param port - Port to expose (1-65535, default: 80)\n */\n async getSessionAppUrl(\n sessionId?: string,\n port?: number\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Session app URL');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const params: Record<string, any> = {};\n if (port !== undefined) {\n params.port = port;\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n return this.httpClient.get<Record<string, any>>(\n `/v1/sessions/app-url/${safeSid}`,\n params,\n this.authHeaders()\n );\n }\n\n /**\n * List sandbox records with optional filtering\n *\n * @param options.metadata - JSON-serializable metadata filters\n * @param options.limit - Maximum number of results (1-1000, default: 100)\n */\n async listSandboxes(options: {\n metadata?: Record<string, any>;\n limit?: number;\n } = {}): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Sandbox listing');\n\n const params: Record<string, any> = {};\n if (options.metadata !== undefined) {\n params.metadata = JSON.stringify(options.metadata);\n }\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n\n return this.httpClient.get<Record<string, any>[]>(\n '/v1/sessions/sandboxes',\n params,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get usage statistics for a session\n */\n async getUsage(sessionId?: string): Promise<UsageStats> {\n this.ensureNotLocal('Usage tracking');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to get usage for');\n }\n\n try {\n const safeSid = encodePathSegment(targetSessionId);\n const response = await this.httpClient.get<any>(\n `/v1/sessions/usage/${safeSid}`,\n undefined,\n this.authHeaders()\n );\n\n return {\n sessionsUsed: response.sessions_used || 0,\n executionTime: response.execution_time || 0,\n quotaRemaining: response.quota_remaining || 0,\n quotaLimit: response.quota_limit || 0,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to get usage stats: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current user profile.\n */\n async getCurrentUser(): Promise<CurrentUserResponse> {\n this.ensureNotLocal('User profile lookup');\n\n return this.httpClient.get<CurrentUserResponse>(\n '/v1/users/me',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get the current status of a session.\n */\n async getSessionStatus(sessionId?: string): Promise<SessionStatusResponse> {\n this.ensureNotLocal('Session management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n return this.httpClient.get<SessionStatusResponse>(\n `/v1/sessions/status/${safeSid}`,\n undefined,\n this.authHeaders()\n );\n }\n\n /**\n * Get session record details from ``GET /v1/sessions/session/{session_id}`` (Python: ``get_session_info``).\n */\n async getSessionInfo(sessionId?: string): Promise<Record<string, any>> {\n this.ensureNotLocal('Session management');\n\n const sid = sessionId || this._sessionId;\n if (!sid) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n try {\n const safeSid = encodePathSegment(sid);\n const result = await this.httpClient.get<unknown>(\n `/v1/sessions/session/${safeSid}`,\n undefined,\n this.authHeaders()\n );\n if (typeof result !== 'object' || result === null) {\n throw new SessionError('Failed to get session info: non-JSON response');\n }\n return result as Record<string, any>;\n } catch (error) {\n if (error instanceof InstaVMError) {\n throw error;\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(`Failed to get session info: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Day-wise usage breakdown from ``GET /v1/users/me/usage-breakdown`` (Python: ``get_usage_breakdown``).\n */\n async getUsageBreakdown(options: {\n startDate?: string;\n endDate?: string;\n days?: number;\n } = {}): Promise<Record<string, any>> {\n this.ensureNotLocal('Usage breakdown lookup');\n\n const params: Record<string, any> = { days: options.days ?? 30 };\n if (options.startDate !== undefined) {\n params.start_date = options.startDate;\n }\n if (options.endDate !== undefined) {\n params.end_date = options.endDate;\n }\n\n try {\n const result = await this.httpClient.get<unknown>(\n '/v1/users/me/usage-breakdown',\n params,\n this.authHeaders()\n );\n if (typeof result !== 'object' || result === null) {\n throw new InstaVMError('Failed to fetch usage breakdown: non-JSON response');\n }\n return result as Record<string, any>;\n } catch (error) {\n if (error instanceof InstaVMError) {\n throw error;\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new InstaVMError(`Failed to fetch usage breakdown: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Time-travel tape context manager (Python: ``tape()`` / ``TapeContext``).\n */\n tape(sessionId?: string | null, options: TapeStartOptions = {}): TapeContext {\n const sid = sessionId ?? this._sessionId ?? undefined;\n return new TapeContext(this.tapes, sid, options);\n }\n\n /** Build a tool-call recorder for an active tape id (Python: ``ToolCallRecorder``). */\n toolCallRecorder(tapeId: string): ToolCallRecorder {\n return new ToolCallRecorder(this.tapes, tapeId);\n }\n\n /**\n * @deprecated Streaming is not supported by the API; yields a single chunk from ``execute``.\n */\n async *executeStreaming(\n command: string,\n onOutput?: (chunk: string) => void\n ): AsyncGenerator<string, void, undefined> {\n // eslint-disable-next-line no-console\n console.warn(\n 'executeStreaming is deprecated. The API does not support streaming execution. Use execute() or executeAsync() instead.'\n );\n const result = await this.execute(command);\n const output = result.stdout || '';\n if (onOutput) {\n onOutput(output);\n }\n yield output;\n }\n\n // --- Vault (flat API parity with Python InstaVM) ---\n\n async listVaults(): Promise<VaultRecord[]> {\n return this.vaults.list();\n }\n\n async createVault(name: string, description?: string): Promise<VaultRecord> {\n return this.vaults.create(name, description);\n }\n\n async getVault(vaultId: string): Promise<VaultRecord> {\n return this.vaults.get(vaultId);\n }\n\n async updateVault(vaultId: string, updates: UpdateVaultOptions): Promise<VaultRecord> {\n return this.vaults.update(vaultId, updates);\n }\n\n async deleteVault(vaultId: string): Promise<Record<string, any>> {\n return this.vaults.delete(vaultId);\n }\n\n async discoverVault(vaultId: string): Promise<VaultDiscoverResponse> {\n return this.vaults.discover(vaultId);\n }\n\n async listVaultCredentials(vaultId: string): Promise<VaultCredential[]> {\n return this.vaults.listCredentials(vaultId);\n }\n\n async addVaultCredential(\n vaultId: string,\n name: string,\n value: string,\n options: AddVaultCredentialOptions = {}\n ): Promise<VaultCredential> {\n return this.vaults.addCredential(vaultId, name, value, options);\n }\n\n async rotateVaultCredential(\n vaultId: string,\n credentialId: string,\n value: string\n ): Promise<VaultCredential> {\n return this.vaults.rotateCredential(vaultId, credentialId, value);\n }\n\n async deleteVaultCredential(vaultId: string, credentialId: string): Promise<Record<string, any>> {\n return this.vaults.deleteCredential(vaultId, credentialId);\n }\n\n async listVaultServices(vaultId: string): Promise<VaultService[]> {\n return this.vaults.listServices(vaultId);\n }\n\n async addVaultService(\n vaultId: string,\n host: string,\n authConfig: Record<string, any>,\n options: AddVaultServiceOptions = {}\n ): Promise<VaultService> {\n return this.vaults.addService(vaultId, host, authConfig, options);\n }\n\n async deleteVaultService(vaultId: string, serviceId: string): Promise<Record<string, any>> {\n return this.vaults.deleteService(vaultId, serviceId);\n }\n\n async addVaultServicesFromTemplates(\n vaultId: string,\n templateIds: string[]\n ): Promise<Record<string, any>> {\n return this.vaults.addServicesFromTemplates(vaultId, templateIds);\n }\n\n async getVaultCatalog(): Promise<VaultCatalogTemplate[]> {\n return this.vaults.getCatalog();\n }\n\n async getVaultRequestLogs(vaultId: string, limit: number = 100): Promise<VaultRequestLog[]> {\n return this.vaults.getRequestLogs(vaultId, limit);\n }\n\n // --- Browser (client-level parity with Python InstaVM) ---\n\n async createBrowserSession(\n viewportWidth: number = 1920,\n viewportHeight: number = 1080,\n userAgent?: string\n ): Promise<string> {\n this.ensureNotLocal('Browser session management');\n const body: Record<string, any> = {\n viewport_width: viewportWidth,\n viewport_height: viewportHeight,\n };\n if (userAgent) {\n body.user_agent = userAgent;\n }\n try {\n const result = await this.httpClient.post<Record<string, any>>(\n '/v1/browser/sessions/',\n body,\n this.authHeaders()\n );\n const sid = result.session_id;\n if (!sid) {\n throw new BrowserSessionError('No session ID returned from server');\n }\n return sid;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to create browser session: ${msg}`, { cause: error as Error });\n }\n }\n\n async getBrowserSession(sessionId: string): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser session management');\n const safe = encodePathSegment(sessionId);\n try {\n return await this.httpClient.get<Record<string, any>>(\n `/v1/browser/sessions/${safe}`,\n undefined,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new BrowserSessionError('Browser session not found or expired', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to get browser session: ${msg}`, { cause: error as Error });\n }\n }\n\n async closeBrowserSession(sessionId: string): Promise<boolean> {\n this.ensureNotLocal('Browser session management');\n const safe = encodePathSegment(sessionId);\n try {\n await this.httpClient.delete(`/v1/browser/sessions/${safe}`, this.authHeaders());\n return true;\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n return true;\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to close browser session: ${msg}`, { cause: error as Error });\n }\n }\n\n async listBrowserSessions(): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Browser session management');\n const result = await this.httpClient.get<any>('/v1/browser/sessions/', undefined, this.authHeaders());\n if (Array.isArray(result)) {\n return result;\n }\n return result?.sessions || [];\n }\n\n async browserNavigate(\n url: string,\n sessionId?: string | null,\n waitTimeout: number = 30000\n ): Promise<Record<string, any>> {\n if (!this.local) {\n if (!sessionId) {\n throw new BrowserSessionError('session_id is required in cloud mode');\n }\n }\n const data: Record<string, any> = { url, wait_timeout: waitTimeout };\n if (!this.local && sessionId) {\n data.session_id = sessionId;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/navigate',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new BrowserSessionError('Browser session not found or expired', { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Navigation timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserNavigationError(`Failed to navigate: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserClick(\n selector: string,\n sessionId: string,\n force: boolean = false,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser click interaction');\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/click',\n { selector, session_id: sessionId, force, timeout },\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new ElementNotFoundError(`Element not found: ${selector}`, selector, { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Click timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to click element: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserType(\n selector: string,\n text: string,\n sessionId: string,\n delay: number = 100,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser type interaction');\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/type',\n { selector, text, session_id: sessionId, delay, timeout },\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new ElementNotFoundError(`Element not found: ${selector}`, selector, { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Type timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to type text: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserFill(\n selector: string,\n value: string,\n sessionId: string,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser fill interaction');\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/fill',\n { selector, value, session_id: sessionId, timeout },\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new ElementNotFoundError(`Element not found: ${selector}`, selector, { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Fill timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to fill form: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserScroll(\n sessionId: string,\n selector?: string | null,\n x?: number | null,\n y?: number | null\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser scroll interaction');\n if (selector == null && x == null && y == null) {\n throw new BrowserInteractionError(\n \"At least one of 'selector', 'x', or 'y' must be provided for scrolling.\"\n );\n }\n const data: Record<string, any> = { session_id: sessionId };\n if (selector) {\n data.selector = selector;\n }\n if (x != null) {\n data.x = x;\n }\n if (y != null) {\n data.y = y;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/scroll',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to scroll: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserWait(\n condition: string,\n sessionId: string,\n selector?: string | null,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser wait interaction');\n const data: Record<string, any> = { condition, session_id: sessionId, timeout };\n if (selector) {\n data.selector = selector;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/wait',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 408) {\n throw new BrowserTimeoutError(`Wait timeout for condition: ${condition}`, { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to wait for condition: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserScreenshot(\n sessionId: string,\n fullPage: boolean = true,\n clip?: Record<string, any> | null,\n format: string = 'png',\n quality?: number | null\n ): Promise<string> {\n this.ensureNotLocal('Browser screenshot');\n const data: Record<string, any> = {\n session_id: sessionId,\n full_page: fullPage,\n format,\n };\n if (clip) {\n data.clip = clip;\n }\n if (quality != null) {\n data.quality = quality;\n }\n try {\n const result = await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/screenshot',\n data,\n this.authHeaders()\n );\n return (result.screenshot as string) || '';\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to take screenshot: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserExtractElements(\n sessionId: string,\n selector?: string | null,\n attributes?: string[] | null\n ): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Browser element extraction');\n const data: Record<string, any> = { session_id: sessionId };\n if (selector) {\n data.selector = selector;\n }\n if (attributes?.length) {\n data.attributes = attributes;\n }\n try {\n const result = await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/extract',\n data,\n this.authHeaders()\n );\n return result.elements || [];\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to extract elements: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserExtractContent(\n sessionId?: string | null,\n url?: string | null,\n includeInteractive: boolean = true,\n includeAnchors: boolean = true,\n maxAnchors: number = 50\n ): Promise<Record<string, any>> {\n if (!this.local) {\n if (!sessionId) {\n throw new BrowserSessionError('session_id is required in cloud mode');\n }\n } else if (!url) {\n throw new BrowserInteractionError('url is required in local mode');\n }\n const data: Record<string, any> = {\n include_interactive: includeInteractive,\n include_anchors: includeAnchors,\n max_anchors: maxAnchors,\n };\n if (!this.local && sessionId) {\n data.session_id = sessionId;\n }\n if (this.local && url) {\n data.url = url;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/content',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new BrowserSessionError('Browser session not found or expired', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to extract content: ${msg}`, { cause: error as Error });\n }\n }\n\n /**\n * Download a file from the remote VM\n */\n async download(\n filename: string,\n options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n this.ensureNotLocal('File download');\n\n const targetSessionId = options.sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to download from');\n }\n\n try {\n // Use postFormUrlEncoded to match Python SDK behavior (sends form-urlencoded data)\n const response = await this.httpClient.postFormUrlEncoded<any>('/download', {\n filename,\n session_id: targetSessionId,\n });\n\n // Parse and decode base64 content from JSON response\n const encodedContent = response.content || '';\n const content = encodedContent\n ? Buffer.from(encodedContent, 'base64')\n : Buffer.from(response); // Fallback for backward compatibility\n\n return {\n success: true,\n filename,\n content,\n size: content.length,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File download failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current session ID\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Kill the VM associated with a session\n *\n * @param sessionId - The session UUID whose VM should be killed. If not provided, uses current sessionId\n * @returns Result containing success message and killed VM ID\n */\n async kill(sessionId?: string): Promise<{ success: boolean; killed: string }> {\n this.ensureNotLocal('VM kill operation');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please provide a sessionId or start a session first.');\n }\n\n try {\n const response = await this.httpClient.post<{ success: boolean; killed: string }>(\n '/kill',\n { session_id: targetSessionId },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n // Clear session_id if we killed the current session\n if (!sessionId && this._sessionId === targetSessionId) {\n this._sessionId = null;\n }\n\n return response;\n } catch (error) {\n if (error instanceof Error && 'statusCode' in error) {\n const statusCode = (error as { statusCode?: number }).statusCode;\n if (statusCode === 403) {\n throw new AuthenticationError(\"You don't own this session\", { cause: error });\n }\n if (statusCode === 404) {\n throw new SessionError(\"Session not found or no VM assigned to session (has execute() been called?)\", { cause: error });\n }\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to kill VM: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n // --- Egress Policy Methods ---\n\n /**\n * Set egress policy for a session\n */\n async setSessionEgress(\n options: EgressPolicyOptions = {},\n sessionId?: string\n ): Promise<{ status: string; sessionId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n const response = await this.httpClient.post<any>(\n `/v1/egress/session/${safeSid}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a session\n */\n async getSessionEgress(sessionId?: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n const response = await this.httpClient.get<any>(\n `/v1/egress/session/${safeSid}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n /**\n * Set egress policy for a specific VM\n */\n async setVmEgress(\n vmId: string,\n options: EgressPolicyOptions = {}\n ): Promise<{ status: string; vmId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const safeVmId = encodePathSegment(vmId);\n const response = await this.httpClient.post<any>(\n `/v1/egress/vm/${safeVmId}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a specific VM\n */\n async getVmEgress(vmId: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const safeVmId = encodePathSegment(vmId);\n const response = await this.httpClient.get<any>(\n `/v1/egress/vm/${safeVmId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n // --- SSH Key Methods ---\n\n /**\n * Add an SSH public key\n */\n async addSshKey(publicKey: string): Promise<SSHKey> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.post<any>(\n '/v1/ssh-keys',\n { public_key: publicKey },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n id: response.id,\n fingerprint: response.fingerprint,\n keyType: response.key_type,\n comment: response.comment ?? null,\n createdAt: response.created_at,\n };\n }\n\n /**\n * List all active SSH keys\n */\n async listSshKeys(): Promise<SSHKey[]> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.get<any>(\n '/v1/ssh-keys',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n const keys = response.keys || [];\n return keys.map((k: any) => ({\n id: k.id,\n fingerprint: k.fingerprint,\n keyType: k.key_type,\n comment: k.comment ?? null,\n createdAt: k.created_at,\n }));\n }\n\n /**\n * Delete an SSH key by ID\n */\n async deleteSshKey(keyId: number): Promise<{ status: string }> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.delete<any>(\n `/v1/ssh-keys/${keyId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Clean up resources\n */\n async dispose(): Promise<void> {\n if (this._sessionId && !this.local && this._vmUsed) {\n try {\n await this.kill();\n } catch (e) {\n // Ignore kill errors during disposal\n }\n } else if (this._sessionId) {\n await this.closeSession();\n }\n await this.browser.dispose();\n }\n}\n"],"mappings":"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","names":["path","path","path","path","fs","axios","axios","fs","FormData","FormData"]}