@cloudflare/sandbox 0.0.0-633bd10 → 0.0.0-63b07c0
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/CHANGELOG.md +146 -15
- package/Dockerfile +88 -71
- package/README.md +9 -4
- package/dist/index.d.ts +1953 -9
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3278 -53
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
- package/src/clients/base-client.ts +39 -24
- package/src/clients/command-client.ts +8 -8
- package/src/clients/file-client.ts +51 -20
- package/src/clients/git-client.ts +9 -3
- package/src/clients/index.ts +16 -15
- package/src/clients/interpreter-client.ts +51 -47
- package/src/clients/port-client.ts +10 -10
- package/src/clients/process-client.ts +11 -8
- package/src/clients/sandbox-client.ts +2 -4
- package/src/clients/types.ts +6 -2
- package/src/clients/utility-client.ts +67 -5
- package/src/errors/adapter.ts +90 -32
- package/src/errors/classes.ts +189 -64
- package/src/errors/index.ts +9 -5
- package/src/file-stream.ts +11 -6
- package/src/index.ts +28 -17
- package/src/interpreter.ts +50 -41
- package/src/request-handler.ts +34 -21
- package/src/sandbox.ts +502 -151
- package/src/security.ts +21 -6
- package/src/sse-parser.ts +4 -3
- package/src/version.ts +6 -0
- package/startup.sh +1 -1
- package/tests/base-client.test.ts +116 -80
- package/tests/command-client.test.ts +149 -112
- package/tests/file-client.test.ts +373 -185
- package/tests/file-stream.test.ts +24 -20
- package/tests/get-sandbox.test.ts +149 -0
- package/tests/git-client.test.ts +260 -101
- package/tests/port-client.test.ts +100 -108
- package/tests/process-client.test.ts +204 -179
- package/tests/request-handler.test.ts +292 -0
- package/tests/sandbox.test.ts +336 -62
- package/tests/sse-parser.test.ts +17 -16
- package/tests/utility-client.test.ts +129 -56
- package/tests/version.test.ts +16 -0
- package/tsdown.config.ts +12 -0
- package/vitest.config.ts +6 -6
- package/dist/chunk-BCJ7SF3Q.js +0 -117
- package/dist/chunk-BCJ7SF3Q.js.map +0 -1
- package/dist/chunk-BFVUNTP4.js +0 -104
- package/dist/chunk-BFVUNTP4.js.map +0 -1
- package/dist/chunk-EKSWCBCA.js +0 -86
- package/dist/chunk-EKSWCBCA.js.map +0 -1
- package/dist/chunk-HGF554LH.js +0 -2236
- package/dist/chunk-HGF554LH.js.map +0 -1
- package/dist/chunk-Z532A7QC.js +0 -78
- package/dist/chunk-Z532A7QC.js.map +0 -1
- package/dist/file-stream.d.ts +0 -43
- package/dist/file-stream.js +0 -9
- package/dist/file-stream.js.map +0 -1
- package/dist/interpreter.d.ts +0 -33
- package/dist/interpreter.js +0 -8
- package/dist/interpreter.js.map +0 -1
- package/dist/request-handler.d.ts +0 -18
- package/dist/request-handler.js +0 -12
- package/dist/request-handler.js.map +0 -1
- package/dist/sandbox-D9K2ypln.d.ts +0 -583
- package/dist/sandbox.d.ts +0 -4
- package/dist/sandbox.js +0 -12
- package/dist/sandbox.js.map +0 -1
- package/dist/security.d.ts +0 -31
- package/dist/security.js +0 -13
- package/dist/security.js.map +0 -1
- package/dist/sse-parser.d.ts +0 -28
- package/dist/sse-parser.js +0 -11
- package/dist/sse-parser.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,139 @@
|
|
|
1
1
|
# @cloudflare/sandbox
|
|
2
2
|
|
|
3
|
+
## 0.4.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`228ef5b`](https://github.com/cloudflare/sandbox-sdk/commit/228ef5b6e57fa3c38dc8d90e006ae58d0815aaec) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix encoding parameter handling in file operations to enable MIME auto-detection. Previously, SDK and container handlers added default 'utf8' encoding, preventing MIME-based detection of binary files. Now encoding parameter is passed through as-is, allowing automatic detection when not explicitly specified.
|
|
8
|
+
|
|
9
|
+
## 0.4.17
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#198](https://github.com/cloudflare/sandbox-sdk/pull/198) [`93c6cc7`](https://github.com/cloudflare/sandbox-sdk/commit/93c6cc7c6b8df9e0a733fa852faf5d2f1c5758da) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix container startup failures when WORKDIR is changed in derived Dockerfiles
|
|
14
|
+
|
|
15
|
+
## 0.4.16
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- [#184](https://github.com/cloudflare/sandbox-sdk/pull/184) [`7989b61`](https://github.com/cloudflare/sandbox-sdk/commit/7989b6105cea8c381dd162be0bcb29db3e214fde) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Redact credentials from Git URLs in logs
|
|
20
|
+
|
|
21
|
+
- [#186](https://github.com/cloudflare/sandbox-sdk/pull/186) [`c2e3384`](https://github.com/cloudflare/sandbox-sdk/commit/c2e3384b151ae3f430c2edc8c492921d0b6b8b1c) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - Expose deleteSession API with proper safeguards
|
|
22
|
+
- Add `deleteSession(sessionId)` method to public SDK API
|
|
23
|
+
- Prevent deletion of default session (throws error with guidance to use `sandbox.destroy()`)
|
|
24
|
+
- Session cleanup kills all running commands in parallel before destroying shell
|
|
25
|
+
- Return structured `SessionDeleteResult` with success status, sessionId, and timestamp
|
|
26
|
+
|
|
27
|
+
## 0.4.15
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- [#185](https://github.com/cloudflare/sandbox-sdk/pull/185) [`7897cdd`](https://github.com/cloudflare/sandbox-sdk/commit/7897cddefc366bbd640ea138b34a520a0b2ddf8c) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix foreground commands blocking on background processes
|
|
32
|
+
|
|
33
|
+
- [#183](https://github.com/cloudflare/sandbox-sdk/pull/183) [`ff2fa91`](https://github.com/cloudflare/sandbox-sdk/commit/ff2fa91479357ef88cfb22418f88acb257462faa) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - update python to 3.11.14
|
|
34
|
+
|
|
35
|
+
## 0.4.14
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- [#172](https://github.com/cloudflare/sandbox-sdk/pull/172) [`1bf3576`](https://github.com/cloudflare/sandbox-sdk/commit/1bf35768b02532c77df6f30a2f2eb08cb2b12115) Thanks [@threepointone](https://github.com/threepointone)! - Update dependencies
|
|
40
|
+
|
|
41
|
+
- [#176](https://github.com/cloudflare/sandbox-sdk/pull/176) [`7edbfa9`](https://github.com/cloudflare/sandbox-sdk/commit/7edbfa906668d75f540527f50b52483dc787192c) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add cache mounts to Dockerfile for faster builds
|
|
42
|
+
|
|
43
|
+
Adds cache mounts for npm, apt, and pip package managers in the Dockerfile. This speeds up Docker image builds when dependencies change, particularly beneficial for users building from source.
|
|
44
|
+
|
|
45
|
+
- [#172](https://github.com/cloudflare/sandbox-sdk/pull/172) [`1bf3576`](https://github.com/cloudflare/sandbox-sdk/commit/1bf35768b02532c77df6f30a2f2eb08cb2b12115) Thanks [@threepointone](https://github.com/threepointone)! - Fix type generation
|
|
46
|
+
|
|
47
|
+
We inline types from `@repo/shared` so that it includes the types we reexport. Fixes #165
|
|
48
|
+
|
|
49
|
+
- [#175](https://github.com/cloudflare/sandbox-sdk/pull/175) [`77cb937`](https://github.com/cloudflare/sandbox-sdk/commit/77cb93762a619523758f769a10509e665ca819fe) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Move .connect to .wsConnect within DO stub
|
|
50
|
+
|
|
51
|
+
## 0.4.13
|
|
52
|
+
|
|
53
|
+
### Patch Changes
|
|
54
|
+
|
|
55
|
+
- [#168](https://github.com/cloudflare/sandbox-sdk/pull/168) [`6b08f02`](https://github.com/cloudflare/sandbox-sdk/commit/6b08f02c061aef07cc98188abef2973ac92365f8) Thanks [@threepointone](https://github.com/threepointone)! - Fix type generation
|
|
56
|
+
|
|
57
|
+
We inline types from `@repo/shared` so that it includes the types we reexport. Fixes #165
|
|
58
|
+
|
|
59
|
+
- [#162](https://github.com/cloudflare/sandbox-sdk/pull/162) [`c4db459`](https://github.com/cloudflare/sandbox-sdk/commit/c4db459389a7b86048a03410d67d4dd7bf4a6085) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - Add WebSocket support via connect() method for routing client WebSocket connections directly to container services
|
|
60
|
+
|
|
61
|
+
## 0.4.12
|
|
62
|
+
|
|
63
|
+
### Patch Changes
|
|
64
|
+
|
|
65
|
+
- [#137](https://github.com/cloudflare/sandbox-sdk/pull/137) [`7f4442b`](https://github.com/cloudflare/sandbox-sdk/commit/7f4442b7a097587d8f8e8f9ff2f887df6943a3db) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - add keepAlive flag to prevent containers from shutting down
|
|
66
|
+
|
|
67
|
+
## 0.4.11
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- [#159](https://github.com/cloudflare/sandbox-sdk/pull/159) [`e16659a`](https://github.com/cloudflare/sandbox-sdk/commit/e16659a1815923f1cd1176f51a052725d820ee16) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Use latest containers package version
|
|
72
|
+
|
|
73
|
+
## 0.4.10
|
|
74
|
+
|
|
75
|
+
### Patch Changes
|
|
76
|
+
|
|
77
|
+
- [#156](https://github.com/cloudflare/sandbox-sdk/pull/156) [`b61841c`](https://github.com/cloudflare/sandbox-sdk/commit/b61841cfb3248022ee8136311e54955ed9faa1ee) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix WebSocket upgrade requests through exposed ports
|
|
78
|
+
|
|
79
|
+
## 0.4.9
|
|
80
|
+
|
|
81
|
+
### Patch Changes
|
|
82
|
+
|
|
83
|
+
- [#152](https://github.com/cloudflare/sandbox-sdk/pull/152) [`8e7773e`](https://github.com/cloudflare/sandbox-sdk/commit/8e7773ec9571a5f968cbbc5f48e38e01d7d13b77) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add exists() method to check if a file or directory exists
|
|
84
|
+
|
|
85
|
+
This adds a new `exists()` method to the SDK that checks whether a file or directory exists at a given path. The method returns a boolean indicating existence, similar to Python's `os.path.exists()` and JavaScript's `fs.existsSync()`.
|
|
86
|
+
|
|
87
|
+
The implementation is end-to-end:
|
|
88
|
+
- New `FileExistsResult` and `FileExistsRequest` types in shared package
|
|
89
|
+
- Handler endpoint at `/api/exists` in container layer
|
|
90
|
+
- Client method in `FileClient` and `Sandbox` classes
|
|
91
|
+
- Full test coverage (unit tests and E2E tests)
|
|
92
|
+
|
|
93
|
+
## 0.4.8
|
|
94
|
+
|
|
95
|
+
### Patch Changes
|
|
96
|
+
|
|
97
|
+
- [#153](https://github.com/cloudflare/sandbox-sdk/pull/153) [`f6a5c3e`](https://github.com/cloudflare/sandbox-sdk/commit/f6a5c3e1607fce5fc26f816e9206ae437898d5af) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix token extraction regex causing Invalid token errors
|
|
98
|
+
|
|
99
|
+
## 0.4.7
|
|
100
|
+
|
|
101
|
+
### Patch Changes
|
|
102
|
+
|
|
103
|
+
- [#141](https://github.com/cloudflare/sandbox-sdk/pull/141) [`c39674b`](https://github.com/cloudflare/sandbox-sdk/commit/c39674b8fe2e986e59a794b6bb3a5f51a87bae89) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix commands hanging when reading stdin by redirecting stdin to /dev/null
|
|
104
|
+
|
|
105
|
+
- [#143](https://github.com/cloudflare/sandbox-sdk/pull/143) [`276efc0`](https://github.com/cloudflare/sandbox-sdk/commit/276efc0ca8776bcc8de79e7e58dd24d9f418cc5c) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Remove unnecessary existing session check
|
|
106
|
+
|
|
107
|
+
## 0.4.6
|
|
108
|
+
|
|
109
|
+
### Patch Changes
|
|
110
|
+
|
|
111
|
+
- [#133](https://github.com/cloudflare/sandbox-sdk/pull/133) [`da2cfb8`](https://github.com/cloudflare/sandbox-sdk/commit/da2cfb876675eb3445970c90b4d70d00288a7c74) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - feat: Add version sync detection between npm package and Docker image
|
|
112
|
+
|
|
113
|
+
## 0.4.5
|
|
114
|
+
|
|
115
|
+
### Patch Changes
|
|
116
|
+
|
|
117
|
+
- [#127](https://github.com/cloudflare/sandbox-sdk/pull/127) [`e79ac80`](https://github.com/cloudflare/sandbox-sdk/commit/e79ac80bc855a3ec527d44cc14585794b23cb129) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - configurable sleepAfter
|
|
118
|
+
|
|
119
|
+
## 0.4.4
|
|
120
|
+
|
|
121
|
+
### Patch Changes
|
|
122
|
+
|
|
123
|
+
- [#125](https://github.com/cloudflare/sandbox-sdk/pull/125) [`fddccfd`](https://github.com/cloudflare/sandbox-sdk/commit/fddccfdce8204ce2aa7dadc0ad9fb2acbdeaec51) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - add docker image to pkg workflow
|
|
124
|
+
|
|
125
|
+
## 0.4.3
|
|
126
|
+
|
|
127
|
+
### Patch Changes
|
|
128
|
+
|
|
129
|
+
- [#114](https://github.com/cloudflare/sandbox-sdk/pull/114) [`8c1f440`](https://github.com/cloudflare/sandbox-sdk/commit/8c1f440ad6fd89a5c69f9ca9d055ad9b183dd1c3) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Debloat base docker image (2.63GB → 1.03GB)
|
|
130
|
+
|
|
131
|
+
## 0.4.2
|
|
132
|
+
|
|
133
|
+
### Patch Changes
|
|
134
|
+
|
|
135
|
+
- [`e53d7e7`](https://github.com/cloudflare/sandbox-sdk/commit/e53d7e7ce185f79bdd899029bb532e9651ae7ba5) Thanks [@threepointone](https://github.com/threepointone)! - fix build by inlining repo/shared
|
|
136
|
+
|
|
3
137
|
## 0.4.1
|
|
4
138
|
|
|
5
139
|
### Patch Changes
|
|
@@ -49,50 +183,47 @@
|
|
|
49
183
|
Implements PID namespace isolation to protect control plane processes (Jupyter, Bun) from sandboxed code. Commands executed via `exec()` now run in isolated namespaces that cannot see or interact with system processes.
|
|
50
184
|
|
|
51
185
|
**Key security improvements:**
|
|
52
|
-
|
|
53
186
|
- Control plane processes are hidden from sandboxed commands
|
|
54
187
|
- Platform secrets in `/proc/1/environ` are inaccessible
|
|
55
188
|
- Ports 8888 (Jupyter) and 3000 (Bun) are protected from hijacking
|
|
56
189
|
|
|
57
190
|
**Breaking changes:**
|
|
58
|
-
|
|
59
191
|
1. **Removed `sessionId` parameter**: The `sessionId` parameter has been removed from all methods (`exec()`, `execStream()`, `startProcess()`, etc.). Each sandbox now maintains its own persistent session automatically.
|
|
60
192
|
|
|
61
193
|
```javascript
|
|
62
194
|
// Before: manual session management
|
|
63
|
-
await sandbox.exec(
|
|
195
|
+
await sandbox.exec('cd /app', { sessionId: 'my-session' });
|
|
64
196
|
|
|
65
197
|
// After: automatic session per sandbox
|
|
66
|
-
await sandbox.exec(
|
|
198
|
+
await sandbox.exec('cd /app');
|
|
67
199
|
```
|
|
68
200
|
|
|
69
201
|
2. **Commands now maintain state**: Commands within the same sandbox now share state (working directory, environment variables, background processes). Previously each command was stateless.
|
|
70
202
|
|
|
71
203
|
```javascript
|
|
72
204
|
// Before: each exec was independent
|
|
73
|
-
await sandbox.exec(
|
|
74
|
-
await sandbox.exec(
|
|
205
|
+
await sandbox.exec('cd /app');
|
|
206
|
+
await sandbox.exec('pwd'); // Output: /workspace
|
|
75
207
|
|
|
76
208
|
// After: state persists in session
|
|
77
|
-
await sandbox.exec(
|
|
78
|
-
await sandbox.exec(
|
|
209
|
+
await sandbox.exec('cd /app');
|
|
210
|
+
await sandbox.exec('pwd'); // Output: /app
|
|
79
211
|
```
|
|
80
212
|
|
|
81
213
|
**Migration guide:**
|
|
82
|
-
|
|
83
214
|
- Remove `sessionId` from all method calls - each sandbox maintains its own session
|
|
84
215
|
- If you need isolated execution contexts within the same sandbox, use `sandbox.createSession()`:
|
|
85
216
|
```javascript
|
|
86
217
|
// Create independent sessions with different environments
|
|
87
218
|
const buildSession = await sandbox.createSession({
|
|
88
|
-
name:
|
|
89
|
-
env: { NODE_ENV:
|
|
90
|
-
cwd:
|
|
219
|
+
name: 'build',
|
|
220
|
+
env: { NODE_ENV: 'production' },
|
|
221
|
+
cwd: '/build'
|
|
91
222
|
});
|
|
92
223
|
const testSession = await sandbox.createSession({
|
|
93
|
-
name:
|
|
94
|
-
env: { NODE_ENV:
|
|
95
|
-
cwd:
|
|
224
|
+
name: 'test',
|
|
225
|
+
env: { NODE_ENV: 'test' },
|
|
226
|
+
cwd: '/test'
|
|
96
227
|
});
|
|
97
228
|
```
|
|
98
229
|
- Environment variables set in one command persist to the next
|
package/Dockerfile
CHANGED
|
@@ -29,8 +29,9 @@ WORKDIR /app
|
|
|
29
29
|
COPY --from=pruner /app/out/json/ .
|
|
30
30
|
COPY --from=pruner /app/out/package-lock.json ./package-lock.json
|
|
31
31
|
|
|
32
|
-
# Install ALL dependencies
|
|
33
|
-
RUN npm
|
|
32
|
+
# Install ALL dependencies with cache mount for npm packages
|
|
33
|
+
RUN --mount=type=cache,target=/root/.npm \
|
|
34
|
+
CI=true npm ci
|
|
34
35
|
|
|
35
36
|
# Copy pruned source code
|
|
36
37
|
COPY --from=pruner /app/out/full/ .
|
|
@@ -53,81 +54,101 @@ COPY --from=builder /app/packages ./packages
|
|
|
53
54
|
COPY --from=builder /app/tooling ./tooling
|
|
54
55
|
|
|
55
56
|
# Install ONLY production dependencies (excludes typescript, @types/*, etc.)
|
|
56
|
-
RUN npm
|
|
57
|
+
RUN --mount=type=cache,target=/root/.npm \
|
|
58
|
+
CI=true npm ci --production
|
|
57
59
|
|
|
58
60
|
# ============================================================================
|
|
59
|
-
# Stage 4:
|
|
61
|
+
# Stage 4: Download pre-built Python 3.11.14
|
|
62
|
+
# ============================================================================
|
|
63
|
+
FROM ubuntu:22.04 AS python-builder
|
|
64
|
+
|
|
65
|
+
# Prevent interactive prompts during package installation
|
|
66
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
67
|
+
|
|
68
|
+
# Accept architecture from Docker BuildKit (for multi-arch builds)
|
|
69
|
+
ARG TARGETARCH
|
|
70
|
+
|
|
71
|
+
# Install minimal dependencies for downloading
|
|
72
|
+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
73
|
+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
74
|
+
rm -f /etc/apt/apt.conf.d/docker-clean && \
|
|
75
|
+
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache && \
|
|
76
|
+
apt-get update && apt-get install -y --no-install-recommends \
|
|
77
|
+
wget ca-certificates
|
|
78
|
+
|
|
79
|
+
# Download and extract pre-built Python 3.11.14 from python-build-standalone
|
|
80
|
+
# Using PGO+LTO optimized builds for better performance
|
|
81
|
+
# Supports multi-arch: amd64 (x86_64) and arm64 (aarch64)
|
|
82
|
+
RUN --mount=type=cache,target=/tmp/python-cache \
|
|
83
|
+
# Map Docker TARGETARCH to python-build-standalone arch naming
|
|
84
|
+
if [ "$TARGETARCH" = "amd64" ]; then \
|
|
85
|
+
PYTHON_ARCH="x86_64-unknown-linux-gnu"; \
|
|
86
|
+
EXPECTED_SHA256="edd8d11aa538953d12822fab418359a692fd1ee4ca2675579fbf0fa31e3688f1"; \
|
|
87
|
+
elif [ "$TARGETARCH" = "arm64" ]; then \
|
|
88
|
+
PYTHON_ARCH="aarch64-unknown-linux-gnu"; \
|
|
89
|
+
EXPECTED_SHA256="08141d31f95d86a23f23e4c741b726de0055f12f83200d1d4867b4e8e6e967c5"; \
|
|
90
|
+
else \
|
|
91
|
+
echo "Unsupported architecture: $TARGETARCH" && exit 1; \
|
|
92
|
+
fi && \
|
|
93
|
+
cd /tmp/python-cache && \
|
|
94
|
+
wget -nc https://github.com/indygreg/python-build-standalone/releases/download/20251028/cpython-3.11.14+20251028-${PYTHON_ARCH}-install_only.tar.gz && \
|
|
95
|
+
# Verify SHA256 checksum for security
|
|
96
|
+
echo "${EXPECTED_SHA256} cpython-3.11.14+20251028-${PYTHON_ARCH}-install_only.tar.gz" | sha256sum -c - && \
|
|
97
|
+
cd /tmp && \
|
|
98
|
+
tar -xzf /tmp/python-cache/cpython-3.11.14+20251028-${PYTHON_ARCH}-install_only.tar.gz && \
|
|
99
|
+
mv python /usr/local/ && \
|
|
100
|
+
rm -rf /tmp/cpython-*
|
|
101
|
+
|
|
102
|
+
# ============================================================================
|
|
103
|
+
# Stage 5: Runtime - Ubuntu 22.04 with only runtime dependencies
|
|
60
104
|
# ============================================================================
|
|
61
105
|
FROM ubuntu:22.04 AS runtime
|
|
62
106
|
|
|
107
|
+
# Accept version as build argument (passed from npm_package_version)
|
|
108
|
+
ARG SANDBOX_VERSION=unknown
|
|
109
|
+
|
|
63
110
|
# Prevent interactive prompts during package installation
|
|
64
111
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
65
112
|
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
# Python dependencies
|
|
90
|
-
python3.11 \
|
|
91
|
-
python3.11-dev \
|
|
92
|
-
python3-pip \
|
|
93
|
-
python3.11-venv \
|
|
94
|
-
# Other useful tools
|
|
95
|
-
ca-certificates \
|
|
96
|
-
gnupg \
|
|
97
|
-
lsb-release \
|
|
98
|
-
strace \
|
|
99
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
113
|
+
# Set the sandbox version as an environment variable for version checking
|
|
114
|
+
ENV SANDBOX_VERSION=${SANDBOX_VERSION}
|
|
115
|
+
|
|
116
|
+
# Install runtime packages and Python runtime libraries
|
|
117
|
+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
118
|
+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
119
|
+
rm -f /etc/apt/apt.conf.d/docker-clean && \
|
|
120
|
+
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache && \
|
|
121
|
+
apt-get update && apt-get install -y --no-install-recommends \
|
|
122
|
+
ca-certificates curl wget procps git unzip zip jq file \
|
|
123
|
+
libssl3 zlib1g libbz2-1.0 libreadline8 libsqlite3-0 \
|
|
124
|
+
libncursesw6 libtinfo6 libxml2 libxmlsec1 libffi8 liblzma5 libtk8.6 && \
|
|
125
|
+
update-ca-certificates
|
|
126
|
+
|
|
127
|
+
# Copy pre-built Python from python-builder stage
|
|
128
|
+
COPY --from=python-builder /usr/local/python /usr/local/python
|
|
129
|
+
|
|
130
|
+
# Create symlinks and update shared library cache
|
|
131
|
+
RUN ln -s /usr/local/python/bin/python3.11 /usr/local/bin/python3.11 && \
|
|
132
|
+
ln -s /usr/local/python/bin/python3 /usr/local/bin/python3 && \
|
|
133
|
+
ln -s /usr/local/python/bin/pip3 /usr/local/bin/pip3 && \
|
|
134
|
+
echo "/usr/local/python/lib" > /etc/ld.so.conf.d/python.conf && \
|
|
135
|
+
ldconfig
|
|
100
136
|
|
|
101
137
|
# Set Python 3.11 as default python3
|
|
102
|
-
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
|
|
138
|
+
RUN update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1
|
|
139
|
+
|
|
140
|
+
# Install Python packages
|
|
141
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
142
|
+
pip3 install --no-cache-dir matplotlib numpy pandas ipython
|
|
103
143
|
|
|
104
|
-
# Install Node.js 20 LTS
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
144
|
+
# Install Node.js 20 LTS from official Node image
|
|
145
|
+
COPY --from=node:20-slim /usr/local/bin/node /usr/local/bin/node
|
|
146
|
+
COPY --from=node:20-slim /usr/local/lib/node_modules /usr/local/lib/node_modules
|
|
147
|
+
RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \
|
|
148
|
+
ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx
|
|
108
149
|
|
|
109
150
|
# Install Bun runtime from official image
|
|
110
151
|
COPY --from=oven/bun:1 /usr/local/bin/bun /usr/local/bin/bun
|
|
111
|
-
COPY --from=oven/bun:1 /usr/local/bin/bunx /usr/local/bin/bunx
|
|
112
|
-
|
|
113
|
-
# Install development tools globally
|
|
114
|
-
RUN npm install -g \
|
|
115
|
-
wrangler \
|
|
116
|
-
vite \
|
|
117
|
-
opencode-ai
|
|
118
|
-
|
|
119
|
-
# Install essential Python packages for code execution
|
|
120
|
-
RUN pip3 install --no-cache-dir \
|
|
121
|
-
matplotlib \
|
|
122
|
-
numpy \
|
|
123
|
-
pandas \
|
|
124
|
-
ipython
|
|
125
|
-
|
|
126
|
-
# Verify installations
|
|
127
|
-
RUN python3 --version && \
|
|
128
|
-
node --version && \
|
|
129
|
-
npm --version && \
|
|
130
|
-
bun --version
|
|
131
152
|
|
|
132
153
|
# Set up runtime container server directory
|
|
133
154
|
WORKDIR /container-server
|
|
@@ -143,10 +164,9 @@ COPY --from=builder /app/packages/sandbox-container/src/runtime/executors/python
|
|
|
143
164
|
# Includes: @repo/shared, zod, esbuild (runtime dependencies)
|
|
144
165
|
COPY --from=prod-deps /app/node_modules ./node_modules
|
|
145
166
|
|
|
146
|
-
# Copy workspace packages
|
|
147
|
-
|
|
148
|
-
COPY --from=prod-deps /app/packages/shared ./packages/shared
|
|
149
|
-
COPY --from=prod-deps /app/tooling/typescript-config ./tooling/typescript-config
|
|
167
|
+
# Copy workspace packages
|
|
168
|
+
COPY --from=prod-deps /app/packages/shared/dist ./packages/shared/dist
|
|
169
|
+
COPY --from=prod-deps /app/packages/shared/package.json ./packages/shared/package.json
|
|
150
170
|
|
|
151
171
|
# Configure process pool sizes (can be overridden at runtime)
|
|
152
172
|
ENV PYTHON_POOL_MIN_SIZE=3
|
|
@@ -157,9 +177,6 @@ ENV TYPESCRIPT_POOL_MIN_SIZE=3
|
|
|
157
177
|
ENV TYPESCRIPT_POOL_MAX_SIZE=10
|
|
158
178
|
|
|
159
179
|
# Create clean workspace directory for user code
|
|
160
|
-
# Architecture:
|
|
161
|
-
# /container-server/ - SDK infrastructure (server, executors, dependencies)
|
|
162
|
-
# /workspace/ - User's clean workspace for their code
|
|
163
180
|
RUN mkdir -p /workspace
|
|
164
181
|
|
|
165
182
|
# Expose the application port (3000 for control)
|
|
@@ -170,4 +187,4 @@ COPY packages/sandbox/startup.sh ./
|
|
|
170
187
|
RUN chmod +x startup.sh
|
|
171
188
|
|
|
172
189
|
# Use startup script
|
|
173
|
-
CMD ["
|
|
190
|
+
CMD ["/container-server/startup.sh"]
|
package/README.md
CHANGED
|
@@ -10,8 +10,6 @@ The Sandbox SDK lets you run untrusted code safely in isolated containers. Execu
|
|
|
10
10
|
|
|
11
11
|
Perfect for AI code execution, interactive development environments, data analysis platforms, CI/CD systems, and any application that needs secure code execution at the edge.
|
|
12
12
|
|
|
13
|
-
> **Note:** The latest published version of the SDK is on the [v03 branch](https://github.com/cloudflare/sandbox-sdk/tree/v03). This main branch is currently the development version and is not yet published.
|
|
14
|
-
|
|
15
13
|
## Getting Started
|
|
16
14
|
|
|
17
15
|
### Prerequisites
|
|
@@ -118,9 +116,17 @@ export default {
|
|
|
118
116
|
- **Preview URLs** - Expose services with public URLs
|
|
119
117
|
- **Git Integration** - Clone repositories directly
|
|
120
118
|
|
|
119
|
+
## Contributing
|
|
120
|
+
|
|
121
|
+
We welcome contributions from the community! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines on:
|
|
122
|
+
|
|
123
|
+
- Setting up your development environment
|
|
124
|
+
- Creating pull requests
|
|
125
|
+
- Code style and testing requirements
|
|
126
|
+
|
|
121
127
|
## Development
|
|
122
128
|
|
|
123
|
-
This repository contains the SDK source code.
|
|
129
|
+
This repository contains the SDK source code. Quick start:
|
|
124
130
|
|
|
125
131
|
```bash
|
|
126
132
|
# Clone the repo
|
|
@@ -146,7 +152,6 @@ See the [examples directory](./examples) for complete working examples:
|
|
|
146
152
|
|
|
147
153
|
- [Minimal](./examples/minimal) - Basic sandbox setup
|
|
148
154
|
- [Code Interpreter](./examples/code-interpreter) - Use sandbox as an interpreter tool with gpt-oss
|
|
149
|
-
- [Complete](./examples/basic) - Huge example integrated with every sandbox feature
|
|
150
155
|
|
|
151
156
|
## Status
|
|
152
157
|
|