@cloudflare/sandbox 0.0.0-af082ab → 0.0.0-b61841c

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 (105) hide show
  1. package/CHANGELOG.md +63 -6
  2. package/Dockerfile +91 -51
  3. package/README.md +88 -825
  4. package/dist/chunk-BFVUNTP4.js +104 -0
  5. package/dist/chunk-BFVUNTP4.js.map +1 -0
  6. package/dist/chunk-EKSWCBCA.js +86 -0
  7. package/dist/chunk-EKSWCBCA.js.map +1 -0
  8. package/dist/chunk-JXZMAU2C.js +559 -0
  9. package/dist/chunk-JXZMAU2C.js.map +1 -0
  10. package/dist/chunk-QHRFHK6X.js +7 -0
  11. package/dist/chunk-QHRFHK6X.js.map +1 -0
  12. package/dist/chunk-SFCV5YTY.js +2456 -0
  13. package/dist/chunk-SFCV5YTY.js.map +1 -0
  14. package/dist/chunk-Z532A7QC.js +78 -0
  15. package/dist/chunk-Z532A7QC.js.map +1 -0
  16. package/dist/file-stream.d.ts +43 -0
  17. package/dist/file-stream.js +9 -0
  18. package/dist/file-stream.js.map +1 -0
  19. package/dist/index.d.ts +9 -0
  20. package/dist/index.js +67 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/interpreter.d.ts +33 -0
  23. package/dist/interpreter.js +8 -0
  24. package/dist/interpreter.js.map +1 -0
  25. package/dist/request-handler.d.ts +18 -0
  26. package/dist/request-handler.js +13 -0
  27. package/dist/request-handler.js.map +1 -0
  28. package/dist/sandbox-DWQVgVTY.d.ts +603 -0
  29. package/dist/sandbox.d.ts +4 -0
  30. package/dist/sandbox.js +13 -0
  31. package/dist/sandbox.js.map +1 -0
  32. package/dist/security.d.ts +31 -0
  33. package/dist/security.js +13 -0
  34. package/dist/security.js.map +1 -0
  35. package/dist/sse-parser.d.ts +28 -0
  36. package/dist/sse-parser.js +11 -0
  37. package/dist/sse-parser.js.map +1 -0
  38. package/dist/version.d.ts +8 -0
  39. package/dist/version.js +7 -0
  40. package/dist/version.js.map +1 -0
  41. package/package.json +12 -4
  42. package/src/clients/base-client.ts +280 -0
  43. package/src/clients/command-client.ts +115 -0
  44. package/src/clients/file-client.ts +295 -0
  45. package/src/clients/git-client.ts +92 -0
  46. package/src/clients/index.ts +64 -0
  47. package/src/{interpreter-client.ts → clients/interpreter-client.ts} +148 -171
  48. package/src/clients/port-client.ts +105 -0
  49. package/src/clients/process-client.ts +177 -0
  50. package/src/clients/sandbox-client.ts +41 -0
  51. package/src/clients/types.ts +84 -0
  52. package/src/clients/utility-client.ts +119 -0
  53. package/src/errors/adapter.ts +180 -0
  54. package/src/errors/classes.ts +469 -0
  55. package/src/errors/index.ts +105 -0
  56. package/src/file-stream.ts +119 -117
  57. package/src/index.ts +81 -69
  58. package/src/interpreter.ts +17 -8
  59. package/src/request-handler.ts +80 -44
  60. package/src/sandbox.ts +794 -537
  61. package/src/security.ts +14 -23
  62. package/src/sse-parser.ts +4 -8
  63. package/src/version.ts +6 -0
  64. package/startup.sh +3 -0
  65. package/tests/base-client.test.ts +328 -0
  66. package/tests/command-client.test.ts +407 -0
  67. package/tests/file-client.test.ts +719 -0
  68. package/tests/file-stream.test.ts +306 -0
  69. package/tests/get-sandbox.test.ts +110 -0
  70. package/tests/git-client.test.ts +328 -0
  71. package/tests/port-client.test.ts +301 -0
  72. package/tests/process-client.test.ts +658 -0
  73. package/tests/request-handler.test.ts +240 -0
  74. package/tests/sandbox.test.ts +554 -0
  75. package/tests/sse-parser.test.ts +290 -0
  76. package/tests/utility-client.test.ts +332 -0
  77. package/tests/version.test.ts +16 -0
  78. package/tests/wrangler.jsonc +35 -0
  79. package/tsconfig.json +9 -1
  80. package/vitest.config.ts +31 -0
  81. package/container_src/bun.lock +0 -76
  82. package/container_src/circuit-breaker.ts +0 -121
  83. package/container_src/control-process.ts +0 -784
  84. package/container_src/handler/exec.ts +0 -185
  85. package/container_src/handler/file.ts +0 -457
  86. package/container_src/handler/git.ts +0 -130
  87. package/container_src/handler/ports.ts +0 -314
  88. package/container_src/handler/process.ts +0 -568
  89. package/container_src/handler/session.ts +0 -92
  90. package/container_src/index.ts +0 -601
  91. package/container_src/interpreter-service.ts +0 -276
  92. package/container_src/isolation.ts +0 -1213
  93. package/container_src/mime-processor.ts +0 -255
  94. package/container_src/package.json +0 -18
  95. package/container_src/runtime/executors/javascript/node_executor.ts +0 -123
  96. package/container_src/runtime/executors/python/ipython_executor.py +0 -338
  97. package/container_src/runtime/executors/typescript/ts_executor.ts +0 -138
  98. package/container_src/runtime/process-pool.ts +0 -464
  99. package/container_src/shell-escape.ts +0 -42
  100. package/container_src/startup.sh +0 -11
  101. package/container_src/types.ts +0 -131
  102. package/src/client.ts +0 -1048
  103. package/src/errors.ts +0 -219
  104. package/src/interpreter-types.ts +0 -390
  105. package/src/types.ts +0 -571
