UNPKG

@computesdk/daytona

Version:

Daytona provider for ComputeSDK - standardized development environments with devcontainer support

1 lines 19 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Daytona Provider - Factory-based Implementation\n */\n\nimport { Daytona, Sandbox as DaytonaSandbox } from '@daytonaio/sdk';\nimport { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type { CommandResult, SandboxInfo, CreateSandboxOptions, FileEntry, RunCommandOptions } from '@computesdk/provider';\n\n/**\n * Daytona-specific configuration options\n */\nexport interface DaytonaConfig {\n /** Daytona API key - if not provided, will fallback to DAYTONA_API_KEY environment variable */\n apiKey?: string;\n /** Default runtime environment (e.g. 'python', 'node') */\n runtime?: string;\n /** Execution timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Create a Daytona provider instance using the factory pattern\n */\nexport const daytona = defineProvider<DaytonaSandbox, DaytonaConfig>({\n name: 'daytona',\n methods: {\n sandbox: {\n create: async (config: DaytonaConfig, options?: CreateSandboxOptions) => {\n const apiKey = config.apiKey || (typeof process !== 'undefined' && process.env?.DAYTONA_API_KEY) || '';\n\n if (!apiKey) {\n throw new Error(\n `Missing Daytona API key. Provide 'apiKey' in config or set DAYTONA_API_KEY environment variable. Get your API key from https://daytona.io/`\n );\n }\n\n const runtime = (options as any)?.runtime || config.runtime || 'node';\n const timeout = options?.timeout ?? config.timeout;\n\n try {\n const daytona = new Daytona({ apiKey: apiKey });\n\n const {\n timeout: _timeout,\n envs,\n name,\n metadata,\n templateId,\n snapshotId,\n sandboxId: _sandboxId,\n namespace: _namespace,\n directory: _directory,\n ...providerOptions\n } = options || {};\n\n const createParams: Record<string, any> = {\n language: runtime === 'python' ? 'python' : 'javascript',\n ...providerOptions,\n };\n\n if (envs && Object.keys(envs).length > 0) {\n createParams.envVars = envs;\n }\n\n if (name) {\n createParams.name = name;\n }\n\n if (metadata && typeof metadata === 'object') {\n const labels: Record<string, string> = {};\n for (const [k, v] of Object.entries(metadata)) {\n labels[k] = typeof v === 'string' ? v : JSON.stringify(v);\n }\n createParams.labels = labels;\n }\n\n const sourceId = templateId || snapshotId;\n if (sourceId) {\n createParams.snapshot = sourceId;\n }\n\n const createOptions = timeout\n ? { timeout: Math.ceil(timeout / 1000) }\n : undefined;\n\n const session = await daytona.create(createParams as any, createOptions);\n const sandboxId = session.id;\n\n return { sandbox: session, sandboxId };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('API key')) {\n throw new Error(`Daytona authentication failed. Please check your DAYTONA_API_KEY environment variable.`);\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(`Daytona quota exceeded. Please check your usage at https://daytona.io/`);\n }\n }\n throw new Error(`Failed to create Daytona sandbox: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n getById: async (config: DaytonaConfig, sandboxId: string) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n try {\n const daytona = new Daytona({ apiKey: apiKey });\n const session = await daytona.get(sandboxId);\n return { sandbox: session, sandboxId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('not found') || error.message.includes('404'))) {\n return null;\n }\n throw new Error(`Failed to get Daytona sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n list: async (config: DaytonaConfig) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n try {\n const daytona = new Daytona({ apiKey: apiKey });\n const result = await daytona.list();\n return result.items.map((session: any) => ({ sandbox: session, sandboxId: session.id }));\n } catch (error) {\n throw new Error(`Failed to list Daytona sandboxes: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n destroy: async (config: DaytonaConfig, sandboxId: string) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n try {\n const daytona = new Daytona({ apiKey: apiKey });\n const sandbox = await daytona.get(sandboxId);\n await sandbox.delete();\n } catch (error) {\n if (error instanceof Error && (error.message.includes('not found') || error.message.includes('404'))) {\n return;\n }\n throw new Error(`Failed to destroy Daytona sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n runCommand: async (sandbox: DaytonaSandbox, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n let fullCommand = command;\n if (options?.env && Object.keys(options.env).length > 0) {\n const envPrefix = Object.entries(options.env)\n .map(([k, v]) => `${k}=\"${escapeShellArg(v)}\"`)\n .join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n if (options?.cwd) fullCommand = `cd \"${escapeShellArg(options.cwd)}\" && ${fullCommand}`;\n if (options?.background) fullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n\n const response = await sandbox.process.executeCommand(fullCommand);\n return {\n stdout: response.result || '',\n stderr: '',\n exitCode: response.exitCode || 0,\n durationMs: Date.now() - startTime\n };\n } catch (error) {\n throw new Error(`Daytona command execution failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n getInfo: async (sandbox: DaytonaSandbox): Promise<SandboxInfo> => {\n return {\n id: sandbox.id,\n provider: 'daytona',\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: { daytonaSandboxId: sandbox.id }\n };\n },\n\n getUrl: async (sandbox: DaytonaSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const previewInfo = await sandbox.getPreviewLink(options.port);\n let url = previewInfo.url;\n if (options.protocol) {\n const urlObj = new URL(url);\n urlObj.protocol = options.protocol + ':';\n url = urlObj.toString();\n }\n return url;\n } catch (error) {\n throw new Error(`Failed to get Daytona preview URL for port ${options.port}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n filesystem: {\n readFile: async (sandbox: DaytonaSandbox, path: string): Promise<string> => {\n const response = await sandbox.process.executeCommand(`cat \"${path}\"`);\n if (response.exitCode !== 0) throw new Error(`File not found or cannot be read: ${path}`);\n return response.result || '';\n },\n writeFile: async (sandbox: DaytonaSandbox, path: string, content: string): Promise<void> => {\n const encoded = Buffer.from(content).toString('base64');\n const response = await sandbox.process.executeCommand(`echo \"${encoded}\" | base64 -d > \"${path}\"`);\n if (response.exitCode !== 0) throw new Error(`Failed to write to file: ${path}`);\n },\n mkdir: async (sandbox: DaytonaSandbox, path: string): Promise<void> => {\n const response = await sandbox.process.executeCommand(`mkdir -p \"${path}\"`);\n if (response.exitCode !== 0) throw new Error(`Failed to create directory: ${path}`);\n },\n readdir: async (sandbox: DaytonaSandbox, path: string): Promise<FileEntry[]> => {\n const response = await sandbox.process.executeCommand(`ls -la \"${path}\"`);\n if (response.exitCode !== 0) throw new Error(`Directory not found or cannot be read: ${path}`);\n const lines = response.result.split('\\n').filter((l: string) => l.trim());\n const entries: FileEntry[] = [];\n for (const line of lines) {\n if (line.startsWith('total ') || line.endsWith(' .') || line.endsWith(' ..')) continue;\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 9) {\n entries.push({\n name: parts.slice(8).join(' '),\n type: parts[0].startsWith('d') ? 'directory' as const : 'file' as const,\n size: parseInt(parts[4]) || 0,\n modified: new Date()\n });\n }\n }\n return entries;\n },\n exists: async (sandbox: DaytonaSandbox, path: string): Promise<boolean> => {\n const response = await sandbox.process.executeCommand(`test -e \"${path}\"`);\n return response.exitCode === 0;\n },\n remove: async (sandbox: DaytonaSandbox, path: string): Promise<void> => {\n const response = await sandbox.process.executeCommand(`rm -rf \"${path}\"`);\n if (response.exitCode !== 0) throw new Error(`Failed to remove: ${path}`);\n }\n },\n\n getInstance: (sandbox: DaytonaSandbox): DaytonaSandbox => sandbox,\n },\n\n snapshot: {\n create: async (config: DaytonaConfig, sandboxId: string, options?: { name?: string }) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n const daytona = new Daytona({ apiKey: apiKey });\n try {\n const snapshot = await (daytona as any).snapshots.create({\n workspaceId: sandboxId,\n name: options?.name || `snapshot-${Date.now()}`\n });\n return snapshot;\n } catch (error) {\n throw new Error(`Failed to create Daytona snapshot: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n list: async (config: DaytonaConfig) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n const daytona = new Daytona({ apiKey: apiKey });\n try { return await (daytona as any).snapshots.list(); } catch { return []; }\n },\n delete: async (config: DaytonaConfig, snapshotId: string) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n const daytona = new Daytona({ apiKey: apiKey });\n try { await (daytona as any).snapshots.delete(snapshotId); } catch { /* ignore */ }\n }\n },\n\n template: {\n create: async (_config: DaytonaConfig, _options: { name: string }) => {\n throw new Error('To create a template in Daytona, create a snapshot from a running sandbox using snapshot.create()');\n },\n list: async (config: DaytonaConfig) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n const daytona = new Daytona({ apiKey: apiKey });\n try { return await (daytona as any).snapshots.list(); } catch { return []; }\n },\n delete: async (config: DaytonaConfig, templateId: string) => {\n const apiKey = config.apiKey || process.env.DAYTONA_API_KEY!;\n const daytona = new Daytona({ apiKey: apiKey });\n try { await (daytona as any).snapshots.delete(templateId); } catch { /* ignore */ }\n }\n }\n }\n});\n"],"mappings":"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","names":["daytona"]}