@computesdk/cloudflare 1.2.8 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -27,6 +27,6 @@ interface CloudflareSandbox {
27
27
  /**
28
28
  * Create a Cloudflare provider instance using the factory pattern
29
29
  */
30
- declare const cloudflare: (config: CloudflareConfig) => computesdk.Provider<CloudflareSandbox, any, any>;
30
+ declare const cloudflare: (config: CloudflareConfig & computesdk.BaseProviderConfig) => computesdk.Provider<CloudflareSandbox, any, any>;
31
31
 
32
32
  export { type CloudflareConfig, cloudflare };
package/dist/index.d.ts CHANGED
@@ -27,6 +27,6 @@ interface CloudflareSandbox {
27
27
  /**
28
28
  * Create a Cloudflare provider instance using the factory pattern
29
29
  */
30
- declare const cloudflare: (config: CloudflareConfig) => computesdk.Provider<CloudflareSandbox, any, any>;
30
+ declare const cloudflare: (config: CloudflareConfig & computesdk.BaseProviderConfig) => computesdk.Provider<CloudflareSandbox, any, any>;
31
31
 
32
32
  export { type CloudflareConfig, cloudflare };
package/dist/index.js CHANGED
@@ -134,27 +134,21 @@ var cloudflare = (0, import_computesdk.createProvider)({
134
134
  }
135
135
  }
136
136
  result = {
137
- stdout,
138
- stderr,
137
+ output: stdout,
139
138
  exitCode: 0,
140
139
  // Cloudflare code interpreter doesn't expose exit codes directly
141
- executionTime: Date.now() - startTime,
142
- sandboxId,
143
- provider: "cloudflare"
140
+ language: "python"
144
141
  };
145
142
  } else {
146
143
  const execResult = await sandbox.exec(`node -e "${code.replace(/"/g, '\\"')}"`);
147
144
  result = {
148
- stdout: execResult.stdout || "",
149
- stderr: execResult.stderr || "",
145
+ output: (execResult.stdout || "") + (execResult.stderr || ""),
150
146
  exitCode: execResult.exitCode || 0,
151
- executionTime: Date.now() - startTime,
152
- sandboxId,
153
- provider: "cloudflare"
147
+ language: "node"
154
148
  };
155
149
  }
156
- if (result.stderr && (result.stderr.includes("SyntaxError") || result.stderr.includes("invalid syntax") || result.stderr.includes("Unexpected token"))) {
157
- throw new Error(`Syntax error: ${result.stderr.trim()}`);
150
+ if (result.output && (result.output.includes("SyntaxError") || result.output.includes("invalid syntax") || result.output.includes("Unexpected token"))) {
151
+ throw new Error(`Syntax error: ${result.output.trim()}`);
158
152
  }
159
153
  return result;
160
154
  } catch (error) {
@@ -182,9 +176,7 @@ var cloudflare = (0, import_computesdk.createProvider)({
182
176
  stdout: execResult.stdout || "",
183
177
  stderr: execResult.stderr || "",
184
178
  exitCode: execResult.exitCode || 0,
185
- executionTime: Date.now() - startTime,
186
- sandboxId,
187
- provider: "cloudflare"
179
+ durationMs: Date.now() - startTime
188
180
  };
189
181
  } catch (error) {
190
182
  return {
@@ -192,9 +184,7 @@ var cloudflare = (0, import_computesdk.createProvider)({
192
184
  stderr: error instanceof Error ? error.message : String(error),
193
185
  exitCode: 127,
194
186
  // Command not found exit code
195
- executionTime: Date.now() - startTime,
196
- sandboxId: cloudflareSandbox.sandboxId,
197
- provider: "cloudflare"
187
+ durationMs: Date.now() - startTime
198
188
  };
199
189
  }
200
190
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n stdout,\n stderr,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n }\n\n // Check for syntax errors\n if (result.stderr && (\n result.stderr.includes('SyntaxError') ||\n result.stderr.includes('invalid syntax') ||\n result.stderr.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.stderr.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n\n // Construct full command with arguments, properly quoting each arg\n const quotedArgs = args.map(arg => {\n // Quote arguments that contain spaces or special characters\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\") || arg.includes('$') || arg.includes('`')) {\n // Escape any double quotes in the argument and wrap in double quotes\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n }\n return arg;\n });\n const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: cloudflareSandbox.sandboxId,\n provider: 'cloudflare'\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${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 const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<CodeResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n output: stdout,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n language: 'python'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n output: (execResult.stdout || '') + (execResult.stderr || ''),\n exitCode: execResult.exitCode || 0,\n language: 'node'\n };\n }\n\n // Check for syntax errors\n if (result.output && (\n result.output.includes('SyntaxError') ||\n result.output.includes('invalid syntax') ||\n result.output.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.output.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<CommandResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n\n // Construct full command with arguments, properly quoting each arg\n const quotedArgs = args.map(arg => {\n // Quote arguments that contain spaces or special characters\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\") || arg.includes('$') || arg.includes('`')) {\n // Escape any double quotes in the argument and wrap in double quotes\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n }\n return arg;\n });\n const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n durationMs: Date.now() - startTime\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n durationMs: Date.now() - startTime\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${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 const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,qBAA2B;AAC3B,wBAA+B;AAsC/B,SAAS,cAAc,MAAuB;AAE5C,MAAI,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,MAAM,KACpB,KAAK,SAAS,MAAM,KACpB,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,QAAQ,GAAG;AAC3B,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,gBAAgB,KAC9B,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,YAAY,GAAG;AAC/B,WAAO;AAAA,EACT;AAGA,SAAO;AACT;AAKO,IAAM,iBAAa,kCAAoD;AAAA,EAC5E,MAAM;AAAA,EACN,SAAS;AAAA,IACP,SAAS;AAAA;AAAA,MAEP,QAAQ,OAAO,QAA0B,YAAmC;AAE1E,YAAI,CAAC,OAAO,gBAAgB;AAC1B,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,cAAM,YAAY,SAAS,aAAa,cAAc,KAAK,IAAI,CAAC;AAEhE,YAAI;AAEF,gBAAM,cAAU,2BAAW,OAAO,gBAAgB,SAAS;AAG3D,cAAI,OAAO,SAAS;AAClB,kBAAM,QAAQ,WAAW,OAAO,OAAO;AAAA,UACzC;AAEA,gBAAM,oBAAuC;AAAA,YAC3C;AAAA,YACA;AAAA,YACA,cAAc,oBAAI,IAAI;AAAA,UACxB;AAEA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAiB,OAAO;AAC1B,gBAAI,MAAM,QAAQ,SAAS,cAAc,KAAK,MAAM,QAAQ,SAAS,SAAS,GAAG;AAC/E,oBAAM,IAAI;AAAA,gBACR;AAAA,cAEF;AAAA,YACF;AACA,gBAAI,MAAM,QAAQ,SAAS,OAAO,KAAK,MAAM,QAAQ,SAAS,OAAO,GAAG;AACtE,oBAAM,IAAI;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,gBAAM,IAAI;AAAA,YACR,wCAAwC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAChG;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,QAA0B,cAAsB;AAC9D,YAAI,CAAC,OAAO,gBAAgB;AAC1B,iBAAO;AAAA,QACT;AAEA,YAAI;AAEF,gBAAM,cAAU,2BAAW,OAAO,gBAAgB,SAAS;AAG3D,cAAI;AACF,kBAAO,QAAgB,KAAK;AAAA,UAC9B,QAAQ;AAAA,UAER;AAEA,gBAAM,oBAAuC;AAAA,YAC3C;AAAA,YACA;AAAA,YACA,cAAc,oBAAI,IAAI;AAAA,UACxB;AAEA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AAEd,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,YAA8B;AACzC,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,QAA0B,cAAsB;AAC9D,YAAI;AACF,cAAI,OAAO,gBAAgB;AACzB,kBAAM,cAAU,2BAAW,OAAO,gBAAgB,SAAS;AAG3D,kBAAM,QAAQ,iBAAiB;AAAA,UAIjC;AAAA,QACF,SAAS,OAAO;AAAA,QAGhB;AAAA,MACF;AAAA;AAAA,MAGA,SAAS,OAAO,mBAAsC,MAAc,YAA2C;AAC7G,cAAM,YAAY,KAAK,IAAI;AAE3B,YAAI;AACF,gBAAM,EAAE,SAAS,UAAU,IAAI;AAG/B,gBAAM,kBAAkB,WAAW,cAAc,IAAI;AAErD,cAAI;AAEJ,cAAI,oBAAoB,UAAU;AAEhC,kBAAM,YAAY,MAAM,QAAQ,QAAQ,MAAM,EAAE,UAAU,SAAS,CAAC;AAGpE,gBAAI,SAAS;AACb,gBAAI,SAAS;AAGb,gBAAI,UAAU,WAAW,MAAM,QAAQ,UAAU,OAAO,GAAG;AACzD,yBAAW,OAAO,UAAU,SAAS;AACnC,oBAAI,IAAI,MAAM;AACZ,4BAAU,IAAI;AAAA,gBAChB;AAAA,cACF;AAAA,YACF;AAEA,qBAAS;AAAA,cACP,QAAQ;AAAA,cACR,UAAU;AAAA;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,UACF,OAAO;AAEL,kBAAM,aAAa,MAAM,QAAQ,KAAK,YAAY,KAAK,QAAQ,MAAM,KAAK,CAAC,GAAG;AAE9E,qBAAS;AAAA,cACP,SAAS,WAAW,UAAU,OAAO,WAAW,UAAU;AAAA,cAC1D,UAAU,WAAW,YAAY;AAAA,cACjC,UAAU;AAAA,YACZ;AAAA,UACF;AAGA,cAAI,OAAO,WACT,OAAO,OAAO,SAAS,aAAa,KACpC,OAAO,OAAO,SAAS,gBAAgB,KACvC,OAAO,OAAO,SAAS,kBAAkB,IACxC;AACD,kBAAM,IAAI,MAAM,iBAAiB,OAAO,OAAO,KAAK,CAAC,EAAE;AAAA,UACzD;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AAEd,cAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,cAAc,GAAG;AACpE,kBAAM;AAAA,UACR;AAEA,gBAAM,IAAI;AAAA,YACR,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UACxF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,YAAY,OAAO,mBAAsC,SAAiB,OAAiB,CAAC,MAA8B;AACxH,cAAM,YAAY,KAAK,IAAI;AAE3B,YAAI;AACF,gBAAM,EAAE,SAAS,UAAU,IAAI;AAG/B,gBAAM,aAAa,KAAK,IAAI,SAAO;AAEjC,gBAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;AAEzG,qBAAO,IAAI,IAAI,QAAQ,MAAM,KAAK,CAAC;AAAA,YACrC;AACA,mBAAO;AAAA,UACT,CAAC;AACD,gBAAM,cAAc,WAAW,SAAS,IAAI,GAAG,OAAO,IAAI,WAAW,KAAK,GAAG,CAAC,KAAK;AAGnF,gBAAM,aAAa,MAAM,QAAQ,KAAK,WAAW;AAEjD,iBAAO;AAAA,YACL,QAAQ,WAAW,UAAU;AAAA,YAC7B,QAAQ,WAAW,UAAU;AAAA,YAC7B,UAAU,WAAW,YAAY;AAAA,YACjC,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AAEd,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC7D,UAAU;AAAA;AAAA,YACV,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,sBAA+D;AAC7E,YAAI;AACF,gBAAM,EAAE,SAAS,UAAU,IAAI;AAG/B,cAAI;AACF,kBAAO,QAAgB,KAAK;AAAA,UAC9B,QAAQ;AAAA,UAER;AAEA,iBAAO;AAAA,YACL,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,SAAS;AAAA;AAAA,YACT,QAAQ;AAAA,YACR,WAAW,oBAAI,KAAK;AAAA,YACpB,SAAS;AAAA,YACT,UAAU;AAAA,cACR,qBAAqB;AAAA,cACrB,sBAAsB;AAAA,YACxB;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,IAAI,kBAAkB;AAAA,YACtB,UAAU;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,WAAW,oBAAI,KAAK;AAAA,YACpB,SAAS;AAAA,YACT,UAAU;AAAA,cACR,qBAAqB,kBAAkB;AAAA,cACvC,sBAAsB;AAAA,cACtB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,OAAO,mBAAsC,YAAkE;AACrH,YAAI;AACF,gBAAM,EAAE,SAAS,aAAa,IAAI;AAClC,gBAAM,EAAE,MAAM,WAAW,QAAQ,IAAI;AAGrC,cAAI,aAAa,IAAI,IAAI,GAAG;AAC1B,mBAAO,aAAa,IAAI,IAAI;AAAA,UAC9B;AAGA,gBAAM,UAAU,MAAM,QAAQ,WAAW,IAAI;AAC7C,gBAAM,MAAM,GAAG,QAAQ,MAAM,QAAQ,GAAG;AAGxC,uBAAa,IAAI,MAAM,GAAG;AAE1B,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,yBAAyB,QAAQ,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,YAAY;AAAA,QACV,UAAU,OAAO,mBAAsC,SAAkC;AACvF,cAAI;AACF,kBAAM,EAAE,QAAQ,IAAI;AACpB,kBAAM,OAAO,MAAM,QAAQ,SAAS,IAAI;AACxC,mBAAO,KAAK,WAAW;AAAA,UACzB,SAAS,OAAO;AACd,kBAAM,IAAI,MAAM,uBAAuB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,UAC1G;AAAA,QACF;AAAA,QAEA,WAAW,OAAO,mBAAsC,MAAc,YAAmC;AACvG,cAAI;AACF,kBAAM,EAAE,QAAQ,IAAI;AACpB,kBAAM,QAAQ,UAAU,MAAM,OAAO;AAAA,UACvC,SAAS,OAAO;AACd,kBAAM,IAAI,MAAM,wBAAwB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,UAC3G;AAAA,QACF;AAAA,QAEA,OAAO,OAAO,mBAAsC,SAAgC;AAClF,cAAI;AACF,kBAAM,EAAE,QAAQ,IAAI;AACpB,kBAAM,QAAQ,MAAM,IAAI;AAAA,UAC1B,SAAS,OAAO;AACd,kBAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,UACjH;AAAA,QACF;AAAA,QAEA,SAAS,OAAO,mBAAsC,SAAuC;AAC3F,cAAI;AACF,kBAAM,EAAE,QAAQ,IAAI;AAGpB,kBAAM,SAAS,MAAM,QAAQ,KAAK,WAAW,IAAI,GAAG;AAEpD,gBAAI,OAAO,aAAa,GAAG;AACzB,oBAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,EAAE;AAAA,YAC9D;AAEA,kBAAM,QAAQ,OAAO,OAAO,MAAM,IAAI,EAAE,OAAO,CAAC,SAAiB,KAAK,KAAK,KAAK,CAAC,KAAK,WAAW,OAAO,CAAC;AAEzG,mBAAO,MAAM,IAAI,CAAC,SAAiB;AACjC,oBAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,oBAAM,cAAc,MAAM,CAAC,KAAK;AAChC,oBAAM,OAAO,SAAS,MAAM,CAAC,CAAC,KAAK;AACnC,oBAAM,WAAW,MAAM,CAAC,KAAK,MAAM,OAAO,MAAM,CAAC,KAAK;AACtD,oBAAM,OAAO,QAAQ,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,oBAAI,KAAK;AAC3D,oBAAM,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,MAAM,MAAM,SAAS,CAAC,KAAK;AAEpE,qBAAO;AAAA,gBACL;AAAA,gBACA,MAAM,GAAG,IAAI,IAAI,IAAI,GAAG,QAAQ,MAAM,GAAG;AAAA,gBACzC,aAAa,YAAY,WAAW,GAAG;AAAA,gBACvC;AAAA,gBACA,cAAc,MAAM,KAAK,QAAQ,CAAC,IAAI,oBAAI,KAAK,IAAI;AAAA,cACrD;AAAA,YACF,CAAC;AAAA,UACH,SAAS,OAAO;AACd,kBAAM,IAAI,MAAM,4BAA4B,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,UAC/G;AAAA,QACF;AAAA,QAEA,QAAQ,OAAO,mBAAsC,SAAmC;AACtF,cAAI;AACF,kBAAM,EAAE,QAAQ,IAAI;AACpB,kBAAM,SAAS,MAAM,QAAQ,KAAK,YAAY,IAAI,GAAG;AACrD,mBAAO,OAAO,aAAa;AAAA,UAC7B,SAAS,OAAO;AACd,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QAEA,QAAQ,OAAO,mBAAsC,SAAgC;AACnF,cAAI;AACF,kBAAM,EAAE,QAAQ,IAAI;AACpB,kBAAM,SAAS,MAAM,QAAQ,KAAK,WAAW,IAAI,GAAG;AAEpD,gBAAI,OAAO,aAAa,GAAG;AACzB,oBAAM,IAAI,MAAM,kBAAkB,OAAO,MAAM,EAAE;AAAA,YACnD;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,IAAI,MAAM,oBAAoB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,UACvG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":[]}
package/dist/index.mjs CHANGED
@@ -110,27 +110,21 @@ var cloudflare = createProvider({
110
110
  }
111
111
  }
112
112
  result = {
113
- stdout,
114
- stderr,
113
+ output: stdout,
115
114
  exitCode: 0,
116
115
  // Cloudflare code interpreter doesn't expose exit codes directly
117
- executionTime: Date.now() - startTime,
118
- sandboxId,
119
- provider: "cloudflare"
116
+ language: "python"
120
117
  };
121
118
  } else {
122
119
  const execResult = await sandbox.exec(`node -e "${code.replace(/"/g, '\\"')}"`);
123
120
  result = {
124
- stdout: execResult.stdout || "",
125
- stderr: execResult.stderr || "",
121
+ output: (execResult.stdout || "") + (execResult.stderr || ""),
126
122
  exitCode: execResult.exitCode || 0,
127
- executionTime: Date.now() - startTime,
128
- sandboxId,
129
- provider: "cloudflare"
123
+ language: "node"
130
124
  };
131
125
  }
132
- if (result.stderr && (result.stderr.includes("SyntaxError") || result.stderr.includes("invalid syntax") || result.stderr.includes("Unexpected token"))) {
133
- throw new Error(`Syntax error: ${result.stderr.trim()}`);
126
+ if (result.output && (result.output.includes("SyntaxError") || result.output.includes("invalid syntax") || result.output.includes("Unexpected token"))) {
127
+ throw new Error(`Syntax error: ${result.output.trim()}`);
134
128
  }
135
129
  return result;
136
130
  } catch (error) {
@@ -158,9 +152,7 @@ var cloudflare = createProvider({
158
152
  stdout: execResult.stdout || "",
159
153
  stderr: execResult.stderr || "",
160
154
  exitCode: execResult.exitCode || 0,
161
- executionTime: Date.now() - startTime,
162
- sandboxId,
163
- provider: "cloudflare"
155
+ durationMs: Date.now() - startTime
164
156
  };
165
157
  } catch (error) {
166
158
  return {
@@ -168,9 +160,7 @@ var cloudflare = createProvider({
168
160
  stderr: error instanceof Error ? error.message : String(error),
169
161
  exitCode: 127,
170
162
  // Command not found exit code
171
- executionTime: Date.now() - startTime,
172
- sandboxId: cloudflareSandbox.sandboxId,
173
- provider: "cloudflare"
163
+ durationMs: Date.now() - startTime
174
164
  };
175
165
  }
176
166
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n stdout,\n stderr,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n }\n\n // Check for syntax errors\n if (result.stderr && (\n result.stderr.includes('SyntaxError') ||\n result.stderr.includes('invalid syntax') ||\n result.stderr.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.stderr.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n\n // Construct full command with arguments, properly quoting each arg\n const quotedArgs = args.map(arg => {\n // Quote arguments that contain spaces or special characters\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\") || arg.includes('$') || arg.includes('`')) {\n // Escape any double quotes in the argument and wrap in double quotes\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n }\n return arg;\n });\n const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId,\n provider: 'cloudflare'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: cloudflareSandbox.sandboxId,\n provider: 'cloudflare'\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${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 const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Cloudflare Provider - Factory-based Implementation\n * \n * Full-featured provider using Cloudflare Sandbox SDK with all required methods.\n * Leverages Cloudflare's edge network and Durable Objects for sandboxed execution.\n */\n\nimport { getSandbox } from '@cloudflare/sandbox';\nimport { createProvider } from 'computesdk';\nimport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n/**\n * Cloudflare-specific configuration options\n */\nexport interface CloudflareConfig {\n /** Cloudflare Sandbox binding from Workers environment - the Durable Object binding */\n sandboxBinding?: any;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Environment variables to pass to sandbox */\n envVars?: Record<string, string>;\n /** Base URL for preview URLs (defaults to worker domain) */\n baseUrl?: string;\n}\n\n/**\n * Cloudflare sandbox wrapper - wraps the Cloudflare Sandbox instance\n */\ninterface CloudflareSandbox {\n sandbox: any; // The actual Cloudflare Sandbox instance from getSandbox()\n sandboxId: string;\n exposedPorts: Map<number, string>; // Track exposed ports and their URLs\n}\n\n/**\n * Detect runtime from code content\n */\nfunction detectRuntime(code: string): Runtime {\n // Strong Python indicators\n if (code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\") ||\n code.includes('raise ')) {\n return 'python';\n }\n\n // Strong Node.js indicators\n if (code.includes('console.log') || \n code.includes('process.') ||\n code.includes('require(') ||\n code.includes('module.exports') ||\n code.includes('__dirname') ||\n code.includes('__filename')) {\n return 'node';\n }\n\n // Default to Python for Cloudflare (matches their examples)\n return 'python';\n}\n\n/**\n * Create a Cloudflare provider instance using the factory pattern\n */\nexport const cloudflare = createProvider<CloudflareSandbox, CloudflareConfig>({\n name: 'cloudflare',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: CloudflareConfig, options?: CreateSandboxOptions) => {\n // Validate Cloudflare Workers environment binding\n if (!config.sandboxBinding) {\n throw new Error(\n `Missing Cloudflare Sandbox binding. Provide 'sandboxBinding' in config with the Durable Object binding from your Cloudflare Workers environment (env.Sandbox). ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n\n const sandboxId = options?.sandboxId || `cf-sandbox-${Date.now()}`;\n\n try {\n // Create or connect to Cloudflare sandbox using getSandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Set environment variables if provided\n if (config.envVars) {\n await sandbox.setEnvVars(config.envVars);\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('binding')) {\n throw new Error(\n `Cloudflare Sandbox binding failed. Ensure your Durable Object binding is properly configured in wrangler.toml. ` +\n `See https://developers.cloudflare.com/durable-objects/get-started/ for setup instructions.`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Cloudflare resource limits exceeded. Check your usage at https://dash.cloudflare.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Cloudflare sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: CloudflareConfig, sandboxId: string) => {\n if (!config.sandboxBinding) {\n return null;\n }\n\n try {\n // Reconnect to existing Cloudflare sandbox\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n\n // Test connection - Note: ping may not be available on all sandbox versions\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n const cloudflareSandbox: CloudflareSandbox = {\n sandbox,\n sandboxId,\n exposedPorts: new Map()\n };\n\n return {\n sandbox: cloudflareSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: CloudflareConfig) => {\n throw new Error(\n `Cloudflare provider does not support listing sandboxes. Cloudflare sandboxes are managed through Durable Objects and don't have a native list API. ` +\n `Use getById to reconnect to specific sandboxes by ID, or implement your own tracking system.`\n );\n },\n\n destroy: async (config: CloudflareConfig, sandboxId: string) => {\n try {\n if (config.sandboxBinding) {\n const sandbox = getSandbox(config.sandboxBinding, sandboxId);\n \n // Stop all processes and clean up\n await sandbox.killAllProcesses();\n \n // Note: Cloudflare Durable Objects manage their own lifecycle\n // The actual destruction happens automatically when the object is no longer referenced\n }\n } catch (error) {\n // Sandbox might already be destroyed or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (cloudflareSandbox: CloudflareSandbox, code: string, runtime?: Runtime): Promise<CodeResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Auto-detect runtime from code if not specified\n const detectedRuntime = runtime || detectRuntime(code);\n \n let result;\n\n if (detectedRuntime === 'python') {\n // Use Cloudflare's code interpreter for Python\n const execution = await sandbox.runCode(code, { language: 'python' });\n \n // Process the execution result\n let stdout = '';\n let stderr = '';\n \n // Handle streaming results if available\n if (execution.results && Array.isArray(execution.results)) {\n for (const res of execution.results) {\n if (res.text) {\n stdout += res.text;\n }\n }\n }\n \n result = {\n output: stdout,\n exitCode: 0, // Cloudflare code interpreter doesn't expose exit codes directly\n language: 'python'\n };\n } else {\n // For Node.js/JavaScript, use exec with node command\n const execResult = await sandbox.exec(`node -e \"${code.replace(/\"/g, '\\\\\"')}\"`);\n \n result = {\n output: (execResult.stdout || '') + (execResult.stderr || ''),\n exitCode: execResult.exitCode || 0,\n language: 'node'\n };\n }\n\n // Check for syntax errors\n if (result.output && (\n result.output.includes('SyntaxError') ||\n result.output.includes('invalid syntax') ||\n result.output.includes('Unexpected token')\n )) {\n throw new Error(`Syntax error: ${result.output.trim()}`);\n }\n\n return result;\n } catch (error) {\n // Re-throw syntax errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error;\n }\n \n throw new Error(\n `Cloudflare execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (cloudflareSandbox: CloudflareSandbox, command: string, args: string[] = []): Promise<CommandResult> => {\n const startTime = Date.now();\n\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n\n // Construct full command with arguments, properly quoting each arg\n const quotedArgs = args.map(arg => {\n // Quote arguments that contain spaces or special characters\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\") || arg.includes('$') || arg.includes('`')) {\n // Escape any double quotes in the argument and wrap in double quotes\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n }\n return arg;\n });\n const fullCommand = quotedArgs.length > 0 ? `${command} ${quotedArgs.join(' ')}` : command;\n\n // Execute command using Cloudflare's exec method\n const execResult = await sandbox.exec(fullCommand);\n\n return {\n stdout: execResult.stdout || '',\n stderr: execResult.stderr || '',\n exitCode: execResult.exitCode || 0,\n durationMs: Date.now() - startTime\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n durationMs: Date.now() - startTime\n };\n }\n },\n\n getInfo: async (cloudflareSandbox: CloudflareSandbox): Promise<SandboxInfo> => {\n try {\n const { sandbox, sandboxId } = cloudflareSandbox;\n \n // Test if sandbox is still alive - ping may not be available\n try {\n await (sandbox as any).ping();\n } catch {\n // ping not supported, continue\n }\n\n return {\n id: sandboxId,\n provider: 'cloudflare',\n runtime: 'python', // Cloudflare default\n status: 'running',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: sandboxId,\n durableObjectSandbox: true\n }\n };\n } catch (error) {\n return {\n id: cloudflareSandbox.sandboxId,\n provider: 'cloudflare',\n runtime: 'python',\n status: 'error',\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n cloudflareSandboxId: cloudflareSandbox.sandboxId,\n durableObjectSandbox: true,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n }\n },\n\n getUrl: async (cloudflareSandbox: CloudflareSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n try {\n const { sandbox, exposedPorts } = cloudflareSandbox;\n const { port, protocol = 'https' } = options;\n\n // Check if port is already exposed\n if (exposedPorts.has(port)) {\n return exposedPorts.get(port)!;\n }\n\n // Expose the port using Cloudflare's exposePort method\n const preview = await sandbox.exposePort(port);\n const url = `${protocol}://${preview.url}`;\n \n // Cache the exposed URL\n exposedPorts.set(port, url);\n \n return url;\n } catch (error) {\n throw new Error(\n `Failed to expose port ${options.port}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n // Filesystem methods - Cloudflare has full filesystem support\n filesystem: {\n readFile: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<string> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const file = await sandbox.readFile(path);\n return file.content || '';\n } catch (error) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n writeFile: async (cloudflareSandbox: CloudflareSandbox, path: string, content: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.writeFile(path, content);\n } catch (error) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n mkdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n await sandbox.mkdir(path);\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const { sandbox } = cloudflareSandbox;\n \n // Use ls command to get directory listing\n const result = await sandbox.exec(`ls -la \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Directory listing failed: ${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 const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || parts[parts.length - 1] || 'unknown';\n\n return {\n name,\n path: `${path}/${name}`.replace('//', '/'),\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<boolean> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`test -e \"${path}\"`);\n return result.exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (cloudflareSandbox: CloudflareSandbox, path: string): Promise<void> => {\n try {\n const { sandbox } = cloudflareSandbox;\n const result = await sandbox.exec(`rm -rf \"${path}\"`);\n \n if (result.exitCode !== 0) {\n throw new Error(`Remove failed: ${result.stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/cloudflare",
3
- "version": "1.2.8",
3
+ "version": "1.3.1",
4
4
  "description": "Cloudflare provider for ComputeSDK",
5
5
  "author": "Garrison",
6
6
  "license": "MIT",
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "@cloudflare/sandbox": "^0.3.0",
22
- "computesdk": "1.8.8"
22
+ "computesdk": "1.9.1"
23
23
  },
24
24
  "keywords": [
25
25
  "cloudflare",