package/CHANGELOG.md CHANGED
@@ -1,22 +1,79 @@
1
1
  # @cloudflare/sandbox
2
2
 
3
- ## 0.3.6
3
+ ## 0.4.9
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - [#90](https://github.com/cloudflare/sandbox-sdk/pull/90) [`66cc85b`](https://github.com/cloudflare/sandbox-sdk/commit/66cc85b679b466b3ffb1f00fbd697670fc186f06) Thanks [@eastlondoner](https://github.com/eastlondoner)! - set bun idletimeout
7
+ - [#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
8
8
 
9
- ## 0.3.5
9
+ 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()`.
10
+
11
+ The implementation is end-to-end:
12
+
13
+ - New `FileExistsResult` and `FileExistsRequest` types in shared package
14
+ - Handler endpoint at `/api/exists` in container layer
15
+ - Client method in `FileClient` and `Sandbox` classes
16
+ - Full test coverage (unit tests and E2E tests)
17
+
18
+ ## 0.4.8
19
+
20
+ ### Patch Changes
21
+
22
+ - [#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
23
+
24
+ ## 0.4.7
25
+
26
+ ### Patch Changes
27
+
28
+ - [#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
29
+
30
+ - [#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
31
+
32
+ ## 0.4.6
10
33
 
11
34
  ### Patch Changes
12
35
 
13
- - [#88](https://github.com/cloudflare/sandbox-sdk/pull/88) [`46eb4e6`](https://github.com/cloudflare/sandbox-sdk/commit/46eb4e6b6c671b682fc74f83563ccf5f316011cb) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add binary file support with automatic MIME detection and streaming
36
+ - [#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
37
+
38
+ ## 0.4.5
39
+
40
+ ### Patch Changes
41
+
42
+ - [#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
43
+
44
+ ## 0.4.4
45
+
46
+ ### Patch Changes
47
+
48
+ - [#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
49
+
50
+ ## 0.4.3
51
+
52
+ ### Patch Changes
53
+
54
+ - [#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)
55
+
56
+ ## 0.4.2
57
+
58
+ ### Patch Changes
59
+
60
+ - [`e53d7e7`](https://github.com/cloudflare/sandbox-sdk/commit/e53d7e7ce185f79bdd899029bb532e9651ae7ba5) Thanks [@threepointone](https://github.com/threepointone)! - fix build by inlining repo/shared
61
+
62
+ ## 0.4.1
63
+
64
+ ### Patch Changes
65
+
66
+ - [#111](https://github.com/cloudflare/sandbox-sdk/pull/111) [`1b5496b`](https://github.com/cloudflare/sandbox-sdk/commit/1b5496bfceaee53c31911b409476ea87bebffe4c) Thanks [@threepointone](https://github.com/threepointone)! - trigger a release
67
+
68
+ ## 0.4.0
69
+
70
+ ### Minor Changes
14
71
 
15
- ## 0.3.4
72
+ - [#95](https://github.com/cloudflare/sandbox-sdk/pull/95) [`7aee736`](https://github.com/cloudflare/sandbox-sdk/commit/7aee736bf07a4bf9020e2109bdaaa70214d52a01) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Rewrite SDK with cleaner design patterns and tests. Remove the unnecessary isolation cruft and fix foundational issues with streaming, sessions, validations and error handling. Cover the SDK with unit & e2e tests.
16
73
 
17
74
  ### Patch Changes
18
75
 
19
- - [#86](https://github.com/cloudflare/sandbox-sdk/pull/86) [`feafd32`](https://github.com/cloudflare/sandbox-sdk/commit/feafd32a51f50dfaf4994bddcbfb56d46cada622) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix session reuse to reuse existing healthy session
76
+ - [#106](https://github.com/cloudflare/sandbox-sdk/pull/106) [`da947cd`](https://github.com/cloudflare/sandbox-sdk/commit/da947cd9543fc99831eefb1e8741fc905cb8fa42) Thanks [@jahands](https://github.com/jahands)! - fix examples failing to deploy and prevent committing node_modules
20
77
 
21
78
  ## 0.3.3
22
79
 
package/Dockerfile CHANGED
@@ -1,43 +1,88 @@
1
- # Sandbox base image with development tools, Python, Node.js, and Bun
2
- FROM oven/bun:latest AS bun-source
3
- FROM ubuntu:22.04
1
+ # Sandbox container image with full development environment
2
+ # Multi-stage build optimized for Turborepo monorepo
3
+
4
+ # ============================================================================
5
+ # Stage 1: Prune monorepo to only include necessary packages
6
+ # ============================================================================
7
+ FROM node:20-alpine AS pruner
8
+
9
+ WORKDIR /app
10
+
11
+ # Install Turborepo globally
12
+ RUN npm install -g turbo
13
+
14
+ # Copy entire monorepo
15
+ COPY . .
16
+
17
+ # Prune to only @repo/sandbox-container and its dependencies (@repo/shared)
18
+ # The --docker flag generates out/json and out/full directories
19
+ RUN turbo prune @repo/sandbox-container --docker
20
+
21
+ # ============================================================================
22
+ # Stage 2: Install dependencies and build packages
23
+ # ============================================================================
24
+ FROM node:20-alpine AS builder
25
+
26
+ WORKDIR /app
27
+
28
+ # Copy pruned lockfile and package.json files (for Docker layer caching)
29
+ COPY --from=pruner /app/out/json/ .
30
+ COPY --from=pruner /app/out/package-lock.json ./package-lock.json
31
+
32
+ # Install ALL dependencies (including devDependencies for build)
33
+ RUN npm ci
34
+
35
+ # Copy pruned source code
36
+ COPY --from=pruner /app/out/full/ .
37
+
38
+ # Build all packages (Turborepo handles dependency order automatically)
39
+ # This builds @repo/shared first, then @repo/sandbox-container
40
+ RUN npx turbo run build
41
+
42
+ # ============================================================================
43
+ # Stage 3: Install production-only dependencies
44
+ # ============================================================================
45
+ FROM node:20-alpine AS prod-deps
46
+
47
+ WORKDIR /app
48
+
49
+ # Copy package files from builder
50
+ COPY --from=builder /app/package.json ./package.json
51
+ COPY --from=builder /app/package-lock.json ./package-lock.json
52
+ COPY --from=builder /app/packages ./packages
53
+ COPY --from=builder /app/tooling ./tooling
54
+
55
+ # Install ONLY production dependencies (excludes typescript, @types/*, etc.)
56
+ RUN npm ci --production
57
+
58
+ # ============================================================================
59
+ # Stage 4: Runtime - Ubuntu 22.04 with only runtime dependencies
60
+ # ============================================================================
61
+ FROM ubuntu:22.04 AS runtime
62
+
63
+ # Accept version as build argument (passed from npm_package_version)
64
+ ARG SANDBOX_VERSION=unknown
4
65
 
5
66
  # Prevent interactive prompts during package installation
6
67
  ENV DEBIAN_FRONTEND=noninteractive
7
68
 
8
- # Install essential system packages and development tools
9
- RUN apt-get update && apt-get install -y \
10
- # Basic utilities
69
+ # Set the sandbox version as an environment variable for version checking
70
+ ENV SANDBOX_VERSION=${SANDBOX_VERSION}
71
+
72
+ # Install essential runtime packages
73
+ RUN apt-get update && apt-get install -y --no-install-recommends \
11
74
  curl \
12
75
  wget \
76
+ ca-certificates \
77
+ python3.11 \
78
+ python3-pip \
79
+ python3.11-venv \
80
+ procps \
13
81
  git \
14
82
  unzip \
15
83
  zip \
16
- file \
17
- # Process management
18
- procps \
19
- htop \
20
- # Build tools
21
- build-essential \
22
- pkg-config \
23
- # Network tools
24
- net-tools \
25
- iputils-ping \
26
- dnsutils \
27
- # Text processing
28
84
  jq \
29
- vim \
30
- nano \
31
- # Python dependencies
32
- python3.11 \
33
- python3.11-dev \
34
- python3-pip \
35
- python3.11-venv \
36
- # Other useful tools
37
- ca-certificates \
38
- gnupg \
39
- lsb-release \
40
- strace \
85
+ file \
41
86
  && rm -rf /var/lib/apt/lists/*
42
87
 
43
88
  # Set Python 3.11 as default python3
@@ -48,9 +93,8 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
48
93
  && apt-get install -y nodejs \
49
94
  && rm -rf /var/lib/apt/lists/*
50
95
 
51
- # Install Bun from official image (avoids architecture compatibility issues)
52
- COPY --from=bun-source /usr/local/bin/bun /usr/local/bin/bun
53
- COPY --from=bun-source /usr/local/bin/bunx /usr/local/bin/bunx
96
+ # Install Bun runtime from official image
97
+ COPY --from=oven/bun:1 /usr/local/bin/bun /usr/local/bin/bun
54
98
 
55
99
  # Install essential Python packages for code execution
56
100
  RUN pip3 install --no-cache-dir \
@@ -59,25 +103,23 @@ RUN pip3 install --no-cache-dir \
59
103
  pandas \
60
104
  ipython
61
105
 
62
- # Set up container server directory
106
+ # Set up runtime container server directory
63
107
  WORKDIR /container-server
64
108
 
65
- # Verify installations
66
- RUN python3 --version && \
67
- node --version && \
68
- npm --version && \
69
- bun --version
109
+ # Copy built sandbox-container package
110
+ COPY --from=builder /app/packages/sandbox-container/dist ./dist
111
+ COPY --from=builder /app/packages/sandbox-container/package.json ./package.json
70
112
 
71
- # Copy container source files to server directory
72
- COPY container_src/package.json container_src/bun.lock ./
73
- RUN bun install --frozen-lockfile
113
+ # Copy Python executor to runtime location
114
+ COPY --from=builder /app/packages/sandbox-container/src/runtime/executors/python/ipython_executor.py ./dist/runtime/executors/python/
74
115
 
75
- COPY container_src/ ./
116
+ # Copy production-only node_modules (excludes typescript, @types/*, etc.)
117
+ # Includes: @repo/shared, zod, esbuild (runtime dependencies)
118
+ COPY --from=prod-deps /app/node_modules ./node_modules
76
119
 
77
- # Compile TypeScript files using the locally installed TypeScript
78
- RUN npx tsc control-process.ts --outDir . --module commonjs --target es2020 --esModuleInterop --skipLibCheck
79
- RUN cd runtime/executors/javascript && npx tsc node_executor.ts --module commonjs --target es2020 --esModuleInterop --skipLibCheck
80
- RUN cd runtime/executors/typescript && npx tsc ts_executor.ts --module commonjs --target es2020 --esModuleInterop --skipLibCheck
120
+ # Copy workspace packages
121
+ COPY --from=prod-deps /app/packages/shared/dist ./packages/shared/dist
122
+ COPY --from=prod-deps /app/packages/shared/package.json ./packages/shared/package.json
81
123
 
82
124
  # Configure process pool sizes (can be overridden at runtime)
83
125
  ENV PYTHON_POOL_MIN_SIZE=3
@@ -88,15 +130,13 @@ ENV TYPESCRIPT_POOL_MIN_SIZE=3
88
130
  ENV TYPESCRIPT_POOL_MAX_SIZE=10
89
131
 
90
132
  # Create clean workspace directory for user code
91
- # Architecture:
92
- # /container-server/ - SDK infrastructure (server, executors, dependencies)
93
- # /workspace/ - User's clean workspace for their code
94
133
  RUN mkdir -p /workspace
95
134
 
96
135
  # Expose the application port (3000 for control)
97
136
  EXPOSE 3000
98
137
 
99
- # Make startup script executable
138
+ # Copy and make startup script executable
139
+ COPY packages/sandbox/startup.sh ./
100
140
  RUN chmod +x startup.sh
101
141
 
102
142
  # Use startup script