computesdk 1.10.1 → 1.10.2

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client/protocol.ts","../src/client/websocket.ts","../src/client/resources/command.ts","../src/client/resources/terminal-command.ts","../src/client/terminal.ts","../src/client/file-watcher.ts","../src/client/signal-service.ts","../src/client/index.ts","../src/client/resources/terminal.ts","../src/client/resources/server.ts","../src/client/resources/watcher.ts","../src/client/resources/session-token.ts","../src/client/resources/magic-link.ts","../src/client/resources/signal.ts","../src/client/resources/file.ts","../src/client/resources/env.ts","../src/client/resources/auth.ts","../src/client/resources/run.ts","../src/client/resources/child.ts","../src/client/types.ts","../src/provider-config.ts","../src/constants.ts","../src/auto-detect.ts","../src/explicit-config.ts","../src/compute-daemon/lifecycle.ts","../src/compute.ts","../src/request-handler.ts"],"sourcesContent":["/**\n * ComputeSDK - User-facing SDK\n *\n * Provides the universal Sandbox class and compute API for executing code in remote sandboxes.\n *\n * Zero-Config Mode (Gateway):\n * Set COMPUTESDK_API_KEY and provider credentials (e.g., E2B_API_KEY)\n * No explicit configuration needed - auto-detects from environment\n *\n * Explicit Mode (Gateway with inline config):\n * compute({ provider: 'e2b', apiKey: '...', e2b: { apiKey: '...' } })\n * Always uses gateway mode, returns new instance\n *\n * Direct Mode (Provider SDKs):\n * Use @computesdk/provider's createCompute() with provider packages\n * Bypasses gateway, talks directly to provider APIs\n */\n\n// ============================================================================\n// Universal Sandbox Interface & Types \n// ============================================================================\n\n// Export universal Sandbox interface and supporting types\n// These are the canonical type definitions that all providers should use\n//\n// Note: The interface is renamed from \"Sandbox\" to \"SandboxInterface\" on export\n// to avoid collision with the gateway Sandbox class below. Use \"SandboxInterface\"\n// when writing provider-agnostic code that accepts any sandbox implementation.\nexport type {\n Sandbox as SandboxInterface,\n Runtime,\n CodeResult,\n CommandResult,\n SandboxInfo,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n CreateSandboxOptions\n} from './types/universal-sandbox';\n\n// ============================================================================\n// Sandbox Client - Gateway Implementation\n// ============================================================================\n\n// Export gateway Sandbox class (implements the SandboxInterface above)\n//\n// Usage guide:\n// - import { Sandbox } from 'computesdk' → Gateway Sandbox class (for runtime use)\n// - import type { SandboxInterface } from 'computesdk' → Universal interface (for type annotations)\n//\n// Use the class when working with gateway sandboxes specifically.\n// Use the interface when writing functions that accept any sandbox (gateway, e2b, modal, etc.)\nexport { Sandbox, Sandbox as GatewaySandbox } from './client';\n\n// Export client-specific types\nexport type { SandboxStatus, ProviderSandboxInfo } from './client/types';\nexport { CommandExitError, isCommandExitError } from './client/types';\n\n// Re-export commonly used client utilities\nexport { \n TerminalInstance,\n FileWatcher,\n SignalService,\n encodeBinaryMessage,\n decodeBinaryMessage,\n MessageType\n} from './client';\n\n// ============================================================================\n// Compute API - Gateway HTTP Implementation\n// ============================================================================\n\n// Export compute singleton/callable - the main API\n// Works as both: compute.sandbox.create() and compute({...}).sandbox.create()\nexport { compute } from './compute';\n\n// ============================================================================\n// Provider Configuration & Detection\n// ============================================================================\n\n// Export auto-detection utilities\nexport {\n isGatewayModeEnabled,\n detectProvider,\n getProviderHeaders,\n autoConfigureCompute\n} from './auto-detect';\n\n// Export provider configuration utilities\nexport {\n GATEWAY_URL,\n PROVIDER_PRIORITY,\n PROVIDER_ENV_VARS,\n} from './constants';\n\nexport {\n PROVIDER_AUTH,\n PROVIDER_NAMES,\n PROVIDER_HEADERS,\n PROVIDER_ENV_MAP,\n PROVIDER_DASHBOARD_URLS,\n type ProviderName,\n isValidProvider,\n buildProviderHeaders,\n getProviderConfigFromEnv,\n isProviderAuthComplete,\n getMissingEnvVars,\n} from './provider-config';\n\n// ============================================================================\n// Web Framework Integration\n// ============================================================================\n\n// Export request handler for web framework integration\nexport { handleComputeRequest } from './request-handler';\nexport type {\n ComputeRequest,\n ComputeResponse,\n HandleComputeRequestParams\n} from './request-handler';\n\n// ============================================================================\n// Note: Provider Framework\n// ============================================================================\n\n// For building custom providers, use @computesdk/provider\n// import { defineProvider } from '@computesdk/provider';\n","/**\n * Binary WebSocket Protocol Implementation\n *\n * Implements the ComputeSDK binary protocol for WebSocket communication.\n * Provides 50-90% size reduction compared to JSON protocol.\n *\n * Binary Message Format:\n * [1 byte: message type]\n * [2 bytes: channel length (uint16, big-endian)]\n * [N bytes: channel string (UTF-8)]\n * [2 bytes: msg type length (uint16, big-endian)]\n * [N bytes: msg type string (UTF-8)]\n * [4 bytes: data length (uint32, big-endian)]\n * [N bytes: data (key-value encoded for complex objects, raw bytes for binary data)]\n *\n * Key-Value Encoding Format:\n * [2 bytes: num_fields (uint16, big-endian)]\n * For each field:\n * [2 bytes: key_length (uint16, big-endian)]\n * [N bytes: key string (UTF-8)]\n * [1 byte: value_type (0x01=string, 0x02=number, 0x03=boolean, 0x04=bytes)]\n * [4 bytes: value_length (uint32, big-endian)]\n * [N bytes: value data]\n */\n\n// ============================================================================\n// Message Type Constants\n// ============================================================================\n\nexport enum MessageType {\n Subscribe = 0x01,\n Unsubscribe = 0x02,\n Data = 0x03,\n Error = 0x04,\n Connected = 0x05,\n}\n\n/**\n * Value types for binary key-value encoding\n */\nenum ValueType {\n String = 0x01,\n Number = 0x02,\n Boolean = 0x03,\n Bytes = 0x04,\n}\n\n// ============================================================================\n// Binary Message Structure\n// ============================================================================\n\nexport interface BinaryMessage {\n type: MessageType;\n channel: string;\n msgType: string;\n data: any;\n}\n\n// ============================================================================\n// Key-Value Encoding Functions\n// ============================================================================\n\n// Reusable encoder/decoder instances for better performance\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\n/**\n * Get the size in bytes of a value\n */\nfunction getValueSize(value: any): number {\n if (typeof value === 'string') {\n return textEncoder.encode(value).length;\n } else if (typeof value === 'number') {\n return 8; // float64\n } else if (typeof value === 'boolean') {\n return 1;\n } else if (value instanceof Uint8Array) {\n return value.length;\n }\n return 0;\n}\n\n/**\n * Encode a key-value object to binary format\n * Format:\n * [2 bytes: num_fields (uint16, big-endian)]\n * For each field:\n * [2 bytes: key_length (uint16, big-endian)]\n * [N bytes: key string (UTF-8)]\n * [1 byte: value_type]\n * [4 bytes: value_length (uint32, big-endian)]\n * [N bytes: value data]\n */\nfunction encodeKeyValue(data: Record<string, any>): Uint8Array {\n\n // Calculate total size\n let totalSize = 2; // num_fields\n const fields = Object.entries(data);\n\n for (const [key, value] of fields) {\n const keyBytes = textEncoder.encode(key);\n totalSize += 2; // key_length\n totalSize += keyBytes.length; // key\n totalSize += 1; // value_type\n totalSize += 4; // value_length\n totalSize += getValueSize(value); // value\n }\n\n const buffer = new Uint8Array(totalSize);\n const view = new DataView(buffer.buffer);\n let offset = 0;\n\n // Write number of fields\n view.setUint16(offset, fields.length, false); // big-endian\n offset += 2;\n\n // Write each field\n for (const [key, value] of fields) {\n // Write key\n const keyBytes = textEncoder.encode(key);\n view.setUint16(offset, keyBytes.length, false);\n offset += 2;\n buffer.set(keyBytes, offset);\n offset += keyBytes.length;\n\n // Write value type and data\n if (typeof value === 'string') {\n buffer[offset] = ValueType.String;\n offset++;\n const valueBytes = textEncoder.encode(value);\n view.setUint32(offset, valueBytes.length, false);\n offset += 4;\n buffer.set(valueBytes, offset);\n offset += valueBytes.length;\n } else if (typeof value === 'number') {\n buffer[offset] = ValueType.Number;\n offset++;\n view.setUint32(offset, 8, false); // float64 is 8 bytes\n offset += 4;\n view.setFloat64(offset, value, false); // big-endian\n offset += 8;\n } else if (typeof value === 'boolean') {\n buffer[offset] = ValueType.Boolean;\n offset++;\n view.setUint32(offset, 1, false);\n offset += 4;\n buffer[offset] = value ? 0x01 : 0x00;\n offset++;\n } else if (value instanceof Uint8Array) {\n buffer[offset] = ValueType.Bytes;\n offset++;\n view.setUint32(offset, value.length, false);\n offset += 4;\n buffer.set(value, offset);\n offset += value.length;\n } else {\n throw new Error(`Unsupported value type for key ${key}: ${typeof value}`);\n }\n }\n\n return buffer;\n}\n\n/**\n * Decode binary key-value format to object\n */\nfunction decodeKeyValue(data: Uint8Array): Record<string, any> {\n if (data.length < 2) {\n throw new Error('Data too short for key-value encoding');\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const result: Record<string, any> = {};\n let offset = 0;\n\n // Read number of fields\n const numFields = view.getUint16(offset, false); // big-endian\n offset += 2;\n\n // Read each field\n for (let i = 0; i < numFields; i++) {\n // Read key\n if (offset + 2 > data.length) {\n throw new Error(`Invalid key length at field ${i}`);\n }\n const keyLen = view.getUint16(offset, false);\n offset += 2;\n\n if (offset + keyLen > data.length) {\n throw new Error(`Key data truncated at field ${i}`);\n }\n const key = textDecoder.decode(data.slice(offset, offset + keyLen));\n offset += keyLen;\n\n // Read value type\n if (offset + 1 > data.length) {\n throw new Error(`Invalid value type at field ${i}`);\n }\n const valueType = data[offset];\n offset++;\n\n // Read value length\n if (offset + 4 > data.length) {\n throw new Error(`Invalid value length at field ${i}`);\n }\n const valueLen = view.getUint32(offset, false);\n offset += 4;\n\n // Read value data\n if (offset + valueLen > data.length) {\n throw new Error(`Value data truncated at field ${i}`);\n }\n const valueData = data.slice(offset, offset + valueLen);\n offset += valueLen;\n\n // Decode value based on type\n switch (valueType) {\n case ValueType.String:\n result[key] = textDecoder.decode(valueData);\n break;\n\n case ValueType.Number:\n if (valueData.length !== 8) {\n throw new Error(`Invalid number length for field ${key}`);\n }\n const valueView = new DataView(valueData.buffer, valueData.byteOffset);\n result[key] = valueView.getFloat64(0, false); // big-endian\n break;\n\n case ValueType.Boolean:\n if (valueData.length !== 1) {\n throw new Error(`Invalid boolean length for field ${key}`);\n }\n result[key] = valueData[0] !== 0x00;\n break;\n\n case ValueType.Bytes:\n result[key] = valueData;\n break;\n\n default:\n throw new Error(`Unknown value type 0x${valueType.toString(16)} for field ${key}`);\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Encoding Functions\n// ============================================================================\n\n/**\n * Encode a WebSocket message to binary format\n * @param message - The message object to encode\n * @returns ArrayBuffer containing the encoded binary message\n */\nexport function encodeBinaryMessage(message: any): ArrayBuffer {\n // Determine message type based on message structure\n let messageType: MessageType;\n let channel = '';\n let msgType = '';\n let data: any = {};\n\n if (message.type === 'subscribe') {\n messageType = MessageType.Subscribe;\n channel = message.channel || '';\n msgType = 'subscribe';\n data = {};\n } else if (message.type === 'unsubscribe') {\n messageType = MessageType.Unsubscribe;\n channel = message.channel || '';\n msgType = 'unsubscribe';\n data = {};\n } else {\n // Generic data message\n messageType = MessageType.Data;\n channel = message.channel || '';\n msgType = message.type || '';\n data = message.data || message;\n }\n\n // Convert strings to UTF-8 bytes\n const channelBytes = encodeUTF8(channel);\n const msgTypeBytes = encodeUTF8(msgType);\n\n // Encode data field (if present)\n let dataBytes: Uint8Array;\n if (data === undefined || data === null) {\n dataBytes = new Uint8Array(0);\n } else if (typeof data === 'string') {\n dataBytes = encodeUTF8(data);\n } else if (data instanceof Uint8Array) {\n dataBytes = data;\n } else if (typeof data === 'object') {\n // Complex object - use key-value encoding\n dataBytes = encodeKeyValue(data);\n } else {\n throw new Error(`Unsupported data type: ${typeof data}`);\n }\n\n // Calculate total size\n const totalSize = 1 + 2 + channelBytes.length + 2 + msgTypeBytes.length + 4 + dataBytes.length;\n\n // Create buffer and view\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n let offset = 0;\n\n // Write message type (1 byte)\n view.setUint8(offset, messageType);\n offset += 1;\n\n // Write channel length (2 bytes, big-endian)\n view.setUint16(offset, channelBytes.length, false);\n offset += 2;\n\n // Write channel bytes\n const uint8View = new Uint8Array(buffer);\n uint8View.set(channelBytes, offset);\n offset += channelBytes.length;\n\n // Write msg type length (2 bytes, big-endian)\n view.setUint16(offset, msgTypeBytes.length, false);\n offset += 2;\n\n // Write msg type bytes\n uint8View.set(msgTypeBytes, offset);\n offset += msgTypeBytes.length;\n\n // Write data length (4 bytes, big-endian)\n view.setUint32(offset, dataBytes.length, false);\n offset += 4;\n\n // Write data bytes\n uint8View.set(dataBytes, offset);\n\n return buffer;\n}\n\n// ============================================================================\n// Decoding Functions\n// ============================================================================\n\n/**\n * Decode a binary WebSocket message\n * @param buffer - The binary data to decode (ArrayBuffer or Uint8Array)\n * @returns Decoded message object\n */\nexport function decodeBinaryMessage(buffer: ArrayBuffer | Uint8Array): any {\n // Convert to ArrayBuffer if needed\n const arrayBuffer = buffer instanceof Uint8Array ? buffer.buffer : buffer;\n const view = new DataView(arrayBuffer);\n const uint8View = new Uint8Array(arrayBuffer);\n let offset = 0;\n\n // Read message type (1 byte)\n const messageType = view.getUint8(offset);\n offset += 1;\n\n // Read channel length (2 bytes, big-endian)\n const channelLength = view.getUint16(offset, false);\n offset += 2;\n\n // Read channel string\n const channelBytes = uint8View.slice(offset, offset + channelLength);\n const channel = decodeUTF8(channelBytes);\n offset += channelLength;\n\n // Read msg type length (2 bytes, big-endian)\n const msgTypeLength = view.getUint16(offset, false);\n offset += 2;\n\n // Read msg type string\n const msgTypeBytes = uint8View.slice(offset, offset + msgTypeLength);\n const msgType = decodeUTF8(msgTypeBytes);\n offset += msgTypeLength;\n\n // Read data length (4 bytes, big-endian)\n const dataLength = view.getUint32(offset, false);\n offset += 4;\n\n // Read data bytes\n const dataBytes = uint8View.slice(offset, offset + dataLength);\n\n // Try to decode as key-value for message types that expect structured data\n const shouldTryKeyValue = ['terminal:input', 'terminal:resize', 'file:changed', 'terminal:output', 'signal', 'test'].includes(msgType);\n\n let data: any;\n if (dataBytes.length === 0) {\n // Empty data\n data = {};\n } else if (shouldTryKeyValue) {\n try {\n // Try to decode as key-value\n data = decodeKeyValue(dataBytes);\n } catch {\n // If key-value decode fails, fall back to raw bytes\n data = dataBytes;\n }\n } else {\n // For other message types, keep as raw bytes\n data = dataBytes;\n }\n\n // Construct message object based on message type\n if (messageType === MessageType.Subscribe || messageType === MessageType.Unsubscribe) {\n return {\n type: msgType,\n channel: channel,\n };\n }\n\n // For data messages, construct the standard message format\n return {\n type: msgType,\n channel: channel,\n data: data,\n };\n}\n\n// ============================================================================\n// UTF-8 Encoding/Decoding Helpers\n// ============================================================================\n\n/**\n * Encode a string to UTF-8 bytes\n * @param str - The string to encode\n * @returns Uint8Array containing UTF-8 encoded bytes\n */\nfunction encodeUTF8(str: string): Uint8Array {\n // Use TextEncoder if available (modern browsers and Node.js)\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n }\n\n // Fallback for older environments\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));\n } else {\n // UTF-16 surrogate pair\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n}\n\n/**\n * Decode UTF-8 bytes to a string\n * @param bytes - The UTF-8 encoded bytes\n * @returns Decoded string\n */\nfunction decodeUTF8(bytes: Uint8Array): string {\n // Use TextDecoder if available (modern browsers and Node.js)\n if (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder();\n return decoder.decode(bytes);\n }\n\n // Fallback for older environments\n let str = '';\n let i = 0;\n while (i < bytes.length) {\n const c = bytes[i++];\n if (c < 0x80) {\n str += String.fromCharCode(c);\n } else if (c < 0xe0) {\n str += String.fromCharCode(((c & 0x1f) << 6) | (bytes[i++] & 0x3f));\n } else if (c < 0xf0) {\n str += String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f));\n } else {\n const c2 = ((c & 0x07) << 18) | ((bytes[i++] & 0x3f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f);\n const c3 = c2 - 0x10000;\n str += String.fromCharCode(0xd800 | (c3 >> 10), 0xdc00 | (c3 & 0x3ff));\n }\n }\n return str;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if data is binary (ArrayBuffer, Uint8Array, or Blob)\n * @param data - The data to check\n * @returns True if data is binary\n */\nexport function isBinaryData(data: any): boolean {\n return data instanceof ArrayBuffer || data instanceof Uint8Array || data instanceof Blob;\n}\n\n/**\n * Convert Blob to ArrayBuffer\n * @param blob - The Blob to convert\n * @returns Promise that resolves to ArrayBuffer\n */\nexport async function blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n if (blob.arrayBuffer) {\n return blob.arrayBuffer();\n }\n\n // Fallback for older browsers\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as ArrayBuffer);\n reader.onerror = reject;\n reader.readAsArrayBuffer(blob);\n });\n}\n","/**\n * WebSocket Manager for ComputeSDK Client\n *\n * Handles real-time bidirectional communication with sandbox API\n */\n\nimport {\n encodeBinaryMessage,\n decodeBinaryMessage,\n isBinaryData,\n blobToArrayBuffer,\n} from './protocol';\n\n// ============================================================================\n// WebSocket Message Types\n// ============================================================================\n\n/**\n * Base WebSocket message structure\n */\nexport interface WebSocketMessage<T = any> {\n type: string;\n channel?: string;\n data?: T;\n}\n\n/**\n * Channel subscription message\n */\nexport interface SubscribeMessage {\n type: 'subscribe';\n channel: string;\n}\n\n/**\n * Channel unsubscription message\n */\nexport interface UnsubscribeMessage {\n type: 'unsubscribe';\n channel: string;\n}\n\n// ============================================================================\n// Outgoing Message Types (Client → Server)\n// ============================================================================\n\n/**\n * Send input to a terminal\n * Note: input is sent as-is (not encoded by client SDK)\n */\nexport interface TerminalInputMessage {\n type: 'terminal:input';\n data: {\n terminal_id: string;\n input: string;\n };\n}\n\n/**\n * Resize terminal window\n */\nexport interface TerminalResizeMessage {\n type: 'terminal:resize';\n data: {\n terminal_id: string;\n cols: number;\n rows: number;\n };\n}\n\nexport type OutgoingMessage =\n | SubscribeMessage\n | UnsubscribeMessage\n | TerminalInputMessage\n | TerminalResizeMessage;\n\n// ============================================================================\n// Incoming Message Types (Server → Client)\n// ============================================================================\n\n/**\n * Terminal created notification\n */\nexport interface TerminalCreatedMessage {\n type: 'terminal:created';\n channel: string;\n data: {\n id: string;\n status: 'running' | 'stopped';\n };\n}\n\n/**\n * Terminal output data\n * Note: output field may be base64 encoded depending on encoding field\n */\nexport interface TerminalOutputMessage {\n type: 'terminal:output';\n channel: string;\n data: {\n output: string; // raw string or base64 encoded, check encoding field\n encoding?: 'raw' | 'base64'; // indicates how output is encoded\n };\n}\n\n/**\n * Terminal destroyed notification\n */\nexport interface TerminalDestroyedMessage {\n type: 'terminal:destroyed';\n channel: string;\n data: {\n id: string;\n };\n}\n\n/**\n * Terminal error notification\n */\nexport interface TerminalErrorMessage {\n type: 'terminal:error';\n channel: string;\n data: {\n error: string;\n };\n}\n\n/**\n * File watcher created notification\n */\nexport interface WatcherCreatedMessage {\n type: 'watcher:created';\n channel: string;\n data: {\n id: string;\n path: string;\n };\n}\n\n/**\n * File change event\n * Note: content field may be base64 encoded depending on encoding field\n */\nexport interface FileChangedMessage {\n type: 'file:changed';\n channel: string;\n data: {\n event: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir';\n path: string;\n content?: string; // raw string or base64 encoded, check encoding field\n encoding?: 'raw' | 'base64'; // indicates how content is encoded\n };\n}\n\n/**\n * File watcher destroyed notification\n */\nexport interface WatcherDestroyedMessage {\n type: 'watcher:destroyed';\n channel: string;\n data: {\n id: string;\n };\n}\n\n/**\n * System signal event\n */\nexport interface SignalMessage {\n type: 'signal';\n channel: 'signals';\n data: {\n signal: 'port' | 'error' | 'server-ready';\n port?: number;\n url?: string;\n message?: string;\n };\n}\n\n/**\n * Sandbox created notification\n */\nexport interface SandboxCreatedMessage {\n type: 'sandbox.created';\n data: {\n subdomain: string;\n url: string;\n };\n}\n\n/**\n * Sandbox deleted notification\n */\nexport interface SandboxDeletedMessage {\n type: 'sandbox.deleted';\n data: {\n subdomain: string;\n };\n}\n\nexport type IncomingMessage =\n | TerminalCreatedMessage\n | TerminalOutputMessage\n | TerminalDestroyedMessage\n | TerminalErrorMessage\n | WatcherCreatedMessage\n | FileChangedMessage\n | WatcherDestroyedMessage\n | SignalMessage\n | SandboxCreatedMessage\n | SandboxDeletedMessage;\n\n// ============================================================================\n// WebSocket Manager Configuration\n// ============================================================================\n\nexport type WebSocketConstructor = new (url: string) => WebSocket;\n\nexport interface WebSocketManagerConfig {\n /** WebSocket URL (will be generated from client config if not provided) */\n url: string;\n /** WebSocket implementation */\n WebSocket: WebSocketConstructor;\n /** Enable automatic reconnection on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Reconnection delay in milliseconds (default: 1000) */\n reconnectDelay?: number;\n /** Maximum reconnection attempts (default: 5, 0 = infinite) */\n maxReconnectAttempts?: number;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n /** WebSocket protocol: 'binary' (default, recommended) or 'json' (for debugging) */\n protocol?: 'json' | 'binary';\n}\n\n// ============================================================================\n// Event Handler Types\n// ============================================================================\n\nexport type MessageHandler<T = any> = (message: T) => void;\nexport type ErrorHandler = (error: Event) => void;\nexport type ConnectionHandler = () => void;\n\n// ============================================================================\n// WebSocket Manager\n// ============================================================================\n\n/**\n * WebSocket Manager for handling real-time communication\n *\n * @example\n * ```typescript\n * import { ComputeClient } from '@computesdk/client'\n *\n * const client = new ComputeClient({ sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com' });\n * await client.generateToken();\n *\n * // Create WebSocket manager\n * const ws = client.createWebSocketManager();\n *\n * // Listen for connection\n * ws.on('open', () => {\n * console.log('Connected!');\n * });\n *\n * // Subscribe to terminal output\n * ws.subscribe('terminal:term_abc123');\n * ws.on('terminal:output', (msg) => {\n * console.log('Terminal output:', msg.data.output);\n * });\n *\n * // Send terminal input\n * ws.sendTerminalInput('term_abc123', 'ls -la\\n');\n *\n * // Subscribe to file changes\n * ws.subscribe('watcher:watcher_xyz789');\n * ws.on('file:changed', (msg) => {\n * console.log('File changed:', msg.data.path, msg.data.event);\n * });\n *\n * // Subscribe to signals\n * ws.subscribe('signals');\n * ws.on('signal', (msg) => {\n * console.log('Signal:', msg.data);\n * });\n * ```\n */\nexport class WebSocketManager {\n private config: Required<WebSocketManagerConfig>;\n private ws: WebSocket | null = null;\n private eventHandlers: Map<string, Set<MessageHandler>> = new Map();\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private subscribedChannels: Set<string> = new Set();\n private isManualClose = false;\n\n constructor(config: WebSocketManagerConfig) {\n this.config = {\n url: config.url,\n WebSocket: config.WebSocket,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 5,\n debug: config.debug ?? false,\n protocol: config.protocol ?? 'binary',\n };\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n /**\n * Connect to WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.isManualClose = false;\n this.log('Connecting to WebSocket URL:', this.config.url);\n this.ws = new this.config.WebSocket(this.config.url);\n\n this.ws.onopen = () => {\n this.log('Connected to WebSocket server');\n this.reconnectAttempts = 0;\n\n // Resubscribe to channels after reconnection\n if (this.subscribedChannels.size > 0) {\n this.log('Resubscribing to channels:', Array.from(this.subscribedChannels));\n this.subscribedChannels.forEach((channel) => {\n this.sendRaw({ type: 'subscribe', channel });\n });\n }\n\n this.emit('open');\n resolve();\n };\n\n this.ws.onmessage = async (event) => {\n try {\n let message: IncomingMessage;\n\n // Check if message is binary\n if (this.config.protocol === 'binary' && isBinaryData(event.data)) {\n // Handle binary message\n let buffer: ArrayBuffer;\n if (event.data instanceof Blob) {\n buffer = await blobToArrayBuffer(event.data);\n } else {\n buffer = event.data;\n }\n message = decodeBinaryMessage(buffer) as IncomingMessage;\n this.log('Received binary message:', message);\n } else {\n // Handle JSON message\n message = JSON.parse(event.data) as IncomingMessage;\n this.log('Received JSON message:', message);\n }\n\n this.handleMessage(message);\n } catch (error) {\n this.log('Failed to parse message:', error);\n }\n };\n\n this.ws.onerror = (error) => {\n this.log('WebSocket error:', error);\n this.emit('error', error);\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.log('WebSocket connection closed');\n this.emit('close');\n\n // Attempt reconnection if enabled and not manually closed\n if (this.config.autoReconnect && !this.isManualClose) {\n this.attemptReconnect();\n }\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n disconnect(): void {\n this.isManualClose = true;\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Check if WebSocket is connected\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Attempt to reconnect to WebSocket server\n */\n private attemptReconnect(): void {\n if (\n this.config.maxReconnectAttempts > 0 &&\n this.reconnectAttempts >= this.config.maxReconnectAttempts\n ) {\n this.log('Max reconnection attempts reached');\n this.emit('reconnect-failed');\n return;\n }\n\n this.reconnectAttempts++;\n this.log(`Reconnecting... (attempt ${this.reconnectAttempts})`);\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n this.log('Reconnection failed:', error);\n });\n }, this.config.reconnectDelay);\n }\n\n // ============================================================================\n // Channel Subscription\n // ============================================================================\n\n /**\n * Subscribe to a channel\n * @param channel - Channel name (e.g., 'terminal:term_abc123', 'watcher:watcher_xyz789', 'signals')\n */\n subscribe(channel: string): void {\n this.subscribedChannels.add(channel);\n this.sendRaw({ type: 'subscribe', channel });\n this.log('Subscribed to channel:', channel);\n }\n\n /**\n * Unsubscribe from a channel\n */\n unsubscribe(channel: string): void {\n this.subscribedChannels.delete(channel);\n this.sendRaw({ type: 'unsubscribe', channel });\n this.log('Unsubscribed from channel:', channel);\n }\n\n /**\n * Get list of subscribed channels\n */\n getSubscribedChannels(): string[] {\n return Array.from(this.subscribedChannels);\n }\n\n // ============================================================================\n // Message Sending\n // ============================================================================\n\n /**\n * Send raw message to server\n */\n private sendRaw(message: OutgoingMessage): void {\n if (!this.isConnected()) {\n throw new Error('WebSocket is not connected');\n }\n\n if (this.config.protocol === 'binary') {\n // Send as binary message\n const buffer = encodeBinaryMessage(message);\n this.ws!.send(buffer);\n this.log('Sent binary message:', message);\n } else {\n // Send as JSON message\n this.ws!.send(JSON.stringify(message));\n this.log('Sent JSON message:', message);\n }\n }\n\n /**\n * Send input to a terminal (sent as-is, not encoded)\n */\n sendTerminalInput(terminalId: string, input: string): void {\n this.sendRaw({\n type: 'terminal:input',\n data: { terminal_id: terminalId, input },\n });\n }\n\n /**\n * Resize terminal window\n */\n resizeTerminal(terminalId: string, cols: number, rows: number): void {\n this.sendRaw({\n type: 'terminal:resize',\n data: { terminal_id: terminalId, cols, rows },\n });\n }\n\n // ============================================================================\n // Event Handling\n // ============================================================================\n\n /**\n * Register event handler\n */\n on(event: 'open', handler: ConnectionHandler): void;\n on(event: 'close', handler: ConnectionHandler): void;\n on(event: 'error', handler: ErrorHandler): void;\n on(event: 'reconnect-failed', handler: ConnectionHandler): void;\n on(event: 'terminal:created', handler: MessageHandler<TerminalCreatedMessage>): void;\n on(event: 'terminal:output', handler: MessageHandler<TerminalOutputMessage>): void;\n on(event: 'terminal:destroyed', handler: MessageHandler<TerminalDestroyedMessage>): void;\n on(event: 'terminal:error', handler: MessageHandler<TerminalErrorMessage>): void;\n on(event: 'watcher:created', handler: MessageHandler<WatcherCreatedMessage>): void;\n on(event: 'file:changed', handler: MessageHandler<FileChangedMessage>): void;\n on(event: 'watcher:destroyed', handler: MessageHandler<WatcherDestroyedMessage>): void;\n on(event: 'signal', handler: MessageHandler<SignalMessage>): void;\n on(event: 'sandbox.created', handler: MessageHandler<SandboxCreatedMessage>): void;\n on(event: 'sandbox.deleted', handler: MessageHandler<SandboxDeletedMessage>): void;\n on(event: string, handler: MessageHandler): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off(event: string, handler: MessageHandler): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Unregister all event handlers for an event\n */\n offAll(event: string): void {\n this.eventHandlers.delete(event);\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit(event: string, data?: any): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n this.log('Error in event handler:', error);\n }\n });\n }\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(message: IncomingMessage): void {\n // Emit message type event\n this.emit(message.type, message);\n\n // Also emit on channel if present\n if ('channel' in message && message.channel) {\n this.emit(message.channel, message);\n }\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Log debug message if debug mode is enabled\n */\n private log(...args: any[]): void {\n if (this.config.debug) {\n console.log('[WebSocketManager]', ...args);\n }\n }\n\n /**\n * Get current connection state\n */\n getState(): 'connecting' | 'open' | 'closing' | 'closed' {\n if (!this.ws) return 'closed';\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return 'connecting';\n case WebSocket.OPEN:\n return 'open';\n case WebSocket.CLOSING:\n return 'closing';\n case WebSocket.CLOSED:\n return 'closed';\n default:\n return 'closed';\n }\n }\n\n /**\n * Get reconnection attempt count\n */\n getReconnectAttempts(): number {\n return this.reconnectAttempts;\n }\n}\n","/**\n * Command - Represents a command execution in a terminal\n */\n\nimport type { CommandDetailsResponse } from '../index';\n\n/**\n * Command execution result with wait capability\n */\nexport class Command {\n readonly id: string;\n readonly terminalId: string;\n readonly command: string;\n private _status: 'running' | 'completed' | 'failed';\n private _stdout: string;\n private _stderr: string;\n private _exitCode?: number;\n private _durationMs?: number;\n private _startedAt: string;\n private _finishedAt?: string;\n\n private waitHandler?: (timeout?: number) => Promise<CommandDetailsResponse>;\n private retrieveHandler?: () => Promise<CommandDetailsResponse>;\n\n constructor(data: {\n cmdId: string;\n terminalId: string;\n command: string;\n status: 'running' | 'completed' | 'failed';\n stdout: string;\n stderr: string;\n exitCode?: number;\n durationMs?: number;\n startedAt: string;\n finishedAt?: string;\n }) {\n this.id = data.cmdId;\n this.terminalId = data.terminalId;\n this.command = data.command;\n this._status = data.status;\n this._stdout = data.stdout;\n this._stderr = data.stderr;\n this._exitCode = data.exitCode;\n this._durationMs = data.durationMs;\n this._startedAt = data.startedAt;\n this._finishedAt = data.finishedAt;\n }\n\n get status(): 'running' | 'completed' | 'failed' {\n return this._status;\n }\n\n get stdout(): string {\n return this._stdout;\n }\n\n get stderr(): string {\n return this._stderr;\n }\n\n get exitCode(): number | undefined {\n return this._exitCode;\n }\n\n get durationMs(): number | undefined {\n return this._durationMs;\n }\n\n get startedAt(): string {\n return this._startedAt;\n }\n\n get finishedAt(): string | undefined {\n return this._finishedAt;\n }\n\n /**\n * Set the wait handler (called by TerminalCommands)\n * @internal\n */\n setWaitHandler(handler: (timeout?: number) => Promise<CommandDetailsResponse>): void {\n this.waitHandler = handler;\n }\n\n /**\n * Set the retrieve handler (called by TerminalCommands)\n * @internal\n */\n setRetrieveHandler(handler: () => Promise<CommandDetailsResponse>): void {\n this.retrieveHandler = handler;\n }\n\n /**\n * Wait for the command to complete\n * @param timeout - Optional timeout in seconds (0 = no timeout)\n * @returns This command with updated status\n */\n async wait(timeout?: number): Promise<this> {\n if (!this.waitHandler) {\n throw new Error('Wait handler not set');\n }\n\n const response = await this.waitHandler(timeout);\n this.updateFromResponse(response);\n return this;\n }\n\n /**\n * Refresh the command status from the server\n * @returns This command with updated status\n */\n async refresh(): Promise<this> {\n if (!this.retrieveHandler) {\n throw new Error('Retrieve handler not set');\n }\n\n const response = await this.retrieveHandler();\n this.updateFromResponse(response);\n return this;\n }\n\n /**\n * Update internal state from API response\n */\n private updateFromResponse(response: CommandDetailsResponse): void {\n this._status = response.data.status;\n this._stdout = response.data.stdout;\n this._stderr = response.data.stderr;\n this._exitCode = response.data.exit_code;\n this._durationMs = response.data.duration_ms;\n this._finishedAt = response.data.finished_at;\n }\n}\n","/**\n * TerminalCommand - Resource namespace for terminal commands\n */\n\nimport { Command } from './command';\nimport type { CommandsListResponse, CommandDetailsResponse, CommandExecutionResponse } from '../index';\n\n/**\n * Command resource namespace for a terminal\n *\n * @example\n * ```typescript\n * const terminal = await sandbox.terminal.create({ pty: false });\n *\n * // Run a command\n * const cmd = await terminal.command.run('npm test');\n * console.log(cmd.stdout);\n *\n * // Run in background and wait\n * const cmd = await terminal.command.run('npm install', { background: true });\n * await cmd.wait();\n * console.log(cmd.exitCode);\n *\n * // List commands\n * const commands = await terminal.command.list();\n *\n * // Retrieve a specific command\n * const cmd = await terminal.command.retrieve(cmdId);\n * ```\n */\nexport class TerminalCommand {\n private terminalId: string;\n private runHandler: (command: string, background?: boolean) => Promise<CommandExecutionResponse>;\n private listHandler: () => Promise<CommandsListResponse>;\n private retrieveHandler: (cmdId: string) => Promise<CommandDetailsResponse>;\n private waitHandler: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>;\n\n constructor(\n terminalId: string,\n handlers: {\n run: (command: string, background?: boolean) => Promise<CommandExecutionResponse>;\n list: () => Promise<CommandsListResponse>;\n retrieve: (cmdId: string) => Promise<CommandDetailsResponse>;\n wait: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>;\n }\n ) {\n this.terminalId = terminalId;\n this.runHandler = handlers.run;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.waitHandler = handlers.wait;\n }\n\n /**\n * Run a command in the terminal\n * @param command - The command to execute\n * @param options - Execution options\n * @param options.background - If true, returns immediately without waiting for completion\n * @returns Command object with results or status\n */\n async run(command: string, options?: { background?: boolean }): Promise<Command> {\n const response = await this.runHandler(command, options?.background);\n\n const cmd = new Command({\n cmdId: response.data.cmd_id || '',\n terminalId: this.terminalId,\n command: response.data.command,\n status: response.data.status || (options?.background ? 'running' : 'completed'),\n stdout: response.data.stdout,\n stderr: response.data.stderr,\n exitCode: response.data.exit_code,\n durationMs: response.data.duration_ms,\n startedAt: new Date().toISOString(),\n });\n\n // Set up handlers for the command\n cmd.setWaitHandler((timeout) => this.waitHandler(cmd.id, timeout));\n cmd.setRetrieveHandler(() => this.retrieveHandler(cmd.id));\n\n return cmd;\n }\n\n /**\n * List all commands executed in this terminal\n * @returns Array of Command objects\n */\n async list(): Promise<Command[]> {\n const response = await this.listHandler();\n\n return response.data.commands.map((item) => {\n const cmd = new Command({\n cmdId: item.cmd_id,\n terminalId: this.terminalId,\n command: item.command,\n status: item.status,\n stdout: '', // Not included in list response\n stderr: '', // Not included in list response\n exitCode: item.exit_code,\n durationMs: item.duration_ms,\n startedAt: item.started_at,\n finishedAt: item.finished_at,\n });\n\n cmd.setWaitHandler((timeout) => this.waitHandler(cmd.id, timeout));\n cmd.setRetrieveHandler(() => this.retrieveHandler(cmd.id));\n\n return cmd;\n });\n }\n\n /**\n * Retrieve a specific command by ID\n * @param cmdId - The command ID\n * @returns Command object with full details\n */\n async retrieve(cmdId: string): Promise<Command> {\n const response = await this.retrieveHandler(cmdId);\n\n const cmd = new Command({\n cmdId: response.data.cmd_id,\n terminalId: this.terminalId,\n command: response.data.command,\n status: response.data.status,\n stdout: response.data.stdout,\n stderr: response.data.stderr,\n exitCode: response.data.exit_code,\n durationMs: response.data.duration_ms,\n startedAt: response.data.started_at,\n finishedAt: response.data.finished_at,\n });\n\n cmd.setWaitHandler((timeout) => this.waitHandler(cmd.id, timeout));\n cmd.setRetrieveHandler(() => this.retrieveHandler(cmd.id));\n\n return cmd;\n }\n}\n","/**\n * Terminal class for managing terminal sessions with WebSocket integration\n */\n\nimport type { WebSocketManager } from './websocket';\nimport type {\n TerminalOutputMessage,\n TerminalErrorMessage,\n TerminalDestroyedMessage,\n} from './websocket';\nimport type { CommandExecutionResponse, CommandsListResponse, CommandDetailsResponse } from './index';\nimport { TerminalCommand } from './resources/terminal-command';\n\n// ============================================================================\n// Base64 Utility Functions\n// ============================================================================\n\n/**\n * Decode base64 to string (cross-platform: browser and Node.js)\n */\nfunction decodeBase64(str: string): string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n // Browser environment\n return window.atob(str);\n } else if (typeof Buffer !== 'undefined') {\n // Node.js environment\n return Buffer.from(str, 'base64').toString('utf-8');\n }\n throw new Error('No base64 decoding available');\n}\n\n/**\n * Terminal event handlers\n */\nexport type TerminalEventHandler = {\n output: (data: string) => void;\n error: (error: string) => void;\n destroyed: () => void;\n};\n\n/**\n * TerminalInstance - A connected terminal session with WebSocket support\n *\n * This is the object returned by sandbox.terminal.create()\n *\n * @example\n * ```typescript\n * // PTY mode - Interactive shell\n * const pty = await sandbox.terminal.create({ pty: true });\n * pty.on('output', (data) => console.log(data));\n * pty.write('ls -la\\n');\n * await pty.destroy();\n *\n * // Exec mode - Command tracking\n * const exec = await sandbox.terminal.create({ pty: false });\n * const cmd = await exec.command.run('npm test');\n * console.log(cmd.exitCode);\n *\n * // Background execution with wait\n * const cmd = await exec.command.run('npm install', { background: true });\n * await cmd.wait();\n * console.log(cmd.stdout);\n * ```\n */\nexport class TerminalInstance {\n private _id: string;\n private _pty: boolean;\n private _status: 'running' | 'stopped' | 'active' | 'ready';\n private _channel: string | null;\n private _ws: WebSocketManager | null;\n private _encoding: 'raw' | 'base64';\n private _eventHandlers: Map<keyof TerminalEventHandler, Set<Function>> = new Map();\n\n /**\n * Command namespace for exec mode terminals\n */\n readonly command: TerminalCommand;\n\n // Handlers set by the Sandbox\n private _executeHandler?: (command: string, background?: boolean) => Promise<CommandExecutionResponse>;\n private _listCommandsHandler?: () => Promise<CommandsListResponse>;\n private _retrieveCommandHandler?: (cmdId: string) => Promise<CommandDetailsResponse>;\n private _waitCommandHandler?: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>;\n private _destroyHandler?: () => Promise<void>;\n\n constructor(\n id: string,\n pty: boolean,\n status: 'running' | 'stopped' | 'active' | 'ready',\n channel: string | null,\n ws: WebSocketManager | null,\n encoding: 'raw' | 'base64' = 'raw'\n ) {\n this._id = id;\n this._pty = pty;\n // Normalize 'active' to 'running' for consistency\n this._status = status === 'active' ? 'running' : status;\n this._channel = channel;\n this._ws = ws;\n this._encoding = encoding;\n\n // Initialize command namespace with handlers\n this.command = new TerminalCommand(id, {\n run: async (command: string, background?: boolean) => {\n if (!this._executeHandler) {\n throw new Error('Execute handler not set');\n }\n return this._executeHandler(command, background);\n },\n list: async () => {\n if (!this._listCommandsHandler) {\n throw new Error('List commands handler not set');\n }\n return this._listCommandsHandler();\n },\n retrieve: async (cmdId: string) => {\n if (!this._retrieveCommandHandler) {\n throw new Error('Retrieve command handler not set');\n }\n return this._retrieveCommandHandler(cmdId);\n },\n wait: async (cmdId: string, timeout?: number) => {\n if (!this._waitCommandHandler) {\n throw new Error('Wait command handler not set');\n }\n return this._waitCommandHandler(cmdId, timeout);\n },\n });\n\n // Only subscribe to WebSocket channel for PTY mode\n if (this._pty && this._ws && this._channel) {\n this._ws.subscribe(this._channel);\n // Set up WebSocket event handlers\n this.setupWebSocketHandlers();\n }\n }\n\n /**\n * Set up WebSocket event handlers (PTY mode only)\n */\n private setupWebSocketHandlers(): void {\n if (!this._ws || !this._channel) {\n return; // No WebSocket in exec mode\n }\n\n // Handle terminal output (decode based on encoding field)\n this._ws.on('terminal:output', (msg: TerminalOutputMessage) => {\n if (msg.channel === this._channel) {\n const encoding = msg.data.encoding || this._encoding;\n const output = encoding === 'base64'\n ? decodeBase64(msg.data.output)\n : msg.data.output;\n this.emit('output', output);\n }\n });\n\n // Handle terminal errors\n this._ws.on('terminal:error', (msg: TerminalErrorMessage) => {\n if (msg.channel === this._channel) {\n this.emit('error', msg.data.error);\n }\n });\n\n // Handle terminal destroyed\n this._ws.on('terminal:destroyed', (msg: TerminalDestroyedMessage) => {\n if (msg.channel === this._channel) {\n this._status = 'stopped';\n this.emit('destroyed');\n this.cleanup();\n }\n });\n }\n\n /**\n * Terminal ID\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Get terminal ID (deprecated, use .id property)\n * @deprecated Use .id property instead\n */\n getId(): string {\n return this._id;\n }\n\n /**\n * Terminal status\n */\n get status(): 'running' | 'stopped' | 'active' | 'ready' {\n return this._status;\n }\n\n /**\n * Get terminal status (deprecated, use .status property)\n * @deprecated Use .status property instead\n */\n getStatus(): 'running' | 'stopped' | 'active' | 'ready' {\n return this._status;\n }\n\n /**\n * Terminal channel (null for exec mode)\n */\n get channel(): string | null {\n return this._channel;\n }\n\n /**\n * Get terminal channel (deprecated, use .channel property)\n * @deprecated Use .channel property instead\n */\n getChannel(): string | null {\n return this._channel;\n }\n\n /**\n * Whether this is a PTY terminal\n */\n get pty(): boolean {\n return this._pty;\n }\n\n /**\n * Get terminal PTY mode (deprecated, use .pty property)\n * @deprecated Use .pty property instead\n */\n isPTY(): boolean {\n return this._pty;\n }\n\n /**\n * Check if terminal is running\n */\n isRunning(): boolean {\n return this._status === 'running';\n }\n\n /**\n * Write input to the terminal (PTY mode only)\n */\n write(input: string): void {\n if (!this._pty) {\n throw new Error('write() is only available for PTY terminals. Use commands.run() for exec mode terminals.');\n }\n if (!this._ws) {\n throw new Error('WebSocket not available');\n }\n if (!this.isRunning()) {\n console.warn('[Terminal] Warning: Terminal status is not \"running\", but attempting to write anyway. Status:', this._status);\n }\n this._ws.sendTerminalInput(this._id, input);\n }\n\n /**\n * Resize terminal window (PTY mode only)\n */\n resize(cols: number, rows: number): void {\n if (!this._pty) {\n throw new Error('resize() is only available for PTY terminals');\n }\n if (!this._ws) {\n throw new Error('WebSocket not available');\n }\n if (!this.isRunning()) {\n throw new Error('Terminal is not running');\n }\n this._ws.resizeTerminal(this._id, cols, rows);\n }\n\n /**\n * Set execute command handler (called by Sandbox)\n * @internal\n */\n setExecuteHandler(handler: (command: string, background?: boolean) => Promise<CommandExecutionResponse>): void {\n this._executeHandler = handler;\n }\n\n /**\n * Set list commands handler (called by Sandbox)\n * @internal\n */\n setListCommandsHandler(handler: () => Promise<CommandsListResponse>): void {\n this._listCommandsHandler = handler;\n }\n\n /**\n * Set retrieve command handler (called by Sandbox)\n * @internal\n */\n setRetrieveCommandHandler(handler: (cmdId: string) => Promise<CommandDetailsResponse>): void {\n this._retrieveCommandHandler = handler;\n }\n\n /**\n * Set wait command handler (called by Sandbox)\n * @internal\n */\n setWaitCommandHandler(handler: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>): void {\n this._waitCommandHandler = handler;\n }\n\n /**\n * Set destroy handler (called by Sandbox)\n * @internal\n */\n setDestroyHandler(handler: () => Promise<void>): void {\n this._destroyHandler = handler;\n }\n\n /**\n * Execute a command in the terminal (deprecated, use command.run())\n * @deprecated Use terminal.command.run() instead\n */\n async execute(command: string, options?: { background?: boolean }): Promise<CommandExecutionResponse> {\n if (!this._executeHandler) {\n throw new Error('Execute handler not set');\n }\n return this._executeHandler(command, options?.background);\n }\n\n /**\n * Destroy the terminal\n */\n async destroy(): Promise<void> {\n if (!this._destroyHandler) {\n throw new Error('Destroy handler not set');\n }\n await this._destroyHandler();\n this.cleanup();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n // Unsubscribe from channel (PTY mode only)\n if (this._ws && this._channel) {\n this._ws.unsubscribe(this._channel);\n }\n\n // Clear event handlers\n this._eventHandlers.clear();\n }\n\n /**\n * Register event handler\n */\n on<K extends keyof TerminalEventHandler>(\n event: K,\n handler: TerminalEventHandler[K]\n ): void {\n if (!this._eventHandlers.has(event)) {\n this._eventHandlers.set(event, new Set());\n }\n this._eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off<K extends keyof TerminalEventHandler>(\n event: K,\n handler: TerminalEventHandler[K]\n ): void {\n const handlers = this._eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this._eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit<K extends keyof TerminalEventHandler>(\n event: K,\n ...args: Parameters<TerminalEventHandler[K]>\n ): void {\n const handlers = this._eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n (handler as any)(...args);\n } catch (error) {\n console.error('Error in terminal event handler:', error);\n }\n });\n }\n }\n}\n","/**\n * FileWatcher class for monitoring file system changes with WebSocket integration\n */\n\nimport type { WebSocketManager } from './websocket';\nimport type {\n FileChangedMessage,\n WatcherDestroyedMessage,\n} from './websocket';\n\n// ============================================================================\n// Base64 Utility Functions\n// ============================================================================\n\n/**\n * Decode base64 to string (cross-platform: browser and Node.js)\n */\nfunction decodeBase64(str: string): string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n // Browser environment\n return window.atob(str);\n } else if (typeof Buffer !== 'undefined') {\n // Node.js environment\n return Buffer.from(str, 'base64').toString('utf-8');\n }\n throw new Error('No base64 decoding available');\n}\n\n/**\n * File change event data\n */\nexport interface FileChangeEvent {\n event: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir';\n path: string;\n content?: string;\n}\n\n/**\n * FileWatcher event handlers\n */\nexport type FileWatcherEventHandler = {\n change: (event: FileChangeEvent) => void;\n destroyed: () => void;\n};\n\n/**\n * FileWatcher class for monitoring file system changes\n *\n * @example\n * ```typescript\n * const client = new ComputeClient({ sandboxUrl: '...' });\n * await client.generateToken();\n *\n * const watcher = await client.createWatcher('/home/project', {\n * ignored: ['node_modules', '.git']\n * });\n *\n * watcher.on('change', (event) => {\n * console.log(`File ${event.event}: ${event.path}`);\n * });\n *\n * await watcher.destroy();\n * ```\n */\nexport class FileWatcher {\n private id: string;\n private path: string;\n private status: 'active' | 'stopped';\n private channel: string;\n private includeContent: boolean;\n private ignored: string[];\n private encoding: 'raw' | 'base64';\n private ws: WebSocketManager;\n private eventHandlers: Map<keyof FileWatcherEventHandler, Set<Function>> = new Map();\n\n constructor(\n id: string,\n path: string,\n status: 'active' | 'stopped',\n channel: string,\n includeContent: boolean,\n ignored: string[],\n ws: WebSocketManager,\n encoding: 'raw' | 'base64' = 'raw'\n ) {\n this.id = id;\n this.path = path;\n this.status = status;\n this.channel = channel;\n this.includeContent = includeContent;\n this.ignored = ignored;\n this.encoding = encoding;\n this.ws = ws;\n\n // Subscribe to watcher channel\n this.ws.subscribe(this.channel);\n\n // Set up WebSocket event handlers\n this.setupWebSocketHandlers();\n }\n\n /**\n * Set up WebSocket event handlers\n */\n private setupWebSocketHandlers(): void {\n // Handle file changes (decode content based on encoding field)\n this.ws.on('file:changed', (msg: FileChangedMessage) => {\n if (msg.channel === this.channel) {\n const encoding = msg.data.encoding || this.encoding;\n const content = msg.data.content && encoding === 'base64'\n ? decodeBase64(msg.data.content)\n : msg.data.content;\n\n this.emit('change', {\n event: msg.data.event,\n path: msg.data.path,\n content: content,\n });\n }\n });\n\n // Handle watcher destroyed\n this.ws.on('watcher:destroyed', (msg: WatcherDestroyedMessage) => {\n if (msg.channel === this.channel) {\n this.status = 'stopped';\n this.emit('destroyed');\n this.cleanup();\n }\n });\n }\n\n /**\n * Get watcher ID\n */\n getId(): string {\n return this.id;\n }\n\n /**\n * Get watched path\n */\n getPath(): string {\n return this.path;\n }\n\n /**\n * Get watcher status\n */\n getStatus(): 'active' | 'stopped' {\n return this.status;\n }\n\n /**\n * Get watcher channel\n */\n getChannel(): string {\n return this.channel;\n }\n\n /**\n * Check if content is included in events\n */\n isIncludingContent(): boolean {\n return this.includeContent;\n }\n\n /**\n * Get ignored patterns\n */\n getIgnoredPatterns(): string[] {\n return [...this.ignored];\n }\n\n /**\n * Check if watcher is active\n */\n isActive(): boolean {\n return this.status === 'active';\n }\n\n /**\n * Destroy the watcher (uses REST API, not WebSocket)\n */\n private destroyWatcher?: () => Promise<void>;\n\n /**\n * Set destroy handler (called by client)\n */\n setDestroyHandler(handler: () => Promise<void>): void {\n this.destroyWatcher = handler;\n }\n\n /**\n * Destroy the watcher\n */\n async destroy(): Promise<void> {\n if (!this.destroyWatcher) {\n throw new Error('Destroy handler not set');\n }\n await this.destroyWatcher();\n this.cleanup();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n // Unsubscribe from channel\n this.ws.unsubscribe(this.channel);\n\n // Clear event handlers\n this.eventHandlers.clear();\n }\n\n /**\n * Register event handler\n */\n on<K extends keyof FileWatcherEventHandler>(\n event: K,\n handler: FileWatcherEventHandler[K]\n ): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off<K extends keyof FileWatcherEventHandler>(\n event: K,\n handler: FileWatcherEventHandler[K]\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit<K extends keyof FileWatcherEventHandler>(\n event: K,\n ...args: Parameters<FileWatcherEventHandler[K]>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n (handler as any)(...args);\n } catch (error) {\n console.error('Error in file watcher event handler:', error);\n }\n });\n }\n }\n}\n","/**\n * SignalService class for monitoring system signals with WebSocket integration\n */\n\nimport type { WebSocketManager } from './websocket';\nimport type { SignalMessage } from './websocket';\n\n/**\n * Port signal data\n */\nexport interface PortSignalEvent {\n signal: 'port' | 'server-ready';\n port: number;\n url: string;\n type?: 'open' | 'close';\n}\n\n/**\n * Error signal data\n */\nexport interface ErrorSignalEvent {\n signal: 'error';\n message: string;\n}\n\n/**\n * Generic signal event (union type)\n */\nexport type SignalEvent = PortSignalEvent | ErrorSignalEvent;\n\n/**\n * SignalService event handlers\n */\nexport type SignalServiceEventHandler = {\n port: (event: PortSignalEvent) => void;\n error: (event: ErrorSignalEvent) => void;\n signal: (event: SignalEvent) => void;\n};\n\n/**\n * SignalService class for monitoring system signals and events\n *\n * @example\n * ```typescript\n * const client = new ComputeClient({ sandboxUrl: '...' });\n * await client.generateToken();\n *\n * const signals = await client.startSignals();\n *\n * signals.on('port', (event) => {\n * console.log(`Port ${event.port} ${event.type}: ${event.url}`);\n * });\n *\n * signals.on('error', (event) => {\n * console.error(`Error: ${event.message}`);\n * });\n *\n * await signals.stop();\n * ```\n */\nexport class SignalService {\n private status: 'active' | 'stopped';\n private channel: string;\n private ws: WebSocketManager;\n private eventHandlers: Map<keyof SignalServiceEventHandler, Set<Function>> = new Map();\n\n constructor(\n status: 'active' | 'stopped',\n channel: string,\n ws: WebSocketManager\n ) {\n this.status = status;\n this.channel = channel;\n this.ws = ws;\n\n // Subscribe to signals channel\n this.ws.subscribe(this.channel);\n\n // Set up WebSocket event handlers\n this.setupWebSocketHandlers();\n }\n\n /**\n * Set up WebSocket event handlers\n */\n private setupWebSocketHandlers(): void {\n // Handle signal events\n this.ws.on('signal', (msg: SignalMessage) => {\n if (msg.channel === this.channel) {\n const event: SignalEvent = {\n signal: msg.data.signal,\n ...(msg.data.port && { port: msg.data.port }),\n ...(msg.data.url && { url: msg.data.url }),\n ...(msg.data.message && { message: msg.data.message }),\n } as SignalEvent;\n\n // Emit specific signal type\n if (msg.data.signal === 'port' || msg.data.signal === 'server-ready') {\n this.emit('port', event as PortSignalEvent);\n } else if (msg.data.signal === 'error') {\n this.emit('error', event as ErrorSignalEvent);\n }\n\n // Emit generic signal event\n this.emit('signal', event);\n }\n });\n }\n\n /**\n * Get service status\n */\n getStatus(): 'active' | 'stopped' {\n return this.status;\n }\n\n /**\n * Get service channel\n */\n getChannel(): string {\n return this.channel;\n }\n\n /**\n * Check if service is active\n */\n isActive(): boolean {\n return this.status === 'active';\n }\n\n /**\n * Stop the signal service (uses REST API, not WebSocket)\n */\n private stopService?: () => Promise<void>;\n\n /**\n * Set stop handler (called by client)\n */\n setStopHandler(handler: () => Promise<void>): void {\n this.stopService = handler;\n }\n\n /**\n * Stop the signal service\n */\n async stop(): Promise<void> {\n if (!this.stopService) {\n throw new Error('Stop handler not set');\n }\n await this.stopService();\n this.cleanup();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n this.status = 'stopped';\n\n // Unsubscribe from channel\n this.ws.unsubscribe(this.channel);\n\n // Clear event handlers\n this.eventHandlers.clear();\n }\n\n /**\n * Register event handler\n */\n on<K extends keyof SignalServiceEventHandler>(\n event: K,\n handler: SignalServiceEventHandler[K]\n ): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off<K extends keyof SignalServiceEventHandler>(\n event: K,\n handler: SignalServiceEventHandler[K]\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit<K extends keyof SignalServiceEventHandler>(\n event: K,\n ...args: Parameters<SignalServiceEventHandler[K]>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n (handler as any)(...args);\n } catch (error) {\n console.error('Error in signal service event handler:', error);\n }\n });\n }\n }\n}\n","/**\n * ComputeSDK Client - Universal Sandbox Implementation\n *\n * This package provides a Sandbox for interacting with ComputeSDK sandboxes\n * through API endpoints at ${sandboxId}.sandbox.computesdk.com\n *\n * Works in browser, Node.js, and edge runtimes.\n * Browser: Uses native WebSocket and fetch\n * Node.js: Pass WebSocket implementation (e.g., 'ws' library)\n */\n\nimport { WebSocketManager } from './websocket';\nimport { TerminalInstance } from './terminal';\nimport { FileWatcher } from './file-watcher';\nimport { SignalService } from './signal-service';\nimport { cmd, escapeArgs, mkdir, test } from '@computesdk/cmd';\nimport type { Command } from '@computesdk/cmd';\n\n// Import resource namespaces\nimport {\n Terminal,\n Server,\n Watcher,\n SessionToken,\n MagicLink,\n Signal,\n File,\n Env,\n Auth,\n Run,\n Child,\n} from './resources';\n\n// Re-export high-level classes and types\nexport { TerminalInstance } from './terminal';\n/** @deprecated Use TerminalInstance instead */\nexport { TerminalInstance as Terminal } from './terminal';\nexport { FileWatcher, type FileChangeEvent } from './file-watcher';\nexport { SignalService, type PortSignalEvent, type ErrorSignalEvent, type SignalEvent } from './signal-service';\nexport { encodeBinaryMessage, decodeBinaryMessage, isBinaryData, blobToArrayBuffer, MessageType } from './protocol';\n\n// Re-export resource types\nexport { Command } from './resources/command';\nexport { TerminalCommand } from './resources/terminal-command';\nexport type { SessionTokenInfo } from './resources/session-token';\nexport type { MagicLinkInfo } from './resources/magic-link';\nexport type { SignalStatusInfo } from './resources/signal';\nexport type { AuthStatusInfo, AuthInfo, AuthEndpointsInfo } from './resources/auth';\nexport type { CodeResult, CommandResult, CodeLanguage, CodeRunOptions, CommandRunOptions } from './resources/run';\n\n// Import universal types\nimport type { \n SandboxFileSystem,\n CodeResult,\n CommandResult,\n Runtime,\n SandboxInfo as UniversalSandboxInfo,\n} from '../types/universal-sandbox';\n\n// Import client-specific types\nimport type {\n SandboxStatus,\n ProviderSandboxInfo,\n FileEntry as ClientFileEntry,\n} from './types';\n\nimport {\n CommandExitError,\n isCommandExitError,\n} from './types';\n\n// Re-export shared types (canonical definitions)\nexport type {\n Runtime,\n SandboxStatus,\n ProviderSandboxInfo,\n SandboxFileSystem,\n};\n\nexport type {\n ClientFileEntry as FileEntry,\n};\n\n// Note: CodeResult and CommandResult are exported from ./resources/run\n\nexport {\n CommandExitError,\n isCommandExitError,\n};\n\n// Import universal Sandbox interface\nimport type { Sandbox as ISandbox } from '../types/universal-sandbox';\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * WebSocket constructor type\n */\nexport type WebSocketConstructor = new (url: string) => WebSocket;\n\n/**\n * Configuration options for creating a Sandbox\n */\nexport interface SandboxConfig {\n /** API endpoint URL (e.g., https://sandbox-123.sandbox.computesdk.com). Optional in browser - can be auto-detected from URL query param or localStorage */\n sandboxUrl?: string;\n /** Sandbox ID */\n sandboxId: string;\n /** Provider name (e.g., 'e2b', 'gateway') */\n provider: string;\n /** Access token or session token for authentication. Optional in browser - can be auto-detected from URL query param or localStorage */\n token?: string;\n /** Optional headers to include with all requests */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** WebSocket implementation (optional, uses global WebSocket if not provided) */\n WebSocket?: WebSocketConstructor;\n /** WebSocket protocol: 'binary' (default, recommended) or 'json' (for debugging) */\n protocol?: 'json' | 'binary';\n /** Optional metadata associated with the sandbox */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Health check response\n */\nexport interface HealthResponse {\n status: string;\n timestamp: string;\n}\n\n/**\n * Server info response\n */\nexport interface InfoResponse {\n message: string;\n data: {\n auth_enabled: boolean;\n main_subdomain: string;\n sandbox_count: number;\n sandbox_url: string;\n version: string;\n };\n}\n\n/**\n * Session token response\n */\nexport interface SessionTokenResponse {\n id: string;\n token: string;\n description?: string;\n createdAt: string;\n expiresAt: string;\n expiresIn: number;\n}\n\n/**\n * Session token list response\n */\nexport interface SessionTokenListResponse {\n message: string;\n data: {\n tokens: Array<{\n id: string;\n description?: string;\n created_at: string;\n expires_at: string;\n last_used_at?: string;\n }>;\n };\n}\n\n/**\n * Magic link response\n */\nexport interface MagicLinkResponse {\n message: string;\n data: {\n magic_url: string;\n expires_at: string;\n redirect_url: string;\n };\n}\n\n/**\n * Authentication status response\n */\nexport interface AuthStatusResponse {\n message: string;\n data: {\n authenticated: boolean;\n token_type?: 'access_token' | 'session_token';\n expires_at?: string;\n };\n}\n\n/**\n * Authentication information response\n */\nexport interface AuthInfoResponse {\n message: string;\n data: {\n message: string;\n instructions: string;\n endpoints: {\n create_session_token: string;\n list_session_tokens: string;\n get_session_token: string;\n revoke_session_token: string;\n create_magic_link: string;\n auth_status: string;\n auth_info: string;\n };\n };\n}\n\n/**\n * File information\n */\nexport interface FileInfo {\n name: string;\n path: string;\n size: number;\n is_dir: boolean;\n modified_at: string;\n}\n\n/**\n * Files list response\n */\nexport interface FilesListResponse {\n message: string;\n data: {\n files: FileInfo[];\n path: string;\n };\n}\n\n/**\n * File response\n */\nexport interface FileResponse {\n message: string;\n data: {\n file: FileInfo;\n content?: string;\n };\n}\n\n/**\n * Terminal response\n */\nexport interface TerminalResponse {\n message: string;\n data: {\n id: string;\n pty: boolean;\n status: 'running' | 'stopped' | 'ready' | 'active';\n channel?: string; // Only present for PTY mode (pty=true)\n ws_url?: string; // Only present for PTY mode (pty=true)\n encoding?: 'raw' | 'base64';\n };\n}\n\n/**\n * Command execution response\n */\nexport interface CommandExecutionResponse {\n message: string;\n data: {\n terminal_id?: string;\n cmd_id?: string; // Present for exec mode commands\n command: string;\n output?: string; // Deprecated: combined stdout+stderr (backward compatibility)\n stdout: string;\n stderr: string;\n exit_code?: number; // May not be present for background commands\n duration_ms?: number; // May not be present for background commands\n status?: 'running' | 'completed' | 'failed'; // Present for exec mode\n pty?: boolean; // Indicates terminal mode\n };\n}\n\n/**\n * Command details response\n */\nexport interface CommandDetailsResponse {\n message: string;\n data: {\n cmd_id: string;\n command: string;\n status: 'running' | 'completed' | 'failed';\n stdout: string;\n stderr: string;\n started_at: string;\n finished_at?: string;\n duration_ms?: number;\n exit_code?: number;\n };\n}\n\n/**\n * Command list item\n */\nexport interface CommandListItem {\n cmd_id: string;\n command: string;\n status: 'running' | 'completed' | 'failed';\n started_at: string;\n finished_at?: string;\n duration_ms?: number;\n exit_code?: number;\n}\n\n/**\n * Commands list response\n */\nexport interface CommandsListResponse {\n message: string;\n data: {\n commands: CommandListItem[];\n count: number;\n };\n}\n\n/**\n * Code execution response (POST /run/code)\n */\nexport interface CodeExecutionResponse {\n data: {\n output: string;\n exit_code: number;\n language: string;\n };\n}\n\n/**\n * Run command response (POST /run/command)\n */\nexport interface RunCommandResponse {\n message: string;\n data: {\n terminal_id?: string;\n cmd_id?: string;\n command: string;\n stdout: string;\n stderr: string;\n exit_code?: number;\n duration_ms?: number;\n status?: 'running' | 'completed' | 'failed';\n };\n}\n\n/**\n * File watcher information\n */\nexport interface WatcherInfo {\n id: string;\n path: string;\n includeContent: boolean;\n ignored: string[];\n status: 'active' | 'stopped';\n channel: string;\n encoding?: 'raw' | 'base64';\n}\n\n/**\n * File watcher response\n */\nexport interface WatcherResponse {\n message: string;\n data: WatcherInfo & {\n ws_url: string;\n };\n}\n\n/**\n * File watchers list response\n */\nexport interface WatchersListResponse {\n message: string;\n data: {\n watchers: WatcherInfo[];\n };\n}\n\n/**\n * Signal service response\n */\nexport interface SignalServiceResponse {\n message: string;\n data: {\n status: 'active' | 'stopped';\n channel: string;\n ws_url: string;\n };\n}\n\n/**\n * Port signal response\n */\nexport interface PortSignalResponse {\n message: string;\n data: {\n port: number;\n type: 'open' | 'close';\n url: string;\n };\n}\n\n/**\n * Generic signal response\n */\nexport interface GenericSignalResponse {\n message: string;\n data: {\n message: string;\n };\n}\n\n/**\n * Sandbox information\n */\nexport interface SandboxInfo {\n subdomain: string;\n directory: string;\n is_main: boolean;\n created_at: string;\n url: string;\n}\n\n/**\n * Sandboxes list response\n */\nexport interface SandboxesListResponse {\n sandboxes: SandboxInfo[];\n}\n\n/**\n * Error response\n */\nexport interface ErrorResponse {\n error: string;\n}\n\n/**\n * Terminal response\n */\nexport interface TerminalResponse {\n message: string;\n data: {\n id: string;\n pty: boolean;\n status: 'running' | 'stopped' | 'ready' | 'active';\n channel?: string; // Only present for PTY mode (pty=true)\n ws_url?: string; // Only present for PTY mode (pty=true)\n encoding?: 'raw' | 'base64';\n };\n}\n\n/**\n * Server status types\n */\nexport type ServerStatus = 'starting' | 'running' | 'ready' | 'failed' | 'stopped';\n\n/**\n * Server information\n */\nexport interface ServerInfo {\n slug: string;\n command: string;\n path: string;\n original_path?: string;\n env_file?: string;\n port?: number;\n url?: string;\n status: ServerStatus;\n pid?: number;\n terminal_id?: string;\n created_at: string;\n updated_at: string;\n}\n\n/**\n * Servers list response\n */\nexport interface ServersListResponse {\n status: string;\n message: string;\n data: {\n servers: ServerInfo[];\n };\n}\n\n/**\n * Server response\n */\nexport interface ServerResponse {\n status: string;\n message: string;\n data: {\n server: ServerInfo;\n };\n}\n\n/**\n * Server stop response\n */\nexport interface ServerStopResponse {\n status: string;\n message: string;\n data: {\n slug: string;\n };\n}\n\n/**\n * Server status update response\n */\nexport interface ServerStatusUpdateResponse {\n status: string;\n message: string;\n data: {\n slug: string;\n status: ServerStatus;\n };\n}\n\n/**\n * Environment variables response\n */\nexport interface EnvGetResponse {\n status: string;\n message: string;\n data: {\n file: string;\n variables: Record<string, string>;\n };\n}\n\n/**\n * Environment set response\n */\nexport interface EnvSetResponse {\n status: string;\n message: string;\n data: {\n file: string;\n keys: string[];\n };\n}\n\n/**\n * Environment delete response\n */\nexport interface EnvDeleteResponse {\n status: string;\n message: string;\n data: {\n file: string;\n keys: string[];\n };\n}\n\n/**\n * Batch file operation type\n */\nexport type BatchFileOperation = 'write' | 'delete';\n\n/**\n * Batch file operation request\n */\nexport interface BatchFileRequest {\n path: string;\n operation: BatchFileOperation;\n content?: string;\n}\n\n/**\n * Batch file operation result\n */\nexport interface BatchWriteResult {\n path: string;\n success: boolean;\n error?: string;\n file?: FileInfo;\n}\n\n/**\n * Batch file operation response\n */\nexport interface BatchWriteResponse {\n message: string;\n data: {\n results: BatchWriteResult[];\n };\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\n/**\n * Sandbox - Full-featured gateway sandbox implementation\n *\n * Provides complete feature set including:\n * - Interactive terminals (PTY and exec modes)\n * - Managed servers\n * - File watchers with real-time events\n * - Authentication (session tokens, magic links)\n * - Environment management\n * - Signal service for port/error events\n * - Child sandbox creation\n *\n * This is the most feature-rich implementation available.\n *\n * @example\n * ```typescript\n * import { Sandbox } from 'computesdk'\n *\n * // Pattern 1: Admin operations (requires access token)\n * const sandbox = new Sandbox({\n * sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com',\n * token: accessToken, // From edge service\n * });\n *\n * // Create session token for delegated operations\n * const sessionToken = await sandbox.createSessionToken({\n * description: 'My Application',\n * expiresIn: 604800, // 7 days\n * });\n *\n * // Pattern 2: Delegated operations (binary protocol by default)\n * const sandbox2 = new Sandbox({\n * sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com',\n * token: sessionToken.data.token,\n * // protocol: 'binary' is the default (50-90% size reduction)\n * });\n *\n * // Execute a one-off command\n * const result = await sandbox.execute({ command: 'ls -la' });\n * console.log(result.data.stdout);\n *\n * // Run code\n * const codeResult = await sandbox.runCode('console.log(\"Hello!\")', 'node');\n *\n * // Work with files\n * const files = await sandbox.listFiles('/home/project');\n * await sandbox.writeFile('/home/project/test.txt', 'Hello, World!');\n * const content = await sandbox.readFile('/home/project/test.txt');\n *\n * // Create a PTY terminal with real-time output (interactive shell)\n * const terminal = await sandbox.createTerminal({ pty: true });\n * terminal.on('output', (data) => console.log(data));\n * terminal.write('ls -la\\n');\n * await terminal.destroy();\n *\n * // Create an exec terminal for command tracking\n * const execTerminal = await sandbox.createTerminal({ pty: false });\n * const result = await execTerminal.execute('npm install', { background: true });\n * const cmd = await sandbox.getCommand(execTerminal.getId(), result.data.cmd_id);\n * console.log(cmd.data.status); // \"running\" | \"completed\" | \"failed\"\n * await execTerminal.destroy();\n *\n * // Watch for file changes\n * const watcher = await sandbox.createWatcher('/home/project', {\n * ignored: ['node_modules', '.git']\n * });\n * watcher.on('change', (event) => {\n * console.log(`${event.event}: ${event.path}`);\n * });\n * await watcher.destroy();\n *\n * // Monitor system signals\n * const signals = await sandbox.startSignals();\n * signals.on('port', (event) => {\n * console.log(`Port ${event.port} opened: ${event.url}`);\n * });\n * await signals.stop();\n *\n * // Clean up\n * await sandbox.disconnect();\n * ```\n */\nexport class Sandbox {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n // Resource namespaces (singular naming convention)\n readonly terminal: Terminal;\n readonly run: Run;\n readonly server: Server;\n readonly watcher: Watcher;\n readonly sessionToken: SessionToken;\n readonly magicLink: MagicLink;\n readonly signal: Signal;\n readonly file: File;\n readonly env: Env;\n readonly auth: Auth;\n readonly child: Child;\n\n private config: Required<Omit<SandboxConfig, 'WebSocket' | 'metadata'>> & { metadata?: Record<string, unknown> };\n private _token: string | null = null;\n private _ws: WebSocketManager | null = null;\n private WebSocketImpl: WebSocketConstructor;\n\n constructor(config: SandboxConfig) {\n this.sandboxId = config.sandboxId;\n this.provider = config.provider;\n\n // Auto-detect sandbox_url and session_token from URL/localStorage in browser environments\n let sandboxUrlResolved = config.sandboxUrl;\n let tokenFromUrl: string | null = null;\n let sandboxUrlFromUrl: string | null = null;\n\n if (typeof window !== 'undefined' && window.location && typeof localStorage !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n\n // Check URL parameters\n tokenFromUrl = params.get('session_token');\n sandboxUrlFromUrl = params.get('sandbox_url');\n\n // Clean up URL if any params were found\n let urlChanged = false;\n if (tokenFromUrl) {\n params.delete('session_token');\n localStorage.setItem('session_token', tokenFromUrl);\n urlChanged = true;\n }\n if (sandboxUrlFromUrl) {\n params.delete('sandbox_url');\n localStorage.setItem('sandbox_url', sandboxUrlFromUrl);\n urlChanged = true;\n }\n\n if (urlChanged) {\n const search = params.toString() ? `?${params.toString()}` : '';\n const newUrl = `${window.location.pathname}${search}${window.location.hash}`;\n window.history.replaceState({}, '', newUrl);\n }\n\n // Resolve sandboxUrl: config > URL > localStorage\n if (!config.sandboxUrl) {\n sandboxUrlResolved = sandboxUrlFromUrl || localStorage.getItem('sandbox_url') || '';\n }\n }\n\n this.config = {\n sandboxUrl: (sandboxUrlResolved || '').replace(/\\/$/, ''), // Remove trailing slash\n sandboxId: config.sandboxId || '',\n provider: config.provider || '',\n token: config.token || '',\n headers: config.headers || {},\n timeout: config.timeout || 30000,\n protocol: config.protocol || 'binary',\n metadata: config.metadata,\n };\n\n // Use provided WebSocket or fall back to global\n this.WebSocketImpl = config.WebSocket || (globalThis.WebSocket as any);\n\n if (!this.WebSocketImpl) {\n throw new Error(\n 'WebSocket is not available. In Node.js, pass WebSocket implementation:\\n' +\n 'import WebSocket from \"ws\";\\n' +\n 'new Sandbox({ sandboxUrl: \"...\", WebSocket })'\n );\n }\n\n // Priority for token: config.token > URL > localStorage\n if (config.token) {\n this._token = config.token;\n } else if (tokenFromUrl) {\n this._token = tokenFromUrl;\n } else if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n this._token = localStorage.getItem('session_token');\n }\n\n // Initialize filesystem interface\n this.filesystem = {\n readFile: async (path: string) => this.readFile(path),\n writeFile: async (path: string, content: string) => {\n await this.writeFile(path, content);\n },\n mkdir: async (path: string) => {\n await this.runCommand(mkdir(path));\n },\n readdir: async (path: string) => {\n const response = await this.listFiles(path);\n // Convert to universal FileEntry format\n return response.data.files.map(f => ({\n name: f.name,\n type: (f.is_dir ? 'directory' : 'file') as 'directory' | 'file',\n size: f.size,\n modified: new Date(f.modified_at)\n }));\n },\n exists: async (path: string) => {\n const result = await this.runCommand(test.exists(path));\n return result.exitCode === 0;\n },\n remove: async (path: string) => {\n await this.deleteFile(path);\n }\n };\n\n // Initialize resource namespaces (singular naming convention)\n this.terminal = new Terminal({\n create: async (options) => this.createTerminal(options),\n list: async () => this.listTerminals(),\n retrieve: async (id) => this.getTerminal(id),\n destroy: async (id) => {\n await this.request<void>(`/terminals/${id}`, { method: 'DELETE' });\n },\n });\n\n this.run = new Run({\n code: async (code, options) => {\n const result = await this.runCodeRequest(code, options?.language);\n return {\n output: result.data.output,\n exitCode: result.data.exit_code,\n language: result.data.language,\n };\n },\n command: async (command, options) => {\n const result = await this.runCommandRequest({ command, shell: options?.shell, background: options?.background });\n return {\n stdout: result.data.stdout,\n stderr: result.data.stderr,\n exitCode: result.data.exit_code ?? 0,\n durationMs: result.data.duration_ms ?? 0,\n };\n },\n });\n\n this.server = new Server({\n start: async (options) => this.startServer(options),\n list: async () => this.listServers(),\n retrieve: async (slug) => this.getServer(slug),\n stop: async (slug) => { await this.stopServer(slug); },\n restart: async (slug) => this.restartServer(slug),\n updateStatus: async (slug, status) => { await this.updateServerStatus(slug, status); },\n });\n\n this.watcher = new Watcher({\n create: async (path, options) => this.createWatcher(path, options),\n list: async () => this.listWatchers(),\n retrieve: async (id) => this.getWatcher(id),\n destroy: async (id) => {\n await this.request<void>(`/watchers/${id}`, { method: 'DELETE' });\n },\n });\n\n this.sessionToken = new SessionToken({\n create: async (options) => this.createSessionToken(options),\n list: async () => this.listSessionTokens(),\n retrieve: async (id) => this.getSessionToken(id),\n revoke: async (id) => this.revokeSessionToken(id),\n });\n\n this.magicLink = new MagicLink({\n create: async (options) => this.createMagicLink(options),\n });\n\n this.signal = new Signal({\n start: async () => this.startSignals(),\n status: async () => this.getSignalStatus(),\n stop: async () => {\n await this.request<void>('/signals/stop', { method: 'POST' });\n },\n emitPort: async (port, type, url) => this.emitPortSignal(port, type, url),\n emitError: async (message) => this.emitErrorSignal(message),\n emitServerReady: async (port, url) => this.emitServerReadySignal(port, url),\n });\n\n this.file = new File({\n create: async (path, content) => this.createFile(path, content),\n list: async (path) => this.listFiles(path),\n retrieve: async (path) => this.readFile(path),\n destroy: async (path) => this.deleteFile(path),\n batchWrite: async (files) => this.batchWriteFiles(files),\n exists: async (path) => this.checkFileExists(path),\n });\n\n this.env = new Env({\n retrieve: async (file) => this.getEnv(file),\n update: async (file, variables) => this.setEnv(file, variables),\n remove: async (file, keys) => this.deleteEnv(file, keys),\n exists: async (file) => this.checkEnvFile(file),\n });\n\n this.auth = new Auth({\n status: async () => this.getAuthStatus(),\n info: async () => this.getAuthInfo(),\n });\n\n this.child = new Child({\n create: async () => this.createSandbox(),\n list: async () => this.listSandboxes(),\n retrieve: async (subdomain) => this.getSandbox(subdomain),\n destroy: async (subdomain, deleteFiles) => this.deleteSandbox(subdomain, deleteFiles),\n });\n }\n\n /**\n * Get or create internal WebSocket manager\n */\n private async ensureWebSocket(): Promise<WebSocketManager> {\n if (!this._ws || this._ws.getState() === 'closed') {\n this._ws = new WebSocketManager({\n url: this.getWebSocketUrl(),\n WebSocket: this.WebSocketImpl,\n autoReconnect: true,\n debug: false,\n protocol: this.config.protocol,\n });\n await this._ws.connect();\n }\n return this._ws;\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const headers: Record<string, string> = {\n ...this.config.headers,\n };\n\n // Only set Content-Type if there's a body\n if (options.body) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Add authentication if token is available\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n const response = await fetch(`${this.config.sandboxUrl}${endpoint}`, {\n ...options,\n headers: {\n ...headers,\n ...options.headers,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n // Get response text first, then parse JSON with better error handling\n const text = await response.text();\n let data: T;\n try {\n data = JSON.parse(text);\n } catch (jsonError) {\n throw new Error(\n `Failed to parse JSON response from ${endpoint}: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}\\n` +\n `Response body (first 200 chars): ${text.substring(0, 200)}${text.length > 200 ? '...' : ''}`\n );\n }\n\n if (!response.ok) {\n const error = (data as ErrorResponse).error || response.statusText;\n\n // Provide helpful error message for 403 on auth endpoints\n if (response.status === 403 && endpoint.startsWith('/auth/')) {\n if (endpoint.includes('/session_tokens') || endpoint.includes('/magic-links')) {\n throw new Error(\n `Access token required. This operation requires an access token, not a session token.\\n` +\n `API request failed (${response.status}): ${error}`\n );\n }\n }\n\n throw new Error(`API request failed (${response.status}): ${error}`);\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw error;\n }\n }\n\n // ============================================================================\n // Health Check\n // ============================================================================\n\n /**\n * Check service health\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>('/health');\n }\n\n // ============================================================================\n // Authentication\n // ============================================================================\n\n /**\n * Create a session token (requires access token)\n *\n * Session tokens are delegated credentials that can authenticate API requests\n * without exposing your access token. Only access tokens can create session tokens.\n *\n * @param options - Token configuration\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async createSessionToken(options?: {\n description?: string;\n expiresIn?: number; // seconds, default 7 days (604800)\n }): Promise<SessionTokenResponse> {\n return this.request<SessionTokenResponse>('/auth/session_tokens', {\n method: 'POST',\n body: JSON.stringify(options || {}),\n });\n }\n\n /**\n * List all session tokens (requires access token)\n *\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async listSessionTokens(): Promise<SessionTokenListResponse> {\n return this.request<SessionTokenListResponse>('/auth/session_tokens');\n }\n\n /**\n * Get details of a specific session token (requires access token)\n *\n * @param tokenId - The token ID\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async getSessionToken(tokenId: string): Promise<SessionTokenResponse> {\n return this.request<SessionTokenResponse>(`/auth/session_tokens/${tokenId}`);\n }\n\n /**\n * Revoke a session token (requires access token)\n *\n * @param tokenId - The token ID to revoke\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async revokeSessionToken(tokenId: string): Promise<void> {\n return this.request<void>(`/auth/session_tokens/${tokenId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Generate a magic link for browser authentication (requires access token)\n *\n * Magic links are one-time URLs that automatically create a session token\n * and set it as a cookie in the user's browser. This provides an easy way\n * to authenticate users in browser-based applications.\n *\n * The generated link:\n * - Expires after 5 minutes or first use (whichever comes first)\n * - Automatically creates a new session token (7 day expiry)\n * - Sets the session token as an HttpOnly cookie\n * - Redirects to the specified URL\n *\n * @param options - Magic link configuration\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async createMagicLink(options?: {\n redirectUrl?: string; // default: /play/\n }): Promise<MagicLinkResponse> {\n return this.request<MagicLinkResponse>('/auth/magic-links', {\n method: 'POST',\n body: JSON.stringify(options || {}),\n });\n }\n\n /**\n * Check authentication status\n * Does not require authentication\n */\n async getAuthStatus(): Promise<AuthStatusResponse> {\n return this.request<AuthStatusResponse>('/auth/status');\n }\n\n /**\n * Get authentication information and usage instructions\n * Does not require authentication\n */\n async getAuthInfo(): Promise<AuthInfoResponse> {\n return this.request<AuthInfoResponse>('/auth/info');\n }\n\n /**\n * Set authentication token manually\n * @param token - Access token or session token\n */\n setToken(token: string): void {\n this._token = token;\n }\n\n /**\n * Get current authentication token\n */\n getToken(): string | null {\n return this._token;\n }\n\n /**\n * Get current sandbox URL\n */\n getSandboxUrl(): string {\n return this.config.sandboxUrl;\n }\n\n // ============================================================================\n // Command Execution\n // ============================================================================\n\n /**\n * Execute a one-off command without creating a persistent terminal\n * \n * @example\n * ```typescript\n * // Synchronous execution (waits for completion)\n * const result = await sandbox.execute({ command: 'npm test' });\n * console.log(result.data.exit_code);\n * \n * // Background execution (returns immediately)\n * const result = await sandbox.execute({ \n * command: 'npm install',\n * background: true \n * });\n * // Use result.data.terminal_id and result.data.cmd_id to track\n * const cmd = await sandbox.getCommand(result.data.terminal_id!, result.data.cmd_id!);\n * ```\n */\n async execute(options: {\n command: string;\n shell?: string;\n background?: boolean;\n }): Promise<CommandExecutionResponse> {\n return this.request<CommandExecutionResponse>('/execute', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Execute code with automatic language detection (POST /run/code)\n *\n * @param code - The code to execute\n * @param language - Programming language (optional - auto-detects if not specified)\n * @returns Code execution result with output, exit code, and detected language\n *\n * @example\n * ```typescript\n * // Auto-detect language\n * const result = await sandbox.runCodeRequest('print(\"Hello\")');\n * console.log(result.data.output); // \"Hello\\n\"\n * console.log(result.data.language); // \"python\"\n *\n * // Explicit language\n * const result = await sandbox.runCodeRequest('console.log(\"Hi\")', 'node');\n * ```\n */\n async runCodeRequest(code: string, language?: string): Promise<CodeExecutionResponse> {\n const body: { code: string; language?: string } = { code };\n if (language) {\n body.language = language;\n }\n return this.request<CodeExecutionResponse>('/run/code', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Execute a shell command (POST /run/command)\n *\n * @param options - Command options\n * @param options.command - The command to execute\n * @param options.shell - Shell to use (optional)\n * @param options.background - Run in background (optional)\n * @returns Command execution result\n *\n * @example\n * ```typescript\n * const result = await sandbox.runCommandRequest({ command: 'ls -la' });\n * console.log(result.data.stdout);\n * ```\n */\n async runCommandRequest(options: {\n command: string;\n shell?: string;\n background?: boolean;\n }): Promise<RunCommandResponse> {\n return this.request<RunCommandResponse>('/run/command', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n // ============================================================================\n // File Operations\n // ============================================================================\n\n /**\n * List files at the specified path\n */\n async listFiles(path: string = '/'): Promise<FilesListResponse> {\n const params = new URLSearchParams({ path });\n return this.request<FilesListResponse>(`/files?${params}`);\n }\n\n /**\n * Create a new file with optional content\n */\n async createFile(path: string, content?: string): Promise<FileResponse> {\n return this.request<FileResponse>('/files', {\n method: 'POST',\n body: JSON.stringify({ path, content }),\n });\n }\n\n /**\n * Get file metadata (without content)\n */\n async getFile(path: string): Promise<FileResponse> {\n return this.request<FileResponse>(`/files/${encodeURIComponent(path)}`);\n }\n\n /**\n * Read file content\n */\n async readFile(path: string): Promise<string> {\n const params = new URLSearchParams({ content: 'true' });\n // Encode each path segment separately to handle special characters in filenames\n // while preserving forward slashes as path separators\n const pathWithoutLeadingSlash = path.startsWith('/') ? path.slice(1) : path;\n const segments = pathWithoutLeadingSlash.split('/');\n const encodedPath = segments.map(s => encodeURIComponent(s)).join('/');\n const response = await this.request<FileResponse>(\n `/files/${encodedPath}?${params}`\n );\n return response.data.content || '';\n }\n\n /**\n * Write file content (creates or updates)\n */\n async writeFile(path: string, content: string): Promise<FileResponse> {\n return this.request<FileResponse>('/files', {\n method: 'POST',\n body: JSON.stringify({ path, content }),\n });\n }\n\n /**\n * Delete a file or directory\n */\n async deleteFile(path: string): Promise<void> {\n return this.request<void>(`/files/${encodeURIComponent(path)}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Check if a file exists (HEAD request)\n * @returns true if file exists, false otherwise\n */\n async checkFileExists(path: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n };\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n const response = await fetch(\n `${this.config.sandboxUrl}/files/${encodeURIComponent(path)}`,\n {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n }\n );\n\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Batch file operations (write or delete multiple files)\n *\n * Features:\n * - Deduplication: Last operation wins per path\n * - File locking: Prevents race conditions\n * - Deterministic ordering: Alphabetical path sorting\n * - Partial failure handling: Returns 207 Multi-Status with per-file results\n *\n * @param files - Array of file operations\n * @returns Results for each file operation\n *\n * @example\n * ```typescript\n * // Write multiple files\n * const results = await sandbox.batchWriteFiles([\n * { path: '/app/file1.txt', operation: 'write', content: 'Hello' },\n * { path: '/app/file2.txt', operation: 'write', content: 'World' },\n * ]);\n *\n * // Mixed operations (write and delete)\n * const results = await sandbox.batchWriteFiles([\n * { path: '/app/new.txt', operation: 'write', content: 'New file' },\n * { path: '/app/old.txt', operation: 'delete' },\n * ]);\n * ```\n */\n async batchWriteFiles(\n files: Array<{ path: string; operation: 'write' | 'delete'; content?: string }>\n ): Promise<BatchWriteResponse> {\n return this.request<BatchWriteResponse>('/files/batch', {\n method: 'POST',\n body: JSON.stringify({ files }),\n });\n }\n\n // ============================================================================\n // Terminal Management\n // ============================================================================\n\n /**\n * Create a new persistent terminal session\n * \n * Terminal Modes:\n * - **PTY mode** (pty: true): Interactive shell with real-time WebSocket streaming\n * - Use for: Interactive shells, vim/nano, real-time output\n * - Methods: write(), resize(), on('output')\n * \n * - **Exec mode** (pty: false, default): Command tracking with HTTP polling\n * - Use for: CI/CD, automation, command tracking, exit codes\n * - Methods: execute(), getCommand(), listCommands(), waitForCommand()\n * \n * @example\n * ```typescript\n * // PTY mode - Interactive shell\n * const pty = await sandbox.createTerminal({ pty: true, shell: '/bin/bash' });\n * pty.on('output', (data) => console.log(data));\n * pty.write('npm install\\n');\n * \n * // Exec mode - Command tracking\n * const exec = await sandbox.createTerminal({ pty: false });\n * const result = await exec.execute('npm test', { background: true });\n * const cmd = await sandbox.waitForCommand(exec.getId(), result.data.cmd_id);\n * console.log(cmd.data.exit_code);\n * \n * // Backward compatible - creates PTY terminal\n * const terminal = await sandbox.createTerminal('/bin/bash');\n * ```\n * \n * @param options - Terminal creation options\n * @param options.shell - Shell to use (e.g., '/bin/bash', '/bin/sh') - PTY mode only\n * @param options.encoding - Encoding for terminal I/O: 'raw' (default) or 'base64' (binary-safe)\n * @param options.pty - Terminal mode: true = PTY (interactive shell), false = exec (command tracking, default)\n * @returns Terminal instance with event handling\n */\n async createTerminal(\n shellOrOptions?: string | {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n },\n encoding?: 'raw' | 'base64'\n ): Promise<TerminalInstance> {\n // Backward compatibility: if first arg is string, treat as old signature\n let pty: boolean;\n let shell: string | undefined;\n let enc: 'raw' | 'base64' | undefined;\n\n if (typeof shellOrOptions === 'string') {\n // Old signature: createTerminal(shell?, encoding?)\n // Create PTY terminal for backward compatibility\n pty = true;\n shell = shellOrOptions;\n enc = encoding;\n } else {\n // New signature: createTerminal(options?)\n pty = shellOrOptions?.pty ?? false; // Default to exec mode\n enc = shellOrOptions?.encoding;\n shell = shellOrOptions?.shell;\n }\n\n // Create terminal via REST API\n const body: { shell?: string; encoding?: 'raw' | 'base64'; pty?: boolean } = {};\n if (shell) body.shell = shell;\n if (enc) body.encoding = enc;\n if (pty !== undefined) body.pty = pty;\n\n const response = await this.request<TerminalResponse>('/terminals', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n let ws: WebSocketManager | null = null;\n\n // Only use WebSocket for PTY mode\n if (response.data.pty) {\n ws = await this.ensureWebSocket();\n\n // Wait for terminal:created event to ensure terminal is ready\n await new Promise<void>((resolve) => {\n const handler = (msg: any) => {\n if (msg.data?.id === response.data.id) {\n if (ws) ws.off('terminal:created', handler);\n resolve();\n }\n };\n if (ws) {\n ws.on('terminal:created', handler);\n\n // Timeout after 5 seconds\n setTimeout(() => {\n if (ws) ws.off('terminal:created', handler);\n resolve();\n }, 5000);\n } else {\n resolve();\n }\n });\n }\n\n // Create TerminalInstance\n const terminal = new TerminalInstance(\n response.data.id,\n response.data.pty,\n response.data.status,\n response.data.channel || null,\n ws,\n response.data.encoding || 'raw'\n );\n\n // Set up terminal handlers\n const terminalId = response.data.id;\n\n terminal.setExecuteHandler(async (command: string, background?: boolean) => {\n return this.request<CommandExecutionResponse>(`/terminals/${terminalId}/execute`, {\n method: 'POST',\n body: JSON.stringify({ command, background }),\n });\n });\n\n terminal.setListCommandsHandler(async () => {\n return this.request<CommandsListResponse>(`/terminals/${terminalId}/commands`);\n });\n\n terminal.setRetrieveCommandHandler(async (cmdId: string) => {\n return this.request<CommandDetailsResponse>(`/terminals/${terminalId}/commands/${cmdId}`);\n });\n\n terminal.setWaitCommandHandler(async (cmdId: string, timeout?: number) => {\n const params = timeout ? new URLSearchParams({ timeout: timeout.toString() }) : '';\n const endpoint = `/terminals/${terminalId}/commands/${cmdId}/wait${params ? `?${params}` : ''}`;\n return this.request<CommandDetailsResponse>(endpoint);\n });\n\n terminal.setDestroyHandler(async () => {\n await this.request<void>(`/terminals/${terminalId}`, {\n method: 'DELETE',\n });\n });\n\n return terminal;\n }\n\n /**\n * List all active terminals (fetches from API)\n */\n async listTerminals(): Promise<TerminalResponse[]> {\n const response = await this.request<{ message: string; data: { terminals: TerminalResponse[] } }>('/terminals');\n return response.data.terminals;\n }\n\n /**\n * Get terminal by ID\n */\n async getTerminal(id: string): Promise<TerminalResponse> {\n return this.request<TerminalResponse>(`/terminals/${id}`);\n }\n\n // ============================================================================\n // Command Tracking (Exec Mode Terminals)\n // ============================================================================\n\n /**\n * List all commands executed in a terminal (exec mode only)\n * @param terminalId - The terminal ID\n * @returns List of all commands with their status\n * @throws {Error} If terminal is in PTY mode (command tracking not available)\n */\n async listCommands(terminalId: string): Promise<CommandsListResponse> {\n return this.request<CommandsListResponse>(`/terminals/${terminalId}/commands`);\n }\n\n /**\n * Get details of a specific command execution (exec mode only)\n * @param terminalId - The terminal ID\n * @param cmdId - The command ID\n * @returns Command execution details including stdout, stderr, and exit code\n * @throws {Error} If terminal is in PTY mode or command not found\n */\n async getCommand(terminalId: string, cmdId: string): Promise<CommandDetailsResponse> {\n return this.request<CommandDetailsResponse>(`/terminals/${terminalId}/commands/${cmdId}`);\n }\n\n /**\n * Wait for a command to complete (HTTP long-polling, exec mode only)\n * @param terminalId - The terminal ID\n * @param cmdId - The command ID\n * @param timeout - Optional timeout in seconds (0 = no timeout)\n * @returns Command execution details when completed\n * @throws {Error} If terminal is in PTY mode, command not found, or timeout occurs\n */\n async waitForCommand(\n terminalId: string,\n cmdId: string,\n timeout?: number\n ): Promise<CommandDetailsResponse> {\n const params = timeout ? new URLSearchParams({ timeout: timeout.toString() }) : '';\n const endpoint = `/terminals/${terminalId}/commands/${cmdId}/wait${params ? `?${params}` : ''}`;\n return this.request<CommandDetailsResponse>(endpoint);\n }\n\n // ============================================================================\n // File Watchers\n // ============================================================================\n\n /**\n * Create a new file watcher with WebSocket integration\n * @param path - Path to watch\n * @param options - Watcher options\n * @param options.includeContent - Include file content in change events\n * @param options.ignored - Patterns to ignore\n * @param options.encoding - Encoding for file content: 'raw' (default) or 'base64' (binary-safe)\n * @returns FileWatcher instance with event handling\n */\n async createWatcher(\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ): Promise<FileWatcher> {\n // Ensure WebSocket is connected\n const ws = await this.ensureWebSocket();\n\n // Create watcher via REST API\n const response = await this.request<WatcherResponse>('/watchers', {\n method: 'POST',\n body: JSON.stringify({ path, ...options }),\n });\n\n // Create FileWatcher instance (no cleanup callback needed)\n const watcher = new FileWatcher(\n response.data.id,\n response.data.path,\n response.data.status,\n response.data.channel,\n response.data.includeContent,\n response.data.ignored,\n ws,\n response.data.encoding || 'raw'\n );\n\n // Set up watcher handlers\n watcher.setDestroyHandler(async () => {\n await this.request<void>(`/watchers/${response.data.id}`, {\n method: 'DELETE',\n });\n });\n\n return watcher;\n }\n\n /**\n * List all active file watchers (fetches from API)\n */\n async listWatchers(): Promise<WatchersListResponse> {\n return this.request<WatchersListResponse>('/watchers');\n }\n\n /**\n * Get file watcher by ID\n */\n async getWatcher(id: string): Promise<WatcherResponse> {\n return this.request<WatcherResponse>(`/watchers/${id}`);\n }\n\n // ============================================================================\n // Signal Service\n // ============================================================================\n\n /**\n * Start the signal service with WebSocket integration\n * @returns SignalService instance with event handling\n */\n async startSignals(): Promise<SignalService> {\n // Ensure WebSocket is connected\n const ws = await this.ensureWebSocket();\n\n // Start signal service via REST API\n const response = await this.request<SignalServiceResponse>('/signals/start', {\n method: 'POST',\n });\n\n // Create SignalService instance (no cleanup callback needed)\n const signalService = new SignalService(\n response.data.status,\n response.data.channel,\n ws\n );\n\n // Set up signal service handlers\n signalService.setStopHandler(async () => {\n await this.request<SignalServiceResponse>('/signals/stop', {\n method: 'POST',\n });\n });\n\n return signalService;\n }\n\n /**\n * Get the signal service status (fetches from API)\n */\n async getSignalStatus(): Promise<SignalServiceResponse> {\n return this.request<SignalServiceResponse>('/signals/status');\n }\n\n /**\n * Emit a port signal\n */\n async emitPortSignal(\n port: number,\n type: 'open' | 'close',\n url: string\n ): Promise<PortSignalResponse> {\n return this.request<PortSignalResponse>('/signals/port', {\n method: 'POST',\n body: JSON.stringify({ port, type, url }),\n });\n }\n\n /**\n * Emit a port signal (alternative endpoint using path parameters)\n */\n async emitPortSignalAlt(\n port: number,\n type: 'open' | 'close'\n ): Promise<PortSignalResponse> {\n return this.request<PortSignalResponse>(`/signals/port/${port}/${type}`, {\n method: 'POST',\n });\n }\n\n /**\n * Emit an error signal\n */\n async emitErrorSignal(message: string): Promise<GenericSignalResponse> {\n return this.request<GenericSignalResponse>('/signals/error', {\n method: 'POST',\n body: JSON.stringify({ message }),\n });\n }\n\n /**\n * Emit a server ready signal\n */\n async emitServerReadySignal(\n port: number,\n url: string\n ): Promise<PortSignalResponse> {\n return this.request<PortSignalResponse>('/signals/server-ready', {\n method: 'POST',\n body: JSON.stringify({ port, url }),\n });\n }\n\n // ============================================================================\n // Environment Variables\n // ============================================================================\n\n /**\n * Get environment variables from a .env file\n * @param file - Path to the .env file (relative to sandbox root)\n */\n async getEnv(file: string): Promise<EnvGetResponse> {\n const params = new URLSearchParams({ file });\n return this.request<EnvGetResponse>(`/env?${params}`);\n }\n\n /**\n * Set (merge) environment variables in a .env file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param variables - Key-value pairs to set\n */\n async setEnv(\n file: string,\n variables: Record<string, string>\n ): Promise<EnvSetResponse> {\n const params = new URLSearchParams({ file });\n return this.request<EnvSetResponse>(`/env?${params}`, {\n method: 'POST',\n body: JSON.stringify({ variables }),\n });\n }\n\n /**\n * Delete environment variables from a .env file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param keys - Keys to delete\n */\n async deleteEnv(file: string, keys: string[]): Promise<EnvDeleteResponse> {\n const params = new URLSearchParams({ file });\n return this.request<EnvDeleteResponse>(`/env?${params}`, {\n method: 'DELETE',\n body: JSON.stringify({ keys }),\n });\n }\n\n /**\n * Check if an environment file exists (HEAD request)\n * @param file - Path to the .env file (relative to sandbox root)\n * @returns true if file exists, false otherwise\n */\n async checkEnvFile(file: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n };\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n const params = new URLSearchParams({ file });\n const response = await fetch(`${this.config.sandboxUrl}/env?${params}`, {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n // ============================================================================\n // Server Management\n // ============================================================================\n\n /**\n * List all managed servers\n */\n async listServers(): Promise<ServersListResponse> {\n return this.request<ServersListResponse>('/servers');\n }\n\n /**\n * Start a new managed server\n * @param options - Server configuration\n */\n async startServer(options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }): Promise<ServerResponse> {\n return this.request<ServerResponse>('/servers', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Get information about a specific server\n * @param slug - Server slug\n */\n async getServer(slug: string): Promise<ServerResponse> {\n return this.request<ServerResponse>(`/servers/${encodeURIComponent(slug)}`);\n }\n\n /**\n * Stop a managed server\n * @param slug - Server slug\n */\n async stopServer(slug: string): Promise<ServerStopResponse> {\n return this.request<ServerStopResponse>(\n `/servers/${encodeURIComponent(slug)}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n /**\n * Restart a managed server\n * @param slug - Server slug\n */\n async restartServer(slug: string): Promise<ServerResponse> {\n return this.request<ServerResponse>(\n `/servers/${encodeURIComponent(slug)}/restart`,\n {\n method: 'POST',\n }\n );\n }\n\n /**\n * Update server status (internal use)\n * @param slug - Server slug\n * @param status - New server status\n */\n async updateServerStatus(\n slug: string,\n status: ServerStatus\n ): Promise<ServerStatusUpdateResponse> {\n return this.request<ServerStatusUpdateResponse>(\n `/servers/${encodeURIComponent(slug)}/status`,\n {\n method: 'PATCH',\n body: JSON.stringify({ status }),\n }\n );\n }\n\n // ============================================================================\n // Sandbox Management\n // ============================================================================\n\n /**\n * Create a new sandbox environment\n */\n async createSandbox(): Promise<SandboxInfo> {\n return this.request<SandboxInfo>('/sandboxes', {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n /**\n * List all sandboxes\n */\n async listSandboxes(): Promise<SandboxesListResponse> {\n return this.request<SandboxesListResponse>('/sandboxes');\n }\n\n /**\n * Get sandbox details\n */\n async getSandbox(subdomain: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(`/sandboxes/${subdomain}`);\n }\n\n /**\n * Delete a sandbox\n */\n async deleteSandbox(\n subdomain: string,\n deleteFiles: boolean = false\n ): Promise<void> {\n const params = new URLSearchParams({ delete_files: String(deleteFiles) });\n return this.request<void>(`/sandboxes/${subdomain}?${params}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // WebSocket Connection (Internal)\n // ============================================================================\n\n /**\n * Get WebSocket URL for real-time communication\n * @private\n */\n private getWebSocketUrl(): string {\n const wsProtocol = this.config.sandboxUrl.startsWith('https') ? 'wss' : 'ws';\n const url = this.config.sandboxUrl.replace(/^https?:/, `${wsProtocol}:`);\n\n // Build query parameters\n const params = new URLSearchParams();\n if (this._token) {\n params.set('token', this._token);\n }\n // Always send protocol parameter\n params.set('protocol', this.config.protocol || 'binary');\n\n const queryString = params.toString();\n return `${url}/ws${queryString ? `?${queryString}` : ''}`;\n }\n\n // ============================================================================\n // Sandbox Interface Implementation\n // ============================================================================\n\n /**\n * Execute code in the sandbox (convenience method)\n *\n * Delegates to sandbox.run.code() - prefer using that directly for new code.\n *\n * @param code - The code to execute\n * @param language - Programming language (auto-detected if not specified)\n * @returns Code execution result\n */\n async runCode(code: string, language?: 'node' | 'python'): Promise<{\n output: string;\n exitCode: number;\n language: string;\n }> {\n return this.run.code(code, language ? { language } : undefined);\n }\n\n /**\n * Execute shell command in the sandbox (convenience method)\n *\n * Delegates to sandbox.run.command() - prefer using that directly for new code.\n *\n * @param command - The command to execute (string or array form)\n * @param argsOrOptions - Arguments array or options object\n * @param maybeOptions - Options when using (command, args, options) form\n * @returns Command execution result\n */\n async runCommand(\n commandOrArray: string | [string, ...string[]],\n argsOrOptions?: string[] | { background?: boolean; cwd?: string },\n maybeOptions?: { background?: boolean; cwd?: string }\n ): Promise<{\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs: number;\n }> {\n // Parse overloaded arguments\n let commandParts: string[];\n let options: { background?: boolean; cwd?: string } | undefined;\n\n if (Array.isArray(commandOrArray)) {\n // Array form: runCommand(['npm', 'install'], { cwd: '/app' })\n commandParts = commandOrArray;\n options = argsOrOptions as { background?: boolean; cwd?: string } | undefined;\n } else {\n // Traditional form: runCommand('npm', ['install'], { cwd: '/app' })\n const args = Array.isArray(argsOrOptions) ? argsOrOptions : [];\n commandParts = [commandOrArray, ...args];\n options = Array.isArray(argsOrOptions) ? maybeOptions : argsOrOptions as { background?: boolean; cwd?: string } | undefined;\n }\n\n // Use cmd() to build the command with proper escaping and shell wrapping\n const finalCommand = cmd(commandParts as Command, options);\n\n // cmd() returns ['sh', '-c', 'escaped command'] if options provided,\n // or the raw array if no options. Either way, escapeArgs handles it safely\n const fullCommand = escapeArgs(finalCommand);\n\n return this.run.command(fullCommand, { background: options?.background });\n }\n\n /**\n * Get server information\n * Returns details about the server including auth status, main subdomain, sandbox count, and version\n */\n async getServerInfo(): Promise<InfoResponse> {\n return this.request<InfoResponse>('/info');\n }\n\n /**\n * Get sandbox information\n */\n async getInfo(): Promise<{\n id: string;\n provider: string;\n runtime: 'node' | 'python';\n status: 'running' | 'stopped' | 'error';\n createdAt: Date;\n timeout: number;\n metadata?: Record<string, any>;\n }> {\n return {\n id: this.sandboxId || '',\n provider: this.provider || '',\n runtime: 'node' as const,\n status: 'running' as const,\n createdAt: new Date(),\n timeout: this.config.timeout,\n metadata: this.config.metadata\n };\n }\n\n /**\n * Get URL for accessing sandbox on a specific port (Sandbox interface method)\n */\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n const protocol = options.protocol || 'https';\n // Extract components from sandboxUrl\n const url = new URL(this.config.sandboxUrl);\n const parts = url.hostname.split('.');\n const subdomain = parts[0]; // Extract \"sandbox-123\" or \"abc\"\n const baseDomain = parts.slice(1).join('.'); // Extract \"sandbox.computesdk.com\"\n\n // ComputeSDK has two domains:\n // - sandbox.computesdk.com: Management/control plane\n // - preview.computesdk.com: Preview URLs for services\n // When getting a URL for a port, we need the preview domain\n const previewDomain = baseDomain.replace('sandbox.computesdk.com', 'preview.computesdk.com');\n\n // ComputeSDK URL pattern: ${subdomain}-${port}.${previewDomain}\n // Examples:\n // - https://sandbox-123.sandbox.computesdk.com → https://sandbox-123-3000.preview.computesdk.com\n return `${protocol}://${subdomain}-${options.port}.${previewDomain}`;\n }\n\n /**\n * Get provider instance\n * Note: Not available when using Sandbox directly - only available through gateway provider\n */\n getProvider(): never {\n throw new Error(\n 'getProvider() is not available on Sandbox. ' +\n 'This method is only available when using provider sandboxes through the gateway.'\n );\n }\n\n /**\n * Get native provider instance\n * Returns the Sandbox itself since this IS the sandbox implementation\n */\n getInstance(): this {\n return this;\n }\n\n /**\n * Destroy the sandbox (Sandbox interface method)\n */\n async destroy(): Promise<void> {\n await this.disconnect();\n }\n\n /**\n * Disconnect WebSocket\n *\n * Note: This only disconnects the WebSocket. Terminals, watchers, and signals\n * will continue running on the server until explicitly destroyed via their\n * respective destroy() methods or the DELETE endpoints.\n */\n async disconnect(): Promise<void> {\n // Disconnect WebSocket\n if (this._ws) {\n this._ws.disconnect();\n this._ws = null;\n }\n }\n}\n\n/**\n * Create a new Sandbox instance\n *\n * @example\n * ```typescript\n * import { createSandbox } from '@computesdk/client'\n *\n * // Create sandbox with access token or session token\n * const sandbox = createSandbox({\n * sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com',\n * token: accessToken,\n * });\n *\n * // Execute commands\n * const result = await sandbox.execute({ command: 'ls -la' });\n * ```\n */\nexport function createSandbox(config: SandboxConfig): Sandbox {\n return new Sandbox(config);\n}\n\n// ============================================================================\n// Backwards Compatibility Aliases\n// ============================================================================\n\n/** @deprecated Use SandboxConfig instead */\nexport type ComputeClientConfig = SandboxConfig;\n\n/** @deprecated Use Sandbox instead */\nexport { Sandbox as ComputeClient };\n\n/** @deprecated Use createSandbox instead */\nexport { createSandbox as createClient };\n","/**\n * Terminal - Resource namespace for terminal management\n */\n\nimport type { TerminalInstance } from '../terminal';\nimport type { TerminalResponse } from '../index';\n\n/**\n * Terminal resource namespace\n *\n * @example\n * ```typescript\n * // Create a PTY terminal (interactive shell)\n * const pty = await sandbox.terminal.create({ pty: true, shell: '/bin/bash' });\n * pty.on('output', (data) => console.log(data));\n * pty.write('ls -la\\n');\n *\n * // Create an exec terminal (command tracking)\n * const exec = await sandbox.terminal.create({ pty: false });\n * const cmd = await exec.command.run('npm test');\n * console.log(cmd.exitCode);\n *\n * // List all terminals\n * const terminals = await sandbox.terminal.list();\n *\n * // Retrieve a specific terminal\n * const terminal = await sandbox.terminal.retrieve(id);\n *\n * // Destroy a terminal\n * await sandbox.terminal.destroy(id);\n * ```\n */\nexport class Terminal {\n private createHandler: (options?: {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n }) => Promise<TerminalInstance>;\n private listHandler: () => Promise<TerminalResponse[]>;\n private retrieveHandler: (id: string) => Promise<TerminalResponse>;\n private destroyHandler: (id: string) => Promise<void>;\n\n constructor(handlers: {\n create: (options?: {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n }) => Promise<TerminalInstance>;\n list: () => Promise<TerminalResponse[]>;\n retrieve: (id: string) => Promise<TerminalResponse>;\n destroy: (id: string) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n }\n\n /**\n * Create a new terminal session\n *\n * @param options - Terminal creation options\n * @param options.shell - Shell to use (e.g., '/bin/bash') - PTY mode only\n * @param options.encoding - Encoding: 'raw' (default) or 'base64' (binary-safe)\n * @param options.pty - Terminal mode: true = PTY (interactive), false = exec (command tracking)\n * @returns TerminalInstance\n */\n async create(options?: {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n }): Promise<TerminalInstance> {\n return this.createHandler(options);\n }\n\n /**\n * List all active terminals\n * @returns Array of terminal responses\n */\n async list(): Promise<TerminalResponse[]> {\n return this.listHandler();\n }\n\n /**\n * Retrieve a specific terminal by ID\n * @param id - The terminal ID\n * @returns Terminal response\n */\n async retrieve(id: string): Promise<TerminalResponse> {\n return this.retrieveHandler(id);\n }\n\n /**\n * Destroy a terminal by ID\n * @param id - The terminal ID\n */\n async destroy(id: string): Promise<void> {\n return this.destroyHandler(id);\n }\n}\n","/**\n * Server - Resource namespace for managed server operations\n */\n\nimport type {\n ServersListResponse,\n ServerResponse,\n ServerStopResponse,\n ServerInfo,\n ServerStatus,\n} from '../index';\n\n/**\n * Server resource namespace\n *\n * @example\n * ```typescript\n * // Start a new server\n * const server = await sandbox.server.start({\n * slug: 'api',\n * command: 'npm start',\n * path: '/app',\n * });\n *\n * // List all servers\n * const servers = await sandbox.server.list();\n *\n * // Retrieve a specific server\n * const server = await sandbox.server.retrieve('api');\n *\n * // Stop a server\n * await sandbox.server.stop('api');\n *\n * // Restart a server\n * await sandbox.server.restart('api');\n * ```\n */\nexport class Server {\n private startHandler: (options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }) => Promise<ServerResponse>;\n private listHandler: () => Promise<ServersListResponse>;\n private retrieveHandler: (slug: string) => Promise<ServerResponse>;\n private stopHandler: (slug: string) => Promise<ServerStopResponse | void>;\n private restartHandler: (slug: string) => Promise<ServerResponse>;\n private updateStatusHandler: (slug: string, status: ServerStatus) => Promise<void>;\n\n constructor(handlers: {\n start: (options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }) => Promise<ServerResponse>;\n list: () => Promise<ServersListResponse>;\n retrieve: (slug: string) => Promise<ServerResponse>;\n stop: (slug: string) => Promise<ServerStopResponse | void>;\n restart: (slug: string) => Promise<ServerResponse>;\n updateStatus: (slug: string, status: ServerStatus) => Promise<void>;\n }) {\n this.startHandler = handlers.start;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.stopHandler = handlers.stop;\n this.restartHandler = handlers.restart;\n this.updateStatusHandler = handlers.updateStatus;\n }\n\n /**\n * Start a new managed server\n * @param options - Server configuration\n * @param options.slug - Unique server slug (URL-safe identifier)\n * @param options.command - Command to start the server\n * @param options.path - Working directory (optional)\n * @param options.env_file - Path to env file (optional)\n * @returns Server info\n */\n async start(options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }): Promise<ServerInfo> {\n const response = await this.startHandler(options);\n return response.data.server;\n }\n\n /**\n * List all managed servers\n * @returns Array of server info\n */\n async list(): Promise<ServerInfo[]> {\n const response = await this.listHandler();\n return response.data.servers;\n }\n\n /**\n * Retrieve a specific server by slug\n * @param slug - The server slug\n * @returns Server info\n */\n async retrieve(slug: string): Promise<ServerInfo> {\n const response = await this.retrieveHandler(slug);\n return response.data.server;\n }\n\n /**\n * Stop a server by slug\n * @param slug - The server slug\n */\n async stop(slug: string): Promise<void> {\n await this.stopHandler(slug);\n }\n\n /**\n * Restart a server by slug\n * @param slug - The server slug\n * @returns Server info\n */\n async restart(slug: string): Promise<ServerInfo> {\n const response = await this.restartHandler(slug);\n return response.data.server;\n }\n\n /**\n * Update server status (internal use)\n * @param slug - The server slug\n * @param status - New status\n */\n async updateStatus(slug: string, status: ServerStatus): Promise<void> {\n await this.updateStatusHandler(slug, status);\n }\n}\n","/**\n * Watcher - Resource namespace for file watcher operations\n */\n\nimport type { FileWatcher } from '../file-watcher';\nimport type { WatchersListResponse, WatcherResponse, WatcherInfo } from '../index';\n\n/**\n * Watcher resource namespace\n *\n * @example\n * ```typescript\n * // Create a file watcher\n * const watcher = await sandbox.watcher.create('/project', {\n * ignored: ['node_modules', '.git'],\n * includeContent: true,\n * });\n * watcher.on('change', (event) => {\n * console.log(`${event.event}: ${event.path}`);\n * });\n *\n * // List all watchers\n * const watchers = await sandbox.watcher.list();\n *\n * // Retrieve a specific watcher\n * const watcher = await sandbox.watcher.retrieve(id);\n *\n * // Destroy a watcher\n * await sandbox.watcher.destroy(id);\n * ```\n */\nexport class Watcher {\n private createHandler: (\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ) => Promise<FileWatcher>;\n private listHandler: () => Promise<WatchersListResponse>;\n private retrieveHandler: (id: string) => Promise<WatcherResponse>;\n private destroyHandler: (id: string) => Promise<void>;\n\n constructor(handlers: {\n create: (\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ) => Promise<FileWatcher>;\n list: () => Promise<WatchersListResponse>;\n retrieve: (id: string) => Promise<WatcherResponse>;\n destroy: (id: string) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n }\n\n /**\n * Create a new file watcher\n * @param path - Path to watch\n * @param options - Watcher options\n * @param options.includeContent - Include file content in change events\n * @param options.ignored - Patterns to ignore\n * @param options.encoding - Encoding: 'raw' (default) or 'base64' (binary-safe)\n * @returns FileWatcher instance\n */\n async create(\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ): Promise<FileWatcher> {\n return this.createHandler(path, options);\n }\n\n /**\n * List all active file watchers\n * @returns Array of watcher info\n */\n async list(): Promise<WatcherInfo[]> {\n const response = await this.listHandler();\n return response.data.watchers;\n }\n\n /**\n * Retrieve a specific watcher by ID\n * @param id - The watcher ID\n * @returns Watcher info\n */\n async retrieve(id: string): Promise<WatcherInfo> {\n const response = await this.retrieveHandler(id);\n return response.data;\n }\n\n /**\n * Destroy a watcher by ID\n * @param id - The watcher ID\n */\n async destroy(id: string): Promise<void> {\n return this.destroyHandler(id);\n }\n}\n","/**\n * SessionToken - Resource namespace for session token management\n */\n\nimport type { SessionTokenResponse, SessionTokenListResponse } from '../index';\n\n/**\n * Session token info\n */\nexport interface SessionTokenInfo {\n id: string;\n token?: string; // Only present when creating\n description?: string;\n createdAt: string;\n expiresAt: string;\n lastUsedAt?: string;\n}\n\n/**\n * SessionToken resource namespace\n *\n * @example\n * ```typescript\n * // Create a session token (requires access token)\n * const token = await sandbox.sessionToken.create({\n * description: 'My Application',\n * expiresIn: 604800, // 7 days\n * });\n * console.log(token.token);\n *\n * // List all session tokens\n * const tokens = await sandbox.sessionToken.list();\n *\n * // Retrieve a specific token\n * const token = await sandbox.sessionToken.retrieve(id);\n *\n * // Revoke a token\n * await sandbox.sessionToken.revoke(id);\n * ```\n */\nexport class SessionToken {\n private createHandler: (options?: {\n description?: string;\n expiresIn?: number;\n }) => Promise<SessionTokenResponse>;\n private listHandler: () => Promise<SessionTokenListResponse>;\n private retrieveHandler: (id: string) => Promise<SessionTokenResponse>;\n private revokeHandler: (id: string) => Promise<void>;\n\n constructor(handlers: {\n create: (options?: {\n description?: string;\n expiresIn?: number;\n }) => Promise<SessionTokenResponse>;\n list: () => Promise<SessionTokenListResponse>;\n retrieve: (id: string) => Promise<SessionTokenResponse>;\n revoke: (id: string) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.revokeHandler = handlers.revoke;\n }\n\n /**\n * Create a new session token (requires access token)\n * @param options - Token configuration\n * @param options.description - Description for the token\n * @param options.expiresIn - Expiration time in seconds (default: 7 days)\n * @returns Session token info including the token value\n */\n async create(options?: {\n description?: string;\n expiresIn?: number;\n }): Promise<SessionTokenInfo> {\n const response = await this.createHandler(options);\n return {\n id: response.id,\n token: response.token,\n description: response.description,\n createdAt: response.createdAt,\n expiresAt: response.expiresAt,\n };\n }\n\n /**\n * List all session tokens\n * @returns Array of session token info\n */\n async list(): Promise<SessionTokenInfo[]> {\n const response = await this.listHandler();\n return response.data.tokens.map((t) => ({\n id: t.id,\n description: t.description,\n createdAt: t.created_at,\n expiresAt: t.expires_at,\n lastUsedAt: t.last_used_at,\n }));\n }\n\n /**\n * Retrieve a specific session token by ID\n * @param id - The token ID\n * @returns Session token info\n */\n async retrieve(id: string): Promise<SessionTokenInfo> {\n const response = await this.retrieveHandler(id);\n return {\n id: response.id,\n description: response.description,\n createdAt: response.createdAt,\n expiresAt: response.expiresAt,\n };\n }\n\n /**\n * Revoke a session token\n * @param id - The token ID to revoke\n */\n async revoke(id: string): Promise<void> {\n return this.revokeHandler(id);\n }\n}\n","/**\n * MagicLink - Resource namespace for magic link operations\n */\n\nimport type { MagicLinkResponse } from '../index';\n\n/**\n * Magic link info\n */\nexport interface MagicLinkInfo {\n url: string;\n expiresAt: string;\n redirectUrl: string;\n}\n\n/**\n * MagicLink resource namespace\n *\n * @example\n * ```typescript\n * // Create a magic link (requires access token)\n * const link = await sandbox.magicLink.create({\n * redirectUrl: '/dashboard',\n * });\n * console.log(link.url);\n * ```\n */\nexport class MagicLink {\n private createHandler: (options?: {\n redirectUrl?: string;\n }) => Promise<MagicLinkResponse>;\n\n constructor(handlers: {\n create: (options?: { redirectUrl?: string }) => Promise<MagicLinkResponse>;\n }) {\n this.createHandler = handlers.create;\n }\n\n /**\n * Create a magic link for browser authentication (requires access token)\n *\n * Magic links are one-time URLs that automatically create a session token\n * and set it as a cookie in the user's browser.\n *\n * @param options - Magic link configuration\n * @param options.redirectUrl - URL to redirect to after authentication\n * @returns Magic link info including the URL\n */\n async create(options?: { redirectUrl?: string }): Promise<MagicLinkInfo> {\n const response = await this.createHandler(options);\n return {\n url: response.data.magic_url,\n expiresAt: response.data.expires_at,\n redirectUrl: response.data.redirect_url,\n };\n }\n}\n","/**\n * Signal - Resource namespace for signal service operations\n */\n\nimport type { SignalService } from '../signal-service';\nimport type { SignalServiceResponse, PortSignalResponse, GenericSignalResponse } from '../index';\n\n/**\n * Signal service status info\n */\nexport interface SignalStatusInfo {\n status: 'active' | 'stopped';\n channel: string;\n wsUrl: string;\n}\n\n/**\n * Signal resource namespace\n *\n * @example\n * ```typescript\n * // Start the signal service\n * const signals = await sandbox.signal.start();\n * signals.on('port', (event) => {\n * console.log(`Port ${event.port} opened: ${event.url}`);\n * });\n *\n * // Get signal service status\n * const status = await sandbox.signal.status();\n *\n * // Emit signals\n * await sandbox.signal.emitPort(3000, 'open', 'http://localhost:3000');\n * await sandbox.signal.emitError('Something went wrong');\n *\n * // Stop the signal service\n * await sandbox.signal.stop();\n * ```\n */\nexport class Signal {\n private startHandler: () => Promise<SignalService>;\n private statusHandler: () => Promise<SignalServiceResponse>;\n private stopHandler: () => Promise<void>;\n private emitPortHandler: (\n port: number,\n type: 'open' | 'close',\n url: string\n ) => Promise<PortSignalResponse>;\n private emitErrorHandler: (message: string) => Promise<GenericSignalResponse>;\n private emitServerReadyHandler: (\n port: number,\n url: string\n ) => Promise<PortSignalResponse>;\n\n constructor(handlers: {\n start: () => Promise<SignalService>;\n status: () => Promise<SignalServiceResponse>;\n stop: () => Promise<void>;\n emitPort: (\n port: number,\n type: 'open' | 'close',\n url: string\n ) => Promise<PortSignalResponse>;\n emitError: (message: string) => Promise<GenericSignalResponse>;\n emitServerReady: (port: number, url: string) => Promise<PortSignalResponse>;\n }) {\n this.startHandler = handlers.start;\n this.statusHandler = handlers.status;\n this.stopHandler = handlers.stop;\n this.emitPortHandler = handlers.emitPort;\n this.emitErrorHandler = handlers.emitError;\n this.emitServerReadyHandler = handlers.emitServerReady;\n }\n\n /**\n * Start the signal service\n * @returns SignalService instance with event handling\n */\n async start(): Promise<SignalService> {\n return this.startHandler();\n }\n\n /**\n * Get the signal service status\n * @returns Signal service status info\n */\n async status(): Promise<SignalStatusInfo> {\n const response = await this.statusHandler();\n return {\n status: response.data.status,\n channel: response.data.channel,\n wsUrl: response.data.ws_url,\n };\n }\n\n /**\n * Stop the signal service\n */\n async stop(): Promise<void> {\n return this.stopHandler();\n }\n\n /**\n * Emit a port signal\n * @param port - Port number\n * @param type - Signal type ('open' or 'close')\n * @param url - URL associated with the port\n */\n async emitPort(\n port: number,\n type: 'open' | 'close',\n url: string\n ): Promise<void> {\n await this.emitPortHandler(port, type, url);\n }\n\n /**\n * Emit an error signal\n * @param message - Error message\n */\n async emitError(message: string): Promise<void> {\n await this.emitErrorHandler(message);\n }\n\n /**\n * Emit a server ready signal\n * @param port - Port number\n * @param url - Server URL\n */\n async emitServerReady(port: number, url: string): Promise<void> {\n await this.emitServerReadyHandler(port, url);\n }\n}\n","/**\n * File - Resource namespace for file operations\n */\n\nimport type {\n FilesListResponse,\n FileResponse,\n BatchWriteResponse,\n FileInfo,\n BatchWriteResult,\n BatchFileOperation,\n} from '../index';\n\n/**\n * File resource namespace\n *\n * @example\n * ```typescript\n * // Create a file\n * const file = await sandbox.file.create('/project/hello.txt', 'Hello, World!');\n *\n * // List files in a directory\n * const files = await sandbox.file.list('/project');\n *\n * // Retrieve file content\n * const content = await sandbox.file.retrieve('/project/hello.txt');\n *\n * // Destroy (delete) a file\n * await sandbox.file.destroy('/project/hello.txt');\n *\n * // Batch write multiple files\n * const results = await sandbox.file.batchWrite([\n * { path: '/project/a.txt', operation: 'write', content: 'A' },\n * { path: '/project/b.txt', operation: 'write', content: 'B' },\n * ]);\n *\n * // Batch delete files\n * const results = await sandbox.file.batchWrite([\n * { path: '/project/old.txt', operation: 'delete' },\n * ]);\n * ```\n */\nexport class File {\n private createHandler: (path: string, content?: string) => Promise<FileResponse>;\n private listHandler: (path: string) => Promise<FilesListResponse>;\n private retrieveHandler: (path: string) => Promise<string>;\n private destroyHandler: (path: string) => Promise<void>;\n private batchWriteHandler: (\n files: Array<{ path: string; operation: BatchFileOperation; content?: string }>\n ) => Promise<BatchWriteResponse>;\n private existsHandler: (path: string) => Promise<boolean>;\n\n constructor(handlers: {\n create: (path: string, content?: string) => Promise<FileResponse>;\n list: (path: string) => Promise<FilesListResponse>;\n retrieve: (path: string) => Promise<string>;\n destroy: (path: string) => Promise<void>;\n batchWrite: (\n files: Array<{ path: string; operation: BatchFileOperation; content?: string }>\n ) => Promise<BatchWriteResponse>;\n exists: (path: string) => Promise<boolean>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n this.batchWriteHandler = handlers.batchWrite;\n this.existsHandler = handlers.exists;\n }\n\n /**\n * Create a new file with optional content\n * @param path - File path\n * @param content - File content (optional)\n * @returns File info\n */\n async create(path: string, content?: string): Promise<FileInfo> {\n const response = await this.createHandler(path, content);\n return response.data.file;\n }\n\n /**\n * List files at the specified path\n * @param path - Directory path (default: '/')\n * @returns Array of file info\n */\n async list(path: string = '/'): Promise<FileInfo[]> {\n const response = await this.listHandler(path);\n return response.data.files;\n }\n\n /**\n * Retrieve file content\n * @param path - File path\n * @returns File content as string\n */\n async retrieve(path: string): Promise<string> {\n return this.retrieveHandler(path);\n }\n\n /**\n * Destroy (delete) a file or directory\n * @param path - File or directory path\n */\n async destroy(path: string): Promise<void> {\n return this.destroyHandler(path);\n }\n\n /**\n * Batch file operations (write or delete multiple files)\n *\n * Features:\n * - Deduplication: Last operation wins per path\n * - File locking: Prevents race conditions\n * - Deterministic ordering: Alphabetical path sorting\n * - Partial failure handling: Returns per-file results\n *\n * @param files - Array of file operations\n * @returns Results for each file operation\n */\n async batchWrite(\n files: Array<{ path: string; operation: BatchFileOperation; content?: string }>\n ): Promise<BatchWriteResult[]> {\n const response = await this.batchWriteHandler(files);\n return response.data.results;\n }\n\n /**\n * Check if a file exists\n * @param path - File path\n * @returns True if file exists\n */\n async exists(path: string): Promise<boolean> {\n return this.existsHandler(path);\n }\n}\n","/**\n * Env - Resource namespace for environment variable operations\n */\n\nimport type { EnvGetResponse, EnvSetResponse, EnvDeleteResponse } from '../index';\n\n/**\n * Env resource namespace\n *\n * @example\n * ```typescript\n * // Retrieve environment variables\n * const vars = await sandbox.env.retrieve('.env');\n * console.log(vars);\n *\n * // Update environment variables (merges with existing)\n * await sandbox.env.update('.env', {\n * API_KEY: 'secret',\n * DEBUG: 'true',\n * });\n *\n * // Remove environment variables\n * await sandbox.env.remove('.env', ['OLD_KEY', 'DEPRECATED']);\n * ```\n */\nexport class Env {\n private retrieveHandler: (file: string) => Promise<EnvGetResponse>;\n private updateHandler: (\n file: string,\n variables: Record<string, string>\n ) => Promise<EnvSetResponse>;\n private removeHandler: (file: string, keys: string[]) => Promise<EnvDeleteResponse>;\n private existsHandler: (file: string) => Promise<boolean>;\n\n constructor(handlers: {\n retrieve: (file: string) => Promise<EnvGetResponse>;\n update: (\n file: string,\n variables: Record<string, string>\n ) => Promise<EnvSetResponse>;\n remove: (file: string, keys: string[]) => Promise<EnvDeleteResponse>;\n exists: (file: string) => Promise<boolean>;\n }) {\n this.retrieveHandler = handlers.retrieve;\n this.updateHandler = handlers.update;\n this.removeHandler = handlers.remove;\n this.existsHandler = handlers.exists;\n }\n\n /**\n * Retrieve environment variables from a file\n * @param file - Path to the .env file (relative to sandbox root)\n * @returns Key-value map of environment variables\n */\n async retrieve(file: string): Promise<Record<string, string>> {\n const response = await this.retrieveHandler(file);\n return response.data.variables;\n }\n\n /**\n * Update (merge) environment variables in a file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param variables - Key-value pairs to set\n * @returns Keys that were updated\n */\n async update(\n file: string,\n variables: Record<string, string>\n ): Promise<string[]> {\n const response = await this.updateHandler(file, variables);\n return response.data.keys;\n }\n\n /**\n * Remove environment variables from a file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param keys - Keys to remove\n * @returns Keys that were removed\n */\n async remove(file: string, keys: string[]): Promise<string[]> {\n const response = await this.removeHandler(file, keys);\n return response.data.keys;\n }\n\n /**\n * Check if an environment file exists\n * @param file - Path to the .env file (relative to sandbox root)\n * @returns True if file exists\n */\n async exists(file: string): Promise<boolean> {\n return this.existsHandler(file);\n }\n}\n","/**\n * Auth - Resource namespace for authentication info\n */\n\nimport type { AuthStatusResponse, AuthInfoResponse } from '../index';\n\n/**\n * Authentication status info\n */\nexport interface AuthStatusInfo {\n authenticated: boolean;\n tokenType?: 'access_token' | 'session_token';\n expiresAt?: string;\n}\n\n/**\n * Authentication endpoints info\n */\nexport interface AuthEndpointsInfo {\n createSessionToken: string;\n listSessionTokens: string;\n getSessionToken: string;\n revokeSessionToken: string;\n createMagicLink: string;\n authStatus: string;\n authInfo: string;\n}\n\n/**\n * Authentication info\n */\nexport interface AuthInfo {\n message: string;\n instructions: string;\n endpoints: AuthEndpointsInfo;\n}\n\n/**\n * Auth resource namespace\n *\n * @example\n * ```typescript\n * // Check authentication status\n * const status = await sandbox.auth.status();\n * console.log(status.authenticated);\n * console.log(status.tokenType);\n *\n * // Get authentication info and instructions\n * const info = await sandbox.auth.info();\n * console.log(info.instructions);\n * ```\n */\nexport class Auth {\n private statusHandler: () => Promise<AuthStatusResponse>;\n private infoHandler: () => Promise<AuthInfoResponse>;\n\n constructor(handlers: {\n status: () => Promise<AuthStatusResponse>;\n info: () => Promise<AuthInfoResponse>;\n }) {\n this.statusHandler = handlers.status;\n this.infoHandler = handlers.info;\n }\n\n /**\n * Check authentication status\n * @returns Authentication status info\n */\n async status(): Promise<AuthStatusInfo> {\n const response = await this.statusHandler();\n return {\n authenticated: response.data.authenticated,\n tokenType: response.data.token_type,\n expiresAt: response.data.expires_at,\n };\n }\n\n /**\n * Get authentication information and usage instructions\n * @returns Authentication info\n */\n async info(): Promise<AuthInfo> {\n const response = await this.infoHandler();\n return {\n message: response.data.message,\n instructions: response.data.instructions,\n endpoints: {\n createSessionToken: response.data.endpoints.create_session_token,\n listSessionTokens: response.data.endpoints.list_session_tokens,\n getSessionToken: response.data.endpoints.get_session_token,\n revokeSessionToken: response.data.endpoints.revoke_session_token,\n createMagicLink: response.data.endpoints.create_magic_link,\n authStatus: response.data.endpoints.auth_status,\n authInfo: response.data.endpoints.auth_info,\n },\n };\n }\n}\n","/**\n * Run - Resource namespace for code and command execution\n */\n\n/**\n * Code execution result\n */\nexport interface CodeResult {\n output: string;\n exitCode: number;\n language: string;\n}\n\n/**\n * Command execution result\n */\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs: number;\n}\n\n/**\n * Supported languages for code execution\n */\nexport type CodeLanguage = 'python' | 'python3' | 'node' | 'javascript' | 'js' | 'bash' | 'sh' | 'ruby';\n\n/**\n * Code execution options\n */\nexport interface CodeRunOptions {\n /** Programming language (optional - will auto-detect if not specified) */\n language?: CodeLanguage;\n}\n\n/**\n * Command execution options\n */\nexport interface CommandRunOptions {\n /** Shell to use (optional) */\n shell?: string;\n /** Run in background (optional) */\n background?: boolean;\n}\n\n/**\n * Run - Resource namespace for executing code and commands\n *\n * @example\n * ```typescript\n * // Run code with auto-detection\n * const result = await sandbox.run.code('print(\"Hello from Python\")');\n * console.log(result.output); // \"Hello from Python\\n\"\n * console.log(result.language); // \"python\"\n *\n * // Run code with explicit language\n * const result = await sandbox.run.code('console.log(\"Hello\")', { language: 'node' });\n *\n * // Run a command\n * const result = await sandbox.run.command('ls -la');\n * console.log(result.stdout);\n * console.log(result.exitCode);\n * ```\n */\nexport class Run {\n private codeHandler: (code: string, options?: CodeRunOptions) => Promise<CodeResult>;\n private commandHandler: (command: string, options?: CommandRunOptions) => Promise<CommandResult>;\n\n constructor(handlers: {\n code: (code: string, options?: CodeRunOptions) => Promise<CodeResult>;\n command: (command: string, options?: CommandRunOptions) => Promise<CommandResult>;\n }) {\n this.codeHandler = handlers.code;\n this.commandHandler = handlers.command;\n }\n\n /**\n * Execute code with automatic language detection\n *\n * Supports: python, python3, node, javascript, js, bash, sh, ruby\n *\n * @param code - The code to execute\n * @param options - Execution options\n * @param options.language - Programming language (auto-detected if not specified)\n * @returns Code execution result with output, exit code, and detected language\n */\n async code(code: string, options?: CodeRunOptions): Promise<CodeResult> {\n return this.codeHandler(code, options);\n }\n\n /**\n * Execute a shell command\n *\n * @param command - The command to execute\n * @param options - Execution options\n * @param options.shell - Shell to use (optional)\n * @param options.background - Run in background (optional)\n * @returns Command execution result with stdout, stderr, exit code, and duration\n */\n async command(command: string, options?: CommandRunOptions): Promise<CommandResult> {\n return this.commandHandler(command, options);\n }\n}\n","/**\n * Child - Resource namespace for child sandbox operations\n */\n\nimport type { SandboxInfo, SandboxesListResponse } from '../index';\n\n/**\n * Child resource namespace for managing child sandboxes\n *\n * Child sandboxes are isolated environments within the parent sandbox,\n * each with their own filesystem. Available only in multi-tenant mode.\n *\n * @example\n * ```typescript\n * // Create a new child sandbox\n * const child = await sandbox.child.create();\n * console.log(child.url); // https://sandbox-12345.sandbox.computesdk.com\n *\n * // List all children\n * const all = await sandbox.child.list();\n *\n * // Get a specific child\n * const info = await sandbox.child.retrieve('sandbox-12345');\n *\n * // Delete a child sandbox\n * await sandbox.child.destroy('sandbox-12345');\n *\n * // Delete child and its files\n * await sandbox.child.destroy('sandbox-12345', { deleteFiles: true });\n * ```\n */\nexport class Child {\n private createHandler: () => Promise<SandboxInfo>;\n private listHandler: () => Promise<SandboxesListResponse>;\n private retrieveHandler: (subdomain: string) => Promise<SandboxInfo>;\n private destroyHandler: (subdomain: string, deleteFiles: boolean) => Promise<void>;\n\n constructor(handlers: {\n create: () => Promise<SandboxInfo>;\n list: () => Promise<SandboxesListResponse>;\n retrieve: (subdomain: string) => Promise<SandboxInfo>;\n destroy: (subdomain: string, deleteFiles: boolean) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n }\n\n /**\n * Create a new child sandbox\n * @returns Child sandbox info including URL and subdomain\n */\n async create(): Promise<SandboxInfo> {\n return this.createHandler();\n }\n\n /**\n * List all child sandboxes\n * @returns Array of child sandbox info\n */\n async list(): Promise<SandboxInfo[]> {\n const response = await this.listHandler();\n return response.sandboxes;\n }\n\n /**\n * Retrieve a specific child sandbox by subdomain\n * @param subdomain - The child subdomain (e.g., 'sandbox-12345')\n * @returns Child sandbox info\n */\n async retrieve(subdomain: string): Promise<SandboxInfo> {\n return this.retrieveHandler(subdomain);\n }\n\n /**\n * Destroy (delete) a child sandbox\n * @param subdomain - The child subdomain\n * @param options - Destroy options\n * @param options.deleteFiles - Whether to delete the child's files (default: false)\n */\n async destroy(\n subdomain: string,\n options?: { deleteFiles?: boolean }\n ): Promise<void> {\n return this.destroyHandler(subdomain, options?.deleteFiles ?? false);\n }\n}\n","/**\n * Client Types\n *\n * Types specific to the gateway Sandbox client implementation.\n * Core universal types are imported from ../types/universal-sandbox\n */\n\n// Import universal types\nimport type {\n Runtime as UniversalRuntime,\n CodeResult,\n CommandResult,\n SandboxInfo,\n FileEntry as UniversalFileEntry,\n RunCommandOptions as UniversalRunCommandOptions,\n SandboxFileSystem as UniversalSandboxFileSystem,\n CreateSandboxOptions as UniversalCreateSandboxOptions,\n} from '../types/universal-sandbox';\n\n// Re-export universal types for backward compatibility\nexport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n UniversalRuntime as Runtime,\n UniversalFileEntry as FileEntry,\n UniversalRunCommandOptions as RunCommandOptions,\n UniversalSandboxFileSystem as SandboxFileSystem,\n UniversalCreateSandboxOptions as CreateSandboxOptions,\n};\n\n/**\n * Sandbox status types (client-specific, more limited than universal)\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Provider-agnostic sandbox info (alias for SandboxInfo for backward compatibility)\n */\nexport interface ProviderSandboxInfo {\n /** Unique identifier for the sandbox */\n id: string;\n /** Provider hosting the sandbox */\n provider: string;\n /** Runtime environment in the sandbox */\n runtime: UniversalRuntime;\n /** Current status of the sandbox */\n status: SandboxStatus;\n /** When the sandbox was created */\n createdAt: Date;\n /** Execution timeout in milliseconds */\n timeout: number;\n /** Additional provider-specific metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Error thrown when a command exits with a non-zero status\n */\nexport class CommandExitError extends Error {\n name = 'CommandExitError';\n constructor(public result: {\n exitCode: number;\n stdout: string;\n stderr: string;\n error: boolean;\n }) {\n super(`Command exited with code ${result.exitCode}`);\n }\n}\n\n/**\n * Type guard to check if an error is a CommandExitError\n */\nexport function isCommandExitError(error: unknown): error is CommandExitError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'CommandExitError' &&\n 'result' in error\n );\n}\n","/**\n * Unified Provider Configuration\n *\n * Single source of truth for all provider auth requirements.\n * Used by both explicit mode (computesdk) and magic mode (workbench).\n */\n\n/**\n * Provider auth requirements\n *\n * Structure: { provider: [[option1_vars], [option2_vars], ...] }\n * - Outer array: OR conditions (any option can satisfy auth)\n * - Inner arrays: AND conditions (all vars in option must be present)\n *\n * Example: vercel: [['OIDC_TOKEN'], ['TOKEN', 'TEAM_ID', 'PROJECT_ID']]\n * -> Ready if OIDC_TOKEN is set, OR if all three traditional vars are set\n */\nexport const PROVIDER_AUTH = {\n e2b: [['E2B_API_KEY']],\n modal: [['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET']],\n railway: [['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID']],\n daytona: [['DAYTONA_API_KEY']],\n vercel: [\n ['VERCEL_OIDC_TOKEN'],\n ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n ],\n runloop: [['RUNLOOP_API_KEY']],\n cloudflare: [['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID']],\n codesandbox: [['CSB_API_KEY']],\n blaxel: [['BL_API_KEY', 'BL_WORKSPACE']],\n} as const;\n\n/**\n * All supported provider names (excluding gateway which is special)\n */\nexport const PROVIDER_NAMES = Object.keys(PROVIDER_AUTH) as ProviderName[];\n\n/**\n * Provider name type derived from PROVIDER_AUTH\n */\nexport type ProviderName = keyof typeof PROVIDER_AUTH;\n\n/**\n * Header mapping for each provider\n * Maps config field names to HTTP header names\n */\nexport const PROVIDER_HEADERS: Record<ProviderName, Record<string, string>> = {\n e2b: {\n apiKey: 'X-E2B-API-Key',\n },\n modal: {\n tokenId: 'X-Modal-Token-Id',\n tokenSecret: 'X-Modal-Token-Secret',\n },\n railway: {\n apiToken: 'X-Railway-API-Token',\n },\n daytona: {\n apiKey: 'X-Daytona-API-Key',\n },\n vercel: {\n oidcToken: 'X-Vercel-OIDC-Token',\n token: 'X-Vercel-Token',\n teamId: 'X-Vercel-Team-Id',\n projectId: 'X-Vercel-Project-Id',\n },\n runloop: {\n apiKey: 'X-Runloop-API-Key',\n },\n cloudflare: {\n apiToken: 'X-Cloudflare-API-Token',\n accountId: 'X-Cloudflare-Account-Id',\n },\n codesandbox: {\n apiKey: 'X-CSB-API-Key',\n },\n blaxel: {\n apiKey: 'X-BL-API-Key',\n workspace: 'X-BL-Workspace',\n },\n};\n\n/**\n * Environment variable to config field mapping for each provider\n */\nexport const PROVIDER_ENV_MAP: Record<ProviderName, Record<string, string>> = {\n e2b: {\n E2B_API_KEY: 'apiKey',\n },\n modal: {\n MODAL_TOKEN_ID: 'tokenId',\n MODAL_TOKEN_SECRET: 'tokenSecret',\n },\n railway: {\n RAILWAY_API_KEY: 'apiToken',\n RAILWAY_PROJECT_ID: 'projectId',\n RAILWAY_ENVIRONMENT_ID: 'environmentId',\n },\n daytona: {\n DAYTONA_API_KEY: 'apiKey',\n },\n vercel: {\n VERCEL_OIDC_TOKEN: 'oidcToken',\n VERCEL_TOKEN: 'token',\n VERCEL_TEAM_ID: 'teamId',\n VERCEL_PROJECT_ID: 'projectId',\n },\n runloop: {\n RUNLOOP_API_KEY: 'apiKey',\n },\n cloudflare: {\n CLOUDFLARE_API_TOKEN: 'apiToken',\n CLOUDFLARE_ACCOUNT_ID: 'accountId',\n },\n codesandbox: {\n CSB_API_KEY: 'apiKey',\n },\n blaxel: {\n BL_API_KEY: 'apiKey',\n BL_WORKSPACE: 'workspace',\n },\n};\n\n/**\n * Dashboard URLs for each provider (for error messages)\n */\nexport const PROVIDER_DASHBOARD_URLS: Record<ProviderName, string> = {\n e2b: 'https://e2b.dev/dashboard',\n modal: 'https://modal.com/settings',\n railway: 'https://railway.app/account/tokens',\n daytona: 'https://daytona.io/dashboard',\n vercel: 'https://vercel.com/account/tokens',\n runloop: 'https://runloop.ai/dashboard',\n cloudflare: 'https://dash.cloudflare.com/profile/api-tokens',\n codesandbox: 'https://codesandbox.io/dashboard/settings',\n blaxel: 'https://blaxel.ai/dashboard',\n};\n\n/**\n * Check if a provider name is valid\n */\nexport function isValidProvider(name: string): name is ProviderName {\n return name in PROVIDER_AUTH;\n}\n\n/**\n * Build headers from provider config\n */\nexport function buildProviderHeaders(\n provider: ProviderName,\n config: Record<string, string | undefined>\n): Record<string, string> {\n const headers: Record<string, string> = {};\n const headerMap = PROVIDER_HEADERS[provider];\n\n for (const [configKey, headerName] of Object.entries(headerMap)) {\n const value = config[configKey];\n if (value) {\n headers[headerName] = value;\n }\n }\n\n return headers;\n}\n\n/**\n * Get provider config from environment variables\n */\nexport function getProviderConfigFromEnv(provider: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n const envMap = PROVIDER_ENV_MAP[provider];\n\n for (const [envVar, configKey] of Object.entries(envMap)) {\n const value = process.env[envVar];\n if (value) {\n config[configKey] = value;\n }\n }\n\n return config;\n}\n\n/**\n * Check if provider has complete auth from environment\n */\nexport function isProviderAuthComplete(provider: ProviderName): boolean {\n const authOptions = PROVIDER_AUTH[provider];\n\n for (const option of authOptions) {\n const allPresent = option.every(envVar => !!process.env[envVar]);\n if (allPresent) return true;\n }\n\n return false;\n}\n\n/**\n * Get missing env vars for a provider (returns the option closest to completion)\n */\nexport function getMissingEnvVars(provider: ProviderName): string[] {\n const authOptions = PROVIDER_AUTH[provider];\n let bestOption: { presentCount: number; missing: string[] } | null = null;\n\n for (const option of authOptions) {\n const missing: string[] = [];\n let presentCount = 0;\n\n for (const envVar of option) {\n if (process.env[envVar]) {\n presentCount++;\n } else {\n missing.push(envVar);\n }\n }\n\n if (missing.length === 0) return [];\n\n if (!bestOption || presentCount > bestOption.presentCount) {\n bestOption = { presentCount, missing };\n }\n }\n\n return bestOption?.missing ?? [];\n}\n","/**\n * ComputeSDK Constants\n *\n * Default configuration values and provider definitions\n */\n\n// Re-export provider config as the single source of truth\nexport {\n PROVIDER_AUTH,\n PROVIDER_NAMES,\n PROVIDER_HEADERS,\n PROVIDER_ENV_MAP,\n PROVIDER_DASHBOARD_URLS,\n type ProviderName,\n isValidProvider,\n buildProviderHeaders,\n getProviderConfigFromEnv,\n isProviderAuthComplete,\n getMissingEnvVars,\n} from './provider-config';\n\n/**\n * Default gateway URL for sandbox lifecycle operations\n */\nexport const GATEWAY_URL = 'https://gateway.computesdk.com';\n\n/**\n * Provider detection priority order\n * When multiple provider credentials are detected, use the first one in this list\n */\nexport const PROVIDER_PRIORITY = [\n 'e2b',\n 'railway',\n 'daytona',\n 'modal',\n 'runloop',\n 'vercel',\n 'cloudflare',\n 'codesandbox',\n 'blaxel',\n] as const;\n\n/**\n * Required environment variables for each provider\n * @deprecated Use PROVIDER_AUTH from provider-config instead\n */\nexport const PROVIDER_ENV_VARS = {\n e2b: ['E2B_API_KEY'],\n railway: ['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID'],\n daytona: ['DAYTONA_API_KEY'],\n modal: ['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET'],\n runloop: ['RUNLOOP_API_KEY'],\n vercel: ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID'],\n codesandbox: ['CSB_API_KEY'],\n blaxel: ['BL_API_KEY', 'BL_WORKSPACE'],\n} as const;\n","/**\n * Auto-Detection Module\n * \n * Automatically detects gateway mode and provider from environment variables.\n * Enables zero-config usage of ComputeSDK.\n */\n\nimport { GATEWAY_URL, PROVIDER_PRIORITY, PROVIDER_ENV_VARS, type ProviderName } from './constants';\n\n/**\n * Check if gateway mode is enabled\n * Gateway mode requires COMPUTESDK_API_KEY to be set\n */\nexport function isGatewayModeEnabled(): boolean {\n return !!(typeof process !== 'undefined' && process.env?.COMPUTESDK_API_KEY);\n}\n\n/**\n * Check if all required environment variables exist for a provider\n */\nfunction hasProviderEnv(provider: ProviderName): boolean {\n if (typeof process === 'undefined') return false;\n \n const requiredVars = PROVIDER_ENV_VARS[provider];\n if (!requiredVars) return false; // Safety check for invalid provider names\n \n return requiredVars.every(varName => !!process.env?.[varName]);\n}\n\n/**\n * Get detailed status of provider credentials\n */\nfunction getProviderEnvStatus(provider: ProviderName): {\n provider: string;\n present: string[];\n missing: string[];\n isComplete: boolean;\n} {\n const requiredVars = PROVIDER_ENV_VARS[provider];\n \n if (typeof process === 'undefined' || !requiredVars) {\n return { provider, present: [], missing: requiredVars ? [...requiredVars] : [], isComplete: false };\n }\n \n const present = requiredVars.filter(varName => !!process.env?.[varName]);\n const missing = requiredVars.filter(varName => !process.env?.[varName]);\n \n return {\n provider,\n present: [...present],\n missing: [...missing],\n isComplete: missing.length === 0\n };\n}\n\n/**\n * Detect which provider to use from environment variables\n * \n * Detection order:\n * 1. Check for explicit COMPUTESDK_PROVIDER override\n * 2. Auto-detect based on PROVIDER_PRIORITY order\n * \n * @returns Provider name or null if none detected\n */\nexport function detectProvider(): string | null {\n if (typeof process === 'undefined') return null;\n \n // Check for explicit override\n const explicit = process.env.COMPUTESDK_PROVIDER?.toLowerCase();\n if (explicit && hasProviderEnv(explicit as ProviderName)) {\n return explicit;\n }\n \n // Warn if explicit provider set but credentials missing\n if (explicit && !hasProviderEnv(explicit as ProviderName)) {\n console.warn(\n `⚠️ COMPUTESDK_PROVIDER is set to \"${explicit}\" but required credentials are missing.\\n` +\n ` Required: ${PROVIDER_ENV_VARS[explicit as ProviderName]?.join(', ') || 'unknown'}\\n` +\n ` Falling back to auto-detection...`\n );\n }\n \n // Auto-detect based on priority order\n for (const provider of PROVIDER_PRIORITY) {\n if (hasProviderEnv(provider)) {\n return provider;\n }\n }\n \n return null;\n}\n\n/**\n * Build provider-specific headers from environment variables\n * These headers are passed through to the gateway\n */\nexport function getProviderHeaders(provider: string): Record<string, string> {\n if (typeof process === 'undefined') return {};\n \n const headers: Record<string, string> = {};\n \n switch (provider) {\n case 'e2b':\n if (process.env.E2B_API_KEY) {\n headers['X-E2B-API-Key'] = process.env.E2B_API_KEY;\n }\n break;\n \n case 'railway':\n if (process.env.RAILWAY_API_KEY) {\n headers['X-Railway-API-Key'] = process.env.RAILWAY_API_KEY;\n }\n if (process.env.RAILWAY_PROJECT_ID) {\n headers['X-Railway-Project-ID'] = process.env.RAILWAY_PROJECT_ID;\n }\n if (process.env.RAILWAY_ENVIRONMENT_ID) {\n headers['X-Railway-Environment-ID'] = process.env.RAILWAY_ENVIRONMENT_ID;\n }\n break;\n \n case 'daytona':\n if (process.env.DAYTONA_API_KEY) {\n headers['X-Daytona-API-Key'] = process.env.DAYTONA_API_KEY;\n }\n break;\n \n case 'modal':\n if (process.env.MODAL_TOKEN_ID) {\n headers['X-Modal-Token-ID'] = process.env.MODAL_TOKEN_ID;\n }\n if (process.env.MODAL_TOKEN_SECRET) {\n headers['X-Modal-Token-Secret'] = process.env.MODAL_TOKEN_SECRET;\n }\n break;\n \n case 'runloop':\n if (process.env.RUNLOOP_API_KEY) {\n headers['X-Runloop-API-Key'] = process.env.RUNLOOP_API_KEY;\n }\n break;\n \n case 'vercel':\n if (process.env.VERCEL_TOKEN) {\n headers['X-Vercel-Token'] = process.env.VERCEL_TOKEN;\n }\n if (process.env.VERCEL_TEAM_ID) {\n headers['X-Vercel-Team-ID'] = process.env.VERCEL_TEAM_ID;\n }\n if (process.env.VERCEL_PROJECT_ID) {\n headers['X-Vercel-Project-ID'] = process.env.VERCEL_PROJECT_ID;\n }\n break;\n \n case 'cloudflare':\n if (process.env.CLOUDFLARE_API_TOKEN) {\n headers['X-Cloudflare-API-Token'] = process.env.CLOUDFLARE_API_TOKEN;\n }\n if (process.env.CLOUDFLARE_ACCOUNT_ID) {\n headers['X-Cloudflare-Account-ID'] = process.env.CLOUDFLARE_ACCOUNT_ID;\n }\n break;\n \n case 'codesandbox':\n if (process.env.CSB_API_KEY) {\n headers['X-CodeSandbox-API-Key'] = process.env.CSB_API_KEY;\n }\n break;\n \n case 'blaxel':\n if (process.env.BL_API_KEY) {\n headers['X-Blaxel-API-Key'] = process.env.BL_API_KEY;\n }\n if (process.env.BL_WORKSPACE) {\n headers['X-Blaxel-Workspace'] = process.env.BL_WORKSPACE;\n }\n break;\n }\n \n return headers;\n}\n\n/**\n * Gateway configuration object\n */\nexport interface GatewayConfig {\n apiKey: string;\n gatewayUrl: string;\n provider: string;\n providerHeaders: Record<string, string>;\n}\n\n/**\n * Main auto-configuration function\n * Returns gateway configuration or null if auto-detection not possible\n *\n * @throws Error if COMPUTESDK_API_KEY is set but no provider detected\n */\nexport function autoConfigureCompute(): GatewayConfig | null {\n // Only auto-configure in gateway mode\n if (!isGatewayModeEnabled()) {\n return null;\n }\n\n const provider = detectProvider();\n if (!provider) {\n // Build detailed diagnostic information\n const detectionResults = PROVIDER_PRIORITY.map(p => getProviderEnvStatus(p));\n \n // Create status indicators\n const statusLines = detectionResults.map(result => {\n const status = result.isComplete ? '✅' : \n result.present.length > 0 ? '⚠️ ' : '❌';\n const ratio = `${result.present.length}/${result.present.length + result.missing.length}`;\n let line = ` ${status} ${result.provider.padEnd(12)} ${ratio} credentials`;\n \n // Show what's missing for partial matches\n if (result.present.length > 0 && result.missing.length > 0) {\n line += ` (missing: ${result.missing.join(', ')})`;\n }\n \n return line;\n });\n \n throw new Error(\n `COMPUTESDK_API_KEY is set but no provider detected.\\n\\n` +\n `Provider detection results:\\n` +\n statusLines.join('\\n') +\n `\\n\\n` +\n `To fix this, set one of the following:\\n\\n` +\n ` E2B: export E2B_API_KEY=xxx\\n` +\n ` Railway: export RAILWAY_API_KEY=xxx RAILWAY_PROJECT_ID=xxx RAILWAY_ENVIRONMENT_ID=xxx\\n` +\n ` Daytona: export DAYTONA_API_KEY=xxx\\n` +\n ` Modal: export MODAL_TOKEN_ID=xxx MODAL_TOKEN_SECRET=xxx\\n` +\n ` Runloop: export RUNLOOP_API_KEY=xxx\\n` +\n ` Vercel: export VERCEL_TOKEN=xxx VERCEL_TEAM_ID=xxx VERCEL_PROJECT_ID=xxx\\n` +\n ` Cloudflare: export CLOUDFLARE_API_TOKEN=xxx CLOUDFLARE_ACCOUNT_ID=xxx\\n` +\n ` CodeSandbox: export CSB_API_KEY=xxx\\n` +\n ` Blaxel: export BL_API_KEY=xxx BL_WORKSPACE=xxx\\n\\n` +\n `Or set COMPUTESDK_PROVIDER to specify explicitly:\\n` +\n ` export COMPUTESDK_PROVIDER=e2b\\n\\n` +\n `Docs: https://computesdk.com/docs/quickstart`\n );\n }\n\n const gatewayUrl = process.env.COMPUTESDK_GATEWAY_URL || GATEWAY_URL;\n const computesdkApiKey = process.env.COMPUTESDK_API_KEY!;\n const providerHeaders = getProviderHeaders(provider);\n\n // Validate gateway URL\n try {\n new URL(gatewayUrl);\n } catch (error) {\n throw new Error(\n `Invalid gateway URL: \"${gatewayUrl}\"\\n\\n` +\n `The URL must be a valid HTTP/HTTPS URL.\\n` +\n `Check your COMPUTESDK_GATEWAY_URL environment variable.`\n );\n }\n\n // Debug logging if enabled\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`✨ ComputeSDK: Auto-detected ${provider} provider`);\n console.log(`🌐 Gateway: ${gatewayUrl}`);\n console.log(`🔑 Provider headers:`, Object.keys(providerHeaders).join(', '));\n }\n\n const config: GatewayConfig = {\n apiKey: computesdkApiKey,\n gatewayUrl,\n provider,\n providerHeaders\n };\n \n return config;\n}\n","/**\n * Explicit Config\n *\n * Converts explicit compute configuration to gateway config.\n * Used when compute() is called as a function with configuration.\n */\n\nimport type { ExplicitComputeConfig } from './compute';\nimport type { GatewayConfig } from './auto-detect';\nimport {\n PROVIDER_AUTH,\n PROVIDER_HEADERS,\n PROVIDER_DASHBOARD_URLS,\n PROVIDER_ENV_MAP,\n type ProviderName,\n} from './provider-config';\nimport { GATEWAY_URL } from './constants';\n\n/**\n * Build provider-specific headers for gateway authentication\n */\nfunction buildProviderHeaders(config: ExplicitComputeConfig): Record<string, string> {\n const headers: Record<string, string> = {};\n const provider = config.provider as ProviderName;\n const headerMap = PROVIDER_HEADERS[provider];\n const providerConfig = config[provider] as Record<string, string | undefined> | undefined;\n\n if (!providerConfig || !headerMap) return headers;\n\n for (const [configKey, headerName] of Object.entries(headerMap)) {\n const value = providerConfig[configKey];\n if (value) {\n headers[headerName] = value;\n }\n }\n\n return headers;\n}\n\n/**\n * Validate that the config has the required provider-specific credentials\n */\nfunction validateProviderConfig(config: ExplicitComputeConfig): void {\n const provider = config.provider as ProviderName;\n const authOptions = PROVIDER_AUTH[provider];\n const providerConfig = config[provider] as Record<string, string | undefined> | undefined;\n const dashboardUrl = PROVIDER_DASHBOARD_URLS[provider];\n\n if (!authOptions) {\n throw new Error(`Unknown provider: ${provider}`);\n }\n\n // Check if any auth option is satisfied\n // For explicit mode, we check config fields instead of env vars\n for (const option of authOptions) {\n // Map env vars to config field names and check if all are present\n const allPresent = option.every(envVar => {\n const configField = envVarToConfigField(provider, envVar);\n return providerConfig?.[configField];\n });\n\n if (allPresent) return; // Valid config found\n }\n\n // No valid config found, build helpful error message\n const configExample = buildConfigExample(provider, authOptions);\n throw new Error(\n `Missing ${provider} configuration. When using provider: '${provider}', you must provide:\\n` +\n `${configExample}\\n\\n` +\n `Get your credentials at: ${dashboardUrl}`\n );\n}\n\n/**\n * Map environment variable name to config field name\n * Uses shared PROVIDER_ENV_MAP as single source of truth\n */\nfunction envVarToConfigField(provider: ProviderName, envVar: string): string {\n return PROVIDER_ENV_MAP[provider]?.[envVar] ?? envVar.toLowerCase();\n}\n\n/**\n * Build example config for error message\n */\nfunction buildConfigExample(provider: ProviderName, authOptions: readonly (readonly string[])[]): string {\n if (authOptions.length === 1) {\n // Single option\n const fields = authOptions[0].map(envVar => {\n const field = envVarToConfigField(provider, envVar);\n return `${field}: '...'`;\n });\n return ` ${provider}: { ${fields.join(', ')} }`;\n }\n\n // Multiple options (like Vercel with OIDC or traditional)\n const options = authOptions.map((option, i) => {\n const fields = option.map(envVar => {\n const field = envVarToConfigField(provider, envVar);\n return `${field}: '...'`;\n });\n return ` Option ${i + 1}:\\n ${provider}: { ${fields.join(', ')} }`;\n });\n\n return options.join('\\n\\n');\n}\n\n/**\n * Create gateway configuration from explicit configuration\n *\n * @param config - Explicit compute configuration\n * @returns Gateway configuration object\n */\nexport function createConfigFromExplicit(config: ExplicitComputeConfig): GatewayConfig {\n // Validate required fields\n if (!config.apiKey) {\n throw new Error(\n `Missing ComputeSDK API key. The 'apiKey' field is required.\\n\\n` +\n `Get your API key at: https://computesdk.com/dashboard`\n );\n }\n\n // Validate provider-specific config\n validateProviderConfig(config);\n\n // Build provider headers\n const providerHeaders = buildProviderHeaders(config);\n\n // Create and return gateway config\n return {\n apiKey: config.apiKey,\n gatewayUrl: config.gatewayUrl || GATEWAY_URL,\n provider: config.provider,\n providerHeaders,\n };\n}\n","/**\n * Compute daemon lifecycle management\n *\n * Handles health checks and waiting for the compute daemon\n * to become ready after installation.\n */\n\nimport { Sandbox } from '../client';\n\n/**\n * Options for waiting for compute daemon to be ready\n */\nexport interface WaitForComputeReadyOptions {\n /** Maximum number of retry attempts (default: 30) */\n maxRetries?: number;\n /** Initial delay between retries in milliseconds (default: 500) */\n initialDelayMs?: number;\n /** Maximum delay between retries in milliseconds (default: 5000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 1.5) */\n backoffFactor?: number;\n}\n\n/**\n * Wait for compute daemon to be ready by polling the health endpoint\n * with exponential backoff for faster success and less noise\n */\nexport async function waitForComputeReady(\n client: Sandbox,\n options: WaitForComputeReadyOptions = {}\n): Promise<void> {\n const maxRetries = options.maxRetries ?? 30;\n const initialDelayMs = options.initialDelayMs ?? 500;\n const maxDelayMs = options.maxDelayMs ?? 5000;\n const backoffFactor = options.backoffFactor ?? 1.5;\n\n let lastError: Error | null = null;\n let currentDelay = initialDelayMs;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n await client.health();\n \n // Success! Log if in debug mode\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Lifecycle] Sandbox ready after ${i + 1} attempt${i === 0 ? '' : 's'}`);\n }\n \n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // On last attempt, throw detailed error\n if (i === maxRetries - 1) {\n throw new Error(\n `Sandbox failed to become ready after ${maxRetries} attempts.\\n` +\n `Last error: ${lastError.message}\\n\\n` +\n `Possible causes:\\n` +\n ` 1. Sandbox failed to start (check provider dashboard for errors)\\n` +\n ` 2. Network connectivity issues between your app and the sandbox\\n` +\n ` 3. Sandbox is taking longer than expected to initialize\\n` +\n ` 4. Invalid sandbox URL or authentication credentials\\n\\n` +\n `Troubleshooting:\\n` +\n ` - Check sandbox logs in your provider dashboard\\n` +\n ` - Verify your network connection\\n` +\n ` - Try increasing maxRetries if initialization is slow\\n` +\n ` - Enable debug mode: export COMPUTESDK_DEBUG=1`\n );\n }\n\n // Wait with exponential backoff before next attempt\n await new Promise(resolve => setTimeout(resolve, currentDelay));\n \n // Increase delay for next attempt (exponential backoff with cap)\n currentDelay = Math.min(currentDelay * backoffFactor, maxDelayMs);\n }\n }\n}\n","/**\n * Compute API - Gateway HTTP Implementation\n *\n * Provides the unified compute.* API using direct HTTP calls to the gateway.\n * The `compute` export works as both a singleton and a callable function:\n *\n * - Singleton: `compute.sandbox.create()` (auto-detects from env vars)\n * - Callable: `compute({ provider: 'e2b', ... }).sandbox.create()` (explicit config)\n */\n\nimport { Sandbox } from './client';\nimport { autoConfigureCompute } from './auto-detect';\nimport { createConfigFromExplicit } from './explicit-config';\nimport { waitForComputeReady } from './compute-daemon/lifecycle';\nimport { GATEWAY_URL } from './constants';\nimport type { ProviderName } from './provider-config';\n\n/**\n * Gateway configuration\n */\ninterface GatewayConfig {\n apiKey: string;\n gatewayUrl: string;\n provider: string;\n providerHeaders: Record<string, string>;\n}\n\n/**\n * Explicit compute configuration for callable mode\n */\nexport interface ExplicitComputeConfig {\n /** Provider name to use */\n provider: ProviderName;\n /** ComputeSDK API key (required for gateway mode) */\n apiKey: string;\n /** Optional gateway URL override */\n gatewayUrl?: string;\n\n /** Provider-specific configurations */\n e2b?: { apiKey?: string; projectId?: string; templateId?: string };\n modal?: { tokenId?: string; tokenSecret?: string };\n railway?: { apiToken?: string; projectId?: string; environmentId?: string };\n daytona?: { apiKey?: string };\n vercel?: { oidcToken?: string; token?: string; teamId?: string; projectId?: string };\n runloop?: { apiKey?: string };\n cloudflare?: { apiToken?: string; accountId?: string };\n codesandbox?: { apiKey?: string };\n blaxel?: { apiKey?: string; workspace?: string };\n}\n\n/**\n * Options for creating a sandbox\n */\nexport interface CreateSandboxOptions {\n runtime?: 'node' | 'python';\n timeout?: number;\n templateId?: string;\n metadata?: Record<string, any>;\n envs?: Record<string, string>;\n name?: string;\n namespace?: string;\n}\n\n/**\n * Options for finding or creating a named sandbox\n */\nexport interface FindOrCreateSandboxOptions extends CreateSandboxOptions {\n name: string;\n namespace?: string;\n}\n\n/**\n * Options for finding a named sandbox\n */\nexport interface FindSandboxOptions {\n name: string;\n namespace?: string;\n}\n\n/**\n * Options for extending sandbox timeout\n */\nexport interface ExtendTimeoutOptions {\n duration?: number;\n}\n\n/**\n * Helper to call gateway API with retry logic\n */\nasync function gatewayFetch<T>(\n url: string,\n config: GatewayConfig,\n options: RequestInit = {}\n): Promise<{ success: boolean; data?: T }> {\n const timeout = 30000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n 'X-ComputeSDK-API-Key': config.apiKey,\n 'X-Provider': config.provider,\n ...config.providerHeaders,\n ...options.headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 404) {\n return { success: false };\n }\n\n const errorText = await response.text().catch(() => response.statusText);\n \n // Build helpful error message\n let errorMessage = `Gateway API error: ${errorText}`;\n if (response.status === 401) {\n errorMessage = `Invalid ComputeSDK API key. Check your COMPUTESDK_API_KEY environment variable.`;\n } else if (response.status === 403) {\n errorMessage = `Access forbidden. Your API key may not have permission to use provider \"${config.provider}\".`;\n }\n\n throw new Error(errorMessage);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n \n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timed out after ${timeout}ms`);\n }\n \n throw error;\n }\n}\n\n/**\n * Compute singleton implementation\n */\nclass ComputeManager {\n private config: GatewayConfig | null = null;\n private autoConfigured = false;\n\n /**\n * Lazy auto-configure from environment if not explicitly configured\n */\n private ensureConfigured(): void {\n if (this.config) return;\n if (this.autoConfigured) return;\n\n const config = autoConfigureCompute();\n this.autoConfigured = true;\n\n if (config) {\n this.config = config;\n }\n }\n\n /**\n * Get gateway config, throwing if not configured\n */\n private getGatewayConfig(): GatewayConfig {\n this.ensureConfigured();\n\n if (!this.config) {\n throw new Error(\n 'No gateway configuration found.\\n\\n' +\n 'Options:\\n' +\n '1. Zero-config mode: Set COMPUTESDK_API_KEY and provider credentials (e.g., E2B_API_KEY)\\n' +\n '2. Explicit mode: Call compute({ provider: \"e2b\", apiKey: \"...\", e2b: { apiKey: \"...\" } })\\n' +\n '3. Direct mode: Import createCompute from @computesdk/provider to bypass the gateway\\n\\n' +\n 'Docs: https://computesdk.com/docs/quickstart'\n );\n }\n\n return this.config;\n }\n\n sandbox = {\n /**\n * Create a new sandbox\n */\n create: async (options?: CreateSandboxOptions): Promise<Sandbox> => {\n const config = this.getGatewayConfig();\n\n const result = await gatewayFetch<{\n sandboxId: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n name?: string;\n namespace?: string;\n }>(`${config.gatewayUrl}/v1/sandboxes`, config, {\n method: 'POST',\n body: JSON.stringify(options || {}),\n });\n\n if (!result.success || !result.data) {\n throw new Error(`Gateway returned invalid response`);\n }\n\n const { sandboxId, url, token, provider, metadata, name, namespace } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata: {\n ...metadata,\n ...(name && { name }),\n ...(namespace && { namespace }),\n },\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * Get an existing sandbox by ID\n */\n getById: async (sandboxId: string): Promise<Sandbox | null> => {\n const config = this.getGatewayConfig();\n\n const result = await gatewayFetch<{\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n }>(`${config.gatewayUrl}/v1/sandboxes/${sandboxId}`, config);\n\n if (!result.success || !result.data) {\n return null;\n }\n\n const { url, token, provider, metadata } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata,\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * List all active sandboxes\n */\n list: async (): Promise<Sandbox[]> => {\n throw new Error(\n 'The gateway does not support listing sandboxes. Use getById() with a known sandbox ID instead.'\n );\n },\n\n /**\n * Destroy a sandbox\n */\n destroy: async (sandboxId: string): Promise<void> => {\n const config = this.getGatewayConfig();\n\n await gatewayFetch(`${config.gatewayUrl}/v1/sandboxes/${sandboxId}`, config, {\n method: 'DELETE',\n });\n },\n\n /**\n * Find existing or create new sandbox by (namespace, name)\n */\n findOrCreate: async (options: FindOrCreateSandboxOptions): Promise<Sandbox> => {\n const config = this.getGatewayConfig();\n\n const { name, namespace, ...restOptions } = options;\n\n const result = await gatewayFetch<{\n sandboxId: string;\n name: string;\n namespace: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n }>(`${config.gatewayUrl}/v1/sandboxes/find-or-create`, config, {\n method: 'POST',\n body: JSON.stringify({\n namespace: namespace || 'default',\n name,\n ...restOptions,\n }),\n });\n\n if (!result.success || !result.data) {\n throw new Error(`Gateway returned invalid response`);\n }\n\n const { sandboxId, url, token, provider, metadata } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata: {\n ...metadata,\n name: result.data.name,\n namespace: result.data.namespace,\n },\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * Find existing sandbox by (namespace, name) without creating\n */\n find: async (options: FindSandboxOptions): Promise<Sandbox | null> => {\n const config = this.getGatewayConfig();\n\n const result = await gatewayFetch<{\n sandboxId: string;\n name: string;\n namespace: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n } | null>(`${config.gatewayUrl}/v1/sandboxes/find`, config, {\n method: 'POST',\n body: JSON.stringify({\n namespace: options.namespace || 'default',\n name: options.name,\n }),\n });\n\n if (!result.success || !result.data) {\n return null;\n }\n\n const { sandboxId, url, token, provider, metadata, name, namespace } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata: {\n ...metadata,\n name,\n namespace,\n },\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * Extend sandbox timeout/expiration\n */\n extendTimeout: async (sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> => {\n const config = this.getGatewayConfig();\n const duration = options?.duration ?? 900000; // Default to 15 minutes\n\n await gatewayFetch(`${config.gatewayUrl}/v1/sandboxes/${sandboxId}/extend`, config, {\n method: 'POST',\n body: JSON.stringify({ duration }),\n });\n },\n };\n}\n\n/**\n * Singleton instance\n */\nconst singletonInstance = new ComputeManager();\n\n/**\n * Factory function for explicit configuration\n */\nfunction computeFactory(config: ExplicitComputeConfig): ComputeManager {\n const gatewayConfig = createConfigFromExplicit(config);\n const manager = new ComputeManager();\n manager['config'] = gatewayConfig;\n return manager;\n}\n\n/**\n * Callable compute interface - dual nature as both singleton and factory\n * \n * This interface represents the compute export's two modes:\n * 1. As a ComputeManager singleton (accessed via properties like compute.sandbox)\n * 2. As a factory function (called with config to create new instances)\n */\ninterface CallableCompute extends ComputeManager {\n /** Create a new compute instance with explicit configuration */\n (config: ExplicitComputeConfig): ComputeManager;\n}\n\n/**\n * Callable compute - works as both singleton and factory function\n *\n * @example\n * ```typescript\n * import { compute } from 'computesdk';\n *\n * // Singleton mode (auto-detects from env vars)\n * const sandbox1 = await compute.sandbox.create();\n *\n * // Callable mode (explicit config)\n * const sandbox2 = await compute({\n * provider: 'e2b',\n * apiKey: 'computesdk_xxx',\n * e2b: { apiKey: 'e2b_xxx' }\n * }).sandbox.create();\n * ```\n */\nexport const compute: CallableCompute = new Proxy(\n computeFactory as any,\n {\n get(_target, prop, _receiver) {\n const singleton = singletonInstance as any;\n const value = singleton[prop];\n if (typeof value === 'function') {\n return value.bind(singletonInstance);\n }\n return value;\n },\n apply(_target, _thisArg, args) {\n return computeFactory(args[0] as ExplicitComputeConfig);\n }\n }\n);\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n */\n\nimport { compute } from './compute';\n\n// Gateway-specific runtime (subset of universal Runtime)\ntype GatewayRuntime = 'node' | 'python';\n\n/**\n * Request structure supporting sandbox and code execution capabilities\n */\nexport interface ComputeRequest {\n /** Action in dot notation (e.g., 'compute.sandbox.create') */\n action: string;\n \n /** Parameters for the action */\n sandboxId?: string;\n code?: string;\n command?: string;\n args?: string[];\n runtime?: GatewayRuntime;\n path?: string;\n content?: string;\n \n /** Command options (for runCommand action) */\n commandOptions?: {\n background?: boolean;\n };\n \n /** Sandbox creation options */\n options?: {\n runtime?: GatewayRuntime;\n timeout?: number;\n name?: string;\n namespace?: string;\n };\n}\n\n/**\n * Response structure for compute operations\n */\nexport interface ComputeResponse {\n success: boolean;\n error?: string;\n sandboxId: string;\n provider: string;\n [key: string]: any; // Allow any additional response data\n}\n\n/**\n * Execute compute action using targeted handling\n */\nasync function executeAction(body: ComputeRequest): Promise<ComputeResponse> {\n try {\n const { action, sandboxId } = body;\n \n // Sandbox management operations\n if (action === 'compute.sandbox.create') {\n const sandbox = await compute.sandbox.create(body.options || { runtime: 'python' });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider\n };\n }\n \n if (action === 'compute.sandbox.list') {\n throw new Error('List operation not supported in gateway mode');\n }\n \n if (action === 'compute.sandbox.destroy') {\n if (!sandboxId) {\n throw new Error('sandboxId is required for destroy action');\n }\n await compute.sandbox.destroy(sandboxId);\n return {\n success: true,\n sandboxId,\n provider: 'gateway'\n };\n }\n \n // For sandbox instance methods, get the sandbox first\n if (!sandboxId) {\n throw new Error('sandboxId is required for this action');\n }\n \n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n throw new Error(`Sandbox ${sandboxId} not found`);\n }\n \n // Sandbox info\n if (action === 'compute.sandbox.getInfo') {\n const result = await sandbox.getInfo();\n return {\n success: true,\n sandboxId,\n provider: sandbox.provider,\n info: {\n id: result.id,\n provider: result.provider,\n runtime: result.runtime,\n status: result.status,\n createdAt: result.createdAt.toISOString(),\n timeout: result.timeout,\n metadata: result.metadata\n }\n };\n }\n \n // Code execution\n if (action === 'compute.sandbox.runCode') {\n if (!body.code) throw new Error('code is required');\n const result = await sandbox.runCode(body.code, body.runtime);\n return {\n success: true,\n sandboxId,\n provider: sandbox.provider,\n result: {\n output: result.output,\n exitCode: result.exitCode,\n language: result.language\n }\n };\n }\n\n if (action === 'compute.sandbox.runCommand') {\n if (!body.command) throw new Error('command is required');\n const result = await sandbox.runCommand(body.command, body.args, body.commandOptions);\n return {\n success: true,\n sandboxId,\n provider: sandbox.provider,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n durationMs: result.durationMs\n }\n };\n }\n \n // Filesystem operations\n if (action === 'compute.sandbox.filesystem.readFile') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readFile(body.path);\n return {\n success: true,\n sandboxId,\n provider: sandbox.provider,\n fileContent: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.writeFile') {\n if (!body.path) throw new Error('path is required');\n if (body.content === undefined) throw new Error('content is required');\n await sandbox.filesystem.writeFile(body.path, body.content);\n return { success: true, sandboxId, provider: sandbox.provider };\n }\n \n if (action === 'compute.sandbox.filesystem.mkdir') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.mkdir(body.path);\n return { success: true, sandboxId, provider: sandbox.provider };\n }\n \n if (action === 'compute.sandbox.filesystem.readdir') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readdir(body.path);\n return {\n success: true,\n sandboxId,\n provider: sandbox.provider,\n files: result.map((entry: any) => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.isDirectory,\n size: entry.size,\n lastModified: entry.lastModified.toISOString()\n }))\n };\n }\n \n if (action === 'compute.sandbox.filesystem.exists') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.exists(body.path);\n return {\n success: true,\n sandboxId,\n provider: sandbox.provider,\n exists: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.remove') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.remove(body.path);\n return { success: true, sandboxId, provider: sandbox.provider };\n }\n \n throw new Error(`Unknown action: ${action}`);\n \n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n sandboxId: body.sandboxId || '',\n provider: 'gateway'\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest\n): Promise<Response | ComputeResponse> {\n try {\n let body: ComputeRequest;\n \n if (requestOrBody instanceof Request) {\n // Handle HTTP method validation\n if (requestOrBody.method !== 'POST') {\n return Response.json({\n success: false,\n error: 'Only POST requests are supported',\n sandboxId: '',\n provider: 'gateway'\n }, { status: 405 });\n }\n \n // Parse JSON body with better error handling\n try {\n body = await requestOrBody.json();\n } catch (parseError) {\n return Response.json({\n success: false,\n error: 'Invalid JSON in request body',\n sandboxId: '',\n provider: 'gateway'\n }, { status: 400 });\n }\n \n // Execute the action and return Response\n const result = await executeAction(body);\n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n } else {\n // Direct body passed - return result directly\n body = requestOrBody;\n return await executeAction(body);\n }\n \n } catch (error) {\n const errorResponse = {\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: 'gateway'\n };\n \n if (requestOrBody instanceof Request) {\n return Response.json(errorResponse, { status: 500 });\n } else {\n return errorResponse;\n }\n }\n}\n\n/**\n * Parameters for handleComputeRequest\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n}\n"],"mappings":"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","names":["MessageType","cmd","decodeBase64","buildProviderHeaders","sandbox"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client/protocol.ts","../src/client/websocket.ts","../src/client/resources/command.ts","../src/client/resources/terminal-command.ts","../src/client/terminal.ts","../src/client/file-watcher.ts","../src/client/signal-service.ts","../src/client/index.ts","../src/client/resources/terminal.ts","../src/client/resources/server.ts","../src/client/resources/watcher.ts","../src/client/resources/session-token.ts","../src/client/resources/magic-link.ts","../src/client/resources/signal.ts","../src/client/resources/file.ts","../src/client/resources/env.ts","../src/client/resources/auth.ts","../src/client/resources/run.ts","../src/client/resources/child.ts","../src/client/types.ts","../src/provider-config.ts","../src/constants.ts","../src/auto-detect.ts","../src/explicit-config.ts","../src/compute-daemon/lifecycle.ts","../src/compute.ts"],"sourcesContent":["/**\n * ComputeSDK - User-facing SDK\n *\n * Provides the universal Sandbox class and compute API for executing code in remote sandboxes.\n *\n * Using ComputeSDK (Recommended):\n * import { compute } from 'computesdk';\n * \n * Zero-config: Set COMPUTESDK_API_KEY and provider credentials (e.g., E2B_API_KEY)\n * Or explicit: compute.setConfig({ provider: 'e2b', apiKey: '...', e2b: { apiKey: '...' } })\n *\n * Using Providers Directly (Advanced):\n * import { e2b } from '@computesdk/e2b';\n * const compute = e2b({ apiKey: '...' });\n * \n * Useful for local providers (Docker) or provider-specific features\n */\n\n// ============================================================================\n// Universal Sandbox Interface & Types \n// ============================================================================\n\n// Export universal Sandbox interface and supporting types\n// These are the canonical type definitions that all providers should use\n//\n// Note: The interface is renamed from \"Sandbox\" to \"SandboxInterface\" on export\n// to avoid collision with the gateway Sandbox class below. Use \"SandboxInterface\"\n// when writing provider-agnostic code that accepts any sandbox implementation.\nexport type {\n Sandbox as SandboxInterface,\n Runtime,\n CodeResult,\n CommandResult,\n SandboxInfo,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n CreateSandboxOptions\n} from './types/universal-sandbox';\n\n// ============================================================================\n// Sandbox Client - Gateway Implementation\n// ============================================================================\n\n// Export gateway Sandbox class (implements the SandboxInterface above)\n//\n// Usage guide:\n// - import { Sandbox } from 'computesdk' → Gateway Sandbox class (for runtime use)\n// - import type { SandboxInterface } from 'computesdk' → Universal interface (for type annotations)\n//\n// Use the class when working with gateway sandboxes specifically.\n// Use the interface when writing functions that accept any sandbox (gateway, e2b, modal, etc.)\nexport { Sandbox, Sandbox as GatewaySandbox } from './client';\n\n// Export client-specific types\nexport type { SandboxStatus, ProviderSandboxInfo } from './client/types';\nexport { CommandExitError, isCommandExitError } from './client/types';\n\n// Re-export commonly used client utilities\nexport { \n TerminalInstance,\n FileWatcher,\n SignalService,\n encodeBinaryMessage,\n decodeBinaryMessage,\n MessageType\n} from './client';\n\n// ============================================================================\n// Compute API - Gateway HTTP Implementation\n// ============================================================================\n\n// Export compute singleton/callable - the main API\n// Works as both: compute.sandbox.create() and compute({...}).sandbox.create()\nexport { compute } from './compute';\n\n// ============================================================================\n// Provider Configuration & Detection\n// ============================================================================\n\n// Export auto-detection utilities\nexport {\n isGatewayModeEnabled,\n detectProvider,\n getProviderHeaders,\n autoConfigureCompute\n} from './auto-detect';\n\n// Export provider configuration utilities\nexport {\n GATEWAY_URL,\n PROVIDER_PRIORITY,\n PROVIDER_ENV_VARS,\n} from './constants';\n\nexport {\n PROVIDER_AUTH,\n PROVIDER_NAMES,\n PROVIDER_HEADERS,\n PROVIDER_ENV_MAP,\n PROVIDER_DASHBOARD_URLS,\n type ProviderName,\n isValidProvider,\n buildProviderHeaders,\n getProviderConfigFromEnv,\n isProviderAuthComplete,\n getMissingEnvVars,\n} from './provider-config';\n\n// ============================================================================\n// Note: Provider Framework\n// ============================================================================\n\n// For building custom providers, use @computesdk/provider\n// import { defineProvider } from '@computesdk/provider';\n","/**\n * Binary WebSocket Protocol Implementation\n *\n * Implements the ComputeSDK binary protocol for WebSocket communication.\n * Provides 50-90% size reduction compared to JSON protocol.\n *\n * Binary Message Format:\n * [1 byte: message type]\n * [2 bytes: channel length (uint16, big-endian)]\n * [N bytes: channel string (UTF-8)]\n * [2 bytes: msg type length (uint16, big-endian)]\n * [N bytes: msg type string (UTF-8)]\n * [4 bytes: data length (uint32, big-endian)]\n * [N bytes: data (key-value encoded for complex objects, raw bytes for binary data)]\n *\n * Key-Value Encoding Format:\n * [2 bytes: num_fields (uint16, big-endian)]\n * For each field:\n * [2 bytes: key_length (uint16, big-endian)]\n * [N bytes: key string (UTF-8)]\n * [1 byte: value_type (0x01=string, 0x02=number, 0x03=boolean, 0x04=bytes)]\n * [4 bytes: value_length (uint32, big-endian)]\n * [N bytes: value data]\n */\n\n// ============================================================================\n// Message Type Constants\n// ============================================================================\n\nexport enum MessageType {\n Subscribe = 0x01,\n Unsubscribe = 0x02,\n Data = 0x03,\n Error = 0x04,\n Connected = 0x05,\n}\n\n/**\n * Value types for binary key-value encoding\n */\nenum ValueType {\n String = 0x01,\n Number = 0x02,\n Boolean = 0x03,\n Bytes = 0x04,\n}\n\n// ============================================================================\n// Binary Message Structure\n// ============================================================================\n\nexport interface BinaryMessage {\n type: MessageType;\n channel: string;\n msgType: string;\n data: any;\n}\n\n// ============================================================================\n// Key-Value Encoding Functions\n// ============================================================================\n\n// Reusable encoder/decoder instances for better performance\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\n/**\n * Get the size in bytes of a value\n */\nfunction getValueSize(value: any): number {\n if (typeof value === 'string') {\n return textEncoder.encode(value).length;\n } else if (typeof value === 'number') {\n return 8; // float64\n } else if (typeof value === 'boolean') {\n return 1;\n } else if (value instanceof Uint8Array) {\n return value.length;\n }\n return 0;\n}\n\n/**\n * Encode a key-value object to binary format\n * Format:\n * [2 bytes: num_fields (uint16, big-endian)]\n * For each field:\n * [2 bytes: key_length (uint16, big-endian)]\n * [N bytes: key string (UTF-8)]\n * [1 byte: value_type]\n * [4 bytes: value_length (uint32, big-endian)]\n * [N bytes: value data]\n */\nfunction encodeKeyValue(data: Record<string, any>): Uint8Array {\n\n // Calculate total size\n let totalSize = 2; // num_fields\n const fields = Object.entries(data);\n\n for (const [key, value] of fields) {\n const keyBytes = textEncoder.encode(key);\n totalSize += 2; // key_length\n totalSize += keyBytes.length; // key\n totalSize += 1; // value_type\n totalSize += 4; // value_length\n totalSize += getValueSize(value); // value\n }\n\n const buffer = new Uint8Array(totalSize);\n const view = new DataView(buffer.buffer);\n let offset = 0;\n\n // Write number of fields\n view.setUint16(offset, fields.length, false); // big-endian\n offset += 2;\n\n // Write each field\n for (const [key, value] of fields) {\n // Write key\n const keyBytes = textEncoder.encode(key);\n view.setUint16(offset, keyBytes.length, false);\n offset += 2;\n buffer.set(keyBytes, offset);\n offset += keyBytes.length;\n\n // Write value type and data\n if (typeof value === 'string') {\n buffer[offset] = ValueType.String;\n offset++;\n const valueBytes = textEncoder.encode(value);\n view.setUint32(offset, valueBytes.length, false);\n offset += 4;\n buffer.set(valueBytes, offset);\n offset += valueBytes.length;\n } else if (typeof value === 'number') {\n buffer[offset] = ValueType.Number;\n offset++;\n view.setUint32(offset, 8, false); // float64 is 8 bytes\n offset += 4;\n view.setFloat64(offset, value, false); // big-endian\n offset += 8;\n } else if (typeof value === 'boolean') {\n buffer[offset] = ValueType.Boolean;\n offset++;\n view.setUint32(offset, 1, false);\n offset += 4;\n buffer[offset] = value ? 0x01 : 0x00;\n offset++;\n } else if (value instanceof Uint8Array) {\n buffer[offset] = ValueType.Bytes;\n offset++;\n view.setUint32(offset, value.length, false);\n offset += 4;\n buffer.set(value, offset);\n offset += value.length;\n } else {\n throw new Error(`Unsupported value type for key ${key}: ${typeof value}`);\n }\n }\n\n return buffer;\n}\n\n/**\n * Decode binary key-value format to object\n */\nfunction decodeKeyValue(data: Uint8Array): Record<string, any> {\n if (data.length < 2) {\n throw new Error('Data too short for key-value encoding');\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const result: Record<string, any> = {};\n let offset = 0;\n\n // Read number of fields\n const numFields = view.getUint16(offset, false); // big-endian\n offset += 2;\n\n // Read each field\n for (let i = 0; i < numFields; i++) {\n // Read key\n if (offset + 2 > data.length) {\n throw new Error(`Invalid key length at field ${i}`);\n }\n const keyLen = view.getUint16(offset, false);\n offset += 2;\n\n if (offset + keyLen > data.length) {\n throw new Error(`Key data truncated at field ${i}`);\n }\n const key = textDecoder.decode(data.slice(offset, offset + keyLen));\n offset += keyLen;\n\n // Read value type\n if (offset + 1 > data.length) {\n throw new Error(`Invalid value type at field ${i}`);\n }\n const valueType = data[offset];\n offset++;\n\n // Read value length\n if (offset + 4 > data.length) {\n throw new Error(`Invalid value length at field ${i}`);\n }\n const valueLen = view.getUint32(offset, false);\n offset += 4;\n\n // Read value data\n if (offset + valueLen > data.length) {\n throw new Error(`Value data truncated at field ${i}`);\n }\n const valueData = data.slice(offset, offset + valueLen);\n offset += valueLen;\n\n // Decode value based on type\n switch (valueType) {\n case ValueType.String:\n result[key] = textDecoder.decode(valueData);\n break;\n\n case ValueType.Number:\n if (valueData.length !== 8) {\n throw new Error(`Invalid number length for field ${key}`);\n }\n const valueView = new DataView(valueData.buffer, valueData.byteOffset);\n result[key] = valueView.getFloat64(0, false); // big-endian\n break;\n\n case ValueType.Boolean:\n if (valueData.length !== 1) {\n throw new Error(`Invalid boolean length for field ${key}`);\n }\n result[key] = valueData[0] !== 0x00;\n break;\n\n case ValueType.Bytes:\n result[key] = valueData;\n break;\n\n default:\n throw new Error(`Unknown value type 0x${valueType.toString(16)} for field ${key}`);\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Encoding Functions\n// ============================================================================\n\n/**\n * Encode a WebSocket message to binary format\n * @param message - The message object to encode\n * @returns ArrayBuffer containing the encoded binary message\n */\nexport function encodeBinaryMessage(message: any): ArrayBuffer {\n // Determine message type based on message structure\n let messageType: MessageType;\n let channel = '';\n let msgType = '';\n let data: any = {};\n\n if (message.type === 'subscribe') {\n messageType = MessageType.Subscribe;\n channel = message.channel || '';\n msgType = 'subscribe';\n data = {};\n } else if (message.type === 'unsubscribe') {\n messageType = MessageType.Unsubscribe;\n channel = message.channel || '';\n msgType = 'unsubscribe';\n data = {};\n } else {\n // Generic data message\n messageType = MessageType.Data;\n channel = message.channel || '';\n msgType = message.type || '';\n data = message.data || message;\n }\n\n // Convert strings to UTF-8 bytes\n const channelBytes = encodeUTF8(channel);\n const msgTypeBytes = encodeUTF8(msgType);\n\n // Encode data field (if present)\n let dataBytes: Uint8Array;\n if (data === undefined || data === null) {\n dataBytes = new Uint8Array(0);\n } else if (typeof data === 'string') {\n dataBytes = encodeUTF8(data);\n } else if (data instanceof Uint8Array) {\n dataBytes = data;\n } else if (typeof data === 'object') {\n // Complex object - use key-value encoding\n dataBytes = encodeKeyValue(data);\n } else {\n throw new Error(`Unsupported data type: ${typeof data}`);\n }\n\n // Calculate total size\n const totalSize = 1 + 2 + channelBytes.length + 2 + msgTypeBytes.length + 4 + dataBytes.length;\n\n // Create buffer and view\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n let offset = 0;\n\n // Write message type (1 byte)\n view.setUint8(offset, messageType);\n offset += 1;\n\n // Write channel length (2 bytes, big-endian)\n view.setUint16(offset, channelBytes.length, false);\n offset += 2;\n\n // Write channel bytes\n const uint8View = new Uint8Array(buffer);\n uint8View.set(channelBytes, offset);\n offset += channelBytes.length;\n\n // Write msg type length (2 bytes, big-endian)\n view.setUint16(offset, msgTypeBytes.length, false);\n offset += 2;\n\n // Write msg type bytes\n uint8View.set(msgTypeBytes, offset);\n offset += msgTypeBytes.length;\n\n // Write data length (4 bytes, big-endian)\n view.setUint32(offset, dataBytes.length, false);\n offset += 4;\n\n // Write data bytes\n uint8View.set(dataBytes, offset);\n\n return buffer;\n}\n\n// ============================================================================\n// Decoding Functions\n// ============================================================================\n\n/**\n * Decode a binary WebSocket message\n * @param buffer - The binary data to decode (ArrayBuffer or Uint8Array)\n * @returns Decoded message object\n */\nexport function decodeBinaryMessage(buffer: ArrayBuffer | Uint8Array): any {\n // Convert to ArrayBuffer if needed\n const arrayBuffer = buffer instanceof Uint8Array ? buffer.buffer : buffer;\n const view = new DataView(arrayBuffer);\n const uint8View = new Uint8Array(arrayBuffer);\n let offset = 0;\n\n // Read message type (1 byte)\n const messageType = view.getUint8(offset);\n offset += 1;\n\n // Read channel length (2 bytes, big-endian)\n const channelLength = view.getUint16(offset, false);\n offset += 2;\n\n // Read channel string\n const channelBytes = uint8View.slice(offset, offset + channelLength);\n const channel = decodeUTF8(channelBytes);\n offset += channelLength;\n\n // Read msg type length (2 bytes, big-endian)\n const msgTypeLength = view.getUint16(offset, false);\n offset += 2;\n\n // Read msg type string\n const msgTypeBytes = uint8View.slice(offset, offset + msgTypeLength);\n const msgType = decodeUTF8(msgTypeBytes);\n offset += msgTypeLength;\n\n // Read data length (4 bytes, big-endian)\n const dataLength = view.getUint32(offset, false);\n offset += 4;\n\n // Read data bytes\n const dataBytes = uint8View.slice(offset, offset + dataLength);\n\n // Try to decode as key-value for message types that expect structured data\n const shouldTryKeyValue = ['terminal:input', 'terminal:resize', 'file:changed', 'terminal:output', 'signal', 'test'].includes(msgType);\n\n let data: any;\n if (dataBytes.length === 0) {\n // Empty data\n data = {};\n } else if (shouldTryKeyValue) {\n try {\n // Try to decode as key-value\n data = decodeKeyValue(dataBytes);\n } catch {\n // If key-value decode fails, fall back to raw bytes\n data = dataBytes;\n }\n } else {\n // For other message types, keep as raw bytes\n data = dataBytes;\n }\n\n // Construct message object based on message type\n if (messageType === MessageType.Subscribe || messageType === MessageType.Unsubscribe) {\n return {\n type: msgType,\n channel: channel,\n };\n }\n\n // For data messages, construct the standard message format\n return {\n type: msgType,\n channel: channel,\n data: data,\n };\n}\n\n// ============================================================================\n// UTF-8 Encoding/Decoding Helpers\n// ============================================================================\n\n/**\n * Encode a string to UTF-8 bytes\n * @param str - The string to encode\n * @returns Uint8Array containing UTF-8 encoded bytes\n */\nfunction encodeUTF8(str: string): Uint8Array {\n // Use TextEncoder if available (modern browsers and Node.js)\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n }\n\n // Fallback for older environments\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));\n } else {\n // UTF-16 surrogate pair\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n}\n\n/**\n * Decode UTF-8 bytes to a string\n * @param bytes - The UTF-8 encoded bytes\n * @returns Decoded string\n */\nfunction decodeUTF8(bytes: Uint8Array): string {\n // Use TextDecoder if available (modern browsers and Node.js)\n if (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder();\n return decoder.decode(bytes);\n }\n\n // Fallback for older environments\n let str = '';\n let i = 0;\n while (i < bytes.length) {\n const c = bytes[i++];\n if (c < 0x80) {\n str += String.fromCharCode(c);\n } else if (c < 0xe0) {\n str += String.fromCharCode(((c & 0x1f) << 6) | (bytes[i++] & 0x3f));\n } else if (c < 0xf0) {\n str += String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f));\n } else {\n const c2 = ((c & 0x07) << 18) | ((bytes[i++] & 0x3f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f);\n const c3 = c2 - 0x10000;\n str += String.fromCharCode(0xd800 | (c3 >> 10), 0xdc00 | (c3 & 0x3ff));\n }\n }\n return str;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if data is binary (ArrayBuffer, Uint8Array, or Blob)\n * @param data - The data to check\n * @returns True if data is binary\n */\nexport function isBinaryData(data: any): boolean {\n return data instanceof ArrayBuffer || data instanceof Uint8Array || data instanceof Blob;\n}\n\n/**\n * Convert Blob to ArrayBuffer\n * @param blob - The Blob to convert\n * @returns Promise that resolves to ArrayBuffer\n */\nexport async function blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n if (blob.arrayBuffer) {\n return blob.arrayBuffer();\n }\n\n // Fallback for older browsers\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as ArrayBuffer);\n reader.onerror = reject;\n reader.readAsArrayBuffer(blob);\n });\n}\n","/**\n * WebSocket Manager for ComputeSDK Client\n *\n * Handles real-time bidirectional communication with sandbox API\n */\n\nimport {\n encodeBinaryMessage,\n decodeBinaryMessage,\n isBinaryData,\n blobToArrayBuffer,\n} from './protocol';\n\n// ============================================================================\n// WebSocket Message Types\n// ============================================================================\n\n/**\n * Base WebSocket message structure\n */\nexport interface WebSocketMessage<T = any> {\n type: string;\n channel?: string;\n data?: T;\n}\n\n/**\n * Channel subscription message\n */\nexport interface SubscribeMessage {\n type: 'subscribe';\n channel: string;\n}\n\n/**\n * Channel unsubscription message\n */\nexport interface UnsubscribeMessage {\n type: 'unsubscribe';\n channel: string;\n}\n\n// ============================================================================\n// Outgoing Message Types (Client → Server)\n// ============================================================================\n\n/**\n * Send input to a terminal\n * Note: input is sent as-is (not encoded by client SDK)\n */\nexport interface TerminalInputMessage {\n type: 'terminal:input';\n data: {\n terminal_id: string;\n input: string;\n };\n}\n\n/**\n * Resize terminal window\n */\nexport interface TerminalResizeMessage {\n type: 'terminal:resize';\n data: {\n terminal_id: string;\n cols: number;\n rows: number;\n };\n}\n\nexport type OutgoingMessage =\n | SubscribeMessage\n | UnsubscribeMessage\n | TerminalInputMessage\n | TerminalResizeMessage;\n\n// ============================================================================\n// Incoming Message Types (Server → Client)\n// ============================================================================\n\n/**\n * Terminal created notification\n */\nexport interface TerminalCreatedMessage {\n type: 'terminal:created';\n channel: string;\n data: {\n id: string;\n status: 'running' | 'stopped';\n };\n}\n\n/**\n * Terminal output data\n * Note: output field may be base64 encoded depending on encoding field\n */\nexport interface TerminalOutputMessage {\n type: 'terminal:output';\n channel: string;\n data: {\n output: string; // raw string or base64 encoded, check encoding field\n encoding?: 'raw' | 'base64'; // indicates how output is encoded\n };\n}\n\n/**\n * Terminal destroyed notification\n */\nexport interface TerminalDestroyedMessage {\n type: 'terminal:destroyed';\n channel: string;\n data: {\n id: string;\n };\n}\n\n/**\n * Terminal error notification\n */\nexport interface TerminalErrorMessage {\n type: 'terminal:error';\n channel: string;\n data: {\n error: string;\n };\n}\n\n/**\n * File watcher created notification\n */\nexport interface WatcherCreatedMessage {\n type: 'watcher:created';\n channel: string;\n data: {\n id: string;\n path: string;\n };\n}\n\n/**\n * File change event\n * Note: content field may be base64 encoded depending on encoding field\n */\nexport interface FileChangedMessage {\n type: 'file:changed';\n channel: string;\n data: {\n event: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir';\n path: string;\n content?: string; // raw string or base64 encoded, check encoding field\n encoding?: 'raw' | 'base64'; // indicates how content is encoded\n };\n}\n\n/**\n * File watcher destroyed notification\n */\nexport interface WatcherDestroyedMessage {\n type: 'watcher:destroyed';\n channel: string;\n data: {\n id: string;\n };\n}\n\n/**\n * System signal event\n */\nexport interface SignalMessage {\n type: 'signal';\n channel: 'signals';\n data: {\n signal: 'port' | 'error' | 'server-ready';\n port?: number;\n url?: string;\n message?: string;\n };\n}\n\n/**\n * Sandbox created notification\n */\nexport interface SandboxCreatedMessage {\n type: 'sandbox.created';\n data: {\n subdomain: string;\n url: string;\n };\n}\n\n/**\n * Sandbox deleted notification\n */\nexport interface SandboxDeletedMessage {\n type: 'sandbox.deleted';\n data: {\n subdomain: string;\n };\n}\n\nexport type IncomingMessage =\n | TerminalCreatedMessage\n | TerminalOutputMessage\n | TerminalDestroyedMessage\n | TerminalErrorMessage\n | WatcherCreatedMessage\n | FileChangedMessage\n | WatcherDestroyedMessage\n | SignalMessage\n | SandboxCreatedMessage\n | SandboxDeletedMessage;\n\n// ============================================================================\n// WebSocket Manager Configuration\n// ============================================================================\n\nexport type WebSocketConstructor = new (url: string) => WebSocket;\n\nexport interface WebSocketManagerConfig {\n /** WebSocket URL (will be generated from client config if not provided) */\n url: string;\n /** WebSocket implementation */\n WebSocket: WebSocketConstructor;\n /** Enable automatic reconnection on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Reconnection delay in milliseconds (default: 1000) */\n reconnectDelay?: number;\n /** Maximum reconnection attempts (default: 5, 0 = infinite) */\n maxReconnectAttempts?: number;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n /** WebSocket protocol: 'binary' (default, recommended) or 'json' (for debugging) */\n protocol?: 'json' | 'binary';\n}\n\n// ============================================================================\n// Event Handler Types\n// ============================================================================\n\nexport type MessageHandler<T = any> = (message: T) => void;\nexport type ErrorHandler = (error: Event) => void;\nexport type ConnectionHandler = () => void;\n\n// ============================================================================\n// WebSocket Manager\n// ============================================================================\n\n/**\n * WebSocket Manager for handling real-time communication\n *\n * @example\n * ```typescript\n * import { ComputeClient } from '@computesdk/client'\n *\n * const client = new ComputeClient({ sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com' });\n * await client.generateToken();\n *\n * // Create WebSocket manager\n * const ws = client.createWebSocketManager();\n *\n * // Listen for connection\n * ws.on('open', () => {\n * console.log('Connected!');\n * });\n *\n * // Subscribe to terminal output\n * ws.subscribe('terminal:term_abc123');\n * ws.on('terminal:output', (msg) => {\n * console.log('Terminal output:', msg.data.output);\n * });\n *\n * // Send terminal input\n * ws.sendTerminalInput('term_abc123', 'ls -la\\n');\n *\n * // Subscribe to file changes\n * ws.subscribe('watcher:watcher_xyz789');\n * ws.on('file:changed', (msg) => {\n * console.log('File changed:', msg.data.path, msg.data.event);\n * });\n *\n * // Subscribe to signals\n * ws.subscribe('signals');\n * ws.on('signal', (msg) => {\n * console.log('Signal:', msg.data);\n * });\n * ```\n */\nexport class WebSocketManager {\n private config: Required<WebSocketManagerConfig>;\n private ws: WebSocket | null = null;\n private eventHandlers: Map<string, Set<MessageHandler>> = new Map();\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private subscribedChannels: Set<string> = new Set();\n private isManualClose = false;\n\n constructor(config: WebSocketManagerConfig) {\n this.config = {\n url: config.url,\n WebSocket: config.WebSocket,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 5,\n debug: config.debug ?? false,\n protocol: config.protocol ?? 'binary',\n };\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n /**\n * Connect to WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.isManualClose = false;\n this.log('Connecting to WebSocket URL:', this.config.url);\n this.ws = new this.config.WebSocket(this.config.url);\n\n this.ws.onopen = () => {\n this.log('Connected to WebSocket server');\n this.reconnectAttempts = 0;\n\n // Resubscribe to channels after reconnection\n if (this.subscribedChannels.size > 0) {\n this.log('Resubscribing to channels:', Array.from(this.subscribedChannels));\n this.subscribedChannels.forEach((channel) => {\n this.sendRaw({ type: 'subscribe', channel });\n });\n }\n\n this.emit('open');\n resolve();\n };\n\n this.ws.onmessage = async (event) => {\n try {\n let message: IncomingMessage;\n\n // Check if message is binary\n if (this.config.protocol === 'binary' && isBinaryData(event.data)) {\n // Handle binary message\n let buffer: ArrayBuffer;\n if (event.data instanceof Blob) {\n buffer = await blobToArrayBuffer(event.data);\n } else {\n buffer = event.data;\n }\n message = decodeBinaryMessage(buffer) as IncomingMessage;\n this.log('Received binary message:', message);\n } else {\n // Handle JSON message\n message = JSON.parse(event.data) as IncomingMessage;\n this.log('Received JSON message:', message);\n }\n\n this.handleMessage(message);\n } catch (error) {\n this.log('Failed to parse message:', error);\n }\n };\n\n this.ws.onerror = (error) => {\n this.log('WebSocket error:', error);\n this.emit('error', error);\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.log('WebSocket connection closed');\n this.emit('close');\n\n // Attempt reconnection if enabled and not manually closed\n if (this.config.autoReconnect && !this.isManualClose) {\n this.attemptReconnect();\n }\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n disconnect(): void {\n this.isManualClose = true;\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Check if WebSocket is connected\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Attempt to reconnect to WebSocket server\n */\n private attemptReconnect(): void {\n if (\n this.config.maxReconnectAttempts > 0 &&\n this.reconnectAttempts >= this.config.maxReconnectAttempts\n ) {\n this.log('Max reconnection attempts reached');\n this.emit('reconnect-failed');\n return;\n }\n\n this.reconnectAttempts++;\n this.log(`Reconnecting... (attempt ${this.reconnectAttempts})`);\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n this.log('Reconnection failed:', error);\n });\n }, this.config.reconnectDelay);\n }\n\n // ============================================================================\n // Channel Subscription\n // ============================================================================\n\n /**\n * Subscribe to a channel\n * @param channel - Channel name (e.g., 'terminal:term_abc123', 'watcher:watcher_xyz789', 'signals')\n */\n subscribe(channel: string): void {\n this.subscribedChannels.add(channel);\n this.sendRaw({ type: 'subscribe', channel });\n this.log('Subscribed to channel:', channel);\n }\n\n /**\n * Unsubscribe from a channel\n */\n unsubscribe(channel: string): void {\n this.subscribedChannels.delete(channel);\n this.sendRaw({ type: 'unsubscribe', channel });\n this.log('Unsubscribed from channel:', channel);\n }\n\n /**\n * Get list of subscribed channels\n */\n getSubscribedChannels(): string[] {\n return Array.from(this.subscribedChannels);\n }\n\n // ============================================================================\n // Message Sending\n // ============================================================================\n\n /**\n * Send raw message to server\n */\n private sendRaw(message: OutgoingMessage): void {\n if (!this.isConnected()) {\n throw new Error('WebSocket is not connected');\n }\n\n if (this.config.protocol === 'binary') {\n // Send as binary message\n const buffer = encodeBinaryMessage(message);\n this.ws!.send(buffer);\n this.log('Sent binary message:', message);\n } else {\n // Send as JSON message\n this.ws!.send(JSON.stringify(message));\n this.log('Sent JSON message:', message);\n }\n }\n\n /**\n * Send input to a terminal (sent as-is, not encoded)\n */\n sendTerminalInput(terminalId: string, input: string): void {\n this.sendRaw({\n type: 'terminal:input',\n data: { terminal_id: terminalId, input },\n });\n }\n\n /**\n * Resize terminal window\n */\n resizeTerminal(terminalId: string, cols: number, rows: number): void {\n this.sendRaw({\n type: 'terminal:resize',\n data: { terminal_id: terminalId, cols, rows },\n });\n }\n\n // ============================================================================\n // Event Handling\n // ============================================================================\n\n /**\n * Register event handler\n */\n on(event: 'open', handler: ConnectionHandler): void;\n on(event: 'close', handler: ConnectionHandler): void;\n on(event: 'error', handler: ErrorHandler): void;\n on(event: 'reconnect-failed', handler: ConnectionHandler): void;\n on(event: 'terminal:created', handler: MessageHandler<TerminalCreatedMessage>): void;\n on(event: 'terminal:output', handler: MessageHandler<TerminalOutputMessage>): void;\n on(event: 'terminal:destroyed', handler: MessageHandler<TerminalDestroyedMessage>): void;\n on(event: 'terminal:error', handler: MessageHandler<TerminalErrorMessage>): void;\n on(event: 'watcher:created', handler: MessageHandler<WatcherCreatedMessage>): void;\n on(event: 'file:changed', handler: MessageHandler<FileChangedMessage>): void;\n on(event: 'watcher:destroyed', handler: MessageHandler<WatcherDestroyedMessage>): void;\n on(event: 'signal', handler: MessageHandler<SignalMessage>): void;\n on(event: 'sandbox.created', handler: MessageHandler<SandboxCreatedMessage>): void;\n on(event: 'sandbox.deleted', handler: MessageHandler<SandboxDeletedMessage>): void;\n on(event: string, handler: MessageHandler): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off(event: string, handler: MessageHandler): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Unregister all event handlers for an event\n */\n offAll(event: string): void {\n this.eventHandlers.delete(event);\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit(event: string, data?: any): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n this.log('Error in event handler:', error);\n }\n });\n }\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(message: IncomingMessage): void {\n // Emit message type event\n this.emit(message.type, message);\n\n // Also emit on channel if present\n if ('channel' in message && message.channel) {\n this.emit(message.channel, message);\n }\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Log debug message if debug mode is enabled\n */\n private log(...args: any[]): void {\n if (this.config.debug) {\n console.log('[WebSocketManager]', ...args);\n }\n }\n\n /**\n * Get current connection state\n */\n getState(): 'connecting' | 'open' | 'closing' | 'closed' {\n if (!this.ws) return 'closed';\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return 'connecting';\n case WebSocket.OPEN:\n return 'open';\n case WebSocket.CLOSING:\n return 'closing';\n case WebSocket.CLOSED:\n return 'closed';\n default:\n return 'closed';\n }\n }\n\n /**\n * Get reconnection attempt count\n */\n getReconnectAttempts(): number {\n return this.reconnectAttempts;\n }\n}\n","/**\n * Command - Represents a command execution in a terminal\n */\n\nimport type { CommandDetailsResponse } from '../index';\n\n/**\n * Command execution result with wait capability\n */\nexport class Command {\n readonly id: string;\n readonly terminalId: string;\n readonly command: string;\n private _status: 'running' | 'completed' | 'failed';\n private _stdout: string;\n private _stderr: string;\n private _exitCode?: number;\n private _durationMs?: number;\n private _startedAt: string;\n private _finishedAt?: string;\n\n private waitHandler?: (timeout?: number) => Promise<CommandDetailsResponse>;\n private retrieveHandler?: () => Promise<CommandDetailsResponse>;\n\n constructor(data: {\n cmdId: string;\n terminalId: string;\n command: string;\n status: 'running' | 'completed' | 'failed';\n stdout: string;\n stderr: string;\n exitCode?: number;\n durationMs?: number;\n startedAt: string;\n finishedAt?: string;\n }) {\n this.id = data.cmdId;\n this.terminalId = data.terminalId;\n this.command = data.command;\n this._status = data.status;\n this._stdout = data.stdout;\n this._stderr = data.stderr;\n this._exitCode = data.exitCode;\n this._durationMs = data.durationMs;\n this._startedAt = data.startedAt;\n this._finishedAt = data.finishedAt;\n }\n\n get status(): 'running' | 'completed' | 'failed' {\n return this._status;\n }\n\n get stdout(): string {\n return this._stdout;\n }\n\n get stderr(): string {\n return this._stderr;\n }\n\n get exitCode(): number | undefined {\n return this._exitCode;\n }\n\n get durationMs(): number | undefined {\n return this._durationMs;\n }\n\n get startedAt(): string {\n return this._startedAt;\n }\n\n get finishedAt(): string | undefined {\n return this._finishedAt;\n }\n\n /**\n * Set the wait handler (called by TerminalCommands)\n * @internal\n */\n setWaitHandler(handler: (timeout?: number) => Promise<CommandDetailsResponse>): void {\n this.waitHandler = handler;\n }\n\n /**\n * Set the retrieve handler (called by TerminalCommands)\n * @internal\n */\n setRetrieveHandler(handler: () => Promise<CommandDetailsResponse>): void {\n this.retrieveHandler = handler;\n }\n\n /**\n * Wait for the command to complete\n * @param timeout - Optional timeout in seconds (0 = no timeout)\n * @returns This command with updated status\n */\n async wait(timeout?: number): Promise<this> {\n if (!this.waitHandler) {\n throw new Error('Wait handler not set');\n }\n\n const response = await this.waitHandler(timeout);\n this.updateFromResponse(response);\n return this;\n }\n\n /**\n * Refresh the command status from the server\n * @returns This command with updated status\n */\n async refresh(): Promise<this> {\n if (!this.retrieveHandler) {\n throw new Error('Retrieve handler not set');\n }\n\n const response = await this.retrieveHandler();\n this.updateFromResponse(response);\n return this;\n }\n\n /**\n * Update internal state from API response\n */\n private updateFromResponse(response: CommandDetailsResponse): void {\n this._status = response.data.status;\n this._stdout = response.data.stdout;\n this._stderr = response.data.stderr;\n this._exitCode = response.data.exit_code;\n this._durationMs = response.data.duration_ms;\n this._finishedAt = response.data.finished_at;\n }\n}\n","/**\n * TerminalCommand - Resource namespace for terminal commands\n */\n\nimport { Command } from './command';\nimport type { CommandsListResponse, CommandDetailsResponse, CommandExecutionResponse } from '../index';\n\n/**\n * Command resource namespace for a terminal\n *\n * @example\n * ```typescript\n * const terminal = await sandbox.terminal.create({ pty: false });\n *\n * // Run a command\n * const cmd = await terminal.command.run('npm test');\n * console.log(cmd.stdout);\n *\n * // Run in background and wait\n * const cmd = await terminal.command.run('npm install', { background: true });\n * await cmd.wait();\n * console.log(cmd.exitCode);\n *\n * // List commands\n * const commands = await terminal.command.list();\n *\n * // Retrieve a specific command\n * const cmd = await terminal.command.retrieve(cmdId);\n * ```\n */\nexport class TerminalCommand {\n private terminalId: string;\n private runHandler: (command: string, background?: boolean) => Promise<CommandExecutionResponse>;\n private listHandler: () => Promise<CommandsListResponse>;\n private retrieveHandler: (cmdId: string) => Promise<CommandDetailsResponse>;\n private waitHandler: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>;\n\n constructor(\n terminalId: string,\n handlers: {\n run: (command: string, background?: boolean) => Promise<CommandExecutionResponse>;\n list: () => Promise<CommandsListResponse>;\n retrieve: (cmdId: string) => Promise<CommandDetailsResponse>;\n wait: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>;\n }\n ) {\n this.terminalId = terminalId;\n this.runHandler = handlers.run;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.waitHandler = handlers.wait;\n }\n\n /**\n * Run a command in the terminal\n * @param command - The command to execute\n * @param options - Execution options\n * @param options.background - If true, returns immediately without waiting for completion\n * @returns Command object with results or status\n */\n async run(command: string, options?: { background?: boolean }): Promise<Command> {\n const response = await this.runHandler(command, options?.background);\n\n const cmd = new Command({\n cmdId: response.data.cmd_id || '',\n terminalId: this.terminalId,\n command: response.data.command,\n status: response.data.status || (options?.background ? 'running' : 'completed'),\n stdout: response.data.stdout,\n stderr: response.data.stderr,\n exitCode: response.data.exit_code,\n durationMs: response.data.duration_ms,\n startedAt: new Date().toISOString(),\n });\n\n // Set up handlers for the command\n cmd.setWaitHandler((timeout) => this.waitHandler(cmd.id, timeout));\n cmd.setRetrieveHandler(() => this.retrieveHandler(cmd.id));\n\n return cmd;\n }\n\n /**\n * List all commands executed in this terminal\n * @returns Array of Command objects\n */\n async list(): Promise<Command[]> {\n const response = await this.listHandler();\n\n return response.data.commands.map((item) => {\n const cmd = new Command({\n cmdId: item.cmd_id,\n terminalId: this.terminalId,\n command: item.command,\n status: item.status,\n stdout: '', // Not included in list response\n stderr: '', // Not included in list response\n exitCode: item.exit_code,\n durationMs: item.duration_ms,\n startedAt: item.started_at,\n finishedAt: item.finished_at,\n });\n\n cmd.setWaitHandler((timeout) => this.waitHandler(cmd.id, timeout));\n cmd.setRetrieveHandler(() => this.retrieveHandler(cmd.id));\n\n return cmd;\n });\n }\n\n /**\n * Retrieve a specific command by ID\n * @param cmdId - The command ID\n * @returns Command object with full details\n */\n async retrieve(cmdId: string): Promise<Command> {\n const response = await this.retrieveHandler(cmdId);\n\n const cmd = new Command({\n cmdId: response.data.cmd_id,\n terminalId: this.terminalId,\n command: response.data.command,\n status: response.data.status,\n stdout: response.data.stdout,\n stderr: response.data.stderr,\n exitCode: response.data.exit_code,\n durationMs: response.data.duration_ms,\n startedAt: response.data.started_at,\n finishedAt: response.data.finished_at,\n });\n\n cmd.setWaitHandler((timeout) => this.waitHandler(cmd.id, timeout));\n cmd.setRetrieveHandler(() => this.retrieveHandler(cmd.id));\n\n return cmd;\n }\n}\n","/**\n * Terminal class for managing terminal sessions with WebSocket integration\n */\n\nimport type { WebSocketManager } from './websocket';\nimport type {\n TerminalOutputMessage,\n TerminalErrorMessage,\n TerminalDestroyedMessage,\n} from './websocket';\nimport type { CommandExecutionResponse, CommandsListResponse, CommandDetailsResponse } from './index';\nimport { TerminalCommand } from './resources/terminal-command';\n\n// ============================================================================\n// Base64 Utility Functions\n// ============================================================================\n\n/**\n * Decode base64 to string (cross-platform: browser and Node.js)\n */\nfunction decodeBase64(str: string): string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n // Browser environment\n return window.atob(str);\n } else if (typeof Buffer !== 'undefined') {\n // Node.js environment\n return Buffer.from(str, 'base64').toString('utf-8');\n }\n throw new Error('No base64 decoding available');\n}\n\n/**\n * Terminal event handlers\n */\nexport type TerminalEventHandler = {\n output: (data: string) => void;\n error: (error: string) => void;\n destroyed: () => void;\n};\n\n/**\n * TerminalInstance - A connected terminal session with WebSocket support\n *\n * This is the object returned by sandbox.terminal.create()\n *\n * @example\n * ```typescript\n * // PTY mode - Interactive shell\n * const pty = await sandbox.terminal.create({ pty: true });\n * pty.on('output', (data) => console.log(data));\n * pty.write('ls -la\\n');\n * await pty.destroy();\n *\n * // Exec mode - Command tracking\n * const exec = await sandbox.terminal.create({ pty: false });\n * const cmd = await exec.command.run('npm test');\n * console.log(cmd.exitCode);\n *\n * // Background execution with wait\n * const cmd = await exec.command.run('npm install', { background: true });\n * await cmd.wait();\n * console.log(cmd.stdout);\n * ```\n */\nexport class TerminalInstance {\n private _id: string;\n private _pty: boolean;\n private _status: 'running' | 'stopped' | 'active' | 'ready';\n private _channel: string | null;\n private _ws: WebSocketManager | null;\n private _encoding: 'raw' | 'base64';\n private _eventHandlers: Map<keyof TerminalEventHandler, Set<Function>> = new Map();\n\n /**\n * Command namespace for exec mode terminals\n */\n readonly command: TerminalCommand;\n\n // Handlers set by the Sandbox\n private _executeHandler?: (command: string, background?: boolean) => Promise<CommandExecutionResponse>;\n private _listCommandsHandler?: () => Promise<CommandsListResponse>;\n private _retrieveCommandHandler?: (cmdId: string) => Promise<CommandDetailsResponse>;\n private _waitCommandHandler?: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>;\n private _destroyHandler?: () => Promise<void>;\n\n constructor(\n id: string,\n pty: boolean,\n status: 'running' | 'stopped' | 'active' | 'ready',\n channel: string | null,\n ws: WebSocketManager | null,\n encoding: 'raw' | 'base64' = 'raw'\n ) {\n this._id = id;\n this._pty = pty;\n // Normalize 'active' to 'running' for consistency\n this._status = status === 'active' ? 'running' : status;\n this._channel = channel;\n this._ws = ws;\n this._encoding = encoding;\n\n // Initialize command namespace with handlers\n this.command = new TerminalCommand(id, {\n run: async (command: string, background?: boolean) => {\n if (!this._executeHandler) {\n throw new Error('Execute handler not set');\n }\n return this._executeHandler(command, background);\n },\n list: async () => {\n if (!this._listCommandsHandler) {\n throw new Error('List commands handler not set');\n }\n return this._listCommandsHandler();\n },\n retrieve: async (cmdId: string) => {\n if (!this._retrieveCommandHandler) {\n throw new Error('Retrieve command handler not set');\n }\n return this._retrieveCommandHandler(cmdId);\n },\n wait: async (cmdId: string, timeout?: number) => {\n if (!this._waitCommandHandler) {\n throw new Error('Wait command handler not set');\n }\n return this._waitCommandHandler(cmdId, timeout);\n },\n });\n\n // Only subscribe to WebSocket channel for PTY mode\n if (this._pty && this._ws && this._channel) {\n this._ws.subscribe(this._channel);\n // Set up WebSocket event handlers\n this.setupWebSocketHandlers();\n }\n }\n\n /**\n * Set up WebSocket event handlers (PTY mode only)\n */\n private setupWebSocketHandlers(): void {\n if (!this._ws || !this._channel) {\n return; // No WebSocket in exec mode\n }\n\n // Handle terminal output (decode based on encoding field)\n this._ws.on('terminal:output', (msg: TerminalOutputMessage) => {\n if (msg.channel === this._channel) {\n const encoding = msg.data.encoding || this._encoding;\n const output = encoding === 'base64'\n ? decodeBase64(msg.data.output)\n : msg.data.output;\n this.emit('output', output);\n }\n });\n\n // Handle terminal errors\n this._ws.on('terminal:error', (msg: TerminalErrorMessage) => {\n if (msg.channel === this._channel) {\n this.emit('error', msg.data.error);\n }\n });\n\n // Handle terminal destroyed\n this._ws.on('terminal:destroyed', (msg: TerminalDestroyedMessage) => {\n if (msg.channel === this._channel) {\n this._status = 'stopped';\n this.emit('destroyed');\n this.cleanup();\n }\n });\n }\n\n /**\n * Terminal ID\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Get terminal ID (deprecated, use .id property)\n * @deprecated Use .id property instead\n */\n getId(): string {\n return this._id;\n }\n\n /**\n * Terminal status\n */\n get status(): 'running' | 'stopped' | 'active' | 'ready' {\n return this._status;\n }\n\n /**\n * Get terminal status (deprecated, use .status property)\n * @deprecated Use .status property instead\n */\n getStatus(): 'running' | 'stopped' | 'active' | 'ready' {\n return this._status;\n }\n\n /**\n * Terminal channel (null for exec mode)\n */\n get channel(): string | null {\n return this._channel;\n }\n\n /**\n * Get terminal channel (deprecated, use .channel property)\n * @deprecated Use .channel property instead\n */\n getChannel(): string | null {\n return this._channel;\n }\n\n /**\n * Whether this is a PTY terminal\n */\n get pty(): boolean {\n return this._pty;\n }\n\n /**\n * Get terminal PTY mode (deprecated, use .pty property)\n * @deprecated Use .pty property instead\n */\n isPTY(): boolean {\n return this._pty;\n }\n\n /**\n * Check if terminal is running\n */\n isRunning(): boolean {\n return this._status === 'running';\n }\n\n /**\n * Write input to the terminal (PTY mode only)\n */\n write(input: string): void {\n if (!this._pty) {\n throw new Error('write() is only available for PTY terminals. Use commands.run() for exec mode terminals.');\n }\n if (!this._ws) {\n throw new Error('WebSocket not available');\n }\n if (!this.isRunning()) {\n console.warn('[Terminal] Warning: Terminal status is not \"running\", but attempting to write anyway. Status:', this._status);\n }\n this._ws.sendTerminalInput(this._id, input);\n }\n\n /**\n * Resize terminal window (PTY mode only)\n */\n resize(cols: number, rows: number): void {\n if (!this._pty) {\n throw new Error('resize() is only available for PTY terminals');\n }\n if (!this._ws) {\n throw new Error('WebSocket not available');\n }\n if (!this.isRunning()) {\n throw new Error('Terminal is not running');\n }\n this._ws.resizeTerminal(this._id, cols, rows);\n }\n\n /**\n * Set execute command handler (called by Sandbox)\n * @internal\n */\n setExecuteHandler(handler: (command: string, background?: boolean) => Promise<CommandExecutionResponse>): void {\n this._executeHandler = handler;\n }\n\n /**\n * Set list commands handler (called by Sandbox)\n * @internal\n */\n setListCommandsHandler(handler: () => Promise<CommandsListResponse>): void {\n this._listCommandsHandler = handler;\n }\n\n /**\n * Set retrieve command handler (called by Sandbox)\n * @internal\n */\n setRetrieveCommandHandler(handler: (cmdId: string) => Promise<CommandDetailsResponse>): void {\n this._retrieveCommandHandler = handler;\n }\n\n /**\n * Set wait command handler (called by Sandbox)\n * @internal\n */\n setWaitCommandHandler(handler: (cmdId: string, timeout?: number) => Promise<CommandDetailsResponse>): void {\n this._waitCommandHandler = handler;\n }\n\n /**\n * Set destroy handler (called by Sandbox)\n * @internal\n */\n setDestroyHandler(handler: () => Promise<void>): void {\n this._destroyHandler = handler;\n }\n\n /**\n * Execute a command in the terminal (deprecated, use command.run())\n * @deprecated Use terminal.command.run() instead\n */\n async execute(command: string, options?: { background?: boolean }): Promise<CommandExecutionResponse> {\n if (!this._executeHandler) {\n throw new Error('Execute handler not set');\n }\n return this._executeHandler(command, options?.background);\n }\n\n /**\n * Destroy the terminal\n */\n async destroy(): Promise<void> {\n if (!this._destroyHandler) {\n throw new Error('Destroy handler not set');\n }\n await this._destroyHandler();\n this.cleanup();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n // Unsubscribe from channel (PTY mode only)\n if (this._ws && this._channel) {\n this._ws.unsubscribe(this._channel);\n }\n\n // Clear event handlers\n this._eventHandlers.clear();\n }\n\n /**\n * Register event handler\n */\n on<K extends keyof TerminalEventHandler>(\n event: K,\n handler: TerminalEventHandler[K]\n ): void {\n if (!this._eventHandlers.has(event)) {\n this._eventHandlers.set(event, new Set());\n }\n this._eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off<K extends keyof TerminalEventHandler>(\n event: K,\n handler: TerminalEventHandler[K]\n ): void {\n const handlers = this._eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this._eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit<K extends keyof TerminalEventHandler>(\n event: K,\n ...args: Parameters<TerminalEventHandler[K]>\n ): void {\n const handlers = this._eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n (handler as any)(...args);\n } catch (error) {\n console.error('Error in terminal event handler:', error);\n }\n });\n }\n }\n}\n","/**\n * FileWatcher class for monitoring file system changes with WebSocket integration\n */\n\nimport type { WebSocketManager } from './websocket';\nimport type {\n FileChangedMessage,\n WatcherDestroyedMessage,\n} from './websocket';\n\n// ============================================================================\n// Base64 Utility Functions\n// ============================================================================\n\n/**\n * Decode base64 to string (cross-platform: browser and Node.js)\n */\nfunction decodeBase64(str: string): string {\n if (typeof window !== 'undefined' && typeof window.atob === 'function') {\n // Browser environment\n return window.atob(str);\n } else if (typeof Buffer !== 'undefined') {\n // Node.js environment\n return Buffer.from(str, 'base64').toString('utf-8');\n }\n throw new Error('No base64 decoding available');\n}\n\n/**\n * File change event data\n */\nexport interface FileChangeEvent {\n event: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir';\n path: string;\n content?: string;\n}\n\n/**\n * FileWatcher event handlers\n */\nexport type FileWatcherEventHandler = {\n change: (event: FileChangeEvent) => void;\n destroyed: () => void;\n};\n\n/**\n * FileWatcher class for monitoring file system changes\n *\n * @example\n * ```typescript\n * const client = new ComputeClient({ sandboxUrl: '...' });\n * await client.generateToken();\n *\n * const watcher = await client.createWatcher('/home/project', {\n * ignored: ['node_modules', '.git']\n * });\n *\n * watcher.on('change', (event) => {\n * console.log(`File ${event.event}: ${event.path}`);\n * });\n *\n * await watcher.destroy();\n * ```\n */\nexport class FileWatcher {\n private id: string;\n private path: string;\n private status: 'active' | 'stopped';\n private channel: string;\n private includeContent: boolean;\n private ignored: string[];\n private encoding: 'raw' | 'base64';\n private ws: WebSocketManager;\n private eventHandlers: Map<keyof FileWatcherEventHandler, Set<Function>> = new Map();\n\n constructor(\n id: string,\n path: string,\n status: 'active' | 'stopped',\n channel: string,\n includeContent: boolean,\n ignored: string[],\n ws: WebSocketManager,\n encoding: 'raw' | 'base64' = 'raw'\n ) {\n this.id = id;\n this.path = path;\n this.status = status;\n this.channel = channel;\n this.includeContent = includeContent;\n this.ignored = ignored;\n this.encoding = encoding;\n this.ws = ws;\n\n // Subscribe to watcher channel\n this.ws.subscribe(this.channel);\n\n // Set up WebSocket event handlers\n this.setupWebSocketHandlers();\n }\n\n /**\n * Set up WebSocket event handlers\n */\n private setupWebSocketHandlers(): void {\n // Handle file changes (decode content based on encoding field)\n this.ws.on('file:changed', (msg: FileChangedMessage) => {\n if (msg.channel === this.channel) {\n const encoding = msg.data.encoding || this.encoding;\n const content = msg.data.content && encoding === 'base64'\n ? decodeBase64(msg.data.content)\n : msg.data.content;\n\n this.emit('change', {\n event: msg.data.event,\n path: msg.data.path,\n content: content,\n });\n }\n });\n\n // Handle watcher destroyed\n this.ws.on('watcher:destroyed', (msg: WatcherDestroyedMessage) => {\n if (msg.channel === this.channel) {\n this.status = 'stopped';\n this.emit('destroyed');\n this.cleanup();\n }\n });\n }\n\n /**\n * Get watcher ID\n */\n getId(): string {\n return this.id;\n }\n\n /**\n * Get watched path\n */\n getPath(): string {\n return this.path;\n }\n\n /**\n * Get watcher status\n */\n getStatus(): 'active' | 'stopped' {\n return this.status;\n }\n\n /**\n * Get watcher channel\n */\n getChannel(): string {\n return this.channel;\n }\n\n /**\n * Check if content is included in events\n */\n isIncludingContent(): boolean {\n return this.includeContent;\n }\n\n /**\n * Get ignored patterns\n */\n getIgnoredPatterns(): string[] {\n return [...this.ignored];\n }\n\n /**\n * Check if watcher is active\n */\n isActive(): boolean {\n return this.status === 'active';\n }\n\n /**\n * Destroy the watcher (uses REST API, not WebSocket)\n */\n private destroyWatcher?: () => Promise<void>;\n\n /**\n * Set destroy handler (called by client)\n */\n setDestroyHandler(handler: () => Promise<void>): void {\n this.destroyWatcher = handler;\n }\n\n /**\n * Destroy the watcher\n */\n async destroy(): Promise<void> {\n if (!this.destroyWatcher) {\n throw new Error('Destroy handler not set');\n }\n await this.destroyWatcher();\n this.cleanup();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n // Unsubscribe from channel\n this.ws.unsubscribe(this.channel);\n\n // Clear event handlers\n this.eventHandlers.clear();\n }\n\n /**\n * Register event handler\n */\n on<K extends keyof FileWatcherEventHandler>(\n event: K,\n handler: FileWatcherEventHandler[K]\n ): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off<K extends keyof FileWatcherEventHandler>(\n event: K,\n handler: FileWatcherEventHandler[K]\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit<K extends keyof FileWatcherEventHandler>(\n event: K,\n ...args: Parameters<FileWatcherEventHandler[K]>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n (handler as any)(...args);\n } catch (error) {\n console.error('Error in file watcher event handler:', error);\n }\n });\n }\n }\n}\n","/**\n * SignalService class for monitoring system signals with WebSocket integration\n */\n\nimport type { WebSocketManager } from './websocket';\nimport type { SignalMessage } from './websocket';\n\n/**\n * Port signal data\n */\nexport interface PortSignalEvent {\n signal: 'port' | 'server-ready';\n port: number;\n url: string;\n type?: 'open' | 'close';\n}\n\n/**\n * Error signal data\n */\nexport interface ErrorSignalEvent {\n signal: 'error';\n message: string;\n}\n\n/**\n * Generic signal event (union type)\n */\nexport type SignalEvent = PortSignalEvent | ErrorSignalEvent;\n\n/**\n * SignalService event handlers\n */\nexport type SignalServiceEventHandler = {\n port: (event: PortSignalEvent) => void;\n error: (event: ErrorSignalEvent) => void;\n signal: (event: SignalEvent) => void;\n};\n\n/**\n * SignalService class for monitoring system signals and events\n *\n * @example\n * ```typescript\n * const client = new ComputeClient({ sandboxUrl: '...' });\n * await client.generateToken();\n *\n * const signals = await client.startSignals();\n *\n * signals.on('port', (event) => {\n * console.log(`Port ${event.port} ${event.type}: ${event.url}`);\n * });\n *\n * signals.on('error', (event) => {\n * console.error(`Error: ${event.message}`);\n * });\n *\n * await signals.stop();\n * ```\n */\nexport class SignalService {\n private status: 'active' | 'stopped';\n private channel: string;\n private ws: WebSocketManager;\n private eventHandlers: Map<keyof SignalServiceEventHandler, Set<Function>> = new Map();\n\n constructor(\n status: 'active' | 'stopped',\n channel: string,\n ws: WebSocketManager\n ) {\n this.status = status;\n this.channel = channel;\n this.ws = ws;\n\n // Subscribe to signals channel\n this.ws.subscribe(this.channel);\n\n // Set up WebSocket event handlers\n this.setupWebSocketHandlers();\n }\n\n /**\n * Set up WebSocket event handlers\n */\n private setupWebSocketHandlers(): void {\n // Handle signal events\n this.ws.on('signal', (msg: SignalMessage) => {\n if (msg.channel === this.channel) {\n const event: SignalEvent = {\n signal: msg.data.signal,\n ...(msg.data.port && { port: msg.data.port }),\n ...(msg.data.url && { url: msg.data.url }),\n ...(msg.data.message && { message: msg.data.message }),\n } as SignalEvent;\n\n // Emit specific signal type\n if (msg.data.signal === 'port' || msg.data.signal === 'server-ready') {\n this.emit('port', event as PortSignalEvent);\n } else if (msg.data.signal === 'error') {\n this.emit('error', event as ErrorSignalEvent);\n }\n\n // Emit generic signal event\n this.emit('signal', event);\n }\n });\n }\n\n /**\n * Get service status\n */\n getStatus(): 'active' | 'stopped' {\n return this.status;\n }\n\n /**\n * Get service channel\n */\n getChannel(): string {\n return this.channel;\n }\n\n /**\n * Check if service is active\n */\n isActive(): boolean {\n return this.status === 'active';\n }\n\n /**\n * Stop the signal service (uses REST API, not WebSocket)\n */\n private stopService?: () => Promise<void>;\n\n /**\n * Set stop handler (called by client)\n */\n setStopHandler(handler: () => Promise<void>): void {\n this.stopService = handler;\n }\n\n /**\n * Stop the signal service\n */\n async stop(): Promise<void> {\n if (!this.stopService) {\n throw new Error('Stop handler not set');\n }\n await this.stopService();\n this.cleanup();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n this.status = 'stopped';\n\n // Unsubscribe from channel\n this.ws.unsubscribe(this.channel);\n\n // Clear event handlers\n this.eventHandlers.clear();\n }\n\n /**\n * Register event handler\n */\n on<K extends keyof SignalServiceEventHandler>(\n event: K,\n handler: SignalServiceEventHandler[K]\n ): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n }\n\n /**\n * Unregister event handler\n */\n off<K extends keyof SignalServiceEventHandler>(\n event: K,\n handler: SignalServiceEventHandler[K]\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(event);\n }\n }\n }\n\n /**\n * Emit event to registered handlers\n */\n private emit<K extends keyof SignalServiceEventHandler>(\n event: K,\n ...args: Parameters<SignalServiceEventHandler[K]>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n (handler as any)(...args);\n } catch (error) {\n console.error('Error in signal service event handler:', error);\n }\n });\n }\n }\n}\n","/**\n * ComputeSDK Client - Universal Sandbox Implementation\n *\n * This package provides a Sandbox for interacting with ComputeSDK sandboxes\n * through API endpoints at ${sandboxId}.sandbox.computesdk.com\n *\n * Works in browser, Node.js, and edge runtimes.\n * Browser: Uses native WebSocket and fetch\n * Node.js: Pass WebSocket implementation (e.g., 'ws' library)\n */\n\nimport { WebSocketManager } from './websocket';\nimport { TerminalInstance } from './terminal';\nimport { FileWatcher } from './file-watcher';\nimport { SignalService } from './signal-service';\nimport { cmd, escapeArgs, mkdir, test } from '@computesdk/cmd';\nimport type { Command } from '@computesdk/cmd';\n\n// Import resource namespaces\nimport {\n Terminal,\n Server,\n Watcher,\n SessionToken,\n MagicLink,\n Signal,\n File,\n Env,\n Auth,\n Run,\n Child,\n} from './resources';\n\n// Re-export high-level classes and types\nexport { TerminalInstance } from './terminal';\n/** @deprecated Use TerminalInstance instead */\nexport { TerminalInstance as Terminal } from './terminal';\nexport { FileWatcher, type FileChangeEvent } from './file-watcher';\nexport { SignalService, type PortSignalEvent, type ErrorSignalEvent, type SignalEvent } from './signal-service';\nexport { encodeBinaryMessage, decodeBinaryMessage, isBinaryData, blobToArrayBuffer, MessageType } from './protocol';\n\n// Re-export resource types\nexport { Command } from './resources/command';\nexport { TerminalCommand } from './resources/terminal-command';\nexport type { SessionTokenInfo } from './resources/session-token';\nexport type { MagicLinkInfo } from './resources/magic-link';\nexport type { SignalStatusInfo } from './resources/signal';\nexport type { AuthStatusInfo, AuthInfo, AuthEndpointsInfo } from './resources/auth';\nexport type { CodeResult, CommandResult, CodeLanguage, CodeRunOptions, CommandRunOptions } from './resources/run';\n\n// Import universal types\nimport type { \n SandboxFileSystem,\n CodeResult,\n CommandResult,\n Runtime,\n SandboxInfo as UniversalSandboxInfo,\n} from '../types/universal-sandbox';\n\n// Import client-specific types\nimport type {\n SandboxStatus,\n ProviderSandboxInfo,\n FileEntry as ClientFileEntry,\n} from './types';\n\nimport {\n CommandExitError,\n isCommandExitError,\n} from './types';\n\n// Re-export shared types (canonical definitions)\nexport type {\n Runtime,\n SandboxStatus,\n ProviderSandboxInfo,\n SandboxFileSystem,\n};\n\nexport type {\n ClientFileEntry as FileEntry,\n};\n\n// Note: CodeResult and CommandResult are exported from ./resources/run\n\nexport {\n CommandExitError,\n isCommandExitError,\n};\n\n// Import universal Sandbox interface\nimport type { Sandbox as ISandbox } from '../types/universal-sandbox';\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * WebSocket constructor type\n */\nexport type WebSocketConstructor = new (url: string) => WebSocket;\n\n/**\n * Configuration options for creating a Sandbox\n */\nexport interface SandboxConfig {\n /** API endpoint URL (e.g., https://sandbox-123.sandbox.computesdk.com). Optional in browser - can be auto-detected from URL query param or localStorage */\n sandboxUrl?: string;\n /** Sandbox ID */\n sandboxId: string;\n /** Provider name (e.g., 'e2b', 'gateway') */\n provider: string;\n /** Access token or session token for authentication. Optional in browser - can be auto-detected from URL query param or localStorage */\n token?: string;\n /** Optional headers to include with all requests */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** WebSocket implementation (optional, uses global WebSocket if not provided) */\n WebSocket?: WebSocketConstructor;\n /** WebSocket protocol: 'binary' (default, recommended) or 'json' (for debugging) */\n protocol?: 'json' | 'binary';\n /** Optional metadata associated with the sandbox */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Health check response\n */\nexport interface HealthResponse {\n status: string;\n timestamp: string;\n}\n\n/**\n * Server info response\n */\nexport interface InfoResponse {\n message: string;\n data: {\n auth_enabled: boolean;\n main_subdomain: string;\n sandbox_count: number;\n sandbox_url: string;\n version: string;\n };\n}\n\n/**\n * Session token response\n */\nexport interface SessionTokenResponse {\n id: string;\n token: string;\n description?: string;\n createdAt: string;\n expiresAt: string;\n expiresIn: number;\n}\n\n/**\n * Session token list response\n */\nexport interface SessionTokenListResponse {\n message: string;\n data: {\n tokens: Array<{\n id: string;\n description?: string;\n created_at: string;\n expires_at: string;\n last_used_at?: string;\n }>;\n };\n}\n\n/**\n * Magic link response\n */\nexport interface MagicLinkResponse {\n message: string;\n data: {\n magic_url: string;\n expires_at: string;\n redirect_url: string;\n };\n}\n\n/**\n * Authentication status response\n */\nexport interface AuthStatusResponse {\n message: string;\n data: {\n authenticated: boolean;\n token_type?: 'access_token' | 'session_token';\n expires_at?: string;\n };\n}\n\n/**\n * Authentication information response\n */\nexport interface AuthInfoResponse {\n message: string;\n data: {\n message: string;\n instructions: string;\n endpoints: {\n create_session_token: string;\n list_session_tokens: string;\n get_session_token: string;\n revoke_session_token: string;\n create_magic_link: string;\n auth_status: string;\n auth_info: string;\n };\n };\n}\n\n/**\n * File information\n */\nexport interface FileInfo {\n name: string;\n path: string;\n size: number;\n is_dir: boolean;\n modified_at: string;\n}\n\n/**\n * Files list response\n */\nexport interface FilesListResponse {\n message: string;\n data: {\n files: FileInfo[];\n path: string;\n };\n}\n\n/**\n * File response\n */\nexport interface FileResponse {\n message: string;\n data: {\n file: FileInfo;\n content?: string;\n };\n}\n\n/**\n * Terminal response\n */\nexport interface TerminalResponse {\n message: string;\n data: {\n id: string;\n pty: boolean;\n status: 'running' | 'stopped' | 'ready' | 'active';\n channel?: string; // Only present for PTY mode (pty=true)\n ws_url?: string; // Only present for PTY mode (pty=true)\n encoding?: 'raw' | 'base64';\n };\n}\n\n/**\n * Command execution response\n */\nexport interface CommandExecutionResponse {\n message: string;\n data: {\n terminal_id?: string;\n cmd_id?: string; // Present for exec mode commands\n command: string;\n output?: string; // Deprecated: combined stdout+stderr (backward compatibility)\n stdout: string;\n stderr: string;\n exit_code?: number; // May not be present for background commands\n duration_ms?: number; // May not be present for background commands\n status?: 'running' | 'completed' | 'failed'; // Present for exec mode\n pty?: boolean; // Indicates terminal mode\n };\n}\n\n/**\n * Command details response\n */\nexport interface CommandDetailsResponse {\n message: string;\n data: {\n cmd_id: string;\n command: string;\n status: 'running' | 'completed' | 'failed';\n stdout: string;\n stderr: string;\n started_at: string;\n finished_at?: string;\n duration_ms?: number;\n exit_code?: number;\n };\n}\n\n/**\n * Command list item\n */\nexport interface CommandListItem {\n cmd_id: string;\n command: string;\n status: 'running' | 'completed' | 'failed';\n started_at: string;\n finished_at?: string;\n duration_ms?: number;\n exit_code?: number;\n}\n\n/**\n * Commands list response\n */\nexport interface CommandsListResponse {\n message: string;\n data: {\n commands: CommandListItem[];\n count: number;\n };\n}\n\n/**\n * Code execution response (POST /run/code)\n */\nexport interface CodeExecutionResponse {\n data: {\n output: string;\n exit_code: number;\n language: string;\n };\n}\n\n/**\n * Run command response (POST /run/command)\n */\nexport interface RunCommandResponse {\n message: string;\n data: {\n terminal_id?: string;\n cmd_id?: string;\n command: string;\n stdout: string;\n stderr: string;\n exit_code?: number;\n duration_ms?: number;\n status?: 'running' | 'completed' | 'failed';\n };\n}\n\n/**\n * File watcher information\n */\nexport interface WatcherInfo {\n id: string;\n path: string;\n includeContent: boolean;\n ignored: string[];\n status: 'active' | 'stopped';\n channel: string;\n encoding?: 'raw' | 'base64';\n}\n\n/**\n * File watcher response\n */\nexport interface WatcherResponse {\n message: string;\n data: WatcherInfo & {\n ws_url: string;\n };\n}\n\n/**\n * File watchers list response\n */\nexport interface WatchersListResponse {\n message: string;\n data: {\n watchers: WatcherInfo[];\n };\n}\n\n/**\n * Signal service response\n */\nexport interface SignalServiceResponse {\n message: string;\n data: {\n status: 'active' | 'stopped';\n channel: string;\n ws_url: string;\n };\n}\n\n/**\n * Port signal response\n */\nexport interface PortSignalResponse {\n message: string;\n data: {\n port: number;\n type: 'open' | 'close';\n url: string;\n };\n}\n\n/**\n * Generic signal response\n */\nexport interface GenericSignalResponse {\n message: string;\n data: {\n message: string;\n };\n}\n\n/**\n * Sandbox information\n */\nexport interface SandboxInfo {\n subdomain: string;\n directory: string;\n is_main: boolean;\n created_at: string;\n url: string;\n}\n\n/**\n * Sandboxes list response\n */\nexport interface SandboxesListResponse {\n sandboxes: SandboxInfo[];\n}\n\n/**\n * Error response\n */\nexport interface ErrorResponse {\n error: string;\n}\n\n/**\n * Terminal response\n */\nexport interface TerminalResponse {\n message: string;\n data: {\n id: string;\n pty: boolean;\n status: 'running' | 'stopped' | 'ready' | 'active';\n channel?: string; // Only present for PTY mode (pty=true)\n ws_url?: string; // Only present for PTY mode (pty=true)\n encoding?: 'raw' | 'base64';\n };\n}\n\n/**\n * Server status types\n */\nexport type ServerStatus = 'starting' | 'running' | 'ready' | 'failed' | 'stopped';\n\n/**\n * Server information\n */\nexport interface ServerInfo {\n slug: string;\n command: string;\n path: string;\n original_path?: string;\n env_file?: string;\n port?: number;\n url?: string;\n status: ServerStatus;\n pid?: number;\n terminal_id?: string;\n created_at: string;\n updated_at: string;\n}\n\n/**\n * Servers list response\n */\nexport interface ServersListResponse {\n status: string;\n message: string;\n data: {\n servers: ServerInfo[];\n };\n}\n\n/**\n * Server response\n */\nexport interface ServerResponse {\n status: string;\n message: string;\n data: {\n server: ServerInfo;\n };\n}\n\n/**\n * Server stop response\n */\nexport interface ServerStopResponse {\n status: string;\n message: string;\n data: {\n slug: string;\n };\n}\n\n/**\n * Server status update response\n */\nexport interface ServerStatusUpdateResponse {\n status: string;\n message: string;\n data: {\n slug: string;\n status: ServerStatus;\n };\n}\n\n/**\n * Environment variables response\n */\nexport interface EnvGetResponse {\n status: string;\n message: string;\n data: {\n file: string;\n variables: Record<string, string>;\n };\n}\n\n/**\n * Environment set response\n */\nexport interface EnvSetResponse {\n status: string;\n message: string;\n data: {\n file: string;\n keys: string[];\n };\n}\n\n/**\n * Environment delete response\n */\nexport interface EnvDeleteResponse {\n status: string;\n message: string;\n data: {\n file: string;\n keys: string[];\n };\n}\n\n/**\n * Batch file operation type\n */\nexport type BatchFileOperation = 'write' | 'delete';\n\n/**\n * Batch file operation request\n */\nexport interface BatchFileRequest {\n path: string;\n operation: BatchFileOperation;\n content?: string;\n}\n\n/**\n * Batch file operation result\n */\nexport interface BatchWriteResult {\n path: string;\n success: boolean;\n error?: string;\n file?: FileInfo;\n}\n\n/**\n * Batch file operation response\n */\nexport interface BatchWriteResponse {\n message: string;\n data: {\n results: BatchWriteResult[];\n };\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\n/**\n * Sandbox - Full-featured gateway sandbox implementation\n *\n * Provides complete feature set including:\n * - Interactive terminals (PTY and exec modes)\n * - Managed servers\n * - File watchers with real-time events\n * - Authentication (session tokens, magic links)\n * - Environment management\n * - Signal service for port/error events\n * - Child sandbox creation\n *\n * This is the most feature-rich implementation available.\n *\n * @example\n * ```typescript\n * import { Sandbox } from 'computesdk'\n *\n * // Pattern 1: Admin operations (requires access token)\n * const sandbox = new Sandbox({\n * sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com',\n * token: accessToken, // From edge service\n * });\n *\n * // Create session token for delegated operations\n * const sessionToken = await sandbox.createSessionToken({\n * description: 'My Application',\n * expiresIn: 604800, // 7 days\n * });\n *\n * // Pattern 2: Delegated operations (binary protocol by default)\n * const sandbox2 = new Sandbox({\n * sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com',\n * token: sessionToken.data.token,\n * // protocol: 'binary' is the default (50-90% size reduction)\n * });\n *\n * // Execute a one-off command\n * const result = await sandbox.execute({ command: 'ls -la' });\n * console.log(result.data.stdout);\n *\n * // Run code\n * const codeResult = await sandbox.runCode('console.log(\"Hello!\")', 'node');\n *\n * // Work with files\n * const files = await sandbox.listFiles('/home/project');\n * await sandbox.writeFile('/home/project/test.txt', 'Hello, World!');\n * const content = await sandbox.readFile('/home/project/test.txt');\n *\n * // Create a PTY terminal with real-time output (interactive shell)\n * const terminal = await sandbox.createTerminal({ pty: true });\n * terminal.on('output', (data) => console.log(data));\n * terminal.write('ls -la\\n');\n * await terminal.destroy();\n *\n * // Create an exec terminal for command tracking\n * const execTerminal = await sandbox.createTerminal({ pty: false });\n * const result = await execTerminal.execute('npm install', { background: true });\n * const cmd = await sandbox.getCommand(execTerminal.getId(), result.data.cmd_id);\n * console.log(cmd.data.status); // \"running\" | \"completed\" | \"failed\"\n * await execTerminal.destroy();\n *\n * // Watch for file changes\n * const watcher = await sandbox.createWatcher('/home/project', {\n * ignored: ['node_modules', '.git']\n * });\n * watcher.on('change', (event) => {\n * console.log(`${event.event}: ${event.path}`);\n * });\n * await watcher.destroy();\n *\n * // Monitor system signals\n * const signals = await sandbox.startSignals();\n * signals.on('port', (event) => {\n * console.log(`Port ${event.port} opened: ${event.url}`);\n * });\n * await signals.stop();\n *\n * // Clean up\n * await sandbox.disconnect();\n * ```\n */\nexport class Sandbox {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n // Resource namespaces (singular naming convention)\n readonly terminal: Terminal;\n readonly run: Run;\n readonly server: Server;\n readonly watcher: Watcher;\n readonly sessionToken: SessionToken;\n readonly magicLink: MagicLink;\n readonly signal: Signal;\n readonly file: File;\n readonly env: Env;\n readonly auth: Auth;\n readonly child: Child;\n\n private config: Required<Omit<SandboxConfig, 'WebSocket' | 'metadata'>> & { metadata?: Record<string, unknown> };\n private _token: string | null = null;\n private _ws: WebSocketManager | null = null;\n private WebSocketImpl: WebSocketConstructor;\n\n constructor(config: SandboxConfig) {\n this.sandboxId = config.sandboxId;\n this.provider = config.provider;\n\n // Auto-detect sandbox_url and session_token from URL/localStorage in browser environments\n let sandboxUrlResolved = config.sandboxUrl;\n let tokenFromUrl: string | null = null;\n let sandboxUrlFromUrl: string | null = null;\n\n if (typeof window !== 'undefined' && window.location && typeof localStorage !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n\n // Check URL parameters\n tokenFromUrl = params.get('session_token');\n sandboxUrlFromUrl = params.get('sandbox_url');\n\n // Clean up URL if any params were found\n let urlChanged = false;\n if (tokenFromUrl) {\n params.delete('session_token');\n localStorage.setItem('session_token', tokenFromUrl);\n urlChanged = true;\n }\n if (sandboxUrlFromUrl) {\n params.delete('sandbox_url');\n localStorage.setItem('sandbox_url', sandboxUrlFromUrl);\n urlChanged = true;\n }\n\n if (urlChanged) {\n const search = params.toString() ? `?${params.toString()}` : '';\n const newUrl = `${window.location.pathname}${search}${window.location.hash}`;\n window.history.replaceState({}, '', newUrl);\n }\n\n // Resolve sandboxUrl: config > URL > localStorage\n if (!config.sandboxUrl) {\n sandboxUrlResolved = sandboxUrlFromUrl || localStorage.getItem('sandbox_url') || '';\n }\n }\n\n this.config = {\n sandboxUrl: (sandboxUrlResolved || '').replace(/\\/$/, ''), // Remove trailing slash\n sandboxId: config.sandboxId || '',\n provider: config.provider || '',\n token: config.token || '',\n headers: config.headers || {},\n timeout: config.timeout || 30000,\n protocol: config.protocol || 'binary',\n metadata: config.metadata,\n };\n\n // Use provided WebSocket or fall back to global\n this.WebSocketImpl = config.WebSocket || (globalThis.WebSocket as any);\n\n if (!this.WebSocketImpl) {\n throw new Error(\n 'WebSocket is not available. In Node.js, pass WebSocket implementation:\\n' +\n 'import WebSocket from \"ws\";\\n' +\n 'new Sandbox({ sandboxUrl: \"...\", WebSocket })'\n );\n }\n\n // Priority for token: config.token > URL > localStorage\n if (config.token) {\n this._token = config.token;\n } else if (tokenFromUrl) {\n this._token = tokenFromUrl;\n } else if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n this._token = localStorage.getItem('session_token');\n }\n\n // Initialize filesystem interface\n this.filesystem = {\n readFile: async (path: string) => this.readFile(path),\n writeFile: async (path: string, content: string) => {\n await this.writeFile(path, content);\n },\n mkdir: async (path: string) => {\n await this.runCommand(mkdir(path));\n },\n readdir: async (path: string) => {\n const response = await this.listFiles(path);\n // Convert to universal FileEntry format\n return response.data.files.map(f => ({\n name: f.name,\n type: (f.is_dir ? 'directory' : 'file') as 'directory' | 'file',\n size: f.size,\n modified: new Date(f.modified_at)\n }));\n },\n exists: async (path: string) => {\n const result = await this.runCommand(test.exists(path));\n return result.exitCode === 0;\n },\n remove: async (path: string) => {\n await this.deleteFile(path);\n }\n };\n\n // Initialize resource namespaces (singular naming convention)\n this.terminal = new Terminal({\n create: async (options) => this.createTerminal(options),\n list: async () => this.listTerminals(),\n retrieve: async (id) => this.getTerminal(id),\n destroy: async (id) => {\n await this.request<void>(`/terminals/${id}`, { method: 'DELETE' });\n },\n });\n\n this.run = new Run({\n code: async (code, options) => {\n const result = await this.runCodeRequest(code, options?.language);\n return {\n output: result.data.output,\n exitCode: result.data.exit_code,\n language: result.data.language,\n };\n },\n command: async (command, options) => {\n const result = await this.runCommandRequest({ command, shell: options?.shell, background: options?.background });\n return {\n stdout: result.data.stdout,\n stderr: result.data.stderr,\n exitCode: result.data.exit_code ?? 0,\n durationMs: result.data.duration_ms ?? 0,\n };\n },\n });\n\n this.server = new Server({\n start: async (options) => this.startServer(options),\n list: async () => this.listServers(),\n retrieve: async (slug) => this.getServer(slug),\n stop: async (slug) => { await this.stopServer(slug); },\n restart: async (slug) => this.restartServer(slug),\n updateStatus: async (slug, status) => { await this.updateServerStatus(slug, status); },\n });\n\n this.watcher = new Watcher({\n create: async (path, options) => this.createWatcher(path, options),\n list: async () => this.listWatchers(),\n retrieve: async (id) => this.getWatcher(id),\n destroy: async (id) => {\n await this.request<void>(`/watchers/${id}`, { method: 'DELETE' });\n },\n });\n\n this.sessionToken = new SessionToken({\n create: async (options) => this.createSessionToken(options),\n list: async () => this.listSessionTokens(),\n retrieve: async (id) => this.getSessionToken(id),\n revoke: async (id) => this.revokeSessionToken(id),\n });\n\n this.magicLink = new MagicLink({\n create: async (options) => this.createMagicLink(options),\n });\n\n this.signal = new Signal({\n start: async () => this.startSignals(),\n status: async () => this.getSignalStatus(),\n stop: async () => {\n await this.request<void>('/signals/stop', { method: 'POST' });\n },\n emitPort: async (port, type, url) => this.emitPortSignal(port, type, url),\n emitError: async (message) => this.emitErrorSignal(message),\n emitServerReady: async (port, url) => this.emitServerReadySignal(port, url),\n });\n\n this.file = new File({\n create: async (path, content) => this.createFile(path, content),\n list: async (path) => this.listFiles(path),\n retrieve: async (path) => this.readFile(path),\n destroy: async (path) => this.deleteFile(path),\n batchWrite: async (files) => this.batchWriteFiles(files),\n exists: async (path) => this.checkFileExists(path),\n });\n\n this.env = new Env({\n retrieve: async (file) => this.getEnv(file),\n update: async (file, variables) => this.setEnv(file, variables),\n remove: async (file, keys) => this.deleteEnv(file, keys),\n exists: async (file) => this.checkEnvFile(file),\n });\n\n this.auth = new Auth({\n status: async () => this.getAuthStatus(),\n info: async () => this.getAuthInfo(),\n });\n\n this.child = new Child({\n create: async () => this.createSandbox(),\n list: async () => this.listSandboxes(),\n retrieve: async (subdomain) => this.getSandbox(subdomain),\n destroy: async (subdomain, deleteFiles) => this.deleteSandbox(subdomain, deleteFiles),\n });\n }\n\n /**\n * Get or create internal WebSocket manager\n */\n private async ensureWebSocket(): Promise<WebSocketManager> {\n if (!this._ws || this._ws.getState() === 'closed') {\n this._ws = new WebSocketManager({\n url: this.getWebSocketUrl(),\n WebSocket: this.WebSocketImpl,\n autoReconnect: true,\n debug: false,\n protocol: this.config.protocol,\n });\n await this._ws.connect();\n }\n return this._ws;\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const headers: Record<string, string> = {\n ...this.config.headers,\n };\n\n // Only set Content-Type if there's a body\n if (options.body) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Add authentication if token is available\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n const response = await fetch(`${this.config.sandboxUrl}${endpoint}`, {\n ...options,\n headers: {\n ...headers,\n ...options.headers,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n // Get response text first, then parse JSON with better error handling\n const text = await response.text();\n let data: T;\n try {\n data = JSON.parse(text);\n } catch (jsonError) {\n throw new Error(\n `Failed to parse JSON response from ${endpoint}: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}\\n` +\n `Response body (first 200 chars): ${text.substring(0, 200)}${text.length > 200 ? '...' : ''}`\n );\n }\n\n if (!response.ok) {\n const error = (data as ErrorResponse).error || response.statusText;\n\n // Provide helpful error message for 403 on auth endpoints\n if (response.status === 403 && endpoint.startsWith('/auth/')) {\n if (endpoint.includes('/session_tokens') || endpoint.includes('/magic-links')) {\n throw new Error(\n `Access token required. This operation requires an access token, not a session token.\\n` +\n `API request failed (${response.status}): ${error}`\n );\n }\n }\n\n throw new Error(`API request failed (${response.status}): ${error}`);\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw error;\n }\n }\n\n // ============================================================================\n // Health Check\n // ============================================================================\n\n /**\n * Check service health\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>('/health');\n }\n\n // ============================================================================\n // Authentication\n // ============================================================================\n\n /**\n * Create a session token (requires access token)\n *\n * Session tokens are delegated credentials that can authenticate API requests\n * without exposing your access token. Only access tokens can create session tokens.\n *\n * @param options - Token configuration\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async createSessionToken(options?: {\n description?: string;\n expiresIn?: number; // seconds, default 7 days (604800)\n }): Promise<SessionTokenResponse> {\n return this.request<SessionTokenResponse>('/auth/session_tokens', {\n method: 'POST',\n body: JSON.stringify(options || {}),\n });\n }\n\n /**\n * List all session tokens (requires access token)\n *\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async listSessionTokens(): Promise<SessionTokenListResponse> {\n return this.request<SessionTokenListResponse>('/auth/session_tokens');\n }\n\n /**\n * Get details of a specific session token (requires access token)\n *\n * @param tokenId - The token ID\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async getSessionToken(tokenId: string): Promise<SessionTokenResponse> {\n return this.request<SessionTokenResponse>(`/auth/session_tokens/${tokenId}`);\n }\n\n /**\n * Revoke a session token (requires access token)\n *\n * @param tokenId - The token ID to revoke\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async revokeSessionToken(tokenId: string): Promise<void> {\n return this.request<void>(`/auth/session_tokens/${tokenId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Generate a magic link for browser authentication (requires access token)\n *\n * Magic links are one-time URLs that automatically create a session token\n * and set it as a cookie in the user's browser. This provides an easy way\n * to authenticate users in browser-based applications.\n *\n * The generated link:\n * - Expires after 5 minutes or first use (whichever comes first)\n * - Automatically creates a new session token (7 day expiry)\n * - Sets the session token as an HttpOnly cookie\n * - Redirects to the specified URL\n *\n * @param options - Magic link configuration\n * @throws {Error} 403 Forbidden if called with a session token\n */\n async createMagicLink(options?: {\n redirectUrl?: string; // default: /play/\n }): Promise<MagicLinkResponse> {\n return this.request<MagicLinkResponse>('/auth/magic-links', {\n method: 'POST',\n body: JSON.stringify(options || {}),\n });\n }\n\n /**\n * Check authentication status\n * Does not require authentication\n */\n async getAuthStatus(): Promise<AuthStatusResponse> {\n return this.request<AuthStatusResponse>('/auth/status');\n }\n\n /**\n * Get authentication information and usage instructions\n * Does not require authentication\n */\n async getAuthInfo(): Promise<AuthInfoResponse> {\n return this.request<AuthInfoResponse>('/auth/info');\n }\n\n /**\n * Set authentication token manually\n * @param token - Access token or session token\n */\n setToken(token: string): void {\n this._token = token;\n }\n\n /**\n * Get current authentication token\n */\n getToken(): string | null {\n return this._token;\n }\n\n /**\n * Get current sandbox URL\n */\n getSandboxUrl(): string {\n return this.config.sandboxUrl;\n }\n\n // ============================================================================\n // Command Execution\n // ============================================================================\n\n /**\n * Execute a one-off command without creating a persistent terminal\n * \n * @example\n * ```typescript\n * // Synchronous execution (waits for completion)\n * const result = await sandbox.execute({ command: 'npm test' });\n * console.log(result.data.exit_code);\n * \n * // Background execution (returns immediately)\n * const result = await sandbox.execute({ \n * command: 'npm install',\n * background: true \n * });\n * // Use result.data.terminal_id and result.data.cmd_id to track\n * const cmd = await sandbox.getCommand(result.data.terminal_id!, result.data.cmd_id!);\n * ```\n */\n async execute(options: {\n command: string;\n shell?: string;\n background?: boolean;\n }): Promise<CommandExecutionResponse> {\n return this.request<CommandExecutionResponse>('/execute', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Execute code with automatic language detection (POST /run/code)\n *\n * @param code - The code to execute\n * @param language - Programming language (optional - auto-detects if not specified)\n * @returns Code execution result with output, exit code, and detected language\n *\n * @example\n * ```typescript\n * // Auto-detect language\n * const result = await sandbox.runCodeRequest('print(\"Hello\")');\n * console.log(result.data.output); // \"Hello\\n\"\n * console.log(result.data.language); // \"python\"\n *\n * // Explicit language\n * const result = await sandbox.runCodeRequest('console.log(\"Hi\")', 'node');\n * ```\n */\n async runCodeRequest(code: string, language?: string): Promise<CodeExecutionResponse> {\n const body: { code: string; language?: string } = { code };\n if (language) {\n body.language = language;\n }\n return this.request<CodeExecutionResponse>('/run/code', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Execute a shell command (POST /run/command)\n *\n * @param options - Command options\n * @param options.command - The command to execute\n * @param options.shell - Shell to use (optional)\n * @param options.background - Run in background (optional)\n * @returns Command execution result\n *\n * @example\n * ```typescript\n * const result = await sandbox.runCommandRequest({ command: 'ls -la' });\n * console.log(result.data.stdout);\n * ```\n */\n async runCommandRequest(options: {\n command: string;\n shell?: string;\n background?: boolean;\n }): Promise<RunCommandResponse> {\n return this.request<RunCommandResponse>('/run/command', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n // ============================================================================\n // File Operations\n // ============================================================================\n\n /**\n * List files at the specified path\n */\n async listFiles(path: string = '/'): Promise<FilesListResponse> {\n const params = new URLSearchParams({ path });\n return this.request<FilesListResponse>(`/files?${params}`);\n }\n\n /**\n * Create a new file with optional content\n */\n async createFile(path: string, content?: string): Promise<FileResponse> {\n return this.request<FileResponse>('/files', {\n method: 'POST',\n body: JSON.stringify({ path, content }),\n });\n }\n\n /**\n * Get file metadata (without content)\n */\n async getFile(path: string): Promise<FileResponse> {\n return this.request<FileResponse>(`/files/${encodeURIComponent(path)}`);\n }\n\n /**\n * Read file content\n */\n async readFile(path: string): Promise<string> {\n const params = new URLSearchParams({ content: 'true' });\n // Encode each path segment separately to handle special characters in filenames\n // while preserving forward slashes as path separators\n const pathWithoutLeadingSlash = path.startsWith('/') ? path.slice(1) : path;\n const segments = pathWithoutLeadingSlash.split('/');\n const encodedPath = segments.map(s => encodeURIComponent(s)).join('/');\n const response = await this.request<FileResponse>(\n `/files/${encodedPath}?${params}`\n );\n return response.data.content || '';\n }\n\n /**\n * Write file content (creates or updates)\n */\n async writeFile(path: string, content: string): Promise<FileResponse> {\n return this.request<FileResponse>('/files', {\n method: 'POST',\n body: JSON.stringify({ path, content }),\n });\n }\n\n /**\n * Delete a file or directory\n */\n async deleteFile(path: string): Promise<void> {\n return this.request<void>(`/files/${encodeURIComponent(path)}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Check if a file exists (HEAD request)\n * @returns true if file exists, false otherwise\n */\n async checkFileExists(path: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n };\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n const response = await fetch(\n `${this.config.sandboxUrl}/files/${encodeURIComponent(path)}`,\n {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n }\n );\n\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Batch file operations (write or delete multiple files)\n *\n * Features:\n * - Deduplication: Last operation wins per path\n * - File locking: Prevents race conditions\n * - Deterministic ordering: Alphabetical path sorting\n * - Partial failure handling: Returns 207 Multi-Status with per-file results\n *\n * @param files - Array of file operations\n * @returns Results for each file operation\n *\n * @example\n * ```typescript\n * // Write multiple files\n * const results = await sandbox.batchWriteFiles([\n * { path: '/app/file1.txt', operation: 'write', content: 'Hello' },\n * { path: '/app/file2.txt', operation: 'write', content: 'World' },\n * ]);\n *\n * // Mixed operations (write and delete)\n * const results = await sandbox.batchWriteFiles([\n * { path: '/app/new.txt', operation: 'write', content: 'New file' },\n * { path: '/app/old.txt', operation: 'delete' },\n * ]);\n * ```\n */\n async batchWriteFiles(\n files: Array<{ path: string; operation: 'write' | 'delete'; content?: string }>\n ): Promise<BatchWriteResponse> {\n return this.request<BatchWriteResponse>('/files/batch', {\n method: 'POST',\n body: JSON.stringify({ files }),\n });\n }\n\n // ============================================================================\n // Terminal Management\n // ============================================================================\n\n /**\n * Create a new persistent terminal session\n * \n * Terminal Modes:\n * - **PTY mode** (pty: true): Interactive shell with real-time WebSocket streaming\n * - Use for: Interactive shells, vim/nano, real-time output\n * - Methods: write(), resize(), on('output')\n * \n * - **Exec mode** (pty: false, default): Command tracking with HTTP polling\n * - Use for: CI/CD, automation, command tracking, exit codes\n * - Methods: execute(), getCommand(), listCommands(), waitForCommand()\n * \n * @example\n * ```typescript\n * // PTY mode - Interactive shell\n * const pty = await sandbox.createTerminal({ pty: true, shell: '/bin/bash' });\n * pty.on('output', (data) => console.log(data));\n * pty.write('npm install\\n');\n * \n * // Exec mode - Command tracking\n * const exec = await sandbox.createTerminal({ pty: false });\n * const result = await exec.execute('npm test', { background: true });\n * const cmd = await sandbox.waitForCommand(exec.getId(), result.data.cmd_id);\n * console.log(cmd.data.exit_code);\n * \n * // Backward compatible - creates PTY terminal\n * const terminal = await sandbox.createTerminal('/bin/bash');\n * ```\n * \n * @param options - Terminal creation options\n * @param options.shell - Shell to use (e.g., '/bin/bash', '/bin/sh') - PTY mode only\n * @param options.encoding - Encoding for terminal I/O: 'raw' (default) or 'base64' (binary-safe)\n * @param options.pty - Terminal mode: true = PTY (interactive shell), false = exec (command tracking, default)\n * @returns Terminal instance with event handling\n */\n async createTerminal(\n shellOrOptions?: string | {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n },\n encoding?: 'raw' | 'base64'\n ): Promise<TerminalInstance> {\n // Backward compatibility: if first arg is string, treat as old signature\n let pty: boolean;\n let shell: string | undefined;\n let enc: 'raw' | 'base64' | undefined;\n\n if (typeof shellOrOptions === 'string') {\n // Old signature: createTerminal(shell?, encoding?)\n // Create PTY terminal for backward compatibility\n pty = true;\n shell = shellOrOptions;\n enc = encoding;\n } else {\n // New signature: createTerminal(options?)\n pty = shellOrOptions?.pty ?? false; // Default to exec mode\n enc = shellOrOptions?.encoding;\n shell = shellOrOptions?.shell;\n }\n\n // Create terminal via REST API\n const body: { shell?: string; encoding?: 'raw' | 'base64'; pty?: boolean } = {};\n if (shell) body.shell = shell;\n if (enc) body.encoding = enc;\n if (pty !== undefined) body.pty = pty;\n\n const response = await this.request<TerminalResponse>('/terminals', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n let ws: WebSocketManager | null = null;\n\n // Only use WebSocket for PTY mode\n if (response.data.pty) {\n ws = await this.ensureWebSocket();\n\n // Wait for terminal:created event to ensure terminal is ready\n await new Promise<void>((resolve) => {\n const handler = (msg: any) => {\n if (msg.data?.id === response.data.id) {\n if (ws) ws.off('terminal:created', handler);\n resolve();\n }\n };\n if (ws) {\n ws.on('terminal:created', handler);\n\n // Timeout after 5 seconds\n setTimeout(() => {\n if (ws) ws.off('terminal:created', handler);\n resolve();\n }, 5000);\n } else {\n resolve();\n }\n });\n }\n\n // Create TerminalInstance\n const terminal = new TerminalInstance(\n response.data.id,\n response.data.pty,\n response.data.status,\n response.data.channel || null,\n ws,\n response.data.encoding || 'raw'\n );\n\n // Set up terminal handlers\n const terminalId = response.data.id;\n\n terminal.setExecuteHandler(async (command: string, background?: boolean) => {\n return this.request<CommandExecutionResponse>(`/terminals/${terminalId}/execute`, {\n method: 'POST',\n body: JSON.stringify({ command, background }),\n });\n });\n\n terminal.setListCommandsHandler(async () => {\n return this.request<CommandsListResponse>(`/terminals/${terminalId}/commands`);\n });\n\n terminal.setRetrieveCommandHandler(async (cmdId: string) => {\n return this.request<CommandDetailsResponse>(`/terminals/${terminalId}/commands/${cmdId}`);\n });\n\n terminal.setWaitCommandHandler(async (cmdId: string, timeout?: number) => {\n const params = timeout ? new URLSearchParams({ timeout: timeout.toString() }) : '';\n const endpoint = `/terminals/${terminalId}/commands/${cmdId}/wait${params ? `?${params}` : ''}`;\n return this.request<CommandDetailsResponse>(endpoint);\n });\n\n terminal.setDestroyHandler(async () => {\n await this.request<void>(`/terminals/${terminalId}`, {\n method: 'DELETE',\n });\n });\n\n return terminal;\n }\n\n /**\n * List all active terminals (fetches from API)\n */\n async listTerminals(): Promise<TerminalResponse[]> {\n const response = await this.request<{ message: string; data: { terminals: TerminalResponse[] } }>('/terminals');\n return response.data.terminals;\n }\n\n /**\n * Get terminal by ID\n */\n async getTerminal(id: string): Promise<TerminalResponse> {\n return this.request<TerminalResponse>(`/terminals/${id}`);\n }\n\n // ============================================================================\n // Command Tracking (Exec Mode Terminals)\n // ============================================================================\n\n /**\n * List all commands executed in a terminal (exec mode only)\n * @param terminalId - The terminal ID\n * @returns List of all commands with their status\n * @throws {Error} If terminal is in PTY mode (command tracking not available)\n */\n async listCommands(terminalId: string): Promise<CommandsListResponse> {\n return this.request<CommandsListResponse>(`/terminals/${terminalId}/commands`);\n }\n\n /**\n * Get details of a specific command execution (exec mode only)\n * @param terminalId - The terminal ID\n * @param cmdId - The command ID\n * @returns Command execution details including stdout, stderr, and exit code\n * @throws {Error} If terminal is in PTY mode or command not found\n */\n async getCommand(terminalId: string, cmdId: string): Promise<CommandDetailsResponse> {\n return this.request<CommandDetailsResponse>(`/terminals/${terminalId}/commands/${cmdId}`);\n }\n\n /**\n * Wait for a command to complete (HTTP long-polling, exec mode only)\n * @param terminalId - The terminal ID\n * @param cmdId - The command ID\n * @param timeout - Optional timeout in seconds (0 = no timeout)\n * @returns Command execution details when completed\n * @throws {Error} If terminal is in PTY mode, command not found, or timeout occurs\n */\n async waitForCommand(\n terminalId: string,\n cmdId: string,\n timeout?: number\n ): Promise<CommandDetailsResponse> {\n const params = timeout ? new URLSearchParams({ timeout: timeout.toString() }) : '';\n const endpoint = `/terminals/${terminalId}/commands/${cmdId}/wait${params ? `?${params}` : ''}`;\n return this.request<CommandDetailsResponse>(endpoint);\n }\n\n // ============================================================================\n // File Watchers\n // ============================================================================\n\n /**\n * Create a new file watcher with WebSocket integration\n * @param path - Path to watch\n * @param options - Watcher options\n * @param options.includeContent - Include file content in change events\n * @param options.ignored - Patterns to ignore\n * @param options.encoding - Encoding for file content: 'raw' (default) or 'base64' (binary-safe)\n * @returns FileWatcher instance with event handling\n */\n async createWatcher(\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ): Promise<FileWatcher> {\n // Ensure WebSocket is connected\n const ws = await this.ensureWebSocket();\n\n // Create watcher via REST API\n const response = await this.request<WatcherResponse>('/watchers', {\n method: 'POST',\n body: JSON.stringify({ path, ...options }),\n });\n\n // Create FileWatcher instance (no cleanup callback needed)\n const watcher = new FileWatcher(\n response.data.id,\n response.data.path,\n response.data.status,\n response.data.channel,\n response.data.includeContent,\n response.data.ignored,\n ws,\n response.data.encoding || 'raw'\n );\n\n // Set up watcher handlers\n watcher.setDestroyHandler(async () => {\n await this.request<void>(`/watchers/${response.data.id}`, {\n method: 'DELETE',\n });\n });\n\n return watcher;\n }\n\n /**\n * List all active file watchers (fetches from API)\n */\n async listWatchers(): Promise<WatchersListResponse> {\n return this.request<WatchersListResponse>('/watchers');\n }\n\n /**\n * Get file watcher by ID\n */\n async getWatcher(id: string): Promise<WatcherResponse> {\n return this.request<WatcherResponse>(`/watchers/${id}`);\n }\n\n // ============================================================================\n // Signal Service\n // ============================================================================\n\n /**\n * Start the signal service with WebSocket integration\n * @returns SignalService instance with event handling\n */\n async startSignals(): Promise<SignalService> {\n // Ensure WebSocket is connected\n const ws = await this.ensureWebSocket();\n\n // Start signal service via REST API\n const response = await this.request<SignalServiceResponse>('/signals/start', {\n method: 'POST',\n });\n\n // Create SignalService instance (no cleanup callback needed)\n const signalService = new SignalService(\n response.data.status,\n response.data.channel,\n ws\n );\n\n // Set up signal service handlers\n signalService.setStopHandler(async () => {\n await this.request<SignalServiceResponse>('/signals/stop', {\n method: 'POST',\n });\n });\n\n return signalService;\n }\n\n /**\n * Get the signal service status (fetches from API)\n */\n async getSignalStatus(): Promise<SignalServiceResponse> {\n return this.request<SignalServiceResponse>('/signals/status');\n }\n\n /**\n * Emit a port signal\n */\n async emitPortSignal(\n port: number,\n type: 'open' | 'close',\n url: string\n ): Promise<PortSignalResponse> {\n return this.request<PortSignalResponse>('/signals/port', {\n method: 'POST',\n body: JSON.stringify({ port, type, url }),\n });\n }\n\n /**\n * Emit a port signal (alternative endpoint using path parameters)\n */\n async emitPortSignalAlt(\n port: number,\n type: 'open' | 'close'\n ): Promise<PortSignalResponse> {\n return this.request<PortSignalResponse>(`/signals/port/${port}/${type}`, {\n method: 'POST',\n });\n }\n\n /**\n * Emit an error signal\n */\n async emitErrorSignal(message: string): Promise<GenericSignalResponse> {\n return this.request<GenericSignalResponse>('/signals/error', {\n method: 'POST',\n body: JSON.stringify({ message }),\n });\n }\n\n /**\n * Emit a server ready signal\n */\n async emitServerReadySignal(\n port: number,\n url: string\n ): Promise<PortSignalResponse> {\n return this.request<PortSignalResponse>('/signals/server-ready', {\n method: 'POST',\n body: JSON.stringify({ port, url }),\n });\n }\n\n // ============================================================================\n // Environment Variables\n // ============================================================================\n\n /**\n * Get environment variables from a .env file\n * @param file - Path to the .env file (relative to sandbox root)\n */\n async getEnv(file: string): Promise<EnvGetResponse> {\n const params = new URLSearchParams({ file });\n return this.request<EnvGetResponse>(`/env?${params}`);\n }\n\n /**\n * Set (merge) environment variables in a .env file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param variables - Key-value pairs to set\n */\n async setEnv(\n file: string,\n variables: Record<string, string>\n ): Promise<EnvSetResponse> {\n const params = new URLSearchParams({ file });\n return this.request<EnvSetResponse>(`/env?${params}`, {\n method: 'POST',\n body: JSON.stringify({ variables }),\n });\n }\n\n /**\n * Delete environment variables from a .env file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param keys - Keys to delete\n */\n async deleteEnv(file: string, keys: string[]): Promise<EnvDeleteResponse> {\n const params = new URLSearchParams({ file });\n return this.request<EnvDeleteResponse>(`/env?${params}`, {\n method: 'DELETE',\n body: JSON.stringify({ keys }),\n });\n }\n\n /**\n * Check if an environment file exists (HEAD request)\n * @param file - Path to the .env file (relative to sandbox root)\n * @returns true if file exists, false otherwise\n */\n async checkEnvFile(file: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n };\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n const params = new URLSearchParams({ file });\n const response = await fetch(`${this.config.sandboxUrl}/env?${params}`, {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n // ============================================================================\n // Server Management\n // ============================================================================\n\n /**\n * List all managed servers\n */\n async listServers(): Promise<ServersListResponse> {\n return this.request<ServersListResponse>('/servers');\n }\n\n /**\n * Start a new managed server\n * @param options - Server configuration\n */\n async startServer(options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }): Promise<ServerResponse> {\n return this.request<ServerResponse>('/servers', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Get information about a specific server\n * @param slug - Server slug\n */\n async getServer(slug: string): Promise<ServerResponse> {\n return this.request<ServerResponse>(`/servers/${encodeURIComponent(slug)}`);\n }\n\n /**\n * Stop a managed server\n * @param slug - Server slug\n */\n async stopServer(slug: string): Promise<ServerStopResponse> {\n return this.request<ServerStopResponse>(\n `/servers/${encodeURIComponent(slug)}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n /**\n * Restart a managed server\n * @param slug - Server slug\n */\n async restartServer(slug: string): Promise<ServerResponse> {\n return this.request<ServerResponse>(\n `/servers/${encodeURIComponent(slug)}/restart`,\n {\n method: 'POST',\n }\n );\n }\n\n /**\n * Update server status (internal use)\n * @param slug - Server slug\n * @param status - New server status\n */\n async updateServerStatus(\n slug: string,\n status: ServerStatus\n ): Promise<ServerStatusUpdateResponse> {\n return this.request<ServerStatusUpdateResponse>(\n `/servers/${encodeURIComponent(slug)}/status`,\n {\n method: 'PATCH',\n body: JSON.stringify({ status }),\n }\n );\n }\n\n // ============================================================================\n // Sandbox Management\n // ============================================================================\n\n /**\n * Create a new sandbox environment\n */\n async createSandbox(): Promise<SandboxInfo> {\n return this.request<SandboxInfo>('/sandboxes', {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n /**\n * List all sandboxes\n */\n async listSandboxes(): Promise<SandboxesListResponse> {\n return this.request<SandboxesListResponse>('/sandboxes');\n }\n\n /**\n * Get sandbox details\n */\n async getSandbox(subdomain: string): Promise<SandboxInfo> {\n return this.request<SandboxInfo>(`/sandboxes/${subdomain}`);\n }\n\n /**\n * Delete a sandbox\n */\n async deleteSandbox(\n subdomain: string,\n deleteFiles: boolean = false\n ): Promise<void> {\n const params = new URLSearchParams({ delete_files: String(deleteFiles) });\n return this.request<void>(`/sandboxes/${subdomain}?${params}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // WebSocket Connection (Internal)\n // ============================================================================\n\n /**\n * Get WebSocket URL for real-time communication\n * @private\n */\n private getWebSocketUrl(): string {\n const wsProtocol = this.config.sandboxUrl.startsWith('https') ? 'wss' : 'ws';\n const url = this.config.sandboxUrl.replace(/^https?:/, `${wsProtocol}:`);\n\n // Build query parameters\n const params = new URLSearchParams();\n if (this._token) {\n params.set('token', this._token);\n }\n // Always send protocol parameter\n params.set('protocol', this.config.protocol || 'binary');\n\n const queryString = params.toString();\n return `${url}/ws${queryString ? `?${queryString}` : ''}`;\n }\n\n // ============================================================================\n // Sandbox Interface Implementation\n // ============================================================================\n\n /**\n * Execute code in the sandbox (convenience method)\n *\n * Delegates to sandbox.run.code() - prefer using that directly for new code.\n *\n * @param code - The code to execute\n * @param language - Programming language (auto-detected if not specified)\n * @returns Code execution result\n */\n async runCode(code: string, language?: 'node' | 'python'): Promise<{\n output: string;\n exitCode: number;\n language: string;\n }> {\n return this.run.code(code, language ? { language } : undefined);\n }\n\n /**\n * Execute shell command in the sandbox (convenience method)\n *\n * Delegates to sandbox.run.command() - prefer using that directly for new code.\n *\n * @param command - The command to execute (string or array form)\n * @param argsOrOptions - Arguments array or options object\n * @param maybeOptions - Options when using (command, args, options) form\n * @returns Command execution result\n */\n async runCommand(\n commandOrArray: string | [string, ...string[]],\n argsOrOptions?: string[] | { background?: boolean; cwd?: string },\n maybeOptions?: { background?: boolean; cwd?: string }\n ): Promise<{\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs: number;\n }> {\n // Parse overloaded arguments\n let commandParts: string[];\n let options: { background?: boolean; cwd?: string } | undefined;\n\n if (Array.isArray(commandOrArray)) {\n // Array form: runCommand(['npm', 'install'], { cwd: '/app' })\n commandParts = commandOrArray;\n options = argsOrOptions as { background?: boolean; cwd?: string } | undefined;\n } else {\n // Traditional form: runCommand('npm', ['install'], { cwd: '/app' })\n const args = Array.isArray(argsOrOptions) ? argsOrOptions : [];\n commandParts = [commandOrArray, ...args];\n options = Array.isArray(argsOrOptions) ? maybeOptions : argsOrOptions as { background?: boolean; cwd?: string } | undefined;\n }\n\n // Use cmd() to build the command with proper escaping and shell wrapping\n const finalCommand = cmd(commandParts as Command, options);\n\n // cmd() returns ['sh', '-c', 'escaped command'] if options provided,\n // or the raw array if no options. Either way, escapeArgs handles it safely\n const fullCommand = escapeArgs(finalCommand);\n\n return this.run.command(fullCommand, { background: options?.background });\n }\n\n /**\n * Get server information\n * Returns details about the server including auth status, main subdomain, sandbox count, and version\n */\n async getServerInfo(): Promise<InfoResponse> {\n return this.request<InfoResponse>('/info');\n }\n\n /**\n * Get sandbox information\n */\n async getInfo(): Promise<{\n id: string;\n provider: string;\n runtime: 'node' | 'python';\n status: 'running' | 'stopped' | 'error';\n createdAt: Date;\n timeout: number;\n metadata?: Record<string, any>;\n }> {\n return {\n id: this.sandboxId || '',\n provider: this.provider || '',\n runtime: 'node' as const,\n status: 'running' as const,\n createdAt: new Date(),\n timeout: this.config.timeout,\n metadata: this.config.metadata\n };\n }\n\n /**\n * Get URL for accessing sandbox on a specific port (Sandbox interface method)\n */\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n const protocol = options.protocol || 'https';\n // Extract components from sandboxUrl\n const url = new URL(this.config.sandboxUrl);\n const parts = url.hostname.split('.');\n const subdomain = parts[0]; // Extract \"sandbox-123\" or \"abc\"\n const baseDomain = parts.slice(1).join('.'); // Extract \"sandbox.computesdk.com\"\n\n // ComputeSDK has two domains:\n // - sandbox.computesdk.com: Management/control plane\n // - preview.computesdk.com: Preview URLs for services\n // When getting a URL for a port, we need the preview domain\n const previewDomain = baseDomain.replace('sandbox.computesdk.com', 'preview.computesdk.com');\n\n // ComputeSDK URL pattern: ${subdomain}-${port}.${previewDomain}\n // Examples:\n // - https://sandbox-123.sandbox.computesdk.com → https://sandbox-123-3000.preview.computesdk.com\n return `${protocol}://${subdomain}-${options.port}.${previewDomain}`;\n }\n\n /**\n * Get provider instance\n * Note: Not available when using Sandbox directly - only available through gateway provider\n */\n getProvider(): never {\n throw new Error(\n 'getProvider() is not available on Sandbox. ' +\n 'This method is only available when using provider sandboxes through the gateway.'\n );\n }\n\n /**\n * Get native provider instance\n * Returns the Sandbox itself since this IS the sandbox implementation\n */\n getInstance(): this {\n return this;\n }\n\n /**\n * Destroy the sandbox (Sandbox interface method)\n */\n async destroy(): Promise<void> {\n await this.disconnect();\n }\n\n /**\n * Disconnect WebSocket\n *\n * Note: This only disconnects the WebSocket. Terminals, watchers, and signals\n * will continue running on the server until explicitly destroyed via their\n * respective destroy() methods or the DELETE endpoints.\n */\n async disconnect(): Promise<void> {\n // Disconnect WebSocket\n if (this._ws) {\n this._ws.disconnect();\n this._ws = null;\n }\n }\n}\n\n/**\n * Create a new Sandbox instance\n *\n * @example\n * ```typescript\n * import { createSandbox } from '@computesdk/client'\n *\n * // Create sandbox with access token or session token\n * const sandbox = createSandbox({\n * sandboxUrl: 'https://sandbox-123.sandbox.computesdk.com',\n * token: accessToken,\n * });\n *\n * // Execute commands\n * const result = await sandbox.execute({ command: 'ls -la' });\n * ```\n */\nexport function createSandbox(config: SandboxConfig): Sandbox {\n return new Sandbox(config);\n}\n\n// ============================================================================\n// Backwards Compatibility Aliases\n// ============================================================================\n\n/** @deprecated Use SandboxConfig instead */\nexport type ComputeClientConfig = SandboxConfig;\n\n/** @deprecated Use Sandbox instead */\nexport { Sandbox as ComputeClient };\n\n/** @deprecated Use createSandbox instead */\nexport { createSandbox as createClient };\n","/**\n * Terminal - Resource namespace for terminal management\n */\n\nimport type { TerminalInstance } from '../terminal';\nimport type { TerminalResponse } from '../index';\n\n/**\n * Terminal resource namespace\n *\n * @example\n * ```typescript\n * // Create a PTY terminal (interactive shell)\n * const pty = await sandbox.terminal.create({ pty: true, shell: '/bin/bash' });\n * pty.on('output', (data) => console.log(data));\n * pty.write('ls -la\\n');\n *\n * // Create an exec terminal (command tracking)\n * const exec = await sandbox.terminal.create({ pty: false });\n * const cmd = await exec.command.run('npm test');\n * console.log(cmd.exitCode);\n *\n * // List all terminals\n * const terminals = await sandbox.terminal.list();\n *\n * // Retrieve a specific terminal\n * const terminal = await sandbox.terminal.retrieve(id);\n *\n * // Destroy a terminal\n * await sandbox.terminal.destroy(id);\n * ```\n */\nexport class Terminal {\n private createHandler: (options?: {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n }) => Promise<TerminalInstance>;\n private listHandler: () => Promise<TerminalResponse[]>;\n private retrieveHandler: (id: string) => Promise<TerminalResponse>;\n private destroyHandler: (id: string) => Promise<void>;\n\n constructor(handlers: {\n create: (options?: {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n }) => Promise<TerminalInstance>;\n list: () => Promise<TerminalResponse[]>;\n retrieve: (id: string) => Promise<TerminalResponse>;\n destroy: (id: string) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n }\n\n /**\n * Create a new terminal session\n *\n * @param options - Terminal creation options\n * @param options.shell - Shell to use (e.g., '/bin/bash') - PTY mode only\n * @param options.encoding - Encoding: 'raw' (default) or 'base64' (binary-safe)\n * @param options.pty - Terminal mode: true = PTY (interactive), false = exec (command tracking)\n * @returns TerminalInstance\n */\n async create(options?: {\n shell?: string;\n encoding?: 'raw' | 'base64';\n pty?: boolean;\n }): Promise<TerminalInstance> {\n return this.createHandler(options);\n }\n\n /**\n * List all active terminals\n * @returns Array of terminal responses\n */\n async list(): Promise<TerminalResponse[]> {\n return this.listHandler();\n }\n\n /**\n * Retrieve a specific terminal by ID\n * @param id - The terminal ID\n * @returns Terminal response\n */\n async retrieve(id: string): Promise<TerminalResponse> {\n return this.retrieveHandler(id);\n }\n\n /**\n * Destroy a terminal by ID\n * @param id - The terminal ID\n */\n async destroy(id: string): Promise<void> {\n return this.destroyHandler(id);\n }\n}\n","/**\n * Server - Resource namespace for managed server operations\n */\n\nimport type {\n ServersListResponse,\n ServerResponse,\n ServerStopResponse,\n ServerInfo,\n ServerStatus,\n} from '../index';\n\n/**\n * Server resource namespace\n *\n * @example\n * ```typescript\n * // Start a new server\n * const server = await sandbox.server.start({\n * slug: 'api',\n * command: 'npm start',\n * path: '/app',\n * });\n *\n * // List all servers\n * const servers = await sandbox.server.list();\n *\n * // Retrieve a specific server\n * const server = await sandbox.server.retrieve('api');\n *\n * // Stop a server\n * await sandbox.server.stop('api');\n *\n * // Restart a server\n * await sandbox.server.restart('api');\n * ```\n */\nexport class Server {\n private startHandler: (options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }) => Promise<ServerResponse>;\n private listHandler: () => Promise<ServersListResponse>;\n private retrieveHandler: (slug: string) => Promise<ServerResponse>;\n private stopHandler: (slug: string) => Promise<ServerStopResponse | void>;\n private restartHandler: (slug: string) => Promise<ServerResponse>;\n private updateStatusHandler: (slug: string, status: ServerStatus) => Promise<void>;\n\n constructor(handlers: {\n start: (options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }) => Promise<ServerResponse>;\n list: () => Promise<ServersListResponse>;\n retrieve: (slug: string) => Promise<ServerResponse>;\n stop: (slug: string) => Promise<ServerStopResponse | void>;\n restart: (slug: string) => Promise<ServerResponse>;\n updateStatus: (slug: string, status: ServerStatus) => Promise<void>;\n }) {\n this.startHandler = handlers.start;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.stopHandler = handlers.stop;\n this.restartHandler = handlers.restart;\n this.updateStatusHandler = handlers.updateStatus;\n }\n\n /**\n * Start a new managed server\n * @param options - Server configuration\n * @param options.slug - Unique server slug (URL-safe identifier)\n * @param options.command - Command to start the server\n * @param options.path - Working directory (optional)\n * @param options.env_file - Path to env file (optional)\n * @returns Server info\n */\n async start(options: {\n slug: string;\n command: string;\n path?: string;\n env_file?: string;\n }): Promise<ServerInfo> {\n const response = await this.startHandler(options);\n return response.data.server;\n }\n\n /**\n * List all managed servers\n * @returns Array of server info\n */\n async list(): Promise<ServerInfo[]> {\n const response = await this.listHandler();\n return response.data.servers;\n }\n\n /**\n * Retrieve a specific server by slug\n * @param slug - The server slug\n * @returns Server info\n */\n async retrieve(slug: string): Promise<ServerInfo> {\n const response = await this.retrieveHandler(slug);\n return response.data.server;\n }\n\n /**\n * Stop a server by slug\n * @param slug - The server slug\n */\n async stop(slug: string): Promise<void> {\n await this.stopHandler(slug);\n }\n\n /**\n * Restart a server by slug\n * @param slug - The server slug\n * @returns Server info\n */\n async restart(slug: string): Promise<ServerInfo> {\n const response = await this.restartHandler(slug);\n return response.data.server;\n }\n\n /**\n * Update server status (internal use)\n * @param slug - The server slug\n * @param status - New status\n */\n async updateStatus(slug: string, status: ServerStatus): Promise<void> {\n await this.updateStatusHandler(slug, status);\n }\n}\n","/**\n * Watcher - Resource namespace for file watcher operations\n */\n\nimport type { FileWatcher } from '../file-watcher';\nimport type { WatchersListResponse, WatcherResponse, WatcherInfo } from '../index';\n\n/**\n * Watcher resource namespace\n *\n * @example\n * ```typescript\n * // Create a file watcher\n * const watcher = await sandbox.watcher.create('/project', {\n * ignored: ['node_modules', '.git'],\n * includeContent: true,\n * });\n * watcher.on('change', (event) => {\n * console.log(`${event.event}: ${event.path}`);\n * });\n *\n * // List all watchers\n * const watchers = await sandbox.watcher.list();\n *\n * // Retrieve a specific watcher\n * const watcher = await sandbox.watcher.retrieve(id);\n *\n * // Destroy a watcher\n * await sandbox.watcher.destroy(id);\n * ```\n */\nexport class Watcher {\n private createHandler: (\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ) => Promise<FileWatcher>;\n private listHandler: () => Promise<WatchersListResponse>;\n private retrieveHandler: (id: string) => Promise<WatcherResponse>;\n private destroyHandler: (id: string) => Promise<void>;\n\n constructor(handlers: {\n create: (\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ) => Promise<FileWatcher>;\n list: () => Promise<WatchersListResponse>;\n retrieve: (id: string) => Promise<WatcherResponse>;\n destroy: (id: string) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n }\n\n /**\n * Create a new file watcher\n * @param path - Path to watch\n * @param options - Watcher options\n * @param options.includeContent - Include file content in change events\n * @param options.ignored - Patterns to ignore\n * @param options.encoding - Encoding: 'raw' (default) or 'base64' (binary-safe)\n * @returns FileWatcher instance\n */\n async create(\n path: string,\n options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }\n ): Promise<FileWatcher> {\n return this.createHandler(path, options);\n }\n\n /**\n * List all active file watchers\n * @returns Array of watcher info\n */\n async list(): Promise<WatcherInfo[]> {\n const response = await this.listHandler();\n return response.data.watchers;\n }\n\n /**\n * Retrieve a specific watcher by ID\n * @param id - The watcher ID\n * @returns Watcher info\n */\n async retrieve(id: string): Promise<WatcherInfo> {\n const response = await this.retrieveHandler(id);\n return response.data;\n }\n\n /**\n * Destroy a watcher by ID\n * @param id - The watcher ID\n */\n async destroy(id: string): Promise<void> {\n return this.destroyHandler(id);\n }\n}\n","/**\n * SessionToken - Resource namespace for session token management\n */\n\nimport type { SessionTokenResponse, SessionTokenListResponse } from '../index';\n\n/**\n * Session token info\n */\nexport interface SessionTokenInfo {\n id: string;\n token?: string; // Only present when creating\n description?: string;\n createdAt: string;\n expiresAt: string;\n lastUsedAt?: string;\n}\n\n/**\n * SessionToken resource namespace\n *\n * @example\n * ```typescript\n * // Create a session token (requires access token)\n * const token = await sandbox.sessionToken.create({\n * description: 'My Application',\n * expiresIn: 604800, // 7 days\n * });\n * console.log(token.token);\n *\n * // List all session tokens\n * const tokens = await sandbox.sessionToken.list();\n *\n * // Retrieve a specific token\n * const token = await sandbox.sessionToken.retrieve(id);\n *\n * // Revoke a token\n * await sandbox.sessionToken.revoke(id);\n * ```\n */\nexport class SessionToken {\n private createHandler: (options?: {\n description?: string;\n expiresIn?: number;\n }) => Promise<SessionTokenResponse>;\n private listHandler: () => Promise<SessionTokenListResponse>;\n private retrieveHandler: (id: string) => Promise<SessionTokenResponse>;\n private revokeHandler: (id: string) => Promise<void>;\n\n constructor(handlers: {\n create: (options?: {\n description?: string;\n expiresIn?: number;\n }) => Promise<SessionTokenResponse>;\n list: () => Promise<SessionTokenListResponse>;\n retrieve: (id: string) => Promise<SessionTokenResponse>;\n revoke: (id: string) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.revokeHandler = handlers.revoke;\n }\n\n /**\n * Create a new session token (requires access token)\n * @param options - Token configuration\n * @param options.description - Description for the token\n * @param options.expiresIn - Expiration time in seconds (default: 7 days)\n * @returns Session token info including the token value\n */\n async create(options?: {\n description?: string;\n expiresIn?: number;\n }): Promise<SessionTokenInfo> {\n const response = await this.createHandler(options);\n return {\n id: response.id,\n token: response.token,\n description: response.description,\n createdAt: response.createdAt,\n expiresAt: response.expiresAt,\n };\n }\n\n /**\n * List all session tokens\n * @returns Array of session token info\n */\n async list(): Promise<SessionTokenInfo[]> {\n const response = await this.listHandler();\n return response.data.tokens.map((t) => ({\n id: t.id,\n description: t.description,\n createdAt: t.created_at,\n expiresAt: t.expires_at,\n lastUsedAt: t.last_used_at,\n }));\n }\n\n /**\n * Retrieve a specific session token by ID\n * @param id - The token ID\n * @returns Session token info\n */\n async retrieve(id: string): Promise<SessionTokenInfo> {\n const response = await this.retrieveHandler(id);\n return {\n id: response.id,\n description: response.description,\n createdAt: response.createdAt,\n expiresAt: response.expiresAt,\n };\n }\n\n /**\n * Revoke a session token\n * @param id - The token ID to revoke\n */\n async revoke(id: string): Promise<void> {\n return this.revokeHandler(id);\n }\n}\n","/**\n * MagicLink - Resource namespace for magic link operations\n */\n\nimport type { MagicLinkResponse } from '../index';\n\n/**\n * Magic link info\n */\nexport interface MagicLinkInfo {\n url: string;\n expiresAt: string;\n redirectUrl: string;\n}\n\n/**\n * MagicLink resource namespace\n *\n * @example\n * ```typescript\n * // Create a magic link (requires access token)\n * const link = await sandbox.magicLink.create({\n * redirectUrl: '/dashboard',\n * });\n * console.log(link.url);\n * ```\n */\nexport class MagicLink {\n private createHandler: (options?: {\n redirectUrl?: string;\n }) => Promise<MagicLinkResponse>;\n\n constructor(handlers: {\n create: (options?: { redirectUrl?: string }) => Promise<MagicLinkResponse>;\n }) {\n this.createHandler = handlers.create;\n }\n\n /**\n * Create a magic link for browser authentication (requires access token)\n *\n * Magic links are one-time URLs that automatically create a session token\n * and set it as a cookie in the user's browser.\n *\n * @param options - Magic link configuration\n * @param options.redirectUrl - URL to redirect to after authentication\n * @returns Magic link info including the URL\n */\n async create(options?: { redirectUrl?: string }): Promise<MagicLinkInfo> {\n const response = await this.createHandler(options);\n return {\n url: response.data.magic_url,\n expiresAt: response.data.expires_at,\n redirectUrl: response.data.redirect_url,\n };\n }\n}\n","/**\n * Signal - Resource namespace for signal service operations\n */\n\nimport type { SignalService } from '../signal-service';\nimport type { SignalServiceResponse, PortSignalResponse, GenericSignalResponse } from '../index';\n\n/**\n * Signal service status info\n */\nexport interface SignalStatusInfo {\n status: 'active' | 'stopped';\n channel: string;\n wsUrl: string;\n}\n\n/**\n * Signal resource namespace\n *\n * @example\n * ```typescript\n * // Start the signal service\n * const signals = await sandbox.signal.start();\n * signals.on('port', (event) => {\n * console.log(`Port ${event.port} opened: ${event.url}`);\n * });\n *\n * // Get signal service status\n * const status = await sandbox.signal.status();\n *\n * // Emit signals\n * await sandbox.signal.emitPort(3000, 'open', 'http://localhost:3000');\n * await sandbox.signal.emitError('Something went wrong');\n *\n * // Stop the signal service\n * await sandbox.signal.stop();\n * ```\n */\nexport class Signal {\n private startHandler: () => Promise<SignalService>;\n private statusHandler: () => Promise<SignalServiceResponse>;\n private stopHandler: () => Promise<void>;\n private emitPortHandler: (\n port: number,\n type: 'open' | 'close',\n url: string\n ) => Promise<PortSignalResponse>;\n private emitErrorHandler: (message: string) => Promise<GenericSignalResponse>;\n private emitServerReadyHandler: (\n port: number,\n url: string\n ) => Promise<PortSignalResponse>;\n\n constructor(handlers: {\n start: () => Promise<SignalService>;\n status: () => Promise<SignalServiceResponse>;\n stop: () => Promise<void>;\n emitPort: (\n port: number,\n type: 'open' | 'close',\n url: string\n ) => Promise<PortSignalResponse>;\n emitError: (message: string) => Promise<GenericSignalResponse>;\n emitServerReady: (port: number, url: string) => Promise<PortSignalResponse>;\n }) {\n this.startHandler = handlers.start;\n this.statusHandler = handlers.status;\n this.stopHandler = handlers.stop;\n this.emitPortHandler = handlers.emitPort;\n this.emitErrorHandler = handlers.emitError;\n this.emitServerReadyHandler = handlers.emitServerReady;\n }\n\n /**\n * Start the signal service\n * @returns SignalService instance with event handling\n */\n async start(): Promise<SignalService> {\n return this.startHandler();\n }\n\n /**\n * Get the signal service status\n * @returns Signal service status info\n */\n async status(): Promise<SignalStatusInfo> {\n const response = await this.statusHandler();\n return {\n status: response.data.status,\n channel: response.data.channel,\n wsUrl: response.data.ws_url,\n };\n }\n\n /**\n * Stop the signal service\n */\n async stop(): Promise<void> {\n return this.stopHandler();\n }\n\n /**\n * Emit a port signal\n * @param port - Port number\n * @param type - Signal type ('open' or 'close')\n * @param url - URL associated with the port\n */\n async emitPort(\n port: number,\n type: 'open' | 'close',\n url: string\n ): Promise<void> {\n await this.emitPortHandler(port, type, url);\n }\n\n /**\n * Emit an error signal\n * @param message - Error message\n */\n async emitError(message: string): Promise<void> {\n await this.emitErrorHandler(message);\n }\n\n /**\n * Emit a server ready signal\n * @param port - Port number\n * @param url - Server URL\n */\n async emitServerReady(port: number, url: string): Promise<void> {\n await this.emitServerReadyHandler(port, url);\n }\n}\n","/**\n * File - Resource namespace for file operations\n */\n\nimport type {\n FilesListResponse,\n FileResponse,\n BatchWriteResponse,\n FileInfo,\n BatchWriteResult,\n BatchFileOperation,\n} from '../index';\n\n/**\n * File resource namespace\n *\n * @example\n * ```typescript\n * // Create a file\n * const file = await sandbox.file.create('/project/hello.txt', 'Hello, World!');\n *\n * // List files in a directory\n * const files = await sandbox.file.list('/project');\n *\n * // Retrieve file content\n * const content = await sandbox.file.retrieve('/project/hello.txt');\n *\n * // Destroy (delete) a file\n * await sandbox.file.destroy('/project/hello.txt');\n *\n * // Batch write multiple files\n * const results = await sandbox.file.batchWrite([\n * { path: '/project/a.txt', operation: 'write', content: 'A' },\n * { path: '/project/b.txt', operation: 'write', content: 'B' },\n * ]);\n *\n * // Batch delete files\n * const results = await sandbox.file.batchWrite([\n * { path: '/project/old.txt', operation: 'delete' },\n * ]);\n * ```\n */\nexport class File {\n private createHandler: (path: string, content?: string) => Promise<FileResponse>;\n private listHandler: (path: string) => Promise<FilesListResponse>;\n private retrieveHandler: (path: string) => Promise<string>;\n private destroyHandler: (path: string) => Promise<void>;\n private batchWriteHandler: (\n files: Array<{ path: string; operation: BatchFileOperation; content?: string }>\n ) => Promise<BatchWriteResponse>;\n private existsHandler: (path: string) => Promise<boolean>;\n\n constructor(handlers: {\n create: (path: string, content?: string) => Promise<FileResponse>;\n list: (path: string) => Promise<FilesListResponse>;\n retrieve: (path: string) => Promise<string>;\n destroy: (path: string) => Promise<void>;\n batchWrite: (\n files: Array<{ path: string; operation: BatchFileOperation; content?: string }>\n ) => Promise<BatchWriteResponse>;\n exists: (path: string) => Promise<boolean>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n this.batchWriteHandler = handlers.batchWrite;\n this.existsHandler = handlers.exists;\n }\n\n /**\n * Create a new file with optional content\n * @param path - File path\n * @param content - File content (optional)\n * @returns File info\n */\n async create(path: string, content?: string): Promise<FileInfo> {\n const response = await this.createHandler(path, content);\n return response.data.file;\n }\n\n /**\n * List files at the specified path\n * @param path - Directory path (default: '/')\n * @returns Array of file info\n */\n async list(path: string = '/'): Promise<FileInfo[]> {\n const response = await this.listHandler(path);\n return response.data.files;\n }\n\n /**\n * Retrieve file content\n * @param path - File path\n * @returns File content as string\n */\n async retrieve(path: string): Promise<string> {\n return this.retrieveHandler(path);\n }\n\n /**\n * Destroy (delete) a file or directory\n * @param path - File or directory path\n */\n async destroy(path: string): Promise<void> {\n return this.destroyHandler(path);\n }\n\n /**\n * Batch file operations (write or delete multiple files)\n *\n * Features:\n * - Deduplication: Last operation wins per path\n * - File locking: Prevents race conditions\n * - Deterministic ordering: Alphabetical path sorting\n * - Partial failure handling: Returns per-file results\n *\n * @param files - Array of file operations\n * @returns Results for each file operation\n */\n async batchWrite(\n files: Array<{ path: string; operation: BatchFileOperation; content?: string }>\n ): Promise<BatchWriteResult[]> {\n const response = await this.batchWriteHandler(files);\n return response.data.results;\n }\n\n /**\n * Check if a file exists\n * @param path - File path\n * @returns True if file exists\n */\n async exists(path: string): Promise<boolean> {\n return this.existsHandler(path);\n }\n}\n","/**\n * Env - Resource namespace for environment variable operations\n */\n\nimport type { EnvGetResponse, EnvSetResponse, EnvDeleteResponse } from '../index';\n\n/**\n * Env resource namespace\n *\n * @example\n * ```typescript\n * // Retrieve environment variables\n * const vars = await sandbox.env.retrieve('.env');\n * console.log(vars);\n *\n * // Update environment variables (merges with existing)\n * await sandbox.env.update('.env', {\n * API_KEY: 'secret',\n * DEBUG: 'true',\n * });\n *\n * // Remove environment variables\n * await sandbox.env.remove('.env', ['OLD_KEY', 'DEPRECATED']);\n * ```\n */\nexport class Env {\n private retrieveHandler: (file: string) => Promise<EnvGetResponse>;\n private updateHandler: (\n file: string,\n variables: Record<string, string>\n ) => Promise<EnvSetResponse>;\n private removeHandler: (file: string, keys: string[]) => Promise<EnvDeleteResponse>;\n private existsHandler: (file: string) => Promise<boolean>;\n\n constructor(handlers: {\n retrieve: (file: string) => Promise<EnvGetResponse>;\n update: (\n file: string,\n variables: Record<string, string>\n ) => Promise<EnvSetResponse>;\n remove: (file: string, keys: string[]) => Promise<EnvDeleteResponse>;\n exists: (file: string) => Promise<boolean>;\n }) {\n this.retrieveHandler = handlers.retrieve;\n this.updateHandler = handlers.update;\n this.removeHandler = handlers.remove;\n this.existsHandler = handlers.exists;\n }\n\n /**\n * Retrieve environment variables from a file\n * @param file - Path to the .env file (relative to sandbox root)\n * @returns Key-value map of environment variables\n */\n async retrieve(file: string): Promise<Record<string, string>> {\n const response = await this.retrieveHandler(file);\n return response.data.variables;\n }\n\n /**\n * Update (merge) environment variables in a file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param variables - Key-value pairs to set\n * @returns Keys that were updated\n */\n async update(\n file: string,\n variables: Record<string, string>\n ): Promise<string[]> {\n const response = await this.updateHandler(file, variables);\n return response.data.keys;\n }\n\n /**\n * Remove environment variables from a file\n * @param file - Path to the .env file (relative to sandbox root)\n * @param keys - Keys to remove\n * @returns Keys that were removed\n */\n async remove(file: string, keys: string[]): Promise<string[]> {\n const response = await this.removeHandler(file, keys);\n return response.data.keys;\n }\n\n /**\n * Check if an environment file exists\n * @param file - Path to the .env file (relative to sandbox root)\n * @returns True if file exists\n */\n async exists(file: string): Promise<boolean> {\n return this.existsHandler(file);\n }\n}\n","/**\n * Auth - Resource namespace for authentication info\n */\n\nimport type { AuthStatusResponse, AuthInfoResponse } from '../index';\n\n/**\n * Authentication status info\n */\nexport interface AuthStatusInfo {\n authenticated: boolean;\n tokenType?: 'access_token' | 'session_token';\n expiresAt?: string;\n}\n\n/**\n * Authentication endpoints info\n */\nexport interface AuthEndpointsInfo {\n createSessionToken: string;\n listSessionTokens: string;\n getSessionToken: string;\n revokeSessionToken: string;\n createMagicLink: string;\n authStatus: string;\n authInfo: string;\n}\n\n/**\n * Authentication info\n */\nexport interface AuthInfo {\n message: string;\n instructions: string;\n endpoints: AuthEndpointsInfo;\n}\n\n/**\n * Auth resource namespace\n *\n * @example\n * ```typescript\n * // Check authentication status\n * const status = await sandbox.auth.status();\n * console.log(status.authenticated);\n * console.log(status.tokenType);\n *\n * // Get authentication info and instructions\n * const info = await sandbox.auth.info();\n * console.log(info.instructions);\n * ```\n */\nexport class Auth {\n private statusHandler: () => Promise<AuthStatusResponse>;\n private infoHandler: () => Promise<AuthInfoResponse>;\n\n constructor(handlers: {\n status: () => Promise<AuthStatusResponse>;\n info: () => Promise<AuthInfoResponse>;\n }) {\n this.statusHandler = handlers.status;\n this.infoHandler = handlers.info;\n }\n\n /**\n * Check authentication status\n * @returns Authentication status info\n */\n async status(): Promise<AuthStatusInfo> {\n const response = await this.statusHandler();\n return {\n authenticated: response.data.authenticated,\n tokenType: response.data.token_type,\n expiresAt: response.data.expires_at,\n };\n }\n\n /**\n * Get authentication information and usage instructions\n * @returns Authentication info\n */\n async info(): Promise<AuthInfo> {\n const response = await this.infoHandler();\n return {\n message: response.data.message,\n instructions: response.data.instructions,\n endpoints: {\n createSessionToken: response.data.endpoints.create_session_token,\n listSessionTokens: response.data.endpoints.list_session_tokens,\n getSessionToken: response.data.endpoints.get_session_token,\n revokeSessionToken: response.data.endpoints.revoke_session_token,\n createMagicLink: response.data.endpoints.create_magic_link,\n authStatus: response.data.endpoints.auth_status,\n authInfo: response.data.endpoints.auth_info,\n },\n };\n }\n}\n","/**\n * Run - Resource namespace for code and command execution\n */\n\n/**\n * Code execution result\n */\nexport interface CodeResult {\n output: string;\n exitCode: number;\n language: string;\n}\n\n/**\n * Command execution result\n */\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs: number;\n}\n\n/**\n * Supported languages for code execution\n */\nexport type CodeLanguage = 'python' | 'python3' | 'node' | 'javascript' | 'js' | 'bash' | 'sh' | 'ruby';\n\n/**\n * Code execution options\n */\nexport interface CodeRunOptions {\n /** Programming language (optional - will auto-detect if not specified) */\n language?: CodeLanguage;\n}\n\n/**\n * Command execution options\n */\nexport interface CommandRunOptions {\n /** Shell to use (optional) */\n shell?: string;\n /** Run in background (optional) */\n background?: boolean;\n}\n\n/**\n * Run - Resource namespace for executing code and commands\n *\n * @example\n * ```typescript\n * // Run code with auto-detection\n * const result = await sandbox.run.code('print(\"Hello from Python\")');\n * console.log(result.output); // \"Hello from Python\\n\"\n * console.log(result.language); // \"python\"\n *\n * // Run code with explicit language\n * const result = await sandbox.run.code('console.log(\"Hello\")', { language: 'node' });\n *\n * // Run a command\n * const result = await sandbox.run.command('ls -la');\n * console.log(result.stdout);\n * console.log(result.exitCode);\n * ```\n */\nexport class Run {\n private codeHandler: (code: string, options?: CodeRunOptions) => Promise<CodeResult>;\n private commandHandler: (command: string, options?: CommandRunOptions) => Promise<CommandResult>;\n\n constructor(handlers: {\n code: (code: string, options?: CodeRunOptions) => Promise<CodeResult>;\n command: (command: string, options?: CommandRunOptions) => Promise<CommandResult>;\n }) {\n this.codeHandler = handlers.code;\n this.commandHandler = handlers.command;\n }\n\n /**\n * Execute code with automatic language detection\n *\n * Supports: python, python3, node, javascript, js, bash, sh, ruby\n *\n * @param code - The code to execute\n * @param options - Execution options\n * @param options.language - Programming language (auto-detected if not specified)\n * @returns Code execution result with output, exit code, and detected language\n */\n async code(code: string, options?: CodeRunOptions): Promise<CodeResult> {\n return this.codeHandler(code, options);\n }\n\n /**\n * Execute a shell command\n *\n * @param command - The command to execute\n * @param options - Execution options\n * @param options.shell - Shell to use (optional)\n * @param options.background - Run in background (optional)\n * @returns Command execution result with stdout, stderr, exit code, and duration\n */\n async command(command: string, options?: CommandRunOptions): Promise<CommandResult> {\n return this.commandHandler(command, options);\n }\n}\n","/**\n * Child - Resource namespace for child sandbox operations\n */\n\nimport type { SandboxInfo, SandboxesListResponse } from '../index';\n\n/**\n * Child resource namespace for managing child sandboxes\n *\n * Child sandboxes are isolated environments within the parent sandbox,\n * each with their own filesystem. Available only in multi-tenant mode.\n *\n * @example\n * ```typescript\n * // Create a new child sandbox\n * const child = await sandbox.child.create();\n * console.log(child.url); // https://sandbox-12345.sandbox.computesdk.com\n *\n * // List all children\n * const all = await sandbox.child.list();\n *\n * // Get a specific child\n * const info = await sandbox.child.retrieve('sandbox-12345');\n *\n * // Delete a child sandbox\n * await sandbox.child.destroy('sandbox-12345');\n *\n * // Delete child and its files\n * await sandbox.child.destroy('sandbox-12345', { deleteFiles: true });\n * ```\n */\nexport class Child {\n private createHandler: () => Promise<SandboxInfo>;\n private listHandler: () => Promise<SandboxesListResponse>;\n private retrieveHandler: (subdomain: string) => Promise<SandboxInfo>;\n private destroyHandler: (subdomain: string, deleteFiles: boolean) => Promise<void>;\n\n constructor(handlers: {\n create: () => Promise<SandboxInfo>;\n list: () => Promise<SandboxesListResponse>;\n retrieve: (subdomain: string) => Promise<SandboxInfo>;\n destroy: (subdomain: string, deleteFiles: boolean) => Promise<void>;\n }) {\n this.createHandler = handlers.create;\n this.listHandler = handlers.list;\n this.retrieveHandler = handlers.retrieve;\n this.destroyHandler = handlers.destroy;\n }\n\n /**\n * Create a new child sandbox\n * @returns Child sandbox info including URL and subdomain\n */\n async create(): Promise<SandboxInfo> {\n return this.createHandler();\n }\n\n /**\n * List all child sandboxes\n * @returns Array of child sandbox info\n */\n async list(): Promise<SandboxInfo[]> {\n const response = await this.listHandler();\n return response.sandboxes;\n }\n\n /**\n * Retrieve a specific child sandbox by subdomain\n * @param subdomain - The child subdomain (e.g., 'sandbox-12345')\n * @returns Child sandbox info\n */\n async retrieve(subdomain: string): Promise<SandboxInfo> {\n return this.retrieveHandler(subdomain);\n }\n\n /**\n * Destroy (delete) a child sandbox\n * @param subdomain - The child subdomain\n * @param options - Destroy options\n * @param options.deleteFiles - Whether to delete the child's files (default: false)\n */\n async destroy(\n subdomain: string,\n options?: { deleteFiles?: boolean }\n ): Promise<void> {\n return this.destroyHandler(subdomain, options?.deleteFiles ?? false);\n }\n}\n","/**\n * Client Types\n *\n * Types specific to the gateway Sandbox client implementation.\n * Core universal types are imported from ../types/universal-sandbox\n */\n\n// Import universal types\nimport type {\n Runtime as UniversalRuntime,\n CodeResult,\n CommandResult,\n SandboxInfo,\n FileEntry as UniversalFileEntry,\n RunCommandOptions as UniversalRunCommandOptions,\n SandboxFileSystem as UniversalSandboxFileSystem,\n CreateSandboxOptions as UniversalCreateSandboxOptions,\n} from '../types/universal-sandbox';\n\n// Re-export universal types for backward compatibility\nexport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n UniversalRuntime as Runtime,\n UniversalFileEntry as FileEntry,\n UniversalRunCommandOptions as RunCommandOptions,\n UniversalSandboxFileSystem as SandboxFileSystem,\n UniversalCreateSandboxOptions as CreateSandboxOptions,\n};\n\n/**\n * Sandbox status types (client-specific, more limited than universal)\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Provider-agnostic sandbox info (alias for SandboxInfo for backward compatibility)\n */\nexport interface ProviderSandboxInfo {\n /** Unique identifier for the sandbox */\n id: string;\n /** Provider hosting the sandbox */\n provider: string;\n /** Runtime environment in the sandbox */\n runtime: UniversalRuntime;\n /** Current status of the sandbox */\n status: SandboxStatus;\n /** When the sandbox was created */\n createdAt: Date;\n /** Execution timeout in milliseconds */\n timeout: number;\n /** Additional provider-specific metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Error thrown when a command exits with a non-zero status\n */\nexport class CommandExitError extends Error {\n name = 'CommandExitError';\n constructor(public result: {\n exitCode: number;\n stdout: string;\n stderr: string;\n error: boolean;\n }) {\n super(`Command exited with code ${result.exitCode}`);\n }\n}\n\n/**\n * Type guard to check if an error is a CommandExitError\n */\nexport function isCommandExitError(error: unknown): error is CommandExitError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'CommandExitError' &&\n 'result' in error\n );\n}\n","/**\n * Unified Provider Configuration\n *\n * Single source of truth for all provider auth requirements.\n * Used by both explicit mode (computesdk) and magic mode (workbench).\n */\n\n/**\n * Provider auth requirements\n *\n * Structure: { provider: [[option1_vars], [option2_vars], ...] }\n * - Outer array: OR conditions (any option can satisfy auth)\n * - Inner arrays: AND conditions (all vars in option must be present)\n *\n * Example: vercel: [['OIDC_TOKEN'], ['TOKEN', 'TEAM_ID', 'PROJECT_ID']]\n * -> Ready if OIDC_TOKEN is set, OR if all three traditional vars are set\n */\nexport const PROVIDER_AUTH = {\n e2b: [['E2B_API_KEY']],\n modal: [['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET']],\n railway: [['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID']],\n daytona: [['DAYTONA_API_KEY']],\n vercel: [\n ['VERCEL_OIDC_TOKEN'],\n ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n ],\n runloop: [['RUNLOOP_API_KEY']],\n cloudflare: [['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID']],\n codesandbox: [['CSB_API_KEY']],\n blaxel: [['BL_API_KEY', 'BL_WORKSPACE']],\n} as const;\n\n/**\n * All supported provider names (excluding gateway which is special)\n */\nexport const PROVIDER_NAMES = Object.keys(PROVIDER_AUTH) as ProviderName[];\n\n/**\n * Provider name type derived from PROVIDER_AUTH\n */\nexport type ProviderName = keyof typeof PROVIDER_AUTH;\n\n/**\n * Header mapping for each provider\n * Maps config field names to HTTP header names\n */\nexport const PROVIDER_HEADERS: Record<ProviderName, Record<string, string>> = {\n e2b: {\n apiKey: 'X-E2B-API-Key',\n },\n modal: {\n tokenId: 'X-Modal-Token-Id',\n tokenSecret: 'X-Modal-Token-Secret',\n },\n railway: {\n apiToken: 'X-Railway-API-Token',\n },\n daytona: {\n apiKey: 'X-Daytona-API-Key',\n },\n vercel: {\n oidcToken: 'X-Vercel-OIDC-Token',\n token: 'X-Vercel-Token',\n teamId: 'X-Vercel-Team-Id',\n projectId: 'X-Vercel-Project-Id',\n },\n runloop: {\n apiKey: 'X-Runloop-API-Key',\n },\n cloudflare: {\n apiToken: 'X-Cloudflare-API-Token',\n accountId: 'X-Cloudflare-Account-Id',\n },\n codesandbox: {\n apiKey: 'X-CSB-API-Key',\n },\n blaxel: {\n apiKey: 'X-BL-API-Key',\n workspace: 'X-BL-Workspace',\n },\n};\n\n/**\n * Environment variable to config field mapping for each provider\n */\nexport const PROVIDER_ENV_MAP: Record<ProviderName, Record<string, string>> = {\n e2b: {\n E2B_API_KEY: 'apiKey',\n },\n modal: {\n MODAL_TOKEN_ID: 'tokenId',\n MODAL_TOKEN_SECRET: 'tokenSecret',\n },\n railway: {\n RAILWAY_API_KEY: 'apiToken',\n RAILWAY_PROJECT_ID: 'projectId',\n RAILWAY_ENVIRONMENT_ID: 'environmentId',\n },\n daytona: {\n DAYTONA_API_KEY: 'apiKey',\n },\n vercel: {\n VERCEL_OIDC_TOKEN: 'oidcToken',\n VERCEL_TOKEN: 'token',\n VERCEL_TEAM_ID: 'teamId',\n VERCEL_PROJECT_ID: 'projectId',\n },\n runloop: {\n RUNLOOP_API_KEY: 'apiKey',\n },\n cloudflare: {\n CLOUDFLARE_API_TOKEN: 'apiToken',\n CLOUDFLARE_ACCOUNT_ID: 'accountId',\n },\n codesandbox: {\n CSB_API_KEY: 'apiKey',\n },\n blaxel: {\n BL_API_KEY: 'apiKey',\n BL_WORKSPACE: 'workspace',\n },\n};\n\n/**\n * Dashboard URLs for each provider (for error messages)\n */\nexport const PROVIDER_DASHBOARD_URLS: Record<ProviderName, string> = {\n e2b: 'https://e2b.dev/dashboard',\n modal: 'https://modal.com/settings',\n railway: 'https://railway.app/account/tokens',\n daytona: 'https://daytona.io/dashboard',\n vercel: 'https://vercel.com/account/tokens',\n runloop: 'https://runloop.ai/dashboard',\n cloudflare: 'https://dash.cloudflare.com/profile/api-tokens',\n codesandbox: 'https://codesandbox.io/dashboard/settings',\n blaxel: 'https://blaxel.ai/dashboard',\n};\n\n/**\n * Check if a provider name is valid\n */\nexport function isValidProvider(name: string): name is ProviderName {\n return name in PROVIDER_AUTH;\n}\n\n/**\n * Build headers from provider config\n */\nexport function buildProviderHeaders(\n provider: ProviderName,\n config: Record<string, string | undefined>\n): Record<string, string> {\n const headers: Record<string, string> = {};\n const headerMap = PROVIDER_HEADERS[provider];\n\n for (const [configKey, headerName] of Object.entries(headerMap)) {\n const value = config[configKey];\n if (value) {\n headers[headerName] = value;\n }\n }\n\n return headers;\n}\n\n/**\n * Get provider config from environment variables\n */\nexport function getProviderConfigFromEnv(provider: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n const envMap = PROVIDER_ENV_MAP[provider];\n\n for (const [envVar, configKey] of Object.entries(envMap)) {\n const value = process.env[envVar];\n if (value) {\n config[configKey] = value;\n }\n }\n\n return config;\n}\n\n/**\n * Check if provider has complete auth from environment\n */\nexport function isProviderAuthComplete(provider: ProviderName): boolean {\n const authOptions = PROVIDER_AUTH[provider];\n\n for (const option of authOptions) {\n const allPresent = option.every(envVar => !!process.env[envVar]);\n if (allPresent) return true;\n }\n\n return false;\n}\n\n/**\n * Get missing env vars for a provider (returns the option closest to completion)\n */\nexport function getMissingEnvVars(provider: ProviderName): string[] {\n const authOptions = PROVIDER_AUTH[provider];\n let bestOption: { presentCount: number; missing: string[] } | null = null;\n\n for (const option of authOptions) {\n const missing: string[] = [];\n let presentCount = 0;\n\n for (const envVar of option) {\n if (process.env[envVar]) {\n presentCount++;\n } else {\n missing.push(envVar);\n }\n }\n\n if (missing.length === 0) return [];\n\n if (!bestOption || presentCount > bestOption.presentCount) {\n bestOption = { presentCount, missing };\n }\n }\n\n return bestOption?.missing ?? [];\n}\n","/**\n * ComputeSDK Constants\n *\n * Default configuration values and provider definitions\n */\n\n// Re-export provider config as the single source of truth\nexport {\n PROVIDER_AUTH,\n PROVIDER_NAMES,\n PROVIDER_HEADERS,\n PROVIDER_ENV_MAP,\n PROVIDER_DASHBOARD_URLS,\n type ProviderName,\n isValidProvider,\n buildProviderHeaders,\n getProviderConfigFromEnv,\n isProviderAuthComplete,\n getMissingEnvVars,\n} from './provider-config';\n\n/**\n * Default gateway URL for sandbox lifecycle operations\n */\nexport const GATEWAY_URL = 'https://gateway.computesdk.com';\n\n/**\n * Provider detection priority order\n * When multiple provider credentials are detected, use the first one in this list\n */\nexport const PROVIDER_PRIORITY = [\n 'e2b',\n 'railway',\n 'daytona',\n 'modal',\n 'runloop',\n 'vercel',\n 'cloudflare',\n 'codesandbox',\n 'blaxel',\n] as const;\n\n/**\n * Required environment variables for each provider\n * @deprecated Use PROVIDER_AUTH from provider-config instead\n */\nexport const PROVIDER_ENV_VARS = {\n e2b: ['E2B_API_KEY'],\n railway: ['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID'],\n daytona: ['DAYTONA_API_KEY'],\n modal: ['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET'],\n runloop: ['RUNLOOP_API_KEY'],\n vercel: ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID'],\n codesandbox: ['CSB_API_KEY'],\n blaxel: ['BL_API_KEY', 'BL_WORKSPACE'],\n} as const;\n","/**\n * Auto-Detection Module\n * \n * Automatically detects gateway mode and provider from environment variables.\n * Enables zero-config usage of ComputeSDK.\n */\n\nimport { GATEWAY_URL, PROVIDER_PRIORITY, PROVIDER_ENV_VARS, type ProviderName } from './constants';\n\n/**\n * Check if gateway mode is enabled\n * Gateway mode requires COMPUTESDK_API_KEY to be set\n */\nexport function isGatewayModeEnabled(): boolean {\n return !!(typeof process !== 'undefined' && process.env?.COMPUTESDK_API_KEY);\n}\n\n/**\n * Check if all required environment variables exist for a provider\n */\nfunction hasProviderEnv(provider: ProviderName): boolean {\n if (typeof process === 'undefined') return false;\n \n const requiredVars = PROVIDER_ENV_VARS[provider];\n if (!requiredVars) return false; // Safety check for invalid provider names\n \n return requiredVars.every(varName => !!process.env?.[varName]);\n}\n\n/**\n * Get detailed status of provider credentials\n */\nfunction getProviderEnvStatus(provider: ProviderName): {\n provider: string;\n present: string[];\n missing: string[];\n isComplete: boolean;\n} {\n const requiredVars = PROVIDER_ENV_VARS[provider];\n \n if (typeof process === 'undefined' || !requiredVars) {\n return { provider, present: [], missing: requiredVars ? [...requiredVars] : [], isComplete: false };\n }\n \n const present = requiredVars.filter(varName => !!process.env?.[varName]);\n const missing = requiredVars.filter(varName => !process.env?.[varName]);\n \n return {\n provider,\n present: [...present],\n missing: [...missing],\n isComplete: missing.length === 0\n };\n}\n\n/**\n * Detect which provider to use from environment variables\n * \n * Detection order:\n * 1. Check for explicit COMPUTESDK_PROVIDER override\n * 2. Auto-detect based on PROVIDER_PRIORITY order\n * \n * @returns Provider name or null if none detected\n */\nexport function detectProvider(): string | null {\n if (typeof process === 'undefined') return null;\n \n // Check for explicit override\n const explicit = process.env.COMPUTESDK_PROVIDER?.toLowerCase();\n if (explicit && hasProviderEnv(explicit as ProviderName)) {\n return explicit;\n }\n \n // Warn if explicit provider set but credentials missing\n if (explicit && !hasProviderEnv(explicit as ProviderName)) {\n console.warn(\n `⚠️ COMPUTESDK_PROVIDER is set to \"${explicit}\" but required credentials are missing.\\n` +\n ` Required: ${PROVIDER_ENV_VARS[explicit as ProviderName]?.join(', ') || 'unknown'}\\n` +\n ` Falling back to auto-detection...`\n );\n }\n \n // Auto-detect based on priority order\n for (const provider of PROVIDER_PRIORITY) {\n if (hasProviderEnv(provider)) {\n return provider;\n }\n }\n \n return null;\n}\n\n/**\n * Build provider-specific headers from environment variables\n * These headers are passed through to the gateway\n */\nexport function getProviderHeaders(provider: string): Record<string, string> {\n if (typeof process === 'undefined') return {};\n \n const headers: Record<string, string> = {};\n \n switch (provider) {\n case 'e2b':\n if (process.env.E2B_API_KEY) {\n headers['X-E2B-API-Key'] = process.env.E2B_API_KEY;\n }\n break;\n \n case 'railway':\n if (process.env.RAILWAY_API_KEY) {\n headers['X-Railway-API-Key'] = process.env.RAILWAY_API_KEY;\n }\n if (process.env.RAILWAY_PROJECT_ID) {\n headers['X-Railway-Project-ID'] = process.env.RAILWAY_PROJECT_ID;\n }\n if (process.env.RAILWAY_ENVIRONMENT_ID) {\n headers['X-Railway-Environment-ID'] = process.env.RAILWAY_ENVIRONMENT_ID;\n }\n break;\n \n case 'daytona':\n if (process.env.DAYTONA_API_KEY) {\n headers['X-Daytona-API-Key'] = process.env.DAYTONA_API_KEY;\n }\n break;\n \n case 'modal':\n if (process.env.MODAL_TOKEN_ID) {\n headers['X-Modal-Token-ID'] = process.env.MODAL_TOKEN_ID;\n }\n if (process.env.MODAL_TOKEN_SECRET) {\n headers['X-Modal-Token-Secret'] = process.env.MODAL_TOKEN_SECRET;\n }\n break;\n \n case 'runloop':\n if (process.env.RUNLOOP_API_KEY) {\n headers['X-Runloop-API-Key'] = process.env.RUNLOOP_API_KEY;\n }\n break;\n \n case 'vercel':\n if (process.env.VERCEL_TOKEN) {\n headers['X-Vercel-Token'] = process.env.VERCEL_TOKEN;\n }\n if (process.env.VERCEL_TEAM_ID) {\n headers['X-Vercel-Team-ID'] = process.env.VERCEL_TEAM_ID;\n }\n if (process.env.VERCEL_PROJECT_ID) {\n headers['X-Vercel-Project-ID'] = process.env.VERCEL_PROJECT_ID;\n }\n break;\n \n case 'cloudflare':\n if (process.env.CLOUDFLARE_API_TOKEN) {\n headers['X-Cloudflare-API-Token'] = process.env.CLOUDFLARE_API_TOKEN;\n }\n if (process.env.CLOUDFLARE_ACCOUNT_ID) {\n headers['X-Cloudflare-Account-ID'] = process.env.CLOUDFLARE_ACCOUNT_ID;\n }\n break;\n \n case 'codesandbox':\n if (process.env.CSB_API_KEY) {\n headers['X-CodeSandbox-API-Key'] = process.env.CSB_API_KEY;\n }\n break;\n \n case 'blaxel':\n if (process.env.BL_API_KEY) {\n headers['X-Blaxel-API-Key'] = process.env.BL_API_KEY;\n }\n if (process.env.BL_WORKSPACE) {\n headers['X-Blaxel-Workspace'] = process.env.BL_WORKSPACE;\n }\n break;\n }\n \n return headers;\n}\n\n/**\n * Gateway configuration object\n */\nexport interface GatewayConfig {\n apiKey: string;\n gatewayUrl: string;\n provider: string;\n providerHeaders: Record<string, string>;\n}\n\n/**\n * Main auto-configuration function\n * Returns gateway configuration or null if auto-detection not possible\n *\n * @throws Error if COMPUTESDK_API_KEY is set but no provider detected\n */\nexport function autoConfigureCompute(): GatewayConfig | null {\n // Only auto-configure in gateway mode\n if (!isGatewayModeEnabled()) {\n return null;\n }\n\n const provider = detectProvider();\n if (!provider) {\n // Build detailed diagnostic information\n const detectionResults = PROVIDER_PRIORITY.map(p => getProviderEnvStatus(p));\n \n // Create status indicators\n const statusLines = detectionResults.map(result => {\n const status = result.isComplete ? '✅' : \n result.present.length > 0 ? '⚠️ ' : '❌';\n const ratio = `${result.present.length}/${result.present.length + result.missing.length}`;\n let line = ` ${status} ${result.provider.padEnd(12)} ${ratio} credentials`;\n \n // Show what's missing for partial matches\n if (result.present.length > 0 && result.missing.length > 0) {\n line += ` (missing: ${result.missing.join(', ')})`;\n }\n \n return line;\n });\n \n throw new Error(\n `COMPUTESDK_API_KEY is set but no provider detected.\\n\\n` +\n `Provider detection results:\\n` +\n statusLines.join('\\n') +\n `\\n\\n` +\n `To fix this, set one of the following:\\n\\n` +\n ` E2B: export E2B_API_KEY=xxx\\n` +\n ` Railway: export RAILWAY_API_KEY=xxx RAILWAY_PROJECT_ID=xxx RAILWAY_ENVIRONMENT_ID=xxx\\n` +\n ` Daytona: export DAYTONA_API_KEY=xxx\\n` +\n ` Modal: export MODAL_TOKEN_ID=xxx MODAL_TOKEN_SECRET=xxx\\n` +\n ` Runloop: export RUNLOOP_API_KEY=xxx\\n` +\n ` Vercel: export VERCEL_TOKEN=xxx VERCEL_TEAM_ID=xxx VERCEL_PROJECT_ID=xxx\\n` +\n ` Cloudflare: export CLOUDFLARE_API_TOKEN=xxx CLOUDFLARE_ACCOUNT_ID=xxx\\n` +\n ` CodeSandbox: export CSB_API_KEY=xxx\\n` +\n ` Blaxel: export BL_API_KEY=xxx BL_WORKSPACE=xxx\\n\\n` +\n `Or set COMPUTESDK_PROVIDER to specify explicitly:\\n` +\n ` export COMPUTESDK_PROVIDER=e2b\\n\\n` +\n `Docs: https://computesdk.com/docs/quickstart`\n );\n }\n\n const gatewayUrl = process.env.COMPUTESDK_GATEWAY_URL || GATEWAY_URL;\n const computesdkApiKey = process.env.COMPUTESDK_API_KEY!;\n const providerHeaders = getProviderHeaders(provider);\n\n // Validate gateway URL\n try {\n new URL(gatewayUrl);\n } catch (error) {\n throw new Error(\n `Invalid gateway URL: \"${gatewayUrl}\"\\n\\n` +\n `The URL must be a valid HTTP/HTTPS URL.\\n` +\n `Check your COMPUTESDK_GATEWAY_URL environment variable.`\n );\n }\n\n // Debug logging if enabled\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`✨ ComputeSDK: Auto-detected ${provider} provider`);\n console.log(`🌐 Gateway: ${gatewayUrl}`);\n console.log(`🔑 Provider headers:`, Object.keys(providerHeaders).join(', '));\n }\n\n const config: GatewayConfig = {\n apiKey: computesdkApiKey,\n gatewayUrl,\n provider,\n providerHeaders\n };\n \n return config;\n}\n","/**\n * Explicit Config\n *\n * Converts explicit compute configuration to gateway config.\n * Used when compute() is called as a function with configuration.\n */\n\nimport type { ExplicitComputeConfig } from './compute';\nimport type { GatewayConfig } from './auto-detect';\nimport {\n PROVIDER_AUTH,\n PROVIDER_HEADERS,\n PROVIDER_DASHBOARD_URLS,\n PROVIDER_ENV_MAP,\n type ProviderName,\n} from './provider-config';\nimport { GATEWAY_URL } from './constants';\n\n/**\n * Build provider-specific headers for gateway authentication\n */\nfunction buildProviderHeaders(config: ExplicitComputeConfig): Record<string, string> {\n const headers: Record<string, string> = {};\n const provider = config.provider as ProviderName;\n const headerMap = PROVIDER_HEADERS[provider];\n const providerConfig = config[provider] as Record<string, string | undefined> | undefined;\n\n if (!providerConfig || !headerMap) return headers;\n\n for (const [configKey, headerName] of Object.entries(headerMap)) {\n const value = providerConfig[configKey];\n if (value) {\n headers[headerName] = value;\n }\n }\n\n return headers;\n}\n\n/**\n * Validate that the config has the required provider-specific credentials\n */\nfunction validateProviderConfig(config: ExplicitComputeConfig): void {\n const provider = config.provider as ProviderName;\n const authOptions = PROVIDER_AUTH[provider];\n const providerConfig = config[provider] as Record<string, string | undefined> | undefined;\n const dashboardUrl = PROVIDER_DASHBOARD_URLS[provider];\n\n if (!authOptions) {\n throw new Error(`Unknown provider: ${provider}`);\n }\n\n // Check if any auth option is satisfied\n // For explicit mode, we check config fields instead of env vars\n for (const option of authOptions) {\n // Map env vars to config field names and check if all are present\n const allPresent = option.every(envVar => {\n const configField = envVarToConfigField(provider, envVar);\n return providerConfig?.[configField];\n });\n\n if (allPresent) return; // Valid config found\n }\n\n // No valid config found, build helpful error message\n const configExample = buildConfigExample(provider, authOptions);\n throw new Error(\n `Missing ${provider} configuration. When using provider: '${provider}', you must provide:\\n` +\n `${configExample}\\n\\n` +\n `Get your credentials at: ${dashboardUrl}`\n );\n}\n\n/**\n * Map environment variable name to config field name\n * Uses shared PROVIDER_ENV_MAP as single source of truth\n */\nfunction envVarToConfigField(provider: ProviderName, envVar: string): string {\n return PROVIDER_ENV_MAP[provider]?.[envVar] ?? envVar.toLowerCase();\n}\n\n/**\n * Build example config for error message\n */\nfunction buildConfigExample(provider: ProviderName, authOptions: readonly (readonly string[])[]): string {\n if (authOptions.length === 1) {\n // Single option\n const fields = authOptions[0].map(envVar => {\n const field = envVarToConfigField(provider, envVar);\n return `${field}: '...'`;\n });\n return ` ${provider}: { ${fields.join(', ')} }`;\n }\n\n // Multiple options (like Vercel with OIDC or traditional)\n const options = authOptions.map((option, i) => {\n const fields = option.map(envVar => {\n const field = envVarToConfigField(provider, envVar);\n return `${field}: '...'`;\n });\n return ` Option ${i + 1}:\\n ${provider}: { ${fields.join(', ')} }`;\n });\n\n return options.join('\\n\\n');\n}\n\n/**\n * Create gateway configuration from explicit configuration\n *\n * @param config - Explicit compute configuration\n * @returns Gateway configuration object\n */\nexport function createConfigFromExplicit(config: ExplicitComputeConfig): GatewayConfig {\n // Validate required fields\n if (!config.apiKey) {\n throw new Error(\n `Missing ComputeSDK API key. The 'apiKey' field is required.\\n\\n` +\n `Get your API key at: https://computesdk.com/dashboard`\n );\n }\n\n // Validate provider-specific config\n validateProviderConfig(config);\n\n // Build provider headers\n const providerHeaders = buildProviderHeaders(config);\n\n // Create and return gateway config\n return {\n apiKey: config.apiKey,\n gatewayUrl: config.gatewayUrl || GATEWAY_URL,\n provider: config.provider,\n providerHeaders,\n };\n}\n","/**\n * Compute daemon lifecycle management\n *\n * Handles health checks and waiting for the compute daemon\n * to become ready after installation.\n */\n\nimport { Sandbox } from '../client';\n\n/**\n * Options for waiting for compute daemon to be ready\n */\nexport interface WaitForComputeReadyOptions {\n /** Maximum number of retry attempts (default: 30) */\n maxRetries?: number;\n /** Initial delay between retries in milliseconds (default: 500) */\n initialDelayMs?: number;\n /** Maximum delay between retries in milliseconds (default: 5000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 1.5) */\n backoffFactor?: number;\n}\n\n/**\n * Wait for compute daemon to be ready by polling the health endpoint\n * with exponential backoff for faster success and less noise\n */\nexport async function waitForComputeReady(\n client: Sandbox,\n options: WaitForComputeReadyOptions = {}\n): Promise<void> {\n const maxRetries = options.maxRetries ?? 30;\n const initialDelayMs = options.initialDelayMs ?? 500;\n const maxDelayMs = options.maxDelayMs ?? 5000;\n const backoffFactor = options.backoffFactor ?? 1.5;\n\n let lastError: Error | null = null;\n let currentDelay = initialDelayMs;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n await client.health();\n \n // Success! Log if in debug mode\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Lifecycle] Sandbox ready after ${i + 1} attempt${i === 0 ? '' : 's'}`);\n }\n \n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // On last attempt, throw detailed error\n if (i === maxRetries - 1) {\n throw new Error(\n `Sandbox failed to become ready after ${maxRetries} attempts.\\n` +\n `Last error: ${lastError.message}\\n\\n` +\n `Possible causes:\\n` +\n ` 1. Sandbox failed to start (check provider dashboard for errors)\\n` +\n ` 2. Network connectivity issues between your app and the sandbox\\n` +\n ` 3. Sandbox is taking longer than expected to initialize\\n` +\n ` 4. Invalid sandbox URL or authentication credentials\\n\\n` +\n `Troubleshooting:\\n` +\n ` - Check sandbox logs in your provider dashboard\\n` +\n ` - Verify your network connection\\n` +\n ` - Try increasing maxRetries if initialization is slow\\n` +\n ` - Enable debug mode: export COMPUTESDK_DEBUG=1`\n );\n }\n\n // Wait with exponential backoff before next attempt\n await new Promise(resolve => setTimeout(resolve, currentDelay));\n \n // Increase delay for next attempt (exponential backoff with cap)\n currentDelay = Math.min(currentDelay * backoffFactor, maxDelayMs);\n }\n }\n}\n","/**\n * Compute API - Gateway HTTP Implementation\n *\n * Provides the unified compute.* API using direct HTTP calls to the gateway.\n * The `compute` export works as both a singleton and a callable function:\n *\n * - Singleton: `compute.sandbox.create()` (auto-detects from env vars)\n * - Callable: `compute({ provider: 'e2b', ... }).sandbox.create()` (explicit config)\n */\n\nimport { Sandbox } from './client';\nimport { autoConfigureCompute } from './auto-detect';\nimport { createConfigFromExplicit } from './explicit-config';\nimport { waitForComputeReady } from './compute-daemon/lifecycle';\nimport { GATEWAY_URL } from './constants';\nimport type { ProviderName } from './provider-config';\n\n/**\n * Gateway configuration\n */\ninterface GatewayConfig {\n apiKey: string;\n gatewayUrl: string;\n provider: string;\n providerHeaders: Record<string, string>;\n}\n\n/**\n * Explicit compute configuration for callable mode\n */\nexport interface ExplicitComputeConfig {\n /** Provider name to use */\n provider: ProviderName;\n /** ComputeSDK API key (required for gateway mode) */\n apiKey: string;\n /** Optional gateway URL override */\n gatewayUrl?: string;\n\n /** Provider-specific configurations */\n e2b?: { apiKey?: string; projectId?: string; templateId?: string };\n modal?: { tokenId?: string; tokenSecret?: string };\n railway?: { apiToken?: string; projectId?: string; environmentId?: string };\n daytona?: { apiKey?: string };\n vercel?: { oidcToken?: string; token?: string; teamId?: string; projectId?: string };\n runloop?: { apiKey?: string };\n cloudflare?: { apiToken?: string; accountId?: string };\n codesandbox?: { apiKey?: string };\n blaxel?: { apiKey?: string; workspace?: string };\n}\n\n/**\n * Options for creating a sandbox via the gateway\n * \n * Note: Runtime is determined by the provider, not specified at creation time.\n * Use sandbox.runCode(code, runtime) to specify which runtime to use for execution.\n */\nexport interface CreateSandboxOptions {\n timeout?: number;\n templateId?: string;\n metadata?: Record<string, any>;\n envs?: Record<string, string>;\n name?: string;\n namespace?: string;\n}\n\n/**\n * Options for finding or creating a named sandbox\n */\nexport interface FindOrCreateSandboxOptions extends CreateSandboxOptions {\n name: string;\n namespace?: string;\n}\n\n/**\n * Options for finding a named sandbox\n */\nexport interface FindSandboxOptions {\n name: string;\n namespace?: string;\n}\n\n/**\n * Options for extending sandbox timeout\n */\nexport interface ExtendTimeoutOptions {\n duration?: number;\n}\n\n/**\n * Helper to call gateway API with retry logic\n */\nasync function gatewayFetch<T>(\n url: string,\n config: GatewayConfig,\n options: RequestInit = {}\n): Promise<{ success: boolean; data?: T }> {\n const timeout = 30000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n 'X-ComputeSDK-API-Key': config.apiKey,\n 'X-Provider': config.provider,\n ...config.providerHeaders,\n ...options.headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 404) {\n return { success: false };\n }\n\n const errorText = await response.text().catch(() => response.statusText);\n \n // Build helpful error message\n let errorMessage = `Gateway API error: ${errorText}`;\n if (response.status === 401) {\n errorMessage = `Invalid ComputeSDK API key. Check your COMPUTESDK_API_KEY environment variable.`;\n } else if (response.status === 403) {\n errorMessage = `Access forbidden. Your API key may not have permission to use provider \"${config.provider}\".`;\n }\n\n throw new Error(errorMessage);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n \n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timed out after ${timeout}ms`);\n }\n \n throw error;\n }\n}\n\n/**\n * Compute singleton implementation\n */\nclass ComputeManager {\n private config: GatewayConfig | null = null;\n private autoConfigured = false;\n\n /**\n * Lazy auto-configure from environment if not explicitly configured\n */\n private ensureConfigured(): void {\n if (this.config) return;\n if (this.autoConfigured) return;\n\n const config = autoConfigureCompute();\n this.autoConfigured = true;\n\n if (config) {\n this.config = config;\n }\n }\n\n /**\n * Get gateway config, throwing if not configured\n */\n private getGatewayConfig(): GatewayConfig {\n this.ensureConfigured();\n\n if (!this.config) {\n throw new Error(\n 'No ComputeSDK configuration found.\\n\\n' +\n 'Options:\\n' +\n '1. Zero-config: Set COMPUTESDK_API_KEY and provider credentials (e.g., E2B_API_KEY)\\n' +\n '2. Explicit: Call compute.setConfig({ provider: \"e2b\", apiKey: \"...\", e2b: { apiKey: \"...\" } })\\n' +\n '3. Use provider directly: import { e2b } from \\'@computesdk/e2b\\'\\n\\n' +\n 'Docs: https://computesdk.com/docs/quickstart'\n );\n }\n\n return this.config;\n }\n\n /**\n * Explicitly configure the compute singleton\n * \n * @example\n * ```typescript\n * import { compute } from 'computesdk';\n * \n * compute.setConfig({\n * provider: 'e2b',\n * apiKey: 'computesdk_xxx',\n * e2b: { apiKey: 'e2b_xxx' }\n * });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\n setConfig(config: ExplicitComputeConfig): void {\n const gatewayConfig = createConfigFromExplicit(config);\n this.config = gatewayConfig;\n this.autoConfigured = false;\n }\n\n sandbox = {\n /**\n * Create a new sandbox\n */\n create: async (options?: CreateSandboxOptions): Promise<Sandbox> => {\n const config = this.getGatewayConfig();\n\n const result = await gatewayFetch<{\n sandboxId: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n name?: string;\n namespace?: string;\n }>(`${config.gatewayUrl}/v1/sandboxes`, config, {\n method: 'POST',\n body: JSON.stringify(options || {}),\n });\n\n if (!result.success || !result.data) {\n throw new Error(`Gateway returned invalid response`);\n }\n\n const { sandboxId, url, token, provider, metadata, name, namespace } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata: {\n ...metadata,\n ...(name && { name }),\n ...(namespace && { namespace }),\n },\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * Get an existing sandbox by ID\n */\n getById: async (sandboxId: string): Promise<Sandbox | null> => {\n const config = this.getGatewayConfig();\n\n const result = await gatewayFetch<{\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n }>(`${config.gatewayUrl}/v1/sandboxes/${sandboxId}`, config);\n\n if (!result.success || !result.data) {\n return null;\n }\n\n const { url, token, provider, metadata } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata,\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * List all active sandboxes\n */\n list: async (): Promise<Sandbox[]> => {\n throw new Error(\n 'The gateway does not support listing sandboxes. Use getById() with a known sandbox ID instead.'\n );\n },\n\n /**\n * Destroy a sandbox\n */\n destroy: async (sandboxId: string): Promise<void> => {\n const config = this.getGatewayConfig();\n\n await gatewayFetch(`${config.gatewayUrl}/v1/sandboxes/${sandboxId}`, config, {\n method: 'DELETE',\n });\n },\n\n /**\n * Find existing or create new sandbox by (namespace, name)\n */\n findOrCreate: async (options: FindOrCreateSandboxOptions): Promise<Sandbox> => {\n const config = this.getGatewayConfig();\n\n const { name, namespace, ...restOptions } = options;\n\n const result = await gatewayFetch<{\n sandboxId: string;\n name: string;\n namespace: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n }>(`${config.gatewayUrl}/v1/sandboxes/find-or-create`, config, {\n method: 'POST',\n body: JSON.stringify({\n namespace: namespace || 'default',\n name,\n ...restOptions,\n }),\n });\n\n if (!result.success || !result.data) {\n throw new Error(`Gateway returned invalid response`);\n }\n\n const { sandboxId, url, token, provider, metadata } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata: {\n ...metadata,\n name: result.data.name,\n namespace: result.data.namespace,\n },\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * Find existing sandbox by (namespace, name) without creating\n */\n find: async (options: FindSandboxOptions): Promise<Sandbox | null> => {\n const config = this.getGatewayConfig();\n\n const result = await gatewayFetch<{\n sandboxId: string;\n name: string;\n namespace: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n } | null>(`${config.gatewayUrl}/v1/sandboxes/find`, config, {\n method: 'POST',\n body: JSON.stringify({\n namespace: options.namespace || 'default',\n name: options.name,\n }),\n });\n\n if (!result.success || !result.data) {\n return null;\n }\n\n const { sandboxId, url, token, provider, metadata, name, namespace } = result.data;\n\n const sandbox = new Sandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey,\n metadata: {\n ...metadata,\n name,\n namespace,\n },\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return sandbox;\n },\n\n /**\n * Extend sandbox timeout/expiration\n */\n extendTimeout: async (sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> => {\n const config = this.getGatewayConfig();\n const duration = options?.duration ?? 900000; // Default to 15 minutes\n\n await gatewayFetch(`${config.gatewayUrl}/v1/sandboxes/${sandboxId}/extend`, config, {\n method: 'POST',\n body: JSON.stringify({ duration }),\n });\n },\n };\n}\n\n/**\n * Singleton instance\n */\nconst singletonInstance = new ComputeManager();\n\n/**\n * Factory function for explicit configuration\n */\nfunction computeFactory(config: ExplicitComputeConfig): ComputeManager {\n const gatewayConfig = createConfigFromExplicit(config);\n const manager = new ComputeManager();\n manager['config'] = gatewayConfig;\n return manager;\n}\n\n/**\n * Callable compute interface - dual nature as both singleton and factory\n * \n * This interface represents the compute export's two modes:\n * 1. As a ComputeManager singleton (accessed via properties like compute.sandbox)\n * 2. As a factory function (called with config to create new instances)\n */\ninterface CallableCompute extends ComputeManager {\n /** Create a new compute instance with explicit configuration */\n (config: ExplicitComputeConfig): ComputeManager;\n /** Explicitly configure the singleton */\n setConfig(config: ExplicitComputeConfig): void;\n}\n\n/**\n * Callable compute - works as both singleton and factory function\n *\n * @example\n * ```typescript\n * import { compute } from 'computesdk';\n *\n * // Singleton mode (auto-detects from env vars)\n * const sandbox1 = await compute.sandbox.create();\n *\n * // Callable mode (explicit config)\n * const sandbox2 = await compute({\n * provider: 'e2b',\n * apiKey: 'computesdk_xxx',\n * e2b: { apiKey: 'e2b_xxx' }\n * }).sandbox.create();\n * ```\n */\nexport const compute: CallableCompute = new Proxy(\n computeFactory as any,\n {\n get(_target, prop, _receiver) {\n const singleton = singletonInstance as any;\n const value = singleton[prop];\n if (typeof value === 'function') {\n return value.bind(singletonInstance);\n }\n return value;\n },\n apply(_target, _thisArg, args) {\n return computeFactory(args[0] as ExplicitComputeConfig);\n }\n }\n);\n"],"mappings":"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","names":["MessageType","cmd","decodeBase64","buildProviderHeaders"]}