@cloudflare/sandbox 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/Dockerfile +54 -59
  2. package/README.md +1 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +12 -1
  6. package/dist/index.js.map +1 -1
  7. package/package.json +13 -8
  8. package/.turbo/turbo-build.log +0 -23
  9. package/CHANGELOG.md +0 -441
  10. package/src/clients/base-client.ts +0 -356
  11. package/src/clients/command-client.ts +0 -133
  12. package/src/clients/file-client.ts +0 -300
  13. package/src/clients/git-client.ts +0 -98
  14. package/src/clients/index.ts +0 -64
  15. package/src/clients/interpreter-client.ts +0 -333
  16. package/src/clients/port-client.ts +0 -105
  17. package/src/clients/process-client.ts +0 -198
  18. package/src/clients/sandbox-client.ts +0 -39
  19. package/src/clients/types.ts +0 -88
  20. package/src/clients/utility-client.ts +0 -156
  21. package/src/errors/adapter.ts +0 -238
  22. package/src/errors/classes.ts +0 -594
  23. package/src/errors/index.ts +0 -109
  24. package/src/file-stream.ts +0 -169
  25. package/src/index.ts +0 -121
  26. package/src/interpreter.ts +0 -168
  27. package/src/openai/index.ts +0 -465
  28. package/src/request-handler.ts +0 -184
  29. package/src/sandbox.ts +0 -1937
  30. package/src/security.ts +0 -119
  31. package/src/sse-parser.ts +0 -144
  32. package/src/storage-mount/credential-detection.ts +0 -41
  33. package/src/storage-mount/errors.ts +0 -51
  34. package/src/storage-mount/index.ts +0 -17
  35. package/src/storage-mount/provider-detection.ts +0 -93
  36. package/src/storage-mount/types.ts +0 -17
  37. package/src/version.ts +0 -6
  38. package/tests/base-client.test.ts +0 -582
  39. package/tests/command-client.test.ts +0 -444
  40. package/tests/file-client.test.ts +0 -831
  41. package/tests/file-stream.test.ts +0 -310
  42. package/tests/get-sandbox.test.ts +0 -172
  43. package/tests/git-client.test.ts +0 -455
  44. package/tests/openai-shell-editor.test.ts +0 -434
  45. package/tests/port-client.test.ts +0 -283
  46. package/tests/process-client.test.ts +0 -649
  47. package/tests/request-handler.test.ts +0 -292
  48. package/tests/sandbox.test.ts +0 -890
  49. package/tests/sse-parser.test.ts +0 -291
  50. package/tests/storage-mount/credential-detection.test.ts +0 -119
  51. package/tests/storage-mount/provider-detection.test.ts +0 -77
  52. package/tests/utility-client.test.ts +0 -339
  53. package/tests/version.test.ts +0 -16
  54. package/tests/wrangler.jsonc +0 -35
  55. package/tsconfig.json +0 -11
  56. package/tsdown.config.ts +0 -13
  57. package/vitest.config.ts +0 -31
package/Dockerfile CHANGED
@@ -25,6 +25,9 @@ FROM node:20-alpine AS builder
25
25
 
26
26
  WORKDIR /app
27
27
 
28
+ # Install Bun runtime (needed for sandbox-container build script)
29
+ COPY --from=oven/bun:1-alpine /usr/local/bin/bun /usr/local/bin/bun
30
+
28
31
  # Copy pruned lockfile and package.json files (for Docker layer caching)
29
32
  COPY --from=pruner /app/out/json/ .
30
33
  COPY --from=pruner /app/out/package-lock.json ./package-lock.json
@@ -41,24 +44,7 @@ COPY --from=pruner /app/out/full/ .
41
44
  RUN npx turbo run build
42
45
 
43
46
  # ============================================================================
44
- # Stage 3: Install production-only dependencies
45
- # ============================================================================
46
- FROM node:20-alpine AS prod-deps
47
-
48
- WORKDIR /app
49
-
50
- # Copy package files from builder
51
- COPY --from=builder /app/package.json ./package.json
52
- COPY --from=builder /app/package-lock.json ./package-lock.json
53
- COPY --from=builder /app/packages ./packages
54
- COPY --from=builder /app/tooling ./tooling
55
-
56
- # Install ONLY production dependencies (excludes typescript, @types/*, etc.)
57
- RUN --mount=type=cache,target=/root/.npm \
58
- CI=true npm ci --production
59
-
60
- # ============================================================================
61
- # Stage 4: Download pre-built Python 3.11.14
47
+ # Stage 3: Download pre-built Python 3.11.14
62
48
  # ============================================================================
63
49
  FROM ubuntu:22.04 AS python-builder
64
50
 
@@ -100,9 +86,9 @@ RUN --mount=type=cache,target=/tmp/python-cache \
100
86
  rm -rf /tmp/cpython-*
101
87
 
102
88
  # ============================================================================
