computesdk 1.8.7 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/sandbox.ts","../src/auth/license.ts","../src/compute-daemon/dependencies.ts","../src/compute-daemon/installer.ts","../src/sandbox/wrapper.ts","../src/compute-daemon/lifecycle.ts","../src/compute.ts","../src/request-handler.ts","../src/factory.ts"],"sourcesContent":["/**\n * Sandbox Types\n * \n * Types related to sandbox execution, filesystem, terminal operations\n */\n\n// Forward declaration to avoid circular dependency\ninterface Provider {\n readonly name: string;\n readonly sandbox: any; // Will be properly typed when imported together\n}\n\n/**\n * Type mapping for provider names to their sandbox types\n * Manually defined for known providers since declaration merging isn't working reliably\n */\nexport interface ProviderSandboxTypeMap {\n e2b: any; // We can't import the E2B type directly, but we'll handle it differently\n vercel: any;\n daytona: any;\n}\n\n/**\n * Utility type to extract the native instance type from a provider\n * Uses provider name and manual type inference\n */\nexport type ExtractSandboxInstanceType<TProvider extends Provider> = \n TProvider extends { readonly name: 'e2b' }\n ? any // For now, let's just try to make the runtime casting work\n : TProvider extends { readonly name: 'vercel' }\n ? any\n : TProvider extends { readonly name: 'daytona' }\n ? any\n : any;\n\n/**\n * Supported runtime environments\n */\nexport type Runtime = 'node' | 'python';\n\n/**\n * Sandbox status types\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Options for running commands\n */\nexport interface RunCommandOptions {\n /** Run command in background (non-blocking) */\n background?: boolean;\n}\n\n/**\n * Result of code execution\n */\nexport interface ExecutionResult {\n /** Standard output from the execution */\n stdout: string;\n /** Standard error from the execution */\n stderr: string;\n /** Exit code from the execution */\n exitCode: number;\n /** Time taken for execution in milliseconds */\n executionTime: number;\n /** ID of the sandbox where the code was executed */\n sandboxId: string;\n /** Provider that executed the code */\n provider: string;\n /** Process ID for background jobs (if applicable) */\n pid?: number;\n /** Whether this command is running in background */\n isBackground?: boolean;\n}\n\n/**\n * Information about a sandbox\n */\nexport interface SandboxInfo {\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: Runtime;\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 * Options for creating a sandbox\n */\nexport interface CreateSandboxOptions {\n /** Runtime environment (defaults to 'node' if not specified) */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Custom sandbox ID (if supported by provider) */\n sandboxId?: string;\n /** Template ID for sandbox creation (provider-specific) */\n templateId?: string;\n /** Additional metadata for the sandbox */\n metadata?: Record<string, any>;\n /** Domain for sandbox connection (provider-specific) */\n domain?: string;\n /** Environment variables for the sandbox */\n envs?: Record<string, string>;\n}\n\n/**\n * File system entry information\n */\nexport interface FileEntry {\n /** File/directory name */\n name: string;\n /** Full path to the entry */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified timestamp */\n lastModified: Date;\n}\n\n/**\n * File system interface for sandbox operations\n */\nexport interface SandboxFileSystem {\n /** Read file contents */\n readFile(path: string): Promise<string>;\n /** Write file contents */\n writeFile(path: string, content: string): Promise<void>;\n /** Create directory */\n mkdir(path: string): Promise<void>;\n /** List directory contents */\n readdir(path: string): Promise<FileEntry[]>;\n /** Check if file/directory exists */\n exists(path: string): Promise<boolean>;\n /** Remove file or directory */\n remove(path: string): Promise<void>;\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\n\n\n\n/**\n * Base sandbox interface - what developers interact with\n */\nexport interface Sandbox<TSandbox = any> {\n /** Unique identifier for the sandbox */\n readonly sandboxId: string;\n /** Provider that created this sandbox */\n readonly provider: string;\n\n /** Execute code in the sandbox */\n runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;\n /** Execute shell commands */\n runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult>;\n /** Get information about the sandbox */\n getInfo(): Promise<SandboxInfo>;\n /** Get URL for accessing the sandbox on a specific port */\n getUrl(options: { port: number; protocol?: string }): Promise<string>;\n /** Get the provider instance that created this sandbox */\n getProvider(): import('./provider').Provider<TSandbox>;\n /** Get the native provider sandbox instance with proper typing */\n getInstance(): TSandbox;\n /** Kill the sandbox */\n kill(): Promise<void>;\n /** Destroy the sandbox and clean up resources */\n destroy(): Promise<void>;\n\n /** File system operations */\n readonly filesystem: SandboxFileSystem;\n}\n\n/**\n * Extract the sandbox type from a provider\n */\ntype ExtractProviderSandboxType<TProvider extends Provider> = TProvider extends { readonly __sandboxType: infer TSandbox } ? TSandbox : any;\n\n/**\n * Typed sandbox interface that preserves the provider's native instance type\n */\nexport interface TypedSandbox<TProvider extends Provider> extends Omit<Sandbox<ExtractProviderSandboxType<TProvider>>, 'getProvider'> {\n /** Get the provider instance that created this sandbox with proper typing */\n getProvider(): TProvider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance(): ExtractProviderSandboxType<TProvider>;\n}\n\n/**\n * Enhanced sandbox type that includes ComputeClient features\n *\n * When a sandbox is created with an API key/JWT, it gets wrapped with ComputeClient\n * which adds powerful features like WebSocket terminals, file watchers, and signals.\n *\n * @example\n * ```typescript\n * const sandbox = await compute.sandbox.create();\n *\n * // ComputeClient features (only available when API key is configured)\n * const terminal = await sandbox.createTerminal();\n * const watcher = await sandbox.createWatcher('/home/project');\n * const signals = await sandbox.startSignals();\n *\n * // Original sandbox features still work\n * await sandbox.runCommand('ls');\n * const instance = sandbox.getInstance();\n * ```\n */\nexport type ComputeEnhancedSandbox<TSandbox = any> = Sandbox<TSandbox> & {\n /** The original provider sandbox instance */\n __originalSandbox: Sandbox<TSandbox>;\n\n // ComputeClient enhanced features\n /** Create a persistent terminal session with WebSocket integration */\n createTerminal(shell?: string, encoding?: 'raw' | 'base64'): Promise<import('@computesdk/client').Terminal>;\n /** Create a file watcher with real-time change notifications */\n createWatcher(path: string, options?: {\n includeContent?: boolean;\n ignored?: string[];\n encoding?: 'raw' | 'base64';\n }): Promise<import('@computesdk/client').FileWatcher>;\n /** Start the signal service for port and error monitoring */\n startSignals(): Promise<import('@computesdk/client').SignalService>;\n /** Execute a one-off command without creating a persistent terminal */\n execute(options: { command: string; shell?: string }): Promise<any>;\n /** List all active terminals */\n listTerminals(): Promise<any[]>;\n /** Get terminal by ID */\n getTerminal(id: string): Promise<any>;\n /** List all active file watchers */\n listWatchers(): Promise<any>;\n /** Get file watcher by ID */\n getWatcher(id: string): Promise<any>;\n /** Get signal service status */\n getSignalStatus(): Promise<any>;\n /** Create a session token (requires access token) */\n createSessionToken(options?: { description?: string; expiresIn?: number }): Promise<any>;\n /** List all session tokens (requires access token) */\n listSessionTokens(): Promise<any>;\n /** Get session token details (requires access token) */\n getSessionToken(tokenId: string): Promise<any>;\n /** Revoke a session token (requires access token) */\n revokeSessionToken(tokenId: string): Promise<void>;\n /** Create a magic link for browser authentication (requires access token) */\n createMagicLink(options?: { redirectUrl?: string }): Promise<any>;\n /** Check authentication status */\n getAuthStatus(): Promise<any>;\n /** Get authentication information */\n getAuthInfo(): Promise<any>;\n /** Set authentication token manually */\n setToken(token: string): void;\n /** Get current authentication token */\n getToken(): string | null;\n /** Get current sandbox URL */\n getSandboxUrl(): string;\n /** Disconnect WebSocket connection */\n disconnect(): Promise<void>;\n}\n\n/**\n * Typed enhanced sandbox that preserves both provider typing and ComputeClient features\n */\nexport type TypedEnhancedSandbox<TProvider extends Provider> =\n ComputeEnhancedSandbox<ExtractProviderSandboxType<TProvider>> &\n Omit<TypedSandbox<TProvider>, keyof Sandbox>;","/**\n * License authorization and token management\n *\n * Handles API key exchange with the license server to obtain\n * JWT access tokens and sandbox URLs.\n */\n\n/**\n * Authorization response from license server\n */\nexport interface AuthorizationResponse {\n access_token: string;\n sandbox_url: string;\n preview_url: string;\n}\n\n/**\n * Authorize license key and get JWT token + URLs from license server\n */\nexport async function authorizeApiKey(apiKey: string): Promise<AuthorizationResponse> {\n try {\n const response = await fetch('https://sandbox.computesdk.com/__api/license/authorize', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n key: apiKey,\n increment_usage: 1\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`License authorization failed (${response.status}): ${errorText}`);\n }\n\n const data = await response.json();\n\n if (!data.access_token) {\n throw new Error('No access token received from license server');\n }\n\n if (!data.sandbox_url) {\n throw new Error('No sandbox_url received from license server');\n }\n\n if (!data.preview_url) {\n throw new Error('No preview_url received from license server');\n }\n\n return {\n access_token: data.access_token,\n sandbox_url: data.sandbox_url,\n preview_url: data.preview_url\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes('License authorization failed')) {\n throw error; // Re-throw our formatted error\n }\n // Network or other errors\n throw new Error(`Failed to authorize API key (network error): ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","/**\n * Dependency management for compute daemon installation\n *\n * Handles detection and installation of required system dependencies\n * (curl and bash) needed to run the compute daemon install script.\n */\n\nimport type { Sandbox } from '../types';\n\n/**\n * Check if a command is available in the sandbox\n */\nasync function isCommandAvailable(sandbox: Sandbox, command: string): Promise<boolean> {\n const result = await sandbox.runCommand('sh', ['-c', `command -v ${command}`]);\n return result.exitCode === 0;\n}\n\n/**\n * Detect package manager available in the sandbox\n */\nexport async function detectPackageManager(sandbox: Sandbox): Promise<'apk' | 'apt' | null> {\n // Try Alpine's apk first (most common in minimal containers)\n if (await isCommandAvailable(sandbox, 'apk')) {\n return 'apk';\n }\n\n // Fall back to Debian/Ubuntu apt\n if (await isCommandAvailable(sandbox, 'apt-get')) {\n return 'apt';\n }\n\n return null;\n}\n\n/**\n * Install required dependencies (curl and bash) if missing\n */\nexport async function ensureDependencies(sandbox: Sandbox): Promise<void> {\n const hasCurl = await isCommandAvailable(sandbox, 'curl');\n const hasBash = await isCommandAvailable(sandbox, 'bash');\n\n // If both are available, nothing to do\n if (hasCurl && hasBash) {\n return;\n }\n\n const packageManager = await detectPackageManager(sandbox);\n\n if (!packageManager) {\n throw new Error(\n `Missing required tools (curl: ${hasCurl}, bash: ${hasBash}), but no supported package manager found.\\n` +\n `Supported package managers: apk (Alpine), apt-get (Debian/Ubuntu).\\n` +\n `Please use a sandbox image that includes curl and bash, or install them manually first.`\n );\n }\n\n let installResult;\n\n if (packageManager === 'apk') {\n // Alpine Linux\n installResult = await sandbox.runCommand('sh', ['-c', 'apk add --no-cache curl bash 2>&1']);\n } else {\n // Debian/Ubuntu\n installResult = await sandbox.runCommand('sh', ['-c', 'apt-get update -qq && apt-get install -qq -y curl bash 2>&1']);\n }\n\n if (installResult.exitCode !== 0) {\n throw new Error(\n `Failed to install curl and bash using ${packageManager}.\\n` +\n `Install output: ${installResult.stderr || installResult.stdout}\\n` +\n `Please install curl and bash manually or use a different sandbox image.`\n );\n }\n}\n","/**\n * Compute daemon installation orchestration\n *\n * Handles downloading and installing the compute daemon binary\n * inside sandboxes, including dependency management and verification.\n */\n\nimport type { Sandbox } from '../types';\nimport type { AuthorizationResponse } from '../auth/license';\nimport { ensureDependencies } from './dependencies';\n\n/**\n * Check if compute daemon is already installed in the sandbox\n */\nasync function isComputeInstalled(sandbox: Sandbox): Promise<boolean> {\n const result = await sandbox.runCommand('sh', ['-c', 'test -f /usr/local/bin/compute && echo \"exists\" || echo \"missing\"']);\n return result.stdout?.trim() === 'exists';\n}\n\n/**\n * Download the compute install script\n */\nasync function downloadInstallScript(sandbox: Sandbox): Promise<void> {\n const downloadResult = await sandbox.runCommand('sh', ['-c', 'curl -fsSL https://computesdk.com/install.sh -o /tmp/compute-install.sh 2>&1']);\n\n if (downloadResult.exitCode !== 0) {\n const errorOutput = downloadResult.stderr || downloadResult.stdout || 'unknown error';\n throw new Error(\n `Failed to download install script from https://computesdk.com/install.sh: ${errorOutput}`\n );\n }\n}\n\n/**\n * Run the compute install script\n */\nasync function runInstallScript(sandbox: Sandbox, accessToken?: string): Promise<void> {\n const installCommand = accessToken\n ? `bash /tmp/compute-install.sh --non-interactive --access-token \"${accessToken}\" --location /usr/local/bin`\n : `bash /tmp/compute-install.sh --non-interactive --location /usr/local/bin`;\n\n const installResult = await sandbox.runCommand('bash', ['-c', installCommand]);\n\n if (installResult.exitCode !== 0) {\n const errorOutput = installResult.stderr || installResult.stdout || 'unknown error';\n throw new Error(`Failed to install compute daemon: ${errorOutput}`);\n }\n}\n\n/**\n * Install and start compute daemon inside a sandbox\n *\n * This is the main installation orchestrator that:\n * 1. Checks if compute is already installed\n * 2. Ensures curl and bash are available (installs if needed)\n * 3. Downloads the install script\n * 4. Runs the install script with proper credentials\n * 5. Verifies the installation succeeded\n */\nexport async function installComputeDaemon(\n sandbox: Sandbox,\n accessToken?: string\n): Promise<void> {\n // Check if compute is already installed\n if (await isComputeInstalled(sandbox)) {\n return;\n }\n\n // Ensure required dependencies are available\n await ensureDependencies(sandbox);\n\n // Download install script\n await downloadInstallScript(sandbox);\n\n // Run install script with credentials\n await runInstallScript(sandbox, accessToken);\n\n // Verify installation succeeded\n if (!await isComputeInstalled(sandbox)) {\n throw new Error('Compute binary not found at /usr/local/bin/compute after installation');\n }\n}\n","/**\n * Sandbox wrapper with ComputeClient enhancement\n *\n * Wraps provider sandboxes with ComputeClient to add powerful features\n * like WebSocket terminals, file watchers, and signals while preserving\n * access to the original provider-specific instance.\n */\n\nimport { ComputeClient } from '@computesdk/client';\nimport type { Sandbox, ComputeEnhancedSandbox } from '../types';\nimport type { AuthorizationResponse } from '../auth/license';\nimport { waitForComputeReady } from '../compute-daemon/lifecycle';\n\n/**\n * Wrap a provider sandbox with ComputeClient while preserving the original sandbox\n * This adds powerful features like WebSocket terminals, file watchers, and signals\n */\nexport async function wrapWithComputeClient(\n originalSandbox: Sandbox,\n authResponse: AuthorizationResponse\n): Promise<ComputeEnhancedSandbox> {\n const client = new ComputeClient({\n sandboxUrl: authResponse.sandbox_url,\n sandboxId: originalSandbox.sandboxId,\n provider: originalSandbox.provider,\n token: authResponse.access_token,\n WebSocket: globalThis.WebSocket\n });\n\n // Wait for compute daemon to be ready before returning\n await waitForComputeReady(client);\n\n // Store the original sandbox for getInstance() and getProvider() calls\n // We create a proxy-like object that delegates most calls to ComputeClient\n // but preserves access to the original provider sandbox\n const wrappedSandbox = Object.assign(client, {\n __originalSandbox: originalSandbox,\n\n // Override getInstance to return the original provider's instance\n getInstance: () => originalSandbox.getInstance(),\n\n // Override getProvider to return the original provider\n getProvider: () => originalSandbox.getProvider()\n });\n\n return wrappedSandbox as ComputeEnhancedSandbox;\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 { ComputeClient } from '@computesdk/client';\n\n/**\n * Wait for compute daemon to be ready by polling the health endpoint\n */\nexport async function waitForComputeReady(\n client: ComputeClient,\n maxRetries = 30,\n delayMs = 2000\n): Promise<void> {\n let lastError: Error | null = null;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n await client.health();\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Only log on last attempt to avoid noise\n if (i === maxRetries - 1) {\n throw new Error(\n `Compute daemon failed to start after ${maxRetries} attempts (${maxRetries * delayMs / 1000}s).\\n` +\n `Last error: ${lastError.message}\\n` +\n `This could indicate:\\n` +\n ` 1. The compute daemon failed to start in the sandbox\\n` +\n ` 2. The sandbox_url is incorrect or unreachable\\n` +\n ` 3. The sandbox is taking longer than expected to initialize`\n );\n }\n\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n}\n","/**\n * Compute Singleton - Main API Orchestrator\n *\n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, Sandbox, Provider, TypedSandbox, TypedComputeAPI, ComputeEnhancedSandbox, TypedEnhancedSandbox } from './types';\nimport { authorizeApiKey, type AuthorizationResponse } from './auth/license';\nimport { installComputeDaemon } from './compute-daemon/installer';\nimport { wrapWithComputeClient } from './sandbox/wrapper';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private config: ComputeConfig | null = null;\n private computeAuth: { apiKey?: string; accessToken?: string } = {};\n\n /**\n * Set default configuration with generic type preservation\n */\n setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void {\n // Validate that at least one provider is specified\n if (!config.defaultProvider && !config.provider) {\n throw new Error('Either defaultProvider or provider must be specified in setConfig');\n }\n\n // Handle backwards compatibility: if both are provided, defaultProvider takes precedence\n if (config.defaultProvider && config.provider) {\n console.warn('Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.');\n }\n\n // Normalize config to always have both fields for internal use (backward compatibility)\n const actualProvider = config.defaultProvider || config.provider!;\n const accessToken = config.accessToken || config.jwt; // Support both accessToken and deprecated jwt\n this.config = {\n provider: actualProvider,\n defaultProvider: actualProvider,\n apiKey: config.apiKey,\n accessToken: accessToken\n };\n\n // Store compute auth credentials\n this.computeAuth = {\n apiKey: config.apiKey,\n accessToken: accessToken\n };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n const provider = this.config?.defaultProvider || this.config?.provider;\n if (!provider) {\n throw new Error(\n 'No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly.'\n );\n }\n return provider;\n }\n\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n * \n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n * \n * // With default provider (both forms work)\n * compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })\n * const sandbox1 = await compute.sandbox.create({})\n * const sandbox2 = await compute.sandbox.create()\n * ```\n */\n create: async (params?: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<Sandbox | ComputeEnhancedSandbox> => {\n const provider = params && 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params?.options;\n const sandbox = await provider.sandbox.create(options);\n\n // Install compute daemon and wrap with ComputeClient if auth is configured\n if (this.computeAuth.apiKey || this.computeAuth.accessToken) {\n // Get access token from API key if needed\n let authResponse: AuthorizationResponse | null = null;\n let accessToken = this.computeAuth.accessToken;\n\n if (this.computeAuth.apiKey && !accessToken) {\n authResponse = await authorizeApiKey(this.computeAuth.apiKey);\n accessToken = authResponse.access_token;\n }\n\n // Install compute daemon in the sandbox\n await installComputeDaemon(sandbox, accessToken);\n\n // Wrap with ComputeClient if we have authorization info\n // This adds features like createTerminal(), createWatcher(), startSignals()\n if (authResponse) {\n return await wrapWithComputeClient(sandbox, authResponse);\n } else if (accessToken) {\n // If we only have access token (no API key), we still need sandbox_url and preview_url\n // For now, we'll use default URLs - this could be improved\n const defaultAuthResponse: AuthorizationResponse = {\n access_token: accessToken,\n sandbox_url: 'https://sandbox.computesdk.com',\n preview_url: 'https://preview.computesdk.com'\n };\n return await wrapWithComputeClient(sandbox, defaultAuthResponse);\n }\n }\n\n return sandbox;\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<Sandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.getById(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.getById(sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<Sandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n return await actualProvider.sandbox.list();\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.destroy(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.destroy(sandboxId);\n }\n }\n };\n\n // Future: compute.blob.*, compute.database.*, compute.git.* will be added here\n // blob = new BlobManager();\n // database = new DatabaseManager(); \n // git = new GitManager();\n\n\n}\n\n/**\n * Singleton instance - the main API (untyped)\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n\n\n/**\n * Create a compute instance with proper typing\n *\n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { createCompute } from 'computesdk'\n *\n * // With API key (automatically gets access token from license server)\n * const compute = createCompute({\n * defaultProvider: e2b({ apiKey: 'your-key' }),\n * apiKey: 'computesdk_live_...' // Returns enhanced sandboxes\n * });\n *\n * // Or with direct access token\n * const compute2 = createCompute({\n * defaultProvider: e2b({ apiKey: 'your-key' }),\n * accessToken: 'your-access-token' // Returns enhanced sandboxes\n * });\n *\n * const sandbox = await compute.sandbox.create();\n * const instance = sandbox.getInstance(); // ✅ Properly typed E2B Sandbox!\n * await sandbox.createTerminal(); // ✅ Enhanced sandbox features!\n * ```\n */\nexport function createCompute<TProvider extends Provider>(\n config: ComputeConfig<TProvider> & { apiKey: string }\n): TypedComputeAPI<TProvider, true>;\nexport function createCompute<TProvider extends Provider>(\n config: ComputeConfig<TProvider> & { accessToken: string }\n): TypedComputeAPI<TProvider, true>;\nexport function createCompute<TProvider extends Provider>(\n config: ComputeConfig<TProvider> & { jwt: string }\n): TypedComputeAPI<TProvider, true>;\nexport function createCompute<TProvider extends Provider>(\n config: ComputeConfig<TProvider>\n): TypedComputeAPI<TProvider, false>;\nexport function createCompute<TProvider extends Provider>(\n config: ComputeConfig<TProvider>\n): TypedComputeAPI<TProvider, boolean> {\n const manager = new ComputeManager();\n\n // Set config directly without calling the public setConfig method\n const actualProvider = config.defaultProvider || config.provider!;\n const accessToken = config.accessToken || config.jwt; // Support both accessToken and deprecated jwt\n manager['config'] = {\n provider: actualProvider,\n defaultProvider: actualProvider,\n apiKey: config.apiKey,\n accessToken: accessToken\n };\n manager['computeAuth'] = {\n apiKey: config.apiKey,\n accessToken: accessToken\n };\n\n const isEnhanced = !!(config.apiKey || config.accessToken || config.jwt);\n\n return {\n setConfig: <T extends Provider>(cfg: ComputeConfig<T>) => createCompute(cfg),\n getConfig: () => manager.getConfig(),\n clearConfig: () => manager.clearConfig(),\n\n sandbox: {\n create: async (params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>) => {\n const sandbox = await manager.sandbox.create(params);\n // If API key/JWT is configured, the sandbox will be enhanced with ComputeClient features\n // Cast to the appropriate type based on whether it's enhanced or not\n if (isEnhanced) {\n return sandbox as TypedEnhancedSandbox<TProvider>;\n }\n return sandbox as TypedSandbox<TProvider>;\n },\n\n getById: async (sandboxId: string) => {\n const sandbox = await manager.sandbox.getById(sandboxId);\n if (!sandbox) return null;\n // Type depends on whether auth is configured\n if (isEnhanced) {\n return sandbox as TypedEnhancedSandbox<TProvider>;\n }\n return sandbox as TypedSandbox<TProvider>;\n },\n\n list: async () => {\n const sandboxes = await manager.sandbox.list();\n // Type depends on whether auth is configured\n if (isEnhanced) {\n return sandboxes as TypedEnhancedSandbox<TProvider>[];\n }\n return sandboxes as TypedSandbox<TProvider>[];\n },\n\n destroy: async (sandboxId: string) => {\n return await manager.sandbox.destroy(sandboxId);\n }\n }\n } as TypedComputeAPI<TProvider, typeof isEnhanced>;\n}\n\n\n\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n * Terminal support removed - will be re-added with WebSocket VM connections.\n */\n\nimport type { Provider, Runtime } from './types';\nimport { compute } from './compute';\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?: Runtime;\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?: Runtime;\n timeout?: number;\n sandboxId?: 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, provider: Provider): 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({\n provider,\n options: body.options || { runtime: 'python' }\n });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n \n if (action === 'compute.sandbox.list') {\n const sandboxes = await compute.sandbox.list(provider);\n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sb => ({\n sandboxId: sb.sandboxId,\n provider: sb.provider\n }))\n };\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(provider, sandboxId);\n return {\n success: true,\n sandboxId,\n provider: provider.name\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(provider, 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: provider.name,\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: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\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: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime,\n ...(result.isBackground && { isBackground: result.isBackground }),\n ...(result.pid && { pid: result.pid })\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: provider.name,\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: provider.name };\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: provider.name };\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: provider.name,\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: provider.name,\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: provider.name };\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: provider.name\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n params: HandleComputeRequestParams\n): Promise<ComputeResponse>;\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest,\n provider: Provider\n): Promise<Response>;\nexport async function handleComputeRequest(\n paramsOrRequestOrBody: HandleComputeRequestParams | Request | ComputeRequest,\n provider?: Provider\n): Promise<ComputeResponse | Response> {\n // Handle object-style API\n if (typeof paramsOrRequestOrBody === 'object' && 'request' in paramsOrRequestOrBody && 'provider' in paramsOrRequestOrBody) {\n const params = paramsOrRequestOrBody as HandleComputeRequestParams;\n return await executeAction(params.request, params.provider);\n }\n \n // Handle original API\n if (!provider) {\n throw new Error('Provider is required when not using object-style API');\n }\n \n const requestOrBody = paramsOrRequestOrBody as Request | ComputeRequest;\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: provider.name\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: provider.name\n }, { status: 400 });\n }\n } else {\n body = requestOrBody;\n }\n \n // Execute the action\n const result = await executeAction(body, provider);\n \n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Legacy export for backward compatibility\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n provider: Provider;\n}\n\nexport { handleComputeRequest as handleHttpComputeRequest };","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\nimport type {\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n Sandbox,\n SandboxFileSystem,\n SandboxInfo,\n ExecutionResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n} from './types/index.js';\n\n/**\n * Helper function to handle background command execution\n * Providers can use this to implement background job support\n */\nexport function createBackgroundCommand(command: string, args: string[] = [], options?: RunCommandOptions): { command: string; args: string[]; isBackground: boolean } {\n if (!options?.background) {\n return { command, args, isBackground: false };\n }\n\n // For background execution, we modify the command to run in background\n // Default approach: append & to make it run in background\n const fullCommand = args.length > 0 ? `${command} ${args.join(' ')}` : command;\n \n return {\n command: 'sh',\n args: ['-c', `${fullCommand} &`],\n isBackground: true\n };\n}\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n \n // Instance operations (map to individual Sandbox methods)\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[], options?: RunCommandOptions) => Promise<ExecutionResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n \n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n \n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any> {\n create: (config: TConfig, options: CreateTemplateOptions | any) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Default filesystem implementations based on shell commands\n * These work for any provider that supports shell command execution\n */\nconst defaultFilesystemMethods = {\n readFile: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<string> => {\n const result = await runCommand(sandbox, 'cat', [path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n }\n // Trim trailing newline that cat command adds\n return result.stdout.replace(/\\n$/, '');\n },\n\n writeFile: async (sandbox: any, path: string, content: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'sh', ['-c', `echo ${JSON.stringify(content)} > ${JSON.stringify(path)}`]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'mkdir', ['-p', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<FileEntry[]> => {\n // Try different ls variations for maximum compatibility\n let result = await runCommand(sandbox, 'ls', ['-la', path]);\n let hasDetailedOutput = true;\n \n // Fall back to basic ls if detailed flags not supported\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', ['-l', path]);\n }\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', [path]);\n hasDetailedOutput = false;\n }\n \n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n\n const lines = (result.stdout || '').split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n if (hasDetailedOutput && line.includes(' ')) {\n // Parse detailed ls output (ls -la or ls -l)\n const parts = line.trim().split(/\\s+/);\n const name = parts[parts.length - 1];\n const isDirectory = line.startsWith('d');\n \n return {\n name,\n path: `${path}/${name}`,\n isDirectory,\n size: parseInt(parts[4]) || 0,\n lastModified: new Date()\n };\n } else {\n // Parse simple ls output (just filenames)\n const name = line.trim();\n return {\n name,\n path: `${path}/${name}`,\n isDirectory: false, // Can't determine from simple ls\n size: 0,\n lastModified: new Date()\n };\n }\n });\n },\n\n exists: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<boolean> => {\n const result = await runCommand(sandbox, 'test', ['-e', path]);\n return result.exitCode === 0; // Exit code 0 means file exists\n },\n\n remove: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'rm', ['-rf', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n }\n};\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the Sandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements Sandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult> {\n return await this.methods.runCommand(this.sandbox, command, args, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n private activeSandboxes: Map<string, GeneratedSandbox<TSandbox>> = new Map();\n\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<Sandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n const sandbox = new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n \n this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async getById(sandboxId: string): Promise<Sandbox<TSandbox> | null> {\n // Check active sandboxes first\n const existing = this.activeSandboxes.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n // Try to reconnect\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n const sandbox = new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n \n this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async list(): Promise<Sandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n const sandboxes: Sandbox[] = [];\n\n for (const result of results) {\n let sandbox = this.activeSandboxes.get(result.sandboxId);\n if (!sandbox) {\n sandbox = new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n this.activeSandboxes.set(result.sandboxId, sandbox);\n }\n sandboxes.push(sandbox);\n }\n\n return sandboxes;\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n this.activeSandboxes.delete(sandboxId);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig> implements ProviderTemplateManager<TTemplate> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig>\n ) {}\n\n async create(options: CreateTemplateOptions | any): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n readonly __sandboxType!: TSandbox; // Phantom type for TypeScript inference\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n * \n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function createProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n // Auto-inject default filesystem methods if none provided\n if (!providerConfig.methods.sandbox.filesystem) {\n providerConfig.methods.sandbox.filesystem = defaultFilesystemMethods;\n }\n\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}"],"mappings":"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","names":["sandbox"]}
1
+ {"version":3,"sources":["../src/types/sandbox.ts","../src/constants.ts","../src/providers/gateway.ts","../src/factory.ts","../src/compute-daemon/lifecycle.ts","../src/utils.ts","../src/auto-detect.ts","../src/compute.ts","../src/request-handler.ts"],"sourcesContent":["/**\n * Sandbox Types\n *\n * Types related to sandbox execution, filesystem, terminal operations\n *\n * Key types:\n * - Sandbox: The full-featured sandbox from @computesdk/client (terminals, watchers, signals)\n * - ProviderSandbox: Base interface that provider implementations return (e2b, railway, etc.)\n */\n\n// Re-export the full Sandbox from @computesdk/client\n// This is THE Sandbox that users interact with\nexport { Sandbox, type SandboxConfig } from '@computesdk/client';\n\n// Re-export execution result types from @computesdk/client\n// These are the canonical types for code and command execution\nexport {\n type CodeResult,\n type CommandResult,\n type CodeLanguage,\n type CodeRunOptions,\n type CommandRunOptions,\n} from '@computesdk/client';\n\n// Re-export shared types from @computesdk/client (canonical source)\nexport {\n type Runtime,\n type SandboxStatus,\n type RunCommandOptions,\n type CreateSandboxOptions,\n type FileEntry,\n type SandboxFileSystem,\n CommandExitError,\n isCommandExitError,\n} from '@computesdk/client';\n\n// Import ProviderSandboxInfo and re-export as SandboxInfo for backwards compatibility\nimport type { ProviderSandboxInfo } from '@computesdk/client';\n\n/**\n * Information about a sandbox (provider-agnostic)\n * @see ProviderSandboxInfo in @computesdk/client for the canonical definition\n */\nexport type SandboxInfo = ProviderSandboxInfo;\n\n// Import for use within this file\nimport type { CodeResult, CommandResult, Runtime, SandboxFileSystem, RunCommandOptions } from '@computesdk/client';\n\n// Forward declaration to avoid circular dependency with provider.ts\ninterface Provider<TSandbox = any> {\n readonly name: string;\n readonly sandbox: any;\n}\n\n// ============================================================================\n// Provider Sandbox - Base interface for provider implementations\n// ============================================================================\n\n/**\n * Provider sandbox interface - what external providers (e2b, railway, etc.) return\n *\n * This is the base interface that all provider sandboxes must implement.\n * The gateway provider returns the full Sandbox from @computesdk/client which\n * extends this with ComputeClient features (terminals, watchers, signals).\n *\n * @example Provider implementation\n * ```typescript\n * // In @computesdk/e2b\n * const e2bProvider = createProvider<E2BSandbox, E2BConfig>({\n * name: 'e2b',\n * methods: {\n * sandbox: {\n * create: async (config, options) => {\n * const sandbox = await E2BSandbox.create({ ... });\n * return { sandbox, sandboxId: sandbox.id };\n * },\n * // ... other methods\n * }\n * }\n * });\n * ```\n */\nexport interface ProviderSandbox<TSandbox = any> {\n /** Unique identifier for the sandbox */\n readonly sandboxId: string;\n /** Provider that created this sandbox */\n readonly provider: string;\n\n /** Execute code in the sandbox */\n runCode(code: string, runtime?: Runtime): Promise<CodeResult>;\n /** Execute shell commands */\n runCommand(\n commandOrArray: string | [string, ...string[]],\n argsOrOptions?: string[] | RunCommandOptions,\n maybeOptions?: RunCommandOptions\n ): Promise<CommandResult>;\n /** Get information about the sandbox */\n getInfo(): Promise<SandboxInfo>;\n /** Get URL for accessing the sandbox on a specific port */\n getUrl(options: { port: number; protocol?: string }): Promise<string>;\n /** Get the provider instance that created this sandbox */\n getProvider(): import('./provider').Provider<TSandbox>;\n /** Get the native provider sandbox instance with proper typing */\n getInstance(): TSandbox;\n /** Kill the sandbox */\n kill(): Promise<void>;\n /** Destroy the sandbox and clean up resources */\n destroy(): Promise<void>;\n\n /** File system operations */\n readonly filesystem: SandboxFileSystem;\n\n // ============================================================================\n // Enhanced Features (Optional - available on gateway provider's Sandbox)\n // ============================================================================\n\n /**\n * Create an interactive terminal (PTY or exec mode)\n * @optional Available when using gateway provider\n */\n createTerminal?(options?: {\n shell?: string;\n pty?: boolean;\n encoding?: 'utf8' | 'binary';\n }): Promise<any>;\n\n /**\n * Create a file system watcher\n * @optional Available when using gateway provider\n */\n createWatcher?(path: string, options?: {\n recursive?: boolean;\n includeContent?: boolean;\n }): Promise<any>;\n\n /**\n * Send a signal to a process\n * @optional Available when using gateway provider\n */\n sendSignal?(pid: number, signal: string): Promise<void>;\n}\n\n// ============================================================================\n// Typed Variants\n// ============================================================================\n\n/**\n * Extract the sandbox type from a provider using generic inference\n */\ntype ExtractProviderSandboxType<TProvider> = TProvider extends Provider<infer TSandbox> ? TSandbox : any;\n\n/**\n * Typed provider sandbox interface that preserves the provider's native instance type\n */\nexport interface TypedProviderSandbox<TProvider extends Provider> extends Omit<ProviderSandbox<ExtractProviderSandboxType<TProvider>>, 'getProvider'> {\n /** Get the provider instance that created this sandbox with proper typing */\n getProvider(): TProvider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance(): ExtractProviderSandboxType<TProvider>;\n}\n","/**\n * ComputeSDK Constants\n * \n * Default configuration values and provider definitions\n */\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 * Used to detect which provider to use from environment\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/**\n * Type for provider names\n */\nexport type ProviderName = keyof typeof PROVIDER_ENV_VARS;\n","/**\n * Gateway Provider\n *\n * Built-in provider that communicates with the ComputeSDK gateway for sandbox lifecycle\n * and uses ClientSandbox (from @computesdk/client) for all sandbox operations.\n *\n * Architecture:\n * - Lifecycle operations (create/destroy) → Gateway API\n * - Sandbox operations → ClientSandbox directly\n */\n\nimport { Sandbox as ClientSandbox } from '@computesdk/client';\nimport { createProvider, type BaseProviderConfig } from '../factory';\nimport { waitForComputeReady } from '../compute-daemon/lifecycle';\nimport type { Runtime, SandboxInfo } from '../types';\nimport { calculateBackoff } from '../utils';\n\n/**\n * Gateway provider configuration\n */\nexport interface GatewayConfig extends BaseProviderConfig {\n /** Gateway URL (default: https://gateway.computesdk.com) */\n gatewayUrl?: string;\n /** ComputeSDK API key for authentication */\n apiKey: string;\n /** Backend provider name (e2b, railway, etc.) */\n provider: string;\n /** Provider-specific headers to pass through to gateway */\n providerHeaders?: Record<string, string>;\n /** Request timeout in milliseconds (default: 30000) */\n requestTimeout?: number;\n /** Maximum retry attempts for transient failures (default: 3) */\n maxRetries?: number;\n /** Initial retry delay in milliseconds (default: 1000) */\n retryDelay?: number;\n /** HTTP status codes that should trigger a retry (default: [408, 429, 502, 503, 504]) */\n retryableStatuses?: number[];\n}\n\nconst DEFAULT_GATEWAY_URL = 'https://gateway.computesdk.com';\nconst DEFAULT_REQUEST_TIMEOUT = 30000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_DELAY = 1000;\nconst DEFAULT_RETRYABLE_STATUSES = [408, 429, 502, 503, 504];\n\n// Track if we've already warned about missing tokens to avoid spam\nlet hasWarnedAboutMissingToken = false;\n\n/**\n * Custom error class for gateway-specific errors with enhanced context\n */\nexport class GatewayError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly provider?: string,\n public readonly sandboxId?: string,\n public readonly requestId?: string\n ) {\n super(message);\n this.name = 'GatewayError';\n }\n}\n\n/**\n * Helper to call gateway API with timeout, retry logic, and better error handling\n * \n * Error handling strategy:\n * - 404 (Not Found): Returns { success: false } without throwing - allows callers to handle missing resources gracefully\n * - Other HTTP errors: Throws GatewayError with detailed context - indicates actual API problems\n * - Network errors: Throws GatewayError after retries exhausted\n */\nasync function gatewayFetch<T>(\n url: string,\n config: GatewayConfig,\n options: RequestInit = {}\n): Promise<{ success: boolean; data?: T }> {\n const timeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT;\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryDelay = config.retryDelay ?? DEFAULT_RETRY_DELAY;\n const retryableStatuses = config.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES;\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const startTime = Date.now();\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 const duration = Date.now() - startTime;\n\n // Debug logging\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Gateway] ${options.method || 'GET'} ${url} - ${response.status} (${duration}ms)`);\n }\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 const requestId = response.headers.get('x-request-id');\n\n // Check if this error is retryable\n const isRetryable = retryableStatuses.includes(response.status);\n const shouldRetry = isRetryable && attempt < maxRetries;\n\n if (shouldRetry) {\n const delay = calculateBackoff(attempt, retryDelay);\n\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Gateway] Retry ${attempt + 1}/${maxRetries} after ${delay.toFixed(0)}ms (status: ${response.status})...`);\n }\n\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // Build helpful error message\n let errorMessage = `Gateway API error: ${errorText}`;\n if (response.status === 401) {\n errorMessage = `Invalid ComputeSDK API key.\\n\\nCheck your COMPUTESDK_API_KEY environment variable.\\nGet your key at: https://computesdk.com/dashboard`;\n } else if (response.status === 403) {\n errorMessage = `Access forbidden. Your API key may not have permission to use provider \"${config.provider}\".\\n\\nVisit https://computesdk.com/dashboard to check your plan.`;\n } else if (response.status === 429) {\n errorMessage = `Rate limit exceeded. Please try again in a moment.\\n\\nIf this persists, visit https://computesdk.com/dashboard to upgrade your plan.`;\n } else if (response.status >= 500) {\n errorMessage = `Gateway server error (${response.status}). This is temporary - please try again.\\n\\nIf this persists, check status at https://status.computesdk.com`;\n }\n\n throw new GatewayError(\n errorMessage,\n response.status,\n config.provider,\n undefined,\n requestId || undefined\n );\n }\n\n return response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n\n // If it's already a GatewayError, just rethrow\n if (error instanceof GatewayError) {\n lastError = error;\n throw error;\n }\n\n // Handle timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n const timeoutError = new GatewayError(\n `Request timed out after ${timeout}ms.\\n\\nThe gateway may be experiencing high load or network issues.\\nCheck your connection and try again.`,\n 408,\n config.provider\n );\n\n // Retry on timeout if attempts remain\n if (attempt < maxRetries) {\n const delay = calculateBackoff(attempt, retryDelay);\n\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Gateway] Retry ${attempt + 1}/${maxRetries} after ${delay.toFixed(0)}ms (timeout)...`);\n }\n\n await new Promise(resolve => setTimeout(resolve, delay));\n lastError = timeoutError;\n continue;\n }\n\n throw timeoutError;\n }\n\n // Handle network errors\n const networkError = new GatewayError(\n `Failed to connect to gateway: ${error instanceof Error ? error.message : String(error)}\\n\\nCheck your internet connection and gateway URL.`,\n 0,\n config.provider\n );\n\n // Retry on network error if attempts remain\n if (attempt < maxRetries) {\n const delay = calculateBackoff(attempt, retryDelay);\n\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Gateway] Retry ${attempt + 1}/${maxRetries} after ${delay.toFixed(0)}ms (network error)...`);\n }\n\n await new Promise(resolve => setTimeout(resolve, delay));\n lastError = networkError;\n continue;\n }\n\n throw networkError;\n }\n }\n\n // If we get here, all retries failed\n throw lastError || new Error('Max retries exceeded');\n}\n\n/**\n * Gateway Provider factory\n *\n * Uses ClientSandbox directly as the sandbox type - no wrapper needed.\n */\nexport const gateway = createProvider<ClientSandbox, GatewayConfig>({\n name: 'gateway',\n methods: {\n sandbox: {\n create: async (config, options) => {\n const gatewayUrl = config.gatewayUrl || DEFAULT_GATEWAY_URL;\n\n const result = await gatewayFetch<{\n sandboxId: string;\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n }>(`${gatewayUrl}/sandbox`, 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: ${JSON.stringify(result)}`);\n }\n\n const { sandboxId, url, token, provider, metadata } = result.data;\n\n // Debug logging\n if (process.env.COMPUTESDK_DEBUG) {\n console.log(`[Gateway] Sandbox created:`, {\n sandboxId,\n url,\n hasToken: !!token,\n tokenPrefix: token ? token.substring(0, 10) + '...' : 'none',\n provider,\n });\n }\n\n // Warn if token is missing (indicates gateway may be running old version)\n // Only warn once to avoid log spam\n if (!token && !hasWarnedAboutMissingToken) {\n hasWarnedAboutMissingToken = true;\n console.warn(\n `[Gateway] No token received from gateway for sandbox ${sandboxId}. ` +\n `Falling back to API key for authentication. ` +\n `This may indicate the gateway is running an outdated version. ` +\n `Check gateway deployment at ${config.gatewayUrl || DEFAULT_GATEWAY_URL}`\n );\n }\n\n const sandbox = new ClientSandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey, // Use token from gateway, fallback to API key\n metadata,\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return { sandbox, sandboxId };\n },\n\n getById: async (config, sandboxId) => {\n const gatewayUrl = config.gatewayUrl || DEFAULT_GATEWAY_URL;\n\n const result = await gatewayFetch<{\n url: string;\n token: string;\n provider: string;\n metadata?: Record<string, unknown>;\n }>(`${gatewayUrl}/sandbox/${sandboxId}`, config);\n\n if (!result.success || !result.data) {\n return null;\n }\n\n const { url, token, provider, metadata } = result.data;\n\n // Warn if token is missing on reconnection\n // Only warn once to avoid log spam\n if (!token && !hasWarnedAboutMissingToken) {\n hasWarnedAboutMissingToken = true;\n console.warn(\n `[Gateway] No token received when reconnecting to sandbox ${sandboxId}. ` +\n `Falling back to API key for authentication. ` +\n `This may indicate the gateway is running an outdated version.`\n );\n }\n\n const sandbox = new ClientSandbox({\n sandboxUrl: url,\n sandboxId,\n provider,\n token: token || config.apiKey, // Use token from gateway, fallback to API key\n metadata,\n WebSocket: globalThis.WebSocket,\n });\n\n await waitForComputeReady(sandbox);\n\n return { sandbox, sandboxId };\n },\n\n list: async () => {\n throw new Error(\n 'Gateway provider does not support listing sandboxes. Use getById() with a known sandbox ID instead.'\n );\n },\n\n destroy: async (config, sandboxId) => {\n const gatewayUrl = config.gatewayUrl || DEFAULT_GATEWAY_URL;\n\n await gatewayFetch(`${gatewayUrl}/sandbox/${sandboxId}`, config, {\n method: 'DELETE',\n });\n },\n\n // All operations delegate directly to ClientSandbox\n runCode: async (sandbox, code, runtime) => sandbox.runCode(code, runtime),\n runCommand: async (sandbox, command, args) => sandbox.runCommand(command, args),\n getUrl: async (sandbox, options) => sandbox.getUrl(options),\n\n getInfo: async (sandbox): Promise<SandboxInfo> => {\n const info = await sandbox.getInfo();\n return {\n id: info.id,\n provider: info.provider,\n runtime: info.runtime as Runtime,\n status: info.status,\n createdAt: info.createdAt,\n timeout: info.timeout,\n metadata: info.metadata || {},\n };\n },\n\n // Filesystem delegates directly to ClientSandbox\n filesystem: {\n readFile: async (sandbox, path) => sandbox.filesystem.readFile(path),\n writeFile: async (sandbox, path, content) => sandbox.filesystem.writeFile(path, content),\n mkdir: async (sandbox, path) => sandbox.filesystem.mkdir(path),\n readdir: async (sandbox, path) => sandbox.filesystem.readdir(path),\n exists: async (sandbox, path) => sandbox.filesystem.exists(path),\n remove: async (sandbox, path) => sandbox.filesystem.remove(path),\n },\n\n // getInstance returns the ClientSandbox directly\n getInstance: (sandbox) => sandbox,\n },\n },\n});\n\n// Re-export Sandbox type for users who want direct client access\nexport { Sandbox } from '@computesdk/client';\n","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\nimport type {\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxFileSystem,\n SandboxInfo,\n CodeResult,\n CommandResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n} from './types/index.js';\nimport { cmd, type Command } from '@computesdk/cmd';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[], options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider execution modes\n *\n * - 'raw': Use raw provider methods directly (for gateway internal use)\n * - 'direct': Use provider's native SDK directly (for providers with sandbox capabilities)\n * - 'gateway': Route through ComputeSDK gateway (for providers without native sandbox)\n */\nexport type ProviderMode = 'raw' | 'direct' | 'gateway';\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n /**\n * Default execution mode for this provider (defaults to 'gateway' if not specified)\n *\n * - 'direct': Provider has native sandbox capabilities (e.g., E2B) - uses provider SDK directly\n * - 'gateway': Provider only has infrastructure (e.g., Railway) - routes through gateway\n *\n * Can be overridden at runtime with `mode` in config.\n */\n defaultMode?: 'direct' | 'gateway';\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Base config that all provider configs should extend\n * Includes the `mode` option for controlling execution mode\n */\nexport interface BaseProviderConfig {\n /**\n * Execution mode override\n *\n * - 'raw': Use raw provider methods directly (for gateway internal use)\n * - 'direct': Use provider's native SDK directly\n * - 'gateway': Route through ComputeSDK gateway\n *\n * If not specified, uses the provider's `defaultMode`.\n */\n mode?: ProviderMode;\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n commandOrArray: string | [string, ...string[]],\n argsOrOptions?: string[] | RunCommandOptions,\n maybeOptions?: RunCommandOptions\n ): Promise<CommandResult> {\n // Parse overloaded arguments\n let command: string;\n let args: string[];\n let options: RunCommandOptions | undefined;\n\n if (Array.isArray(commandOrArray)) {\n // Array form: runCommand(['npm', 'install'], { cwd: '/app' })\n [command, ...args] = commandOrArray;\n options = argsOrOptions as RunCommandOptions | undefined;\n } else {\n // Traditional form: runCommand('npm', ['install'], { cwd: '/app' })\n command = commandOrArray;\n args = (Array.isArray(argsOrOptions) ? argsOrOptions : []) as string[];\n options = Array.isArray(argsOrOptions) ? maybeOptions : argsOrOptions as RunCommandOptions | undefined;\n }\n\n // Build the command tuple\n const baseCommand: Command = args.length > 0 ? [command, ...args] : [command];\n\n // Use cmd() helper to handle cwd and background options\n if (options?.cwd || options?.background) {\n const wrappedCommand = cmd(baseCommand, {\n cwd: options.cwd,\n background: options.background,\n });\n const [wrappedCmd, ...wrappedArgs] = wrappedCommand;\n return await this.methods.runCommand(this.sandbox, wrappedCmd, wrappedArgs, undefined);\n }\n\n return await this.methods.runCommand(this.sandbox, command, args, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Determines the effective execution mode\n *\n * @param config - Runtime config (may contain `mode` override)\n * @param defaultMode - Provider's default mode\n * @returns The effective execution mode\n */\nfunction getEffectiveMode(config: BaseProviderConfig, defaultMode: 'direct' | 'gateway'): ProviderMode {\n // If mode is explicitly set in config, use it\n if (config.mode) {\n return config.mode;\n }\n\n // Otherwise use provider's default mode\n return defaultMode;\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n private readonly effectiveMode: ProviderMode;\n\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider,\n defaultMode: 'direct' | 'gateway'\n ) {\n this.effectiveMode = getEffectiveMode(config as BaseProviderConfig, defaultMode);\n }\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this,\n providerConfig.defaultMode ?? 'gateway'\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function createProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\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 { ComputeClient } from '@computesdk/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: ComputeClient,\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 * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\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';\nimport { gateway as gatewayProvider } from './providers/gateway';\nimport type { Provider } from './types';\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 * Main auto-configuration function\n * Returns configured HTTP provider 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(): Provider | 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 return gatewayProvider({\n gatewayUrl,\n apiKey: computesdkApiKey,\n provider,\n providerHeaders\n });\n}\n","/**\n * Compute Singleton - Main API Orchestrator\n *\n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, ProviderSandbox, Provider, TypedProviderSandbox, TypedComputeAPI } from './types';\nimport { autoConfigureCompute } from './auto-detect';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private config: ComputeConfig | null = null;\n private autoConfigured = false;\n\n /**\n * Set default configuration with generic type preservation\n */\n setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void {\n // Validate that at least one provider is specified\n if (!config.defaultProvider && !config.provider) {\n throw new Error('Either defaultProvider or provider must be specified in setConfig');\n }\n\n // Handle backwards compatibility: if both are provided, defaultProvider takes precedence\n if (config.defaultProvider && config.provider) {\n console.warn('Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.');\n }\n\n // Normalize config to always have both fields for internal use (backward compatibility)\n const actualProvider = config.defaultProvider || config.provider!;\n this.config = {\n provider: actualProvider,\n defaultProvider: actualProvider,\n };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Lazy auto-configure from environment if not explicitly configured\n */\n private ensureConfigured(): void {\n // Skip if already configured\n if (this.config) return;\n\n // Skip if already tried auto-detection\n if (this.autoConfigured) return;\n\n // Try auto-detection from environment\n const provider = autoConfigureCompute();\n \n // Mark as configured after detection completes (success or failure)\n // This prevents retry loops but allows exceptions to propagate\n this.autoConfigured = true;\n\n if (provider) {\n this.config = {\n provider,\n defaultProvider: provider,\n };\n }\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n // Try auto-configuration first\n this.ensureConfigured();\n\n const provider = this.config?.defaultProvider || this.config?.provider;\n if (!provider) {\n throw new Error(\n 'No default provider configured.\\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.setConfig({ defaultProvider }) or pass provider to create()\\n\\n' +\n 'Docs: https://computesdk.com/docs/quickstart'\n );\n }\n return provider;\n }\n\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n *\n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n *\n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n *\n * // With default provider\n * compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })\n * const sandbox = await compute.sandbox.create()\n * ```\n */\n create: async (params?: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<ProviderSandbox> => {\n const provider = params && 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params?.options;\n return await provider.sandbox.create(options);\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<ProviderSandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.getById(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.getById(sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<ProviderSandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n return await actualProvider.sandbox.list();\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.destroy(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.destroy(sandboxId);\n }\n }\n };\n}\n\n/**\n * Singleton instance - the main API (untyped)\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n\n/**\n * Create a compute instance with proper typing\n *\n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { createCompute } from 'computesdk'\n *\n * // Zero-config mode (auto-detects from environment)\n * const compute = createCompute();\n * const sandbox = await compute.sandbox.create();\n *\n * // Explicit mode\n * const compute2 = createCompute({\n * defaultProvider: e2b({ apiKey: 'your-key' }),\n * });\n *\n * const sandbox2 = await compute2.sandbox.create();\n * const instance = sandbox2.getInstance(); // ✅ Properly typed!\n * ```\n */\n// Zero-config mode (no arguments)\nexport function createCompute(): ComputeAPI;\n// Explicit mode with provider\nexport function createCompute<TProvider extends Provider>(\n config: ComputeConfig<TProvider>\n): TypedComputeAPI<TProvider>;\n// Implementation\nexport function createCompute<TProvider extends Provider>(\n config?: ComputeConfig<TProvider>\n): TypedComputeAPI<TProvider> | ComputeAPI {\n const manager = new ComputeManager();\n\n // Zero-config mode: No config provided, will auto-detect on first use\n if (!config) {\n return manager as ComputeAPI;\n }\n\n // Explicit mode: Set config directly\n const actualProvider = config.defaultProvider || config.provider!;\n manager['config'] = {\n provider: actualProvider,\n defaultProvider: actualProvider,\n };\n\n return {\n setConfig: <T extends Provider>(cfg: ComputeConfig<T>) => createCompute(cfg),\n getConfig: () => manager.getConfig(),\n clearConfig: () => manager.clearConfig(),\n\n sandbox: {\n create: async (params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>) => {\n const sandbox = await manager.sandbox.create(params);\n return sandbox as TypedProviderSandbox<TProvider>;\n },\n\n getById: async (sandboxId: string) => {\n const sandbox = await manager.sandbox.getById(sandboxId);\n if (!sandbox) return null;\n return sandbox as TypedProviderSandbox<TProvider>;\n },\n\n list: async () => {\n const sandboxes = await manager.sandbox.list();\n return sandboxes as TypedProviderSandbox<TProvider>[];\n },\n\n destroy: async (sandboxId: string) => {\n return await manager.sandbox.destroy(sandboxId);\n }\n }\n } as TypedComputeAPI<TProvider>;\n}\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n * Terminal support removed - will be re-added with WebSocket VM connections.\n */\n\nimport type { Provider, Runtime } from './types';\nimport { compute } from './compute';\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?: Runtime;\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?: Runtime;\n timeout?: number;\n sandboxId?: 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, provider: Provider): 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({\n provider,\n options: body.options || { runtime: 'python' }\n });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n \n if (action === 'compute.sandbox.list') {\n const sandboxes = await compute.sandbox.list(provider);\n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sb => ({\n sandboxId: sb.sandboxId,\n provider: sb.provider\n }))\n };\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(provider, sandboxId);\n return {\n success: true,\n sandboxId,\n provider: provider.name\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(provider, 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: provider.name,\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: provider.name,\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: provider.name,\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: provider.name,\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: provider.name };\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: provider.name };\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: provider.name,\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: provider.name,\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: provider.name };\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: provider.name\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n params: HandleComputeRequestParams\n): Promise<ComputeResponse>;\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest,\n provider: Provider\n): Promise<Response>;\nexport async function handleComputeRequest(\n paramsOrRequestOrBody: HandleComputeRequestParams | Request | ComputeRequest,\n provider?: Provider\n): Promise<ComputeResponse | Response> {\n // Handle object-style API\n if (typeof paramsOrRequestOrBody === 'object' && 'request' in paramsOrRequestOrBody && 'provider' in paramsOrRequestOrBody) {\n const params = paramsOrRequestOrBody as HandleComputeRequestParams;\n return await executeAction(params.request, params.provider);\n }\n \n // Handle original API\n if (!provider) {\n throw new Error('Provider is required when not using object-style API');\n }\n \n const requestOrBody = paramsOrRequestOrBody as Request | ComputeRequest;\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: provider.name\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: provider.name\n }, { status: 400 });\n }\n } else {\n body = requestOrBody;\n }\n \n // Execute the action\n const result = await executeAction(body, provider);\n \n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Legacy export for backward compatibility\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n provider: Provider;\n}\n\nexport { handleComputeRequest as handleHttpComputeRequest };"],"mappings":"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","names":["Sandbox","sandbox"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "computesdk",
3
- "version": "1.8.7",
3
+ "version": "1.9.0",
4
4
  "description": "A free and open-source toolkit for running other people's code in your applications.",
5
5
  "author": "Garrison",
6
6
  "license": "MIT",
@@ -37,7 +37,8 @@
37
37
  "url": "https://github.com/computesdk/computesdk/issues"
38
38
  },
39
39
  "dependencies": {
40
- "@computesdk/client": "0.3.5"
40
+ "@computesdk/client": "0.4.0",
41
+ "@computesdk/cmd": "0.2.0"
41
42
  },
42
43
  "devDependencies": {
43
44
  "@types/node": "^20.0.0",