@cloudflare/sandbox 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +17 -9
- package/CHANGELOG.md +12 -0
- package/dist/dist-gVyG2H2h.js +612 -0
- package/dist/dist-gVyG2H2h.js.map +1 -0
- package/dist/index.d.ts +2 -1726
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -686
- package/dist/index.js.map +1 -1
- package/dist/openai/index.d.ts +67 -0
- package/dist/openai/index.d.ts.map +1 -0
- package/dist/openai/index.js +362 -0
- package/dist/openai/index.js.map +1 -0
- package/dist/sandbox-B3vJ541e.d.ts +1729 -0
- package/dist/sandbox-B3vJ541e.d.ts.map +1 -0
- package/package.json +15 -1
- package/src/openai/index.ts +465 -0
- package/src/sandbox.ts +47 -38
- package/src/version.ts +1 -1
- package/tests/git-client.test.ts +7 -39
- package/tests/openai-shell-editor.test.ts +434 -0
- package/tests/port-client.test.ts +25 -35
- package/tests/process-client.test.ts +73 -107
- package/tests/sandbox.test.ts +17 -11
- package/tsconfig.json +2 -2
- package/tsdown.config.ts +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-B3vJ541e.d.ts","names":["LogLevel","LogComponent","LogContext","Logger","Partial","Error","CreateContextOptions","Record","CodeContext","Date","RunCodeOptions","AbortSignal","OutputMessage","Promise","Result","ExecutionError","ChartData","ExecutionResult","Array","Execution","ResultImpl","CodeContext","CreateContextOptions","ExecutionResult","RunCodeOptions","BaseExecOptions","Record","ExecOptions","ExecResult","Error","AbortSignal","ProcessOptions","Process","ProcessStatus","Date","Promise","ExecEvent","LogEvent","StreamOptions","SessionOptions","SandboxOptions","MkdirResult","WriteFileResult","ReadFileResult","DeleteFileResult","RenameFileResult","MoveFileResult","FileExistsResult","FileInfo","ListFilesOptions","ListFilesResult","GitCheckoutResult","FileStreamEvent","FileMetadata","FileChunk","Uint8Array","ProcessStartResult","ProcessListResult","Array","ProcessInfoResult","ProcessKillResult","ProcessLogsResult","ProcessCleanupResult","SessionCreateResult","SessionDeleteResult","EnvSetResult","PortExposeResult","PortStatusResult","PortListResult","PortCloseResult","InterpreterHealthResult","ContextCreateResult","ContextListResult","ContextDeleteResult","HealthCheckResult","ShutdownResult","ExecutionSession","ReadableStream","MountBucketOptions","BucketProvider","BucketCredentials","ISandbox","Request","Response","isExecResult","isProcess","isProcessStatus","ChartData","ExecutionError","OutputMessage","Result","Execution","ResultImpl"],"sources":["../../shared/dist/logger/types.d.ts","../../shared/dist/interpreter-types.d.ts","../../shared/dist/types.d.ts","../src/clients/types.ts","../src/clients/base-client.ts","../src/clients/command-client.ts","../src/clients/file-client.ts","../src/clients/git-client.ts","../src/clients/interpreter-client.ts","../src/clients/port-client.ts","../src/clients/process-client.ts","../src/clients/utility-client.ts","../src/clients/sandbox-client.ts","../src/sandbox.ts"],"sourcesContent":["/**\n * Logger types for Cloudflare Sandbox SDK\n *\n * Provides structured, trace-aware logging across Worker, Durable Object, and Container.\n */\n/**\n * Log levels (from most to least verbose)\n */\nexport declare enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3\n}\nexport type LogComponent = 'container' | 'sandbox-do' | 'executor';\n/**\n * Context metadata included in every log entry\n */\nexport interface LogContext {\n /**\n * Unique trace ID for request correlation across distributed components\n * Format: \"tr_\" + 16 hex chars (e.g., \"tr_7f3a9b2c4e5d6f1a\")\n */\n traceId: string;\n /**\n * Component that generated the log\n */\n component: LogComponent;\n /**\n * Sandbox identifier (which sandbox instance)\n */\n sandboxId?: string;\n /**\n * Session identifier (which session within sandbox)\n */\n sessionId?: string;\n /**\n * Process identifier (which background process)\n */\n processId?: string;\n /**\n * Command identifier (which command execution)\n */\n commandId?: string;\n /**\n * Operation name (e.g., 'exec', 'startProcess', 'writeFile')\n */\n operation?: string;\n /**\n * Duration in milliseconds\n */\n duration?: number;\n /**\n * Extensible for additional metadata\n */\n [key: string]: unknown;\n}\n/**\n * Logger interface for structured logging\n *\n * All methods accept optional context that gets merged with the logger's base context.\n */\nexport interface Logger {\n /**\n * Log debug-level message (most verbose, typically disabled in production)\n *\n * @param message Human-readable message\n * @param context Optional additional context\n */\n debug(message: string, context?: Partial<LogContext>): void;\n /**\n * Log info-level message (normal operational events)\n *\n * @param message Human-readable message\n * @param context Optional additional context\n */\n info(message: string, context?: Partial<LogContext>): void;\n /**\n * Log warning-level message (recoverable issues, degraded state)\n *\n * @param message Human-readable message\n * @param context Optional additional context\n */\n warn(message: string, context?: Partial<LogContext>): void;\n /**\n * Log error-level message (failures, exceptions)\n *\n * @param message Human-readable message\n * @param error Optional Error object to include\n * @param context Optional additional context\n */\n error(message: string, error?: Error, context?: Partial<LogContext>): void;\n /**\n * Create a child logger with additional context\n *\n * The child logger inherits all context from the parent and adds new context.\n * This is useful for adding operation-specific context without passing through parameters.\n *\n * @param context Additional context to merge\n * @returns New logger instance with merged context\n *\n * @example\n * const logger = createLogger({ component: 'sandbox-do', traceId: 'tr_abc123' });\n * const execLogger = logger.child({ operation: 'exec', commandId: 'cmd-456' });\n * execLogger.info('Command started'); // Includes all context: component, traceId, operation, commandId\n */\n child(context: Partial<LogContext>): Logger;\n}\n//# sourceMappingURL=types.d.ts.map","export interface CreateContextOptions {\n /**\n * Programming language for the context\n * @default 'python'\n */\n language?: 'python' | 'javascript' | 'typescript';\n /**\n * Working directory for the context\n * @default '/workspace'\n */\n cwd?: string;\n /**\n * Environment variables for the context\n */\n envVars?: Record<string, string>;\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\nexport interface CodeContext {\n /**\n * Unique identifier for the context\n */\n readonly id: string;\n /**\n * Programming language of the context\n */\n readonly language: string;\n /**\n * Current working directory\n */\n readonly cwd: string;\n /**\n * When the context was created\n */\n readonly createdAt: Date;\n /**\n * When the context was last used\n */\n readonly lastUsed: Date;\n}\nexport interface RunCodeOptions {\n /**\n * Context to run the code in. If not provided, uses default context for the language\n */\n context?: CodeContext;\n /**\n * Language to use if context is not provided\n * @default 'python'\n */\n language?: 'python' | 'javascript' | 'typescript';\n /**\n * Environment variables for this execution\n */\n envVars?: Record<string, string>;\n /**\n * Execution timeout in milliseconds\n * @default 60000\n */\n timeout?: number;\n /**\n * AbortSignal for cancelling execution\n */\n signal?: AbortSignal;\n /**\n * Callback for stdout output\n */\n onStdout?: (output: OutputMessage) => void | Promise<void>;\n /**\n * Callback for stderr output\n */\n onStderr?: (output: OutputMessage) => void | Promise<void>;\n /**\n * Callback for execution results (charts, tables, etc)\n */\n onResult?: (result: Result) => void | Promise<void>;\n /**\n * Callback for execution errors\n */\n onError?: (error: ExecutionError) => void | Promise<void>;\n}\nexport interface OutputMessage {\n /**\n * The output text\n */\n text: string;\n /**\n * Timestamp of the output\n */\n timestamp: number;\n}\nexport interface Result {\n /**\n * Plain text representation\n */\n text?: string;\n /**\n * HTML representation (tables, formatted output)\n */\n html?: string;\n /**\n * PNG image data (base64 encoded)\n */\n png?: string;\n /**\n * JPEG image data (base64 encoded)\n */\n jpeg?: string;\n /**\n * SVG image data\n */\n svg?: string;\n /**\n * LaTeX representation\n */\n latex?: string;\n /**\n * Markdown representation\n */\n markdown?: string;\n /**\n * JavaScript code to execute\n */\n javascript?: string;\n /**\n * JSON data\n */\n json?: any;\n /**\n * Chart data if the result is a visualization\n */\n chart?: ChartData;\n /**\n * Raw data object\n */\n data?: any;\n /**\n * Available output formats\n */\n formats(): string[];\n}\nexport interface ChartData {\n /**\n * Type of chart\n */\n type: 'line' | 'bar' | 'scatter' | 'pie' | 'histogram' | 'heatmap' | 'unknown';\n /**\n * Chart title\n */\n title?: string;\n /**\n * Chart data (format depends on library)\n */\n data: any;\n /**\n * Chart layout/configuration\n */\n layout?: any;\n /**\n * Additional configuration\n */\n config?: any;\n /**\n * Library that generated the chart\n */\n library?: 'matplotlib' | 'plotly' | 'altair' | 'seaborn' | 'unknown';\n /**\n * Base64 encoded image if available\n */\n image?: string;\n}\nexport interface ExecutionError {\n /**\n * Error name/type (e.g., 'NameError', 'SyntaxError')\n */\n name: string;\n /**\n * Error message\n */\n message: string;\n /**\n * Stack trace\n */\n traceback: string[];\n /**\n * Line number where error occurred\n */\n lineNumber?: number;\n}\nexport interface ExecutionResult {\n code: string;\n logs: {\n stdout: string[];\n stderr: string[];\n };\n error?: ExecutionError;\n executionCount?: number;\n results: Array<{\n text?: string;\n html?: string;\n png?: string;\n jpeg?: string;\n svg?: string;\n latex?: string;\n markdown?: string;\n javascript?: string;\n json?: any;\n chart?: ChartData;\n data?: any;\n }>;\n}\nexport declare class Execution {\n readonly code: string;\n readonly context: CodeContext;\n /**\n * All results from the execution\n */\n results: Result[];\n /**\n * Accumulated stdout and stderr\n */\n logs: {\n stdout: string[];\n stderr: string[];\n };\n /**\n * Execution error if any\n */\n error?: ExecutionError;\n /**\n * Execution count (for interpreter)\n */\n executionCount?: number;\n constructor(code: string, context: CodeContext);\n /**\n * Convert to a plain object for serialization\n */\n toJSON(): ExecutionResult;\n}\nexport declare class ResultImpl implements Result {\n private raw;\n constructor(raw: any);\n get text(): string | undefined;\n get html(): string | undefined;\n get png(): string | undefined;\n get jpeg(): string | undefined;\n get svg(): string | undefined;\n get latex(): string | undefined;\n get markdown(): string | undefined;\n get javascript(): string | undefined;\n get json(): any;\n get chart(): ChartData | undefined;\n get data(): any;\n formats(): string[];\n}\n//# sourceMappingURL=interpreter-types.d.ts.map","import type { CodeContext, CreateContextOptions, ExecutionResult, RunCodeOptions } from './interpreter-types';\nexport interface BaseExecOptions {\n /**\n * Maximum execution time in milliseconds\n */\n timeout?: number;\n /**\n * Environment variables for the command\n */\n env?: Record<string, string>;\n /**\n * Working directory for command execution\n */\n cwd?: string;\n /**\n * Text encoding for output (default: 'utf8')\n */\n encoding?: string;\n}\nexport interface ExecOptions extends BaseExecOptions {\n /**\n * Enable real-time output streaming via callbacks\n */\n stream?: boolean;\n /**\n * Callback for real-time output data\n */\n onOutput?: (stream: 'stdout' | 'stderr', data: string) => void;\n /**\n * Callback when command completes (only when stream: true)\n */\n onComplete?: (result: ExecResult) => void;\n /**\n * Callback for execution errors\n */\n onError?: (error: Error) => void;\n /**\n * AbortSignal for cancelling execution\n */\n signal?: AbortSignal;\n}\nexport interface ExecResult {\n /**\n * Whether the command succeeded (exitCode === 0)\n */\n success: boolean;\n /**\n * Process exit code\n */\n exitCode: number;\n /**\n * Standard output content\n */\n stdout: string;\n /**\n * Standard error content\n */\n stderr: string;\n /**\n * Command that was executed\n */\n command: string;\n /**\n * Execution duration in milliseconds\n */\n duration: number;\n /**\n * ISO timestamp when command started\n */\n timestamp: string;\n /**\n * Session ID if provided\n */\n sessionId?: string;\n}\nexport interface ProcessOptions extends BaseExecOptions {\n /**\n * Custom process ID for later reference\n * If not provided, a UUID will be generated\n */\n processId?: string;\n /**\n * Automatically cleanup process record after exit (default: true)\n */\n autoCleanup?: boolean;\n /**\n * Callback when process exits\n */\n onExit?: (code: number | null) => void;\n /**\n * Callback for real-time output (background processes)\n */\n onOutput?: (stream: 'stdout' | 'stderr', data: string) => void;\n /**\n * Callback when process starts successfully\n */\n onStart?: (process: Process) => void;\n /**\n * Callback for process errors\n */\n onError?: (error: Error) => void;\n}\nexport type ProcessStatus = 'starting' | 'running' | 'completed' | 'failed' | 'killed' | 'error';\nexport interface Process {\n /**\n * Unique process identifier\n */\n readonly id: string;\n /**\n * System process ID (if available and running)\n */\n readonly pid?: number;\n /**\n * Command that was executed\n */\n readonly command: string;\n /**\n * Current process status\n */\n readonly status: ProcessStatus;\n /**\n * When the process was started\n */\n readonly startTime: Date;\n /**\n * When the process ended (if completed)\n */\n readonly endTime?: Date;\n /**\n * Process exit code (if completed)\n */\n readonly exitCode?: number;\n /**\n * Session ID if provided\n */\n readonly sessionId?: string;\n /**\n * Kill the process\n */\n kill(signal?: string): Promise<void>;\n /**\n * Get current process status (refreshed)\n */\n getStatus(): Promise<ProcessStatus>;\n /**\n * Get accumulated logs\n */\n getLogs(): Promise<{\n stdout: string;\n stderr: string;\n }>;\n}\nexport interface ExecEvent {\n type: 'start' | 'stdout' | 'stderr' | 'complete' | 'error';\n timestamp: string;\n data?: string;\n command?: string;\n exitCode?: number;\n result?: ExecResult;\n error?: string;\n sessionId?: string;\n}\nexport interface LogEvent {\n type: 'stdout' | 'stderr' | 'exit' | 'error';\n timestamp: string;\n data: string;\n processId: string;\n sessionId?: string;\n exitCode?: number;\n}\nexport interface StreamOptions extends BaseExecOptions {\n /**\n * Buffer size for streaming output\n */\n bufferSize?: number;\n /**\n * AbortSignal for cancelling stream\n */\n signal?: AbortSignal;\n}\nexport interface SessionOptions {\n /**\n * Optional session ID (auto-generated if not provided)\n */\n id?: string;\n /**\n * Session name for identification\n */\n name?: string;\n /**\n * Environment variables for this session\n */\n env?: Record<string, string>;\n /**\n * Working directory\n */\n cwd?: string;\n /**\n * Enable PID namespace isolation (requires CAP_SYS_ADMIN)\n */\n isolation?: boolean;\n}\nexport interface SandboxOptions {\n /**\n * Duration after which the sandbox instance will sleep if no requests are received\n * Can be:\n * - A string like \"30s\", \"3m\", \"5m\", \"1h\" (seconds, minutes, or hours)\n * - A number representing seconds (e.g., 180 for 3 minutes)\n * Default: \"10m\" (10 minutes)\n *\n * Note: Ignored when keepAlive is true\n */\n sleepAfter?: string | number;\n /**\n * Base URL for the sandbox API\n */\n baseUrl?: string;\n /**\n * Keep the container alive indefinitely by preventing automatic shutdown\n * When true, the container will never auto-timeout and must be explicitly destroyed\n * - Any scenario where activity can't be automatically detected\n *\n * Important: You MUST call sandbox.destroy() when done to avoid resource leaks\n *\n * Default: false\n */\n keepAlive?: boolean;\n /**\n * Normalize sandbox ID to lowercase for preview URL compatibility\n *\n * Required for preview URLs because hostnames are case-insensitive (RFC 3986), which\n * would route requests to a different Durable Object instance with IDs containing uppercase letters.\n *\n * **Important:** Different normalizeId values create different Durable Object instances:\n * - `getSandbox(ns, \"MyProject\")` → DO key: \"MyProject\"\n * - `getSandbox(ns, \"MyProject\", {normalizeId: true})` → DO key: \"myproject\"\n *\n * **Future change:** In a future version, this will default to `true` (automatically lowercase all IDs).\n * IDs with uppercase letters will trigger a warning. To prepare, use lowercase IDs or explicitly\n * pass `normalizeId: true`.\n *\n * @example\n * getSandbox(ns, \"my-project\") // Works with preview URLs (lowercase)\n * getSandbox(ns, \"MyProject\", {normalizeId: true}) // Normalized to \"myproject\"\n *\n * @default false\n */\n normalizeId?: boolean;\n /**\n * Container startup timeout configuration\n *\n * Tune timeouts based on your container's characteristics. SDK defaults (30s instance, 90s ports)\n * work for most use cases. Adjust for heavy containers or fail-fast applications.\n *\n * Can also be configured via environment variables:\n * - SANDBOX_INSTANCE_TIMEOUT_MS\n * - SANDBOX_PORT_TIMEOUT_MS\n * - SANDBOX_POLL_INTERVAL_MS\n *\n * Precedence: options > env vars > SDK defaults\n *\n * @example\n * // Heavy containers (ML models, large apps)\n * getSandbox(ns, id, {\n * containerTimeouts: { portReadyTimeoutMS: 180_000 }\n * })\n *\n * @example\n * // Fail-fast for latency-sensitive apps\n * getSandbox(ns, id, {\n * containerTimeouts: {\n * instanceGetTimeoutMS: 15_000,\n * portReadyTimeoutMS: 30_000\n * }\n * })\n */\n containerTimeouts?: {\n /**\n * Time to wait for container instance provisioning\n * @default 30000 (30s) - or SANDBOX_INSTANCE_TIMEOUT_MS env var\n */\n instanceGetTimeoutMS?: number;\n /**\n * Time to wait for application startup and ports to be ready\n * @default 90000 (90s) - or SANDBOX_PORT_TIMEOUT_MS env var\n */\n portReadyTimeoutMS?: number;\n /**\n * How often to poll for container readiness\n * @default 1000 (1s) - or SANDBOX_POLL_INTERVAL_MS env var\n */\n waitIntervalMS?: number;\n };\n}\n/**\n * Execution session - isolated execution context within a sandbox\n * Returned by sandbox.createSession()\n * Provides the same API as ISandbox but bound to a specific session\n */\nexport interface MkdirResult {\n success: boolean;\n path: string;\n recursive: boolean;\n timestamp: string;\n exitCode?: number;\n}\nexport interface WriteFileResult {\n success: boolean;\n path: string;\n timestamp: string;\n exitCode?: number;\n}\nexport interface ReadFileResult {\n success: boolean;\n path: string;\n content: string;\n timestamp: string;\n exitCode?: number;\n /**\n * Encoding used for content (utf-8 for text, base64 for binary)\n */\n encoding?: 'utf-8' | 'base64';\n /**\n * Whether the file is detected as binary\n */\n isBinary?: boolean;\n /**\n * MIME type of the file (e.g., 'image/png', 'text/plain')\n */\n mimeType?: string;\n /**\n * File size in bytes\n */\n size?: number;\n}\nexport interface DeleteFileResult {\n success: boolean;\n path: string;\n timestamp: string;\n exitCode?: number;\n}\nexport interface RenameFileResult {\n success: boolean;\n path: string;\n newPath: string;\n timestamp: string;\n exitCode?: number;\n}\nexport interface MoveFileResult {\n success: boolean;\n path: string;\n newPath: string;\n timestamp: string;\n exitCode?: number;\n}\nexport interface FileExistsResult {\n success: boolean;\n path: string;\n exists: boolean;\n timestamp: string;\n}\nexport interface FileInfo {\n name: string;\n absolutePath: string;\n relativePath: string;\n type: 'file' | 'directory' | 'symlink' | 'other';\n size: number;\n modifiedAt: string;\n mode: string;\n permissions: {\n readable: boolean;\n writable: boolean;\n executable: boolean;\n };\n}\nexport interface ListFilesOptions {\n recursive?: boolean;\n includeHidden?: boolean;\n}\nexport interface ListFilesResult {\n success: boolean;\n path: string;\n files: FileInfo[];\n count: number;\n timestamp: string;\n exitCode?: number;\n}\nexport interface GitCheckoutResult {\n success: boolean;\n repoUrl: string;\n branch: string;\n targetDir: string;\n timestamp: string;\n exitCode?: number;\n}\n/**\n * SSE events for file streaming\n */\nexport type FileStreamEvent = {\n type: 'metadata';\n mimeType: string;\n size: number;\n isBinary: boolean;\n encoding: 'utf-8' | 'base64';\n} | {\n type: 'chunk';\n data: string;\n} | {\n type: 'complete';\n bytesRead: number;\n} | {\n type: 'error';\n error: string;\n};\n/**\n * File metadata from streaming\n */\nexport interface FileMetadata {\n mimeType: string;\n size: number;\n isBinary: boolean;\n encoding: 'utf-8' | 'base64';\n}\n/**\n * File stream chunk - either string (text) or Uint8Array (binary, auto-decoded)\n */\nexport type FileChunk = string | Uint8Array;\nexport interface ProcessStartResult {\n success: boolean;\n processId: string;\n pid?: number;\n command: string;\n timestamp: string;\n}\nexport interface ProcessListResult {\n success: boolean;\n processes: Array<{\n id: string;\n pid?: number;\n command: string;\n status: ProcessStatus;\n startTime: string;\n endTime?: string;\n exitCode?: number;\n }>;\n timestamp: string;\n}\nexport interface ProcessInfoResult {\n success: boolean;\n process: {\n id: string;\n pid?: number;\n command: string;\n status: ProcessStatus;\n startTime: string;\n endTime?: string;\n exitCode?: number;\n };\n timestamp: string;\n}\nexport interface ProcessKillResult {\n success: boolean;\n processId: string;\n signal?: string;\n timestamp: string;\n}\nexport interface ProcessLogsResult {\n success: boolean;\n processId: string;\n stdout: string;\n stderr: string;\n timestamp: string;\n}\nexport interface ProcessCleanupResult {\n success: boolean;\n cleanedCount: number;\n timestamp: string;\n}\nexport interface SessionCreateResult {\n success: boolean;\n sessionId: string;\n name?: string;\n cwd?: string;\n timestamp: string;\n}\nexport interface SessionDeleteResult {\n success: boolean;\n sessionId: string;\n timestamp: string;\n}\nexport interface EnvSetResult {\n success: boolean;\n timestamp: string;\n}\nexport interface PortExposeResult {\n success: boolean;\n port: number;\n url: string;\n timestamp: string;\n}\nexport interface PortStatusResult {\n success: boolean;\n port: number;\n status: 'active' | 'inactive';\n url?: string;\n timestamp: string;\n}\nexport interface PortListResult {\n success: boolean;\n ports: Array<{\n port: number;\n url: string;\n status: 'active' | 'inactive';\n }>;\n timestamp: string;\n}\nexport interface PortCloseResult {\n success: boolean;\n port: number;\n timestamp: string;\n}\nexport interface InterpreterHealthResult {\n success: boolean;\n status: 'healthy' | 'unhealthy';\n timestamp: string;\n}\nexport interface ContextCreateResult {\n success: boolean;\n contextId: string;\n language: string;\n cwd?: string;\n timestamp: string;\n}\nexport interface ContextListResult {\n success: boolean;\n contexts: Array<{\n id: string;\n language: string;\n cwd?: string;\n }>;\n timestamp: string;\n}\nexport interface ContextDeleteResult {\n success: boolean;\n contextId: string;\n timestamp: string;\n}\nexport interface HealthCheckResult {\n success: boolean;\n status: 'healthy' | 'unhealthy';\n timestamp: string;\n}\nexport interface ShutdownResult {\n success: boolean;\n message: string;\n timestamp: string;\n}\nexport interface ExecutionSession {\n /** Unique session identifier */\n readonly id: string;\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n execStream(command: string, options?: StreamOptions): Promise<ReadableStream<Uint8Array>>;\n startProcess(command: string, options?: ProcessOptions): Promise<Process>;\n listProcesses(): Promise<Process[]>;\n getProcess(id: string): Promise<Process | null>;\n killProcess(id: string, signal?: string): Promise<void>;\n killAllProcesses(): Promise<number>;\n cleanupCompletedProcesses(): Promise<number>;\n getProcessLogs(id: string): Promise<{\n stdout: string;\n stderr: string;\n processId: string;\n }>;\n streamProcessLogs(processId: string, options?: {\n signal?: AbortSignal;\n }): Promise<ReadableStream<Uint8Array>>;\n writeFile(path: string, content: string, options?: {\n encoding?: string;\n }): Promise<WriteFileResult>;\n readFile(path: string, options?: {\n encoding?: string;\n }): Promise<ReadFileResult>;\n readFileStream(path: string): Promise<ReadableStream<Uint8Array>>;\n mkdir(path: string, options?: {\n recursive?: boolean;\n }): Promise<MkdirResult>;\n deleteFile(path: string): Promise<DeleteFileResult>;\n renameFile(oldPath: string, newPath: string): Promise<RenameFileResult>;\n moveFile(sourcePath: string, destinationPath: string): Promise<MoveFileResult>;\n listFiles(path: string, options?: ListFilesOptions): Promise<ListFilesResult>;\n exists(path: string): Promise<FileExistsResult>;\n gitCheckout(repoUrl: string, options?: {\n branch?: string;\n targetDir?: string;\n }): Promise<GitCheckoutResult>;\n setEnvVars(envVars: Record<string, string>): Promise<void>;\n createCodeContext(options?: CreateContextOptions): Promise<CodeContext>;\n runCode(code: string, options?: RunCodeOptions): Promise<ExecutionResult>;\n runCodeStream(code: string, options?: RunCodeOptions): Promise<ReadableStream<Uint8Array>>;\n listCodeContexts(): Promise<CodeContext[]>;\n deleteCodeContext(contextId: string): Promise<void>;\n mountBucket(bucket: string, mountPath: string, options: MountBucketOptions): Promise<void>;\n unmountBucket(mountPath: string): Promise<void>;\n}\n/**\n * Supported S3-compatible storage providers\n */\nexport type BucketProvider = 'r2' | 's3' | 'gcs';\n/**\n * Credentials for S3-compatible storage\n */\nexport interface BucketCredentials {\n accessKeyId: string;\n secretAccessKey: string;\n}\n/**\n * Options for mounting an S3-compatible bucket\n */\nexport interface MountBucketOptions {\n /**\n * S3-compatible endpoint URL\n *\n * Examples:\n * - R2: 'https://abc123.r2.cloudflarestorage.com'\n * - AWS S3: 'https://s3.us-west-2.amazonaws.com'\n * - GCS: 'https://storage.googleapis.com'\n *\n * Required field\n */\n endpoint: string;\n /**\n * Optional provider hint for automatic s3fs flag configuration\n * If not specified, will attempt to detect from endpoint URL.\n *\n * Examples:\n * - 'r2' - Cloudflare R2 (adds nomixupload)\n * - 's3' - Amazon S3 (standard configuration)\n * - 'gcs' - Google Cloud Storage (no special flags needed)\n */\n provider?: BucketProvider;\n /**\n * Explicit credentials (overrides env var auto-detection)\n */\n credentials?: BucketCredentials;\n /**\n * Mount filesystem as read-only\n * Default: false\n */\n readOnly?: boolean;\n /**\n * Advanced: Override or extend s3fs options\n *\n * These will be merged with provider-specific defaults.\n * To override defaults completely, specify all options here.\n *\n * Common options:\n * - 'use_path_request_style' - Use path-style URLs (bucket/path vs bucket.host/path)\n * - 'nomixupload' - Disable mixed multipart uploads (needed for some providers)\n * - 'nomultipart' - Disable all multipart operations\n * - 'sigv2' - Use signature version 2 instead of v4\n * - 'no_check_certificate' - Skip SSL certificate validation (dev/testing only)\n */\n s3fsOptions?: string[];\n}\nexport interface ISandbox {\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n startProcess(command: string, options?: ProcessOptions): Promise<Process>;\n listProcesses(): Promise<Process[]>;\n getProcess(id: string): Promise<Process | null>;\n killProcess(id: string, signal?: string): Promise<void>;\n killAllProcesses(): Promise<number>;\n execStream(command: string, options?: StreamOptions): Promise<ReadableStream<Uint8Array>>;\n streamProcessLogs(processId: string, options?: {\n signal?: AbortSignal;\n }): Promise<ReadableStream<Uint8Array>>;\n cleanupCompletedProcesses(): Promise<number>;\n getProcessLogs(id: string): Promise<{\n stdout: string;\n stderr: string;\n processId: string;\n }>;\n writeFile(path: string, content: string, options?: {\n encoding?: string;\n }): Promise<WriteFileResult>;\n readFile(path: string, options?: {\n encoding?: string;\n }): Promise<ReadFileResult>;\n readFileStream(path: string): Promise<ReadableStream<Uint8Array>>;\n mkdir(path: string, options?: {\n recursive?: boolean;\n }): Promise<MkdirResult>;\n deleteFile(path: string): Promise<DeleteFileResult>;\n renameFile(oldPath: string, newPath: string): Promise<RenameFileResult>;\n moveFile(sourcePath: string, destinationPath: string): Promise<MoveFileResult>;\n listFiles(path: string, options?: ListFilesOptions): Promise<ListFilesResult>;\n exists(path: string, sessionId?: string): Promise<FileExistsResult>;\n gitCheckout(repoUrl: string, options?: {\n branch?: string;\n targetDir?: string;\n }): Promise<GitCheckoutResult>;\n mountBucket(bucket: string, mountPath: string, options: MountBucketOptions): Promise<void>;\n unmountBucket(mountPath: string): Promise<void>;\n createSession(options?: SessionOptions): Promise<ExecutionSession>;\n deleteSession(sessionId: string): Promise<SessionDeleteResult>;\n createCodeContext(options?: CreateContextOptions): Promise<CodeContext>;\n runCode(code: string, options?: RunCodeOptions): Promise<ExecutionResult>;\n runCodeStream(code: string, options?: RunCodeOptions): Promise<ReadableStream>;\n listCodeContexts(): Promise<CodeContext[]>;\n deleteCodeContext(contextId: string): Promise<void>;\n wsConnect(request: Request, port: number): Promise<Response>;\n}\nexport declare function isExecResult(value: any): value is ExecResult;\nexport declare function isProcess(value: any): value is Process;\nexport declare function isProcessStatus(value: string): value is ProcessStatus;\nexport type { ChartData, CodeContext, CreateContextOptions, ExecutionError, ExecutionResult, OutputMessage, Result, RunCodeOptions } from './interpreter-types';\nexport { Execution, ResultImpl } from './interpreter-types';\n//# sourceMappingURL=types.d.ts.map"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudflare/sandbox",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/cloudflare/sandbox-sdk"
|
|
@@ -11,8 +11,17 @@
|
|
|
11
11
|
"@cloudflare/containers": "^0.0.30"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
+
"@openai/agents": "^0.3.2",
|
|
14
15
|
"@repo/shared": "^0.0.0"
|
|
15
16
|
},
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"@openai/agents": "^0.3.2"
|
|
19
|
+
},
|
|
20
|
+
"peerDependenciesMeta": {
|
|
21
|
+
"@openai/agents": {
|
|
22
|
+
"optional": true
|
|
23
|
+
}
|
|
24
|
+
},
|
|
16
25
|
"tags": [
|
|
17
26
|
"sandbox",
|
|
18
27
|
"codegen",
|
|
@@ -36,6 +45,11 @@
|
|
|
36
45
|
"types": "./dist/index.d.ts",
|
|
37
46
|
"import": "./dist/index.js",
|
|
38
47
|
"require": "./dist/index.js"
|
|
48
|
+
},
|
|
49
|
+
"./openai": {
|
|
50
|
+
"types": "./dist/openai/index.d.ts",
|
|
51
|
+
"import": "./dist/openai/index.js",
|
|
52
|
+
"require": "./dist/openai/index.js"
|
|
39
53
|
}
|
|
40
54
|
},
|
|
41
55
|
"keywords": [],
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Agents adapters for executing shell commands and file operations
|
|
3
|
+
* inside a Cloudflare Sandbox.
|
|
4
|
+
*/
|
|
5
|
+
import {
|
|
6
|
+
type ApplyPatchOperation,
|
|
7
|
+
type ApplyPatchResult,
|
|
8
|
+
applyDiff,
|
|
9
|
+
type Editor as OpenAIEeditor,
|
|
10
|
+
type Shell as OpenAIShell,
|
|
11
|
+
type ShellAction,
|
|
12
|
+
type ShellOutputResult,
|
|
13
|
+
type ShellResult
|
|
14
|
+
} from '@openai/agents';
|
|
15
|
+
|
|
16
|
+
// Command result for API responses
|
|
17
|
+
export interface CommandResult {
|
|
18
|
+
command: string;
|
|
19
|
+
stdout: string;
|
|
20
|
+
stderr: string;
|
|
21
|
+
exitCode: number | null;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// File operation result for API responses
|
|
26
|
+
export interface FileOperationResult {
|
|
27
|
+
operation: 'create' | 'update' | 'delete';
|
|
28
|
+
path: string;
|
|
29
|
+
status: 'completed' | 'failed';
|
|
30
|
+
output: string;
|
|
31
|
+
error?: string;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
import { createLogger, type Logger } from '@repo/shared';
|
|
36
|
+
import type { Sandbox } from '../sandbox';
|
|
37
|
+
|
|
38
|
+
// Helper functions for error handling
|
|
39
|
+
function isErrorWithProperties(error: unknown): error is {
|
|
40
|
+
message?: string;
|
|
41
|
+
exitCode?: number;
|
|
42
|
+
stdout?: string;
|
|
43
|
+
stderr?: string;
|
|
44
|
+
status?: number;
|
|
45
|
+
stack?: string;
|
|
46
|
+
} {
|
|
47
|
+
return typeof error === 'object' && error !== null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function getErrorMessage(error: unknown): string {
|
|
51
|
+
if (isErrorWithProperties(error) && typeof error.message === 'string') {
|
|
52
|
+
return error.message;
|
|
53
|
+
}
|
|
54
|
+
return String(error);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Convert unknown values to Error instances when possible so downstream
|
|
59
|
+
* loggers can include stack traces without losing type safety.
|
|
60
|
+
*/
|
|
61
|
+
function toError(error: unknown): Error | undefined {
|
|
62
|
+
return error instanceof Error ? error : undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Shell implementation that adapts Cloudflare Sandbox exec calls to the
|
|
67
|
+
* OpenAI Agents `Shell` contract, including structured result collection.
|
|
68
|
+
*/
|
|
69
|
+
export class Shell implements OpenAIShell {
|
|
70
|
+
private cwd: string = '/workspace';
|
|
71
|
+
public results: CommandResult[] = [];
|
|
72
|
+
private readonly logger: Logger;
|
|
73
|
+
|
|
74
|
+
constructor(private readonly sandbox: Sandbox) {
|
|
75
|
+
this.logger = createLogger({
|
|
76
|
+
component: 'sandbox-do',
|
|
77
|
+
operation: 'openai-shell'
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async run(action: ShellAction): Promise<ShellResult> {
|
|
82
|
+
this.logger.debug('SandboxShell.run called', {
|
|
83
|
+
commands: action.commands,
|
|
84
|
+
timeout: action.timeoutMs
|
|
85
|
+
});
|
|
86
|
+
const output: ShellResult['output'] = [];
|
|
87
|
+
|
|
88
|
+
for (const command of action.commands) {
|
|
89
|
+
this.logger.debug('Executing command', { command, cwd: this.cwd });
|
|
90
|
+
let stdout = '';
|
|
91
|
+
let stderr = '';
|
|
92
|
+
let exitCode: number | null = 0;
|
|
93
|
+
let outcome: ShellOutputResult['outcome'] = {
|
|
94
|
+
type: 'exit',
|
|
95
|
+
exitCode: 0
|
|
96
|
+
};
|
|
97
|
+
try {
|
|
98
|
+
const result = await this.sandbox.exec(command, {
|
|
99
|
+
timeout: action.timeoutMs,
|
|
100
|
+
cwd: this.cwd
|
|
101
|
+
});
|
|
102
|
+
stdout = result.stdout;
|
|
103
|
+
stderr = result.stderr;
|
|
104
|
+
exitCode = result.exitCode;
|
|
105
|
+
// exec returns a result even for failed commands, so check success field
|
|
106
|
+
// Timeout would be indicated by a specific error or exit code
|
|
107
|
+
outcome = { type: 'exit', exitCode };
|
|
108
|
+
|
|
109
|
+
this.logger.debug('Command executed successfully', {
|
|
110
|
+
command,
|
|
111
|
+
exitCode,
|
|
112
|
+
stdoutLength: stdout.length,
|
|
113
|
+
stderrLength: stderr.length
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Log warnings for non-zero exit codes or stderr output
|
|
117
|
+
if (exitCode !== 0) {
|
|
118
|
+
this.logger.warn(`Command failed with exit code ${exitCode}`, {
|
|
119
|
+
command,
|
|
120
|
+
stderr
|
|
121
|
+
});
|
|
122
|
+
} else if (stderr) {
|
|
123
|
+
this.logger.warn(`Command produced stderr output`, {
|
|
124
|
+
command,
|
|
125
|
+
stderr
|
|
126
|
+
});
|
|
127
|
+
} else {
|
|
128
|
+
this.logger.info(`Command completed successfully`, { command });
|
|
129
|
+
}
|
|
130
|
+
} catch (error: unknown) {
|
|
131
|
+
// Handle network/HTTP errors or timeout errors
|
|
132
|
+
const errorObj = isErrorWithProperties(error) ? error : {};
|
|
133
|
+
exitCode =
|
|
134
|
+
typeof errorObj.exitCode === 'number' ? errorObj.exitCode : null;
|
|
135
|
+
stdout = typeof errorObj.stdout === 'string' ? errorObj.stdout : '';
|
|
136
|
+
stderr = typeof errorObj.stderr === 'string' ? errorObj.stderr : '';
|
|
137
|
+
|
|
138
|
+
// Check if it's a timeout error
|
|
139
|
+
const errorMessage = getErrorMessage(error);
|
|
140
|
+
if (
|
|
141
|
+
errorMessage.includes('timeout') ||
|
|
142
|
+
errorMessage.includes('Timeout') ||
|
|
143
|
+
errorMessage.includes('timed out')
|
|
144
|
+
) {
|
|
145
|
+
this.logger.error(`Command timed out`, undefined, {
|
|
146
|
+
command,
|
|
147
|
+
timeout: action.timeoutMs
|
|
148
|
+
});
|
|
149
|
+
outcome = { type: 'timeout' };
|
|
150
|
+
} else {
|
|
151
|
+
this.logger.error(`Error executing command`, toError(error), {
|
|
152
|
+
command,
|
|
153
|
+
error: errorMessage || error,
|
|
154
|
+
exitCode
|
|
155
|
+
});
|
|
156
|
+
outcome = { type: 'exit', exitCode: exitCode ?? 1 };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
output.push({
|
|
160
|
+
command,
|
|
161
|
+
stdout,
|
|
162
|
+
stderr,
|
|
163
|
+
outcome
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Collect results for API responses
|
|
167
|
+
const collectedExitCode =
|
|
168
|
+
outcome.type === 'exit' ? outcome.exitCode : null;
|
|
169
|
+
const timestamp = Date.now();
|
|
170
|
+
this.results.push({
|
|
171
|
+
command: String(command),
|
|
172
|
+
stdout: String(stdout),
|
|
173
|
+
stderr: String(stderr),
|
|
174
|
+
exitCode: collectedExitCode,
|
|
175
|
+
timestamp
|
|
176
|
+
});
|
|
177
|
+
this.logger.debug('Result collected', {
|
|
178
|
+
command,
|
|
179
|
+
exitCode: collectedExitCode,
|
|
180
|
+
timestamp
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (outcome.type === 'timeout') {
|
|
184
|
+
this.logger.warn('Breaking command loop due to timeout');
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this.logger.debug('SandboxShell.run completed', {
|
|
190
|
+
totalCommands: action.commands.length,
|
|
191
|
+
resultsCount: this.results.length
|
|
192
|
+
});
|
|
193
|
+
return {
|
|
194
|
+
output,
|
|
195
|
+
providerData: {
|
|
196
|
+
working_directory: this.cwd
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Editor implementation that projects applyPatch operations from Agents
|
|
204
|
+
* into calls against the sandbox filesystem APIs.
|
|
205
|
+
*/
|
|
206
|
+
export class Editor implements OpenAIEeditor {
|
|
207
|
+
public results: FileOperationResult[] = [];
|
|
208
|
+
private readonly logger: Logger;
|
|
209
|
+
|
|
210
|
+
constructor(
|
|
211
|
+
private readonly sandbox: Sandbox,
|
|
212
|
+
private readonly root: string = '/workspace'
|
|
213
|
+
) {
|
|
214
|
+
this.logger = createLogger({
|
|
215
|
+
component: 'sandbox-do',
|
|
216
|
+
operation: 'openai-editor'
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Create a new file inside the sandbox by applying the provided diff.
|
|
222
|
+
*/
|
|
223
|
+
async createFile(
|
|
224
|
+
operation: Extract<ApplyPatchOperation, { type: 'create_file' }>
|
|
225
|
+
): Promise<ApplyPatchResult | undefined> {
|
|
226
|
+
const targetPath = this.resolve(operation.path);
|
|
227
|
+
this.logger.debug('WorkspaceEditor.createFile called', {
|
|
228
|
+
path: operation.path,
|
|
229
|
+
targetPath
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
// Create parent directory if needed
|
|
234
|
+
const dirPath = this.getDirname(targetPath);
|
|
235
|
+
if (dirPath !== this.root && dirPath !== '/') {
|
|
236
|
+
this.logger.debug('Creating parent directory', { dirPath });
|
|
237
|
+
await this.sandbox.mkdir(dirPath, { recursive: true });
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const content = applyDiff('', operation.diff, 'create');
|
|
241
|
+
this.logger.debug('Writing file content', {
|
|
242
|
+
path: targetPath,
|
|
243
|
+
contentLength: content.length
|
|
244
|
+
});
|
|
245
|
+
await this.sandbox.writeFile(targetPath, content, { encoding: 'utf-8' });
|
|
246
|
+
const timestamp = Date.now();
|
|
247
|
+
const result: FileOperationResult = {
|
|
248
|
+
operation: 'create',
|
|
249
|
+
path: operation.path,
|
|
250
|
+
status: 'completed',
|
|
251
|
+
output: `Created ${operation.path}`,
|
|
252
|
+
timestamp
|
|
253
|
+
};
|
|
254
|
+
this.results.push(result);
|
|
255
|
+
this.logger.info('File created successfully', {
|
|
256
|
+
path: operation.path,
|
|
257
|
+
timestamp
|
|
258
|
+
});
|
|
259
|
+
return { status: 'completed', output: `Created ${operation.path}` };
|
|
260
|
+
} catch (error: unknown) {
|
|
261
|
+
const timestamp = Date.now();
|
|
262
|
+
const errorMessage = getErrorMessage(error);
|
|
263
|
+
const result: FileOperationResult = {
|
|
264
|
+
operation: 'create',
|
|
265
|
+
path: operation.path,
|
|
266
|
+
status: 'failed',
|
|
267
|
+
output: `Failed to create ${operation.path}`,
|
|
268
|
+
error: errorMessage,
|
|
269
|
+
timestamp
|
|
270
|
+
};
|
|
271
|
+
this.results.push(result);
|
|
272
|
+
this.logger.error('Failed to create file', toError(error), {
|
|
273
|
+
path: operation.path,
|
|
274
|
+
error: errorMessage
|
|
275
|
+
});
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Update an existing file by reading its content, applying a diff, and
|
|
282
|
+
* writing the patched output back to the sandbox.
|
|
283
|
+
*/
|
|
284
|
+
async updateFile(
|
|
285
|
+
operation: Extract<ApplyPatchOperation, { type: 'update_file' }>
|
|
286
|
+
): Promise<ApplyPatchResult | undefined> {
|
|
287
|
+
const targetPath = this.resolve(operation.path);
|
|
288
|
+
this.logger.debug('WorkspaceEditor.updateFile called', {
|
|
289
|
+
path: operation.path,
|
|
290
|
+
targetPath
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
try {
|
|
294
|
+
let original: string;
|
|
295
|
+
try {
|
|
296
|
+
this.logger.debug('Reading original file', { path: targetPath });
|
|
297
|
+
const fileInfo = await this.sandbox.readFile(targetPath, {
|
|
298
|
+
encoding: 'utf-8'
|
|
299
|
+
});
|
|
300
|
+
original = fileInfo.content;
|
|
301
|
+
this.logger.debug('Original file read', {
|
|
302
|
+
path: targetPath,
|
|
303
|
+
originalLength: original.length
|
|
304
|
+
});
|
|
305
|
+
} catch (error: unknown) {
|
|
306
|
+
// Sandbox API may throw errors for missing files
|
|
307
|
+
const errorObj = isErrorWithProperties(error) ? error : {};
|
|
308
|
+
const errorMessage = getErrorMessage(error);
|
|
309
|
+
if (
|
|
310
|
+
errorMessage.includes('not found') ||
|
|
311
|
+
errorMessage.includes('ENOENT') ||
|
|
312
|
+
errorObj.status === 404
|
|
313
|
+
) {
|
|
314
|
+
this.logger.error('Cannot update missing file', undefined, {
|
|
315
|
+
path: operation.path
|
|
316
|
+
});
|
|
317
|
+
throw new Error(`Cannot update missing file: ${operation.path}`);
|
|
318
|
+
}
|
|
319
|
+
this.logger.error('Error reading file', toError(error), {
|
|
320
|
+
path: operation.path,
|
|
321
|
+
error: errorMessage
|
|
322
|
+
});
|
|
323
|
+
throw error;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const patched = applyDiff(original, operation.diff);
|
|
327
|
+
this.logger.debug('Applied diff', {
|
|
328
|
+
path: targetPath,
|
|
329
|
+
originalLength: original.length,
|
|
330
|
+
patchedLength: patched.length
|
|
331
|
+
});
|
|
332
|
+
await this.sandbox.writeFile(targetPath, patched, { encoding: 'utf-8' });
|
|
333
|
+
const timestamp = Date.now();
|
|
334
|
+
const result: FileOperationResult = {
|
|
335
|
+
operation: 'update',
|
|
336
|
+
path: operation.path,
|
|
337
|
+
status: 'completed',
|
|
338
|
+
output: `Updated ${operation.path}`,
|
|
339
|
+
timestamp
|
|
340
|
+
};
|
|
341
|
+
this.results.push(result);
|
|
342
|
+
this.logger.info('File updated successfully', {
|
|
343
|
+
path: operation.path,
|
|
344
|
+
timestamp
|
|
345
|
+
});
|
|
346
|
+
return { status: 'completed', output: `Updated ${operation.path}` };
|
|
347
|
+
} catch (error: unknown) {
|
|
348
|
+
const timestamp = Date.now();
|
|
349
|
+
const errorMessage = getErrorMessage(error);
|
|
350
|
+
const result: FileOperationResult = {
|
|
351
|
+
operation: 'update',
|
|
352
|
+
path: operation.path,
|
|
353
|
+
status: 'failed',
|
|
354
|
+
output: `Failed to update ${operation.path}`,
|
|
355
|
+
error: errorMessage,
|
|
356
|
+
timestamp
|
|
357
|
+
};
|
|
358
|
+
this.results.push(result);
|
|
359
|
+
this.logger.error('Failed to update file', toError(error), {
|
|
360
|
+
path: operation.path,
|
|
361
|
+
error: errorMessage
|
|
362
|
+
});
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Delete a file that was previously created through applyPatch calls.
|
|
369
|
+
*/
|
|
370
|
+
async deleteFile(
|
|
371
|
+
operation: Extract<ApplyPatchOperation, { type: 'delete_file' }>
|
|
372
|
+
): Promise<ApplyPatchResult | undefined> {
|
|
373
|
+
const targetPath = this.resolve(operation.path);
|
|
374
|
+
this.logger.debug('WorkspaceEditor.deleteFile called', {
|
|
375
|
+
path: operation.path,
|
|
376
|
+
targetPath
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
try {
|
|
380
|
+
await this.sandbox.deleteFile(targetPath);
|
|
381
|
+
const timestamp = Date.now();
|
|
382
|
+
const result: FileOperationResult = {
|
|
383
|
+
operation: 'delete',
|
|
384
|
+
path: operation.path,
|
|
385
|
+
status: 'completed',
|
|
386
|
+
output: `Deleted ${operation.path}`,
|
|
387
|
+
timestamp
|
|
388
|
+
};
|
|
389
|
+
this.results.push(result);
|
|
390
|
+
this.logger.info('File deleted successfully', {
|
|
391
|
+
path: operation.path,
|
|
392
|
+
timestamp
|
|
393
|
+
});
|
|
394
|
+
return { status: 'completed', output: `Deleted ${operation.path}` };
|
|
395
|
+
} catch (error: unknown) {
|
|
396
|
+
const timestamp = Date.now();
|
|
397
|
+
const errorMessage = getErrorMessage(error);
|
|
398
|
+
const result: FileOperationResult = {
|
|
399
|
+
operation: 'delete',
|
|
400
|
+
path: operation.path,
|
|
401
|
+
status: 'failed',
|
|
402
|
+
output: `Failed to delete ${operation.path}`,
|
|
403
|
+
error: errorMessage,
|
|
404
|
+
timestamp
|
|
405
|
+
};
|
|
406
|
+
this.results.push(result);
|
|
407
|
+
this.logger.error('Failed to delete file', toError(error), {
|
|
408
|
+
path: operation.path,
|
|
409
|
+
error: errorMessage
|
|
410
|
+
});
|
|
411
|
+
throw error;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
private resolve(relativePath: string): string {
|
|
416
|
+
// If the path already starts with the root, strip it to get the relative part
|
|
417
|
+
let pathToProcess = relativePath;
|
|
418
|
+
if (relativePath.startsWith(this.root)) {
|
|
419
|
+
pathToProcess = relativePath.slice(this.root.length);
|
|
420
|
+
// Remove leading slash if present after stripping root
|
|
421
|
+
pathToProcess = pathToProcess.replace(/^\//, '');
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Remove leading ./ or / if present, then join with root
|
|
425
|
+
const normalized = pathToProcess.replace(/^\.\//, '').replace(/^\//, '');
|
|
426
|
+
const resolved = normalized ? `${this.root}/${normalized}` : this.root;
|
|
427
|
+
|
|
428
|
+
// Normalize path separators first
|
|
429
|
+
const pathWithNormalizedSeparators = resolved.replace(/\/+/g, '/');
|
|
430
|
+
|
|
431
|
+
// Normalize .. segments by processing path segments
|
|
432
|
+
const segments = pathWithNormalizedSeparators
|
|
433
|
+
.split('/')
|
|
434
|
+
.filter((s) => s && s !== '.');
|
|
435
|
+
const stack: string[] = [];
|
|
436
|
+
|
|
437
|
+
for (const segment of segments) {
|
|
438
|
+
if (segment === '..') {
|
|
439
|
+
if (stack.length === 0) {
|
|
440
|
+
throw new Error(`Operation outside workspace: ${relativePath}`);
|
|
441
|
+
}
|
|
442
|
+
stack.pop();
|
|
443
|
+
} else {
|
|
444
|
+
stack.push(segment);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
const normalizedPath = `/${stack.join('/')}`;
|
|
449
|
+
|
|
450
|
+
// Ensure the resolved path is within the workspace
|
|
451
|
+
if (!normalizedPath.startsWith(this.root)) {
|
|
452
|
+
throw new Error(`Operation outside workspace: ${relativePath}`);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
return normalizedPath;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
private getDirname(filePath: string): string {
|
|
459
|
+
const lastSlash = filePath.lastIndexOf('/');
|
|
460
|
+
if (lastSlash === -1) {
|
|
461
|
+
return '/';
|
|
462
|
+
}
|
|
463
|
+
return filePath.substring(0, lastSlash) || '/';
|
|
464
|
+
}
|
|
465
|
+
}
|