103
- # Stage 5: Runtime - Ubuntu 22.04 with only runtime dependencies
89
+ # Stage 4: Runtime base - Ubuntu 22.04 with Node.js and Bun (no Python)
104
90
  # ============================================================================
105
- FROM ubuntu:22.04 AS runtime
91
+ FROM ubuntu:22.04 AS runtime-base
106
92
 
107
93
  # Accept version as build argument (passed from npm_package_version)
108
94
  ARG SANDBOX_VERSION=unknown
@@ -128,23 +114,6 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
128
114
  # Enable FUSE in container - allow non-root users to use FUSE
129
115
  RUN sed -i 's/#user_allow_other/user_allow_other/' /etc/fuse.conf
130
116
 
131
- # Copy pre-built Python from python-builder stage
132
- COPY --from=python-builder /usr/local/python /usr/local/python
133
-
134
- # Create symlinks and update shared library cache
135
- RUN ln -s /usr/local/python/bin/python3.11 /usr/local/bin/python3.11 && \
136
- ln -s /usr/local/python/bin/python3 /usr/local/bin/python3 && \
137
- ln -s /usr/local/python/bin/pip3 /usr/local/bin/pip3 && \
138
- echo "/usr/local/python/lib" > /etc/ld.so.conf.d/python.conf && \
139
- ldconfig
140
-
141
- # Set Python 3.11 as default python3
142
- RUN update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1
143
-
144
- # Install Python packages
145
- RUN --mount=type=cache,target=/root/.cache/pip \
146
- pip3 install --no-cache-dir matplotlib numpy pandas ipython
147
-
148
117
  # Install Node.js 20 LTS from official Node image
149
118
  COPY --from=node:20-slim /usr/local/bin/node /usr/local/bin/node
150
119
  COPY --from=node:20-slim /usr/local/lib/node_modules /usr/local/lib/node_modules
@@ -157,28 +126,13 @@ COPY --from=oven/bun:1 /usr/local/bin/bun /usr/local/bin/bun
157
126
  # Set up runtime container server directory
158
127
  WORKDIR /container-server
159
128
 
160
- # Copy built sandbox-container package
161
- COPY --from=builder /app/packages/sandbox-container/dist ./dist
162
- COPY --from=builder /app/packages/sandbox-container/package.json ./package.json
129
+ # Copy bundled container server (all dependencies inlined, no node_modules needed)
130
+ COPY --from=builder /app/packages/sandbox-container/dist/index.js ./dist/
131
+ COPY --from=builder /app/packages/sandbox-container/dist/index.js.map ./dist/
163
132
 
164
- # Copy Python executor to runtime location
165
- COPY --from=builder /app/packages/sandbox-container/src/runtime/executors/python/ipython_executor.py ./dist/runtime/executors/python/
166
-
167
- # Copy production-only node_modules (excludes typescript, @types/*, etc.)
168
- # Includes: @repo/shared, zod, esbuild (runtime dependencies)
169
- COPY --from=prod-deps /app/node_modules ./node_modules
170
-
171
- # Copy workspace packages
172
- COPY --from=prod-deps /app/packages/shared/dist ./packages/shared/dist
173
- COPY --from=prod-deps /app/packages/shared/package.json ./packages/shared/package.json
174
-
175
- # Configure process pool sizes (can be overridden at runtime)
176
- ENV PYTHON_POOL_MIN_SIZE=3
177
- ENV PYTHON_POOL_MAX_SIZE=15
178
- ENV JAVASCRIPT_POOL_MIN_SIZE=3
179
- ENV JAVASCRIPT_POOL_MAX_SIZE=10
180
- ENV TYPESCRIPT_POOL_MIN_SIZE=3
181
- ENV TYPESCRIPT_POOL_MAX_SIZE=10
133
+ # Copy bundled JavaScript executor
134
+ COPY --from=builder /app/packages/sandbox-container/dist/runtime/executors/javascript/node_executor.js ./dist/runtime/executors/javascript/
135
+ COPY --from=builder /app/packages/sandbox-container/dist/runtime/executors/javascript/node_executor.js.map ./dist/runtime/executors/javascript/
182
136
 
183
137
  # Create clean workspace directory for user code
184
138
  RUN mkdir -p /workspace
@@ -190,5 +144,46 @@ EXPOSE 3000
190
144
  COPY packages/sandbox/startup.sh ./
191
145
  RUN chmod +x startup.sh
192
146
 
193
- # Use startup script
147
+ # ============================================================================
148
+ # Stage 5a: Default image - lean, no Python
149
+ # ============================================================================
150
+ FROM runtime-base AS default
151
+
152
+ # Disable Python pool (Python not available in this image)
153
+ ENV PYTHON_POOL_MIN_SIZE=0
154
+ ENV JAVASCRIPT_POOL_MIN_SIZE=3
155
+ ENV TYPESCRIPT_POOL_MIN_SIZE=3
156
+
157
+ CMD ["/container-server/startup.sh"]
158
+
159
+ # ============================================================================
160
+ # Stage 5b: Python image - full, with Python + data science packages
161
+ # ============================================================================
162
+ FROM runtime-base AS python
163
+
164
+ # Copy pre-built Python from python-builder stage
165
+ COPY --from=python-builder /usr/local/python /usr/local/python
166
+
167
+ # Create symlinks and update shared library cache
168
+ RUN ln -s /usr/local/python/bin/python3.11 /usr/local/bin/python3.11 && \
169
+ ln -s /usr/local/python/bin/python3 /usr/local/bin/python3 && \
170
+ ln -s /usr/local/python/bin/pip3 /usr/local/bin/pip3 && \
171
+ echo "/usr/local/python/lib" > /etc/ld.so.conf.d/python.conf && \
172
+ ldconfig
173
+
174
+ # Set Python 3.11 as default python3
175
+ RUN update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1
176
+
177
+ # Install Python packages for data science and code interpreter
178
+ RUN --mount=type=cache,target=/root/.cache/pip \
179
+ pip3 install --no-cache-dir matplotlib numpy pandas ipython
180
+
181
+ # Copy Python executor
182
+ COPY --from=builder /app/packages/sandbox-container/src/runtime/executors/python/ipython_executor.py ./dist/runtime/executors/python/
183
+
184
+ # Enable all interpreter pools
185
+ ENV PYTHON_POOL_MIN_SIZE=3
186
+ ENV JAVASCRIPT_POOL_MIN_SIZE=3
187
+ ENV TYPESCRIPT_POOL_MIN_SIZE=3
188
+
194
189
  CMD ["/container-server/startup.sh"]
package/README.md CHANGED
@@ -15,7 +15,7 @@ Perfect for AI code execution, interactive development environments, data analys
15
15
  ### Prerequisites
16
16
 
17
17
  1. Install [Node.js](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) (version 16.17.0 or later)
18
- 2. Ensure Docker is running locally
18
+ 2. Ensure Docker is running locally ([see setup guide](https://developers.cloudflare.com/sandbox/get-started/#ensure-docker-is-running-locally))
19
19
  3. For deploying to production, sign up for a [Cloudflare account](https://dash.cloudflare.com/sign-up/workers-and-pages)
20
20
 
21
21
  ### 1. Create a new project
package/dist/index.d.ts CHANGED
@@ -193,6 +193,7 @@ declare const ErrorCode: {
193
193
  readonly INTERPRETER_NOT_READY: "INTERPRETER_NOT_READY";
194
194
  readonly CONTEXT_NOT_FOUND: "CONTEXT_NOT_FOUND";
195
195
  readonly CODE_EXECUTION_ERROR: "CODE_EXECUTION_ERROR";
196
+ readonly PYTHON_NOT_AVAILABLE: "PYTHON_NOT_AVAILABLE";
196
197
  readonly VALIDATION_FAILED: "VALIDATION_FAILED";
197
198
  readonly INVALID_JSON_RESPONSE: "INVALID_JSON_RESPONSE";
198
199
  readonly UNKNOWN_ERROR: "UNKNOWN_ERROR";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["ExecuteRequest","Record","StartProcessRequest","ReadFileRequest","WriteFileRequest","DeleteFileRequest","RenameFileRequest","MoveFileRequest","MkdirRequest","FileExistsRequest","ExposePortRequest","GitCheckoutRequest","SessionCreateRequest","SessionDeleteRequest","ErrorCode"],"sources":["../../shared/dist/request-types.d.ts","../src/file-stream.ts","../src/interpreter.ts","../src/request-handler.ts","../src/sse-parser.ts","../../shared/dist/errors/codes.d.ts","../src/storage-mount/errors.ts"],"sourcesContent":["/**\n * Request types for API calls to the container\n * These types enforce the contract between the Durable Object client and container handlers\n *\n * IMPORTANT: These types must match the Zod schemas in:\n * @repo/sandbox-container/src/validation/schemas.ts\n */\n/**\n * Request to execute a command\n */\nexport interface ExecuteRequest {\n command: string;\n sessionId?: string;\n background?: boolean;\n timeoutMs?: number;\n env?: Record<string, string>;\n cwd?: string;\n}\n/**\n * Request to start a background process\n * Uses flat structure consistent with other endpoints\n */\nexport interface StartProcessRequest {\n command: string;\n sessionId?: string;\n processId?: string;\n timeoutMs?: number;\n env?: Record<string, string>;\n cwd?: string;\n encoding?: string;\n autoCleanup?: boolean;\n}\n/**\n * Request to read a file\n */\nexport interface ReadFileRequest {\n path: string;\n encoding?: string;\n sessionId?: string;\n}\n/**\n * Request to write a file\n */\nexport interface WriteFileRequest {\n path: string;\n content: string;\n encoding?: string;\n sessionId?: string;\n}\n/**\n * Request to delete a file\n */\nexport interface DeleteFileRequest {\n path: string;\n sessionId?: string;\n}\n/**\n * Request to rename a file\n */\nexport interface RenameFileRequest {\n oldPath: string;\n newPath: string;\n sessionId?: string;\n}\n/**\n * Request to move a file\n */\nexport interface MoveFileRequest {\n sourcePath: string;\n destinationPath: string;\n sessionId?: string;\n}\n/**\n * Request to create a directory\n */\nexport interface MkdirRequest {\n path: string;\n recursive?: boolean;\n sessionId?: string;\n}\n/**\n * Request to check if a file or directory exists\n */\nexport interface FileExistsRequest {\n path: string;\n sessionId?: string;\n}\n/**\n * Request to expose a port\n */\nexport interface ExposePortRequest {\n port: number;\n name?: string;\n}\n/**\n * Request to clone a Git repository\n */\nexport interface GitCheckoutRequest {\n repoUrl: string;\n branch?: string;\n targetDir?: string;\n sessionId?: string;\n}\n/**\n * Request to create a session\n */\nexport interface SessionCreateRequest {\n id?: string;\n name?: string;\n env?: Record<string, string>;\n cwd?: string;\n}\n/**\n * Request to delete a session\n */\nexport interface SessionDeleteRequest {\n sessionId: string;\n}\n//# sourceMappingURL=request-types.d.ts.map","/**\n * Centralized error code registry\n * Each code maps to a specific error type with consistent semantics\n */\nexport declare const ErrorCode: {\n readonly FILE_NOT_FOUND: \"FILE_NOT_FOUND\";\n readonly PERMISSION_DENIED: \"PERMISSION_DENIED\";\n readonly FILE_EXISTS: \"FILE_EXISTS\";\n readonly IS_DIRECTORY: \"IS_DIRECTORY\";\n readonly NOT_DIRECTORY: \"NOT_DIRECTORY\";\n readonly NO_SPACE: \"NO_SPACE\";\n readonly TOO_MANY_FILES: \"TOO_MANY_FILES\";\n readonly RESOURCE_BUSY: \"RESOURCE_BUSY\";\n readonly READ_ONLY: \"READ_ONLY\";\n readonly NAME_TOO_LONG: \"NAME_TOO_LONG\";\n readonly TOO_MANY_LINKS: \"TOO_MANY_LINKS\";\n readonly FILESYSTEM_ERROR: \"FILESYSTEM_ERROR\";\n readonly COMMAND_NOT_FOUND: \"COMMAND_NOT_FOUND\";\n readonly COMMAND_PERMISSION_DENIED: \"COMMAND_PERMISSION_DENIED\";\n readonly INVALID_COMMAND: \"INVALID_COMMAND\";\n readonly COMMAND_EXECUTION_ERROR: \"COMMAND_EXECUTION_ERROR\";\n readonly STREAM_START_ERROR: \"STREAM_START_ERROR\";\n readonly PROCESS_NOT_FOUND: \"PROCESS_NOT_FOUND\";\n readonly PROCESS_PERMISSION_DENIED: \"PROCESS_PERMISSION_DENIED\";\n readonly PROCESS_ERROR: \"PROCESS_ERROR\";\n readonly PORT_ALREADY_EXPOSED: \"PORT_ALREADY_EXPOSED\";\n readonly PORT_IN_USE: \"PORT_IN_USE\";\n readonly PORT_NOT_EXPOSED: \"PORT_NOT_EXPOSED\";\n readonly INVALID_PORT_NUMBER: \"INVALID_PORT_NUMBER\";\n readonly INVALID_PORT: \"INVALID_PORT\";\n readonly SERVICE_NOT_RESPONDING: \"SERVICE_NOT_RESPONDING\";\n readonly PORT_OPERATION_ERROR: \"PORT_OPERATION_ERROR\";\n readonly CUSTOM_DOMAIN_REQUIRED: \"CUSTOM_DOMAIN_REQUIRED\";\n readonly GIT_REPOSITORY_NOT_FOUND: \"GIT_REPOSITORY_NOT_FOUND\";\n readonly GIT_BRANCH_NOT_FOUND: \"GIT_BRANCH_NOT_FOUND\";\n readonly GIT_AUTH_FAILED: \"GIT_AUTH_FAILED\";\n readonly GIT_NETWORK_ERROR: \"GIT_NETWORK_ERROR\";\n readonly INVALID_GIT_URL: \"INVALID_GIT_URL\";\n readonly GIT_CLONE_FAILED: \"GIT_CLONE_FAILED\";\n readonly GIT_CHECKOUT_FAILED: \"GIT_CHECKOUT_FAILED\";\n readonly GIT_OPERATION_FAILED: \"GIT_OPERATION_FAILED\";\n readonly BUCKET_MOUNT_ERROR: \"BUCKET_MOUNT_ERROR\";\n readonly S3FS_MOUNT_ERROR: \"S3FS_MOUNT_ERROR\";\n readonly MISSING_CREDENTIALS: \"MISSING_CREDENTIALS\";\n readonly INVALID_MOUNT_CONFIG: \"INVALID_MOUNT_CONFIG\";\n readonly INTERPRETER_NOT_READY: \"INTERPRETER_NOT_READY\";\n readonly CONTEXT_NOT_FOUND: \"CONTEXT_NOT_FOUND\";\n readonly CODE_EXECUTION_ERROR: \"CODE_EXECUTION_ERROR\";\n readonly VALIDATION_FAILED: \"VALIDATION_FAILED\";\n readonly INVALID_JSON_RESPONSE: \"INVALID_JSON_RESPONSE\";\n readonly UNKNOWN_ERROR: \"UNKNOWN_ERROR\";\n readonly INTERNAL_ERROR: \"INTERNAL_ERROR\";\n};\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n//# sourceMappingURL=codes.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":["ExecuteRequest","Record","StartProcessRequest","ReadFileRequest","WriteFileRequest","DeleteFileRequest","RenameFileRequest","MoveFileRequest","MkdirRequest","FileExistsRequest","ExposePortRequest","GitCheckoutRequest","SessionCreateRequest","SessionDeleteRequest","ErrorCode"],"sources":["../../shared/dist/request-types.d.ts","../src/file-stream.ts","../src/interpreter.ts","../src/request-handler.ts","../src/sse-parser.ts","../../shared/dist/errors/codes.d.ts","../src/storage-mount/errors.ts"],"sourcesContent":["/**\n * Request types for API calls to the container\n * These types enforce the contract between the Durable Object client and container handlers\n *\n * IMPORTANT: These types must match the Zod schemas in:\n * @repo/sandbox-container/src/validation/schemas.ts\n */\n/**\n * Request to execute a command\n */\nexport interface ExecuteRequest {\n command: string;\n sessionId?: string;\n background?: boolean;\n timeoutMs?: number;\n env?: Record<string, string>;\n cwd?: string;\n}\n/**\n * Request to start a background process\n * Uses flat structure consistent with other endpoints\n */\nexport interface StartProcessRequest {\n command: string;\n sessionId?: string;\n processId?: string;\n timeoutMs?: number;\n env?: Record<string, string>;\n cwd?: string;\n encoding?: string;\n autoCleanup?: boolean;\n}\n/**\n * Request to read a file\n */\nexport interface ReadFileRequest {\n path: string;\n encoding?: string;\n sessionId?: string;\n}\n/**\n * Request to write a file\n */\nexport interface WriteFileRequest {\n path: string;\n content: string;\n encoding?: string;\n sessionId?: string;\n}\n/**\n * Request to delete a file\n */\nexport interface DeleteFileRequest {\n path: string;\n sessionId?: string;\n}\n/**\n * Request to rename a file\n */\nexport interface RenameFileRequest {\n oldPath: string;\n newPath: string;\n sessionId?: string;\n}\n/**\n * Request to move a file\n */\nexport interface MoveFileRequest {\n sourcePath: string;\n destinationPath: string;\n sessionId?: string;\n}\n/**\n * Request to create a directory\n */\nexport interface MkdirRequest {\n path: string;\n recursive?: boolean;\n sessionId?: string;\n}\n/**\n * Request to check if a file or directory exists\n */\nexport interface FileExistsRequest {\n path: string;\n sessionId?: string;\n}\n/**\n * Request to expose a port\n */\nexport interface ExposePortRequest {\n port: number;\n name?: string;\n}\n/**\n * Request to clone a Git repository\n */\nexport interface GitCheckoutRequest {\n repoUrl: string;\n branch?: string;\n targetDir?: string;\n sessionId?: string;\n}\n/**\n * Request to create a session\n */\nexport interface SessionCreateRequest {\n id?: string;\n name?: string;\n env?: Record<string, string>;\n cwd?: string;\n}\n/**\n * Request to delete a session\n */\nexport interface SessionDeleteRequest {\n sessionId: string;\n}\n//# sourceMappingURL=request-types.d.ts.map","/**\n * Centralized error code registry\n * Each code maps to a specific error type with consistent semantics\n */\nexport declare const ErrorCode: {\n readonly FILE_NOT_FOUND: \"FILE_NOT_FOUND\";\n readonly PERMISSION_DENIED: \"PERMISSION_DENIED\";\n readonly FILE_EXISTS: \"FILE_EXISTS\";\n readonly IS_DIRECTORY: \"IS_DIRECTORY\";\n readonly NOT_DIRECTORY: \"NOT_DIRECTORY\";\n readonly NO_SPACE: \"NO_SPACE\";\n readonly TOO_MANY_FILES: \"TOO_MANY_FILES\";\n readonly RESOURCE_BUSY: \"RESOURCE_BUSY\";\n readonly READ_ONLY: \"READ_ONLY\";\n readonly NAME_TOO_LONG: \"NAME_TOO_LONG\";\n readonly TOO_MANY_LINKS: \"TOO_MANY_LINKS\";\n readonly FILESYSTEM_ERROR: \"FILESYSTEM_ERROR\";\n readonly COMMAND_NOT_FOUND: \"COMMAND_NOT_FOUND\";\n readonly COMMAND_PERMISSION_DENIED: \"COMMAND_PERMISSION_DENIED\";\n readonly INVALID_COMMAND: \"INVALID_COMMAND\";\n readonly COMMAND_EXECUTION_ERROR: \"COMMAND_EXECUTION_ERROR\";\n readonly STREAM_START_ERROR: \"STREAM_START_ERROR\";\n readonly PROCESS_NOT_FOUND: \"PROCESS_NOT_FOUND\";\n readonly PROCESS_PERMISSION_DENIED: \"PROCESS_PERMISSION_DENIED\";\n readonly PROCESS_ERROR: \"PROCESS_ERROR\";\n readonly PORT_ALREADY_EXPOSED: \"PORT_ALREADY_EXPOSED\";\n readonly PORT_IN_USE: \"PORT_IN_USE\";\n readonly PORT_NOT_EXPOSED: \"PORT_NOT_EXPOSED\";\n readonly INVALID_PORT_NUMBER: \"INVALID_PORT_NUMBER\";\n readonly INVALID_PORT: \"INVALID_PORT\";\n readonly SERVICE_NOT_RESPONDING: \"SERVICE_NOT_RESPONDING\";\n readonly PORT_OPERATION_ERROR: \"PORT_OPERATION_ERROR\";\n readonly CUSTOM_DOMAIN_REQUIRED: \"CUSTOM_DOMAIN_REQUIRED\";\n readonly GIT_REPOSITORY_NOT_FOUND: \"GIT_REPOSITORY_NOT_FOUND\";\n readonly GIT_BRANCH_NOT_FOUND: \"GIT_BRANCH_NOT_FOUND\";\n readonly GIT_AUTH_FAILED: \"GIT_AUTH_FAILED\";\n readonly GIT_NETWORK_ERROR: \"GIT_NETWORK_ERROR\";\n readonly INVALID_GIT_URL: \"INVALID_GIT_URL\";\n readonly GIT_CLONE_FAILED: \"GIT_CLONE_FAILED\";\n readonly GIT_CHECKOUT_FAILED: \"GIT_CHECKOUT_FAILED\";\n readonly GIT_OPERATION_FAILED: \"GIT_OPERATION_FAILED\";\n readonly BUCKET_MOUNT_ERROR: \"BUCKET_MOUNT_ERROR\";\n readonly S3FS_MOUNT_ERROR: \"S3FS_MOUNT_ERROR\";\n readonly MISSING_CREDENTIALS: \"MISSING_CREDENTIALS\";\n readonly INVALID_MOUNT_CONFIG: \"INVALID_MOUNT_CONFIG\";\n readonly INTERPRETER_NOT_READY: \"INTERPRETER_NOT_READY\";\n readonly CONTEXT_NOT_FOUND: \"CONTEXT_NOT_FOUND\";\n readonly CODE_EXECUTION_ERROR: \"CODE_EXECUTION_ERROR\";\n readonly PYTHON_NOT_AVAILABLE: \"PYTHON_NOT_AVAILABLE\";\n readonly VALIDATION_FAILED: \"VALIDATION_FAILED\";\n readonly INVALID_JSON_RESPONSE: \"INVALID_JSON_RESPONSE\";\n readonly UNKNOWN_ERROR: \"UNKNOWN_ERROR\";\n readonly INTERNAL_ERROR: \"INTERNAL_ERROR\";\n};\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n//# sourceMappingURL=codes.d.ts.map"],"mappings":";;;;;;;AAUA;AAYA;;;;AC+CA;;AACU,UD5DOA,cAAAA,CC4DP;EACQ,OAAA,EAAA,MAAA;EAAW,SAAA,CAAA,EAAA,MAAA;EAA1B,UAAA,CAAA,EAAA,OAAA;EAAc,SAAA,CAAA,EAAA,MAAA;EA6DK,GAAA,CAAA,EDrHZC,MCqHY,CAAA,MAAW,EAAA,MAAA,CAAA;EAAwB,GAAA,CAAA,EAAA,MAAA;;;;;;UD9GxCC,mBAAAA;;;EERJ,SAAA,CAAA,EAAA,MAAe;EAIL,SAAA,CAAA,EAAA,MAAA;EAUV,GAAA,CAAA,EFDHD,MECG,CAAA,MAAA,EAAA,MAAA,CAAA;EACA,GAAA,CAAA,EAAA,MAAA;EAAR,QAAA,CAAA,EAAA,MAAA;EAcQ,WAAA,CAAA,EAAA,OAAA;;;;;;AFjCb;AAYA;;;;AC+CA;;;;;;;AA+DA;;;;;;AAA8E,iBA/DvD,UAAA,CA+DuD,MAAA,EA9DpE,cA8DoE,CA9DrD,UA8DqD,CAAA,CAAA,EA7D3E,cA6D2E,CA7D5D,SA6D4D,EA7DjD,YA6DiD,CAAA;;;;ACtH9E;;;;;;;;;;;AAyHoC,iBDHd,WAAA,CCGc,MAAA,EDHM,cCGN,CDHqB,UCGrB,CAAA,CAAA,EDHmC,OCGnC,CAAA;EAAR,OAAA,EAAA,MAAA,GDFR,UCEQ;EAckB,QAAA,EDflC,YCekC;CAAO,CAAA;;;cAvIxC,eAAA;EFJID,QAAAA,iBAAc;EAYdE,QAAAA,QAAAA;uBEJM;;;ADmDvB;EACyB,iBAAA,CAAA,OAAA,CAAA,EC1CZ,oBD0CY,CAAA,ECzCpB,ODyCoB,CCzCZ,WDyCY,CAAA;EAAf;;;EACP,OAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EC5BU,cD4BV,CAAA,EC3BE,OD2BF,CC3BU,SD2BV,CAAA;EAAc;AA6DjB;;EAA0C,aAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EC3C7B,cD2C6B,CAAA,EC1CrC,OD0CqC,CC1C7B,cD0C6B,CAAA;EACtB;;;EAD0D,gBAAA,CAAA,CAAA,ECGlD,ODHkD,CCG1C,WDH0C,EAAA,CAAA;;;;ECtHjE,iBAAA,CAAe,SAAA,EAAA,MAAA,CAAA,EAuIkB,OAvIlB,CAAA,IAAA,CAAA;EAIL,QAAA,yBAAA;;;;UCbN,UAAA;WACN,uBAAuB;AHIlC;AAYiBA,UGbA,SAAA,CHamB;;;;EC+Cb,KAAA,EAAA,MAAU;;AACvB,iBEtDY,cFsDZ,CAAA,UEtDqC,UFsDrC,CAAA,CAAA,OAAA,EErDC,OFqDD,EAAA,GAAA,EEpDH,CFoDG,CAAA,EEnDP,OFmDO,CEnDC,QFmDD,GAAA,IAAA,CAAA;;;;;;AD5DV;AAYA;;;;AC+CA;AACyB,iBG5DF,cH4DE,CAAA,CAAA,CAAA,CAAA,MAAA,EG3Df,cH2De,CG3DA,UH2DA,CAAA,EAAA,MAAA,CAAA,EG1Dd,WH0Dc,CAAA,EGzDtB,aHyDsB,CGzDR,CHyDQ,CAAA;;;;;;AA8DH,iBG9CC,uBH8CU,CAAA,CAAA,CAAA,CAAA,QAAA,EG7CrB,QH6CqB,EAAA,MAAA,CAAA,EG5CtB,WH4CsB,CAAA,EG3C9B,aH2C8B,CG3ChB,CH2CgB,CAAA;;;;;;;iBGvBjB,oCACN,cAAc,WFhGxB;WEkGa;sBACW;AFnGxB,CAAA,CAAA,EEqGG,cFrGU,CEqGK,UFrGU,CAAA;;;;;;AFJ5B;AAYiBA,cKlBIY,SLkBe,EAAA;;;;EC+Cb,SAAA,YAAU,EAAA,cAAA;EACR,SAAA,aAAA,EAAA,eAAA;EAAf,SAAA,QAAA,EAAA,UAAA;EACQ,SAAA,cAAA,EAAA,gBAAA;EAAW,SAAA,aAAA,EAAA,eAAA;EAA1B,SAAA,SAAA,EAAA,WAAA;EAAc,SAAA,aAAA,EAAA,eAAA;EA6DK,SAAA,cAAW,EAAA,gBAAA;EAAwB,SAAA,gBAAA,EAAA,kBAAA;EAAf,SAAA,iBAAA,EAAA,mBAAA;EACtB,SAAA,yBAAA,EAAA,2BAAA;EACR,SAAA,eAAA,EAAA,iBAAA;EAF2D,SAAA,uBAAA,EAAA,yBAAA;EAAO,SAAA,kBAAA,EAAA,oBAAA;;;;ECtHjE,SAAA,oBAAe,EAAA,sBAAA;EAIL,SAAA,WAAA,EAAA,aAAA;EAUV,SAAA,gBAAA,EAAA,kBAAA;EACA,SAAA,mBAAA,EAAA,qBAAA;EAAR,SAAA,YAAA,EAAA,cAAA;EAcQ,SAAA,sBAAA,EAAA,wBAAA;EACA,SAAA,oBAAA,EAAA,sBAAA;EAAR,SAAA,sBAAA,EAAA,wBAAA;EA6CQ,SAAA,wBAAA,EAAA,0BAAA;EACA,SAAA,oBAAA,EAAA,sBAAA;EAAR,SAAA,eAAA,EAAA,iBAAA;EA6C+B,SAAA,iBAAA,EAAA,mBAAA;EAAR,SAAA,eAAA,EAAA,iBAAA;EAckB,SAAA,gBAAA,EAAA,kBAAA;EAAO,SAAA,mBAAA,EAAA,qBAAA;;;;EChJpC,SAAA,mBACiB,EAAA,qBAAvB;EAGM,SAAA,oBAAS,EAAA,sBAAA;EAOJ,SAAA,qBAAc,EAAA,uBAAA;EAAW,SAAA,iBAAA,EAAA,mBAAA;EACpC,SAAA,oBAAA,EAAA,sBAAA;EACJ,SAAA,oBAAA,EAAA,sBAAA;EACI,SAAA,iBAAA,EAAA,mBAAA;EAAR,SAAA,qBAAA,EAAA,uBAAA;EAAO,SAAA,aAAA,EAAA,eAAA;;;KEmCEA,SAAAA,WAAoBA,wBAAwBA;;;;AJexD;;AACU,cK1DG,gBAAA,SAAyB,KAAA,CL0D5B;EACQ,SAAA,IAAA,EK1DM,SL0DN;EAAW,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EKxDQ,SLwDR;;;AA6D7B;;AAA0C,cK3G7B,cAAA,SAAuB,gBAAA,CL2GM;EACtB,WAAA,CAAA,OAAA,EAAA,MAAA;;;;;cKlGP,uBAAA,SAAgC,gBAAA;;AJrB7C;;;;AAeK,cIgBQ,uBAAA,SAAgC,gBAAA,CJhBxC;EAcQ,WAAA,CAAA,OAAA,EAAA,MAAA"}
package/dist/index.js CHANGED
@@ -50,6 +50,7 @@ const ErrorCode = {
50
50
  INTERPRETER_NOT_READY: "INTERPRETER_NOT_READY",
51
51
  CONTEXT_NOT_FOUND: "CONTEXT_NOT_FOUND",
52
52
  CODE_EXECUTION_ERROR: "CODE_EXECUTION_ERROR",
53
+ PYTHON_NOT_AVAILABLE: "PYTHON_NOT_AVAILABLE",
53
54
  VALIDATION_FAILED: "VALIDATION_FAILED",
54
55
  INVALID_JSON_RESPONSE: "INVALID_JSON_RESPONSE",
55
56
  UNKNOWN_ERROR: "UNKNOWN_ERROR",
@@ -93,6 +94,7 @@ const ERROR_STATUS_MAP = {
93
94
  [ErrorCode.RESOURCE_BUSY]: 409,
94
95
  [ErrorCode.SERVICE_NOT_RESPONDING]: 502,
95
96
  [ErrorCode.GIT_NETWORK_ERROR]: 502,
97
+ [ErrorCode.PYTHON_NOT_AVAILABLE]: 501,
96
98
  [ErrorCode.INTERPRETER_NOT_READY]: 503,
97
99
  [ErrorCode.NO_SPACE]: 500,
98
100
  [ErrorCode.TOO_MANY_FILES]: 500,
@@ -1265,6 +1267,9 @@ var InterpreterClient = class extends BaseHttpClient {
1265
1267
  }
1266
1268
  if (buffer.length > 0) yield buffer;
1267
1269
  } finally {
1270
+ try {
1271
+ await reader.cancel();
1272
+ } catch {}
1268
1273
  reader.releaseLock();
1269
1274
  }
1270
1275
  }
@@ -1886,6 +1891,9 @@ async function* parseSSEStream(stream, signal) {
1886
1891
  } catch {}
1887
1892
  }
1888
1893
  } finally {
1894
+ try {
1895
+ await reader.cancel();
1896
+ } catch {}
1889
1897
  reader.releaseLock();
1890
1898
  }
1891
1899
  }
@@ -2055,7 +2063,7 @@ function resolveS3fsOptions(provider, userOptions) {
2055
2063
  * This file is auto-updated by .github/changeset-version.ts during releases
2056
2064
  * DO NOT EDIT MANUALLY - Changes will be overwritten on the next version bump
2057
2065
  */
2058
- const SDK_VERSION = "0.5.4";
2066
+ const SDK_VERSION = "0.6.0";
2059
2067
 
2060
2068
  //#endregion
2061
2069
  //#region src/sandbox.ts
@@ -3037,6 +3045,9 @@ async function* parseSSE(stream) {
3037
3045
  }
3038
3046
  }
3039
3047
  } finally {
3048
+ try {
3049
+ await reader.cancel();
3050
+ } catch {}
3040
3051
  reader.releaseLock();
3041
3052
  }
3042
3053
  }