withruntime 0.14.0 → 0.16.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 (62) hide show
  1. package/BLAXEL.md +97 -32
  2. package/COMPATIBILITY.md +120 -5
  3. package/DAYTONA.md +34 -3
  4. package/E2B.md +34 -5
  5. package/README.md +33 -0
  6. package/README.src.md +33 -0
  7. package/VERCEL.md +52 -5
  8. package/compatibility-lock.json +71 -111
  9. package/dist/blaxel/client.d.ts +11 -0
  10. package/dist/blaxel/client.js +28 -0
  11. package/dist/blaxel/errors.d.ts +65 -0
  12. package/dist/blaxel/errors.js +114 -0
  13. package/dist/blaxel/index.d.ts +10 -3
  14. package/dist/blaxel/index.js +23 -4
  15. package/dist/blaxel/preview.d.ts +29 -4
  16. package/dist/blaxel/preview.js +79 -5
  17. package/dist/blaxel/sandbox.js +1 -0
  18. package/dist/blaxel/session.js +4 -2
  19. package/dist/cli-extras.js +2 -1
  20. package/dist/cli-words.js +1 -0
  21. package/dist/cli.d.ts +1 -1
  22. package/dist/cli.js +54 -21
  23. package/dist/client.d.ts +1 -1
  24. package/dist/daytona/client.d.ts +4 -0
  25. package/dist/daytona/client.js +8 -3
  26. package/dist/daytona/daytona.d.ts +3 -0
  27. package/dist/daytona/daytona.js +2 -1
  28. package/dist/e2b/sandbox.d.ts +6 -5
  29. package/dist/e2b/sandbox.js +9 -12
  30. package/dist/freestyle/index.d.ts +77 -5
  31. package/dist/freestyle/index.js +380 -48
  32. package/dist/identity.js +36 -18
  33. package/dist/index.d.ts +2 -2
  34. package/dist/machine.d.ts +24 -12
  35. package/dist/machine.js +46 -14
  36. package/dist/mcp.js +16 -3
  37. package/dist/modal/index.d.ts +15 -0
  38. package/dist/modal/index.js +35 -7
  39. package/dist/morph/index.d.ts +255 -0
  40. package/dist/morph/index.js +641 -0
  41. package/dist/network-cli.js +2 -2
  42. package/dist/product-names.d.ts +2 -2
  43. package/dist/product-names.js +2 -2
  44. package/dist/products/limits.d.ts +16 -2
  45. package/dist/products/limits.js +2 -2
  46. package/dist/products/mcp.d.ts +5 -0
  47. package/dist/products/network-products.d.ts +21 -3
  48. package/dist/products/network-products.js +3 -1
  49. package/dist/products/previews.d.ts +6 -3
  50. package/dist/products/previews.js +1 -1
  51. package/dist/snapshots.d.ts +4 -0
  52. package/dist/ssh.d.ts +35 -0
  53. package/dist/ssh.js +93 -1
  54. package/dist/transport.d.ts +11 -8
  55. package/dist/transport.js +46 -12
  56. package/dist/types.d.ts +24 -0
  57. package/dist/vercel/command.d.ts +48 -1
  58. package/dist/vercel/command.js +237 -6
  59. package/dist/vercel/sandbox-user.js +2 -1
  60. package/dist/vercel/sandbox.d.ts +16 -2
  61. package/dist/vercel/sandbox.js +45 -2
  62. package/package.json +6 -1
package/README.src.md CHANGED
@@ -149,6 +149,21 @@ with its token. A Blaxel key is never sent anywhere. Drives, codegen, schedules
149
149
  `NotSupportedError` before anything happens, naming what to use instead.
150
150
  `BLAXEL.md` in this package lists every mapping and gap.
151
151
 
152
+ ## Code written for Morph Cloud
153
+
154
+ `withruntime/morph` translates Morph's TypeScript client (`morphcloud`).
155
+ Change the import:
156
+
157
+ ```ts no-run
158
+ import { MorphCloudClient } from "withruntime/morph"; // was: from "morphcloud"
159
+ ```
160
+
161
+ Instances become sandboxes, snapshots Runtime snapshots, metadata labels and
162
+ HTTP services previews; `setup` caches by Morph's chain hash and `branch`
163
+ copies memory and processes. `stop` deletes the sandbox, as Morph's does.
164
+ SSH, reboot and a time limit set after start throw `CompatibilityError`
165
+ naming the alternative. `COMPATIBILITY.md` lists every mapping.
166
+
152
167
  ## Agent frameworks
153
168
 
154
169
  `withruntime/openai-agents` is a sandbox client for the OpenAI Agents SDK's
@@ -185,6 +200,24 @@ connected yet, it offers `runtime_connect`, which walks you through the browser
185
200
  approval. Remote clients add `https://api.withruntime.com/mcp` and sign in through
186
201
  the browser, or send a bearer key.
187
202
 
203
+ ## How Runtime compares
204
+
205
+ For typical agent work, Runtime costs {{saving-range}} less than {{rival-count}} other
206
+ sandbox providers at their published rates. These pages show the arithmetic,
207
+ each with the rates it used and the date they were read:
208
+
209
+ - [Best sandbox for AI agents](https://withruntime.com/compare/best-sandbox-for-ai-agents)
210
+ - Alternatives to [E2B](https://withruntime.com/compare/e2b-alternatives),
211
+ [Daytona](https://withruntime.com/compare/daytona-alternatives),
212
+ [Modal](https://withruntime.com/compare/modal-alternatives) and
213
+ [Vercel Sandbox](https://withruntime.com/compare/vercel-sandbox-alternatives)
214
+ - [E2B vs Daytona](https://withruntime.com/compare/e2b-vs-daytona), and
215
+ [every comparison](https://withruntime.com/compare)
216
+ - [The agent sandbox price index](https://withruntime.com/pricing/agent-sandbox-price-index):
217
+ every provider's rates, also as CSV and JSON
218
+ - [Sandbox cost calculator](https://withruntime.com/calculators/sandbox-cost-calculator)
219
+ and [Runtime's pricing](https://withruntime.com/pricing)
220
+
188
221
  ## Reliability and support
189
222
 
190
223
  - **Status:** https://withruntime.com/status checks the API from outside every
package/VERCEL.md CHANGED
@@ -16,11 +16,22 @@ from withruntime.vercel import sandbox # was: from vercel import sandbox
16
16
  from withruntime.vercel.sandbox import sync as sandbox # was: from vercel.sandbox import sync as sandbox
17
17
  ```
18
18
 
19
- The JavaScript mapping was checked against `@vercel/sandbox` 3.6.1 on
20
- 8 October 2026. Python was checked against `vercel-sandbox` 0.9.0 on PyPI
21
- (the `vercel.sandbox` module of `vercel` 0.11.6) on 7 October 2026.
22
- 0.9.0 adds `get_drive`, which raises `NotSupportedError` like
23
- the other Drive calls; `vercel` 0.11.6 only raises its `vercel-sandbox` floor.
19
+ The JavaScript mapping was checked against `@vercel/sandbox` 3.8.0 on
20
+ 15 October 2026. Python was checked against `vercel-sandbox` 0.9.1 on PyPI
21
+ (the `vercel.sandbox` module of `vercel` 0.12.0) on 15 October 2026.
22
+ 0.9.0 added `get_drive`, which raises `NotSupportedError` like the other
23
+ Drive calls.
24
+
25
+ Python review, 15 October 2026: each pinned wheel and sdist matched its
26
+ SHA-256 in `compatibility-lock.json`, each new one the PyPI digest, and each
27
+ new wheel's source its sdist; they were compared file by file, nothing
28
+ installed or run. `vercel-sandbox` 0.9.1 changes only its version and its
29
+ `vercel-internal-core` floor (0.2.2); no sandbox source changes. `vercel`
30
+ 0.12.0 moves `vercel.blob` into the separate `vercel-blob` package (a new
31
+ dependency), removing its own Blob code, and raises its floors
32
+ (`vercel-sandbox` 0.9.1). Blob is Vercel's storage product, which the
33
+ drop-in has never offered (`withruntime.vercel` exports `sandbox` and
34
+ `api`), so nothing changes; the inventory's 684 Python items are unchanged.
24
35
 
25
36
  ## Keys
26
37
 
@@ -125,6 +136,42 @@ Some differences are not refusals:
125
136
  Vercel's `universal` has Python 3.14.
126
137
  - A git source is cloned into the working directory itself.
127
138
 
139
+ ## JavaScript qualification, 15 October 2026
140
+
141
+ Reviewed the exact published npm tarballs for `@vercel/sandbox` 3.6.1 → 3.7.0
142
+ → 3.8.0 (3.7.0 is the only stable release between them). 3.6.1 matched its
143
+ SHA-512 in `compatibility-lock.json`; 3.7.0 and 3.8.0 matched
144
+ `npm view @vercel/sandbox@<version> dist.integrity` (3.8.0:
145
+ `sha512-2ib+Dl8W...`). No downloaded package code was installed or executed
146
+ outside the oracle's frozen install.
147
+
148
+ The source maps name six changed TypeScript files and one new one
149
+ (`utils/pipe-stdin.ts`); CommonJS and ES-module builds match. `index.d.ts`
150
+ exports nothing new. The changes and their dispositions:
151
+
152
+ | Upstream change | Drop-in disposition |
153
+ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
154
+ | 3.7.0: `runCommand({ stdin: true, detached: true })` keeps the command's stdin open; `stdin: true` without `detached` throws `TypeError` before anything runs. Unset or false, stdin is empty, as before. | Followed. The process is spawned with Runtime's piped stdin (`stdinMode: "pipe"`); the same `TypeError` message is thrown before any request. Without `stdin`, nothing changes. |
155
+ | 3.7.0: `Command.writeStdin(data, { abortSignal })` and `closeStdin({ abortSignal })`. Writes are queued in call order, chunked, resent with byte offsets so retries never duplicate; after a write that may be partial, later writes are refused (`closeStdin` still works). | Followed on Runtime's process input (`:write` with `offset` and `eof`), which already resends by offset, so no byte is written twice. Writes are queued in call order. A failed write refuses later ones with upstream's message, unless the API rejected a single request with a 4xx, which applied none of it. A `Command` from `getCommand` reads its offset from the process. |
156
+ | 3.7.0: `CommandFinished.writeStdin`/`closeStdin` always throw: the command has exited. | Followed with the same messages. |
157
+ | 3.7.0: `stdin` may be a `Readable`, attached or detached. It is written with backpressure and stdin closes when it ends; the stream is never ended or destroyed. Attached: a piping failure kills the command and rejects `runCommand`. Detached: `wait()` rejects (and `stdinPipe` clears). The command exiting or no longer accepting input (404, `command_stdin_unavailable`) stops piping quietly. `Command.stdinPipe` is the (internal) pipe. | Followed. An attached command with a stream starts as a process and waits on its output, streaming to `stdout`/`stderr` writers as before. Reading pauses past 512 KiB waiting. Runtime's "input closed" answer (409 `stdin_closed`) or a 404 stops piping quietly, as upstream's does. `stdinPipe` is exposed the same way. |
158
+ | 3.7.0: `SandboxUser.runCommand` passes `stdin`; 3.8.0 also passes `onStart`. | Followed: both reach the sandbox's `runCommand` through the user's `sudo -u` wrapper. |
159
+ | 3.8.0: `runCommand({ onStart })`, only when not detached (the type forbids it with `detached: true`; upstream ignores it there): called with the running `Command` as soon as it starts and awaited before `runCommand` resolves. | Followed with the same type. The command starts as a Runtime process so its `Command` (id, `kill`, `logs`) exists before it exits; output and truncation are reported as for any attached command. |
160
+ | `APIClient.writeCommandStdin` and its stdin retry policy (429 `Retry-After`, 502/503/504 resends, offset probes); `CommandStdinResponse` validator. | Internal; `APIClient` is not exported. Runtime's transport and offsets cover resends. |
161
+ | `@vercel/oidc` 3.2.0 → 4.0.0 (now depending on `@vercel/cli-config` and `@vercel/cli-exec`). | The drop-in never uses Vercel OIDC: a Vercel or OIDC token still throws `AuthenticationError`. Only the oracle's lock changes. |
162
+ | Declarations reorder existing status union members; README documents stdin; the package and internal version advance. | No adapter change. |
163
+
164
+ `tests/vercel-3-8.test.ts` (12 cases) runs the real Runtime transport over
165
+ controlled HTTP: piped spawn, write order and offsets, the `TypeError`,
166
+ empty stdin by default, finished-command refusals, partial-write refusal and
167
+ 4xx recovery, an attached and a detached `Readable` (end, failure with kill,
168
+ quiet stop on `stdin_closed`), `onStart` ordering and `SandboxUser`
169
+ pass-through. Eleven fail before the adapter change (the twelfth, empty stdin
170
+ by default, guards existing behaviour). They do not prove live-host
171
+ behaviour; the provider remains `partial`. `compat-inventory.json` now counts
172
+ `writeStdin`, `closeStdin`, `stdinPipe` and the `stdin`/`onStart` options
173
+ present (and `CommandFinished`'s stdin calls refused, as upstream's are).
174
+
128
175
  ## JavaScript qualification, 8 October 2026
129
176
 
130
177
  Reviewed the exact published npm tarballs for `@vercel/sandbox` 3.5.1 → 3.6.1.
@@ -9,35 +9,35 @@
9
9
  {
10
10
  "registry": "npm",
11
11
  "name": "e2b",
12
- "version": "2.55.0",
12
+ "version": "2.56.0",
13
13
  "artifacts": {
14
- "2.55.0": "sha512-viC7GLHMPqzilndlKgNXWN0ebMV8fpbI1IfDlPd+GHuNcJIcUCXKyr5HAxjcC5sDMym3rrbyUyUQ+zQVAU9oGA=="
14
+ "2.56.0": "sha512-67vAYTERArdKrPujKnAVZuiIKLFX3vQT2gh1+TFphwEmYcXfU2iGKraRxpwn9qWIdUPFVym+KOo+QFhnySWYNQ=="
15
15
  }
16
16
  },
17
17
  {
18
18
  "registry": "npm",
19
19
  "name": "@e2b/code-interpreter",
20
- "version": "2.8.3",
20
+ "version": "2.9.0",
21
21
  "artifacts": {
22
- "2.8.3": "sha512-xrSwGtyEoYFZJTtOI8UzYzsNmi4SL/fsH4jxRjJYJDtIHYHLD+sFR6gxGYs5xRYLGxi56ptVMTayX/26ZzJlEA=="
22
+ "2.9.0": "sha512-ZLO3ayZ0N5kMbKFtgfMSiTa3ppzkybEZgI89XJa55gTv+AvuddO17oFUioeJty3aefhVOnMYiALWfCSxeCKhVA=="
23
23
  }
24
24
  },
25
25
  {
26
26
  "registry": "pypi",
27
27
  "name": "e2b",
28
- "version": "2.55.1",
28
+ "version": "2.56.0",
29
29
  "artifacts": {
30
- "e2b-2.55.1-py3-none-any.whl": "sha256-30aec382a7cac5401e0aa0efb156422459f586101809c3e9f34a6fcf797097db",
31
- "e2b-2.55.1.tar.gz": "sha256-5255f9a01dc484c343f750d13d3a9c857ef3511222a240572ddce2563dd301d9"
30
+ "e2b-2.56.0-py3-none-any.whl": "sha256-acfb77c56a33daf1542362cab8048f062b578dffe7a48f32f87a4a3e0bef1e14",
31
+ "e2b-2.56.0.tar.gz": "sha256-942a5b0a915e4125bb4cad0aaa17fb3dc891d3b43e31fb8e2fb5ac24b0fef394"
32
32
  }
33
33
  },
34
34
  {
35
35
  "registry": "pypi",
36
36
  "name": "e2b-code-interpreter",
37
- "version": "2.10.5",
37
+ "version": "2.11.0",
38
38
  "artifacts": {
39
- "e2b_code_interpreter-2.10.5-py3-none-any.whl": "sha256-ac98cd29335ae4f035b70a4eb5f6ca89dc5728d48de79cfb7d90a08d57a652b5",
40
- "e2b_code_interpreter-2.10.5.tar.gz": "sha256-ea478929289d0f9936e236cf9e36b914f4df7ef58ca2e5b1e851c1f3b13bf5ca"
39
+ "e2b_code_interpreter-2.11.0-py3-none-any.whl": "sha256-33dd24820da40343ae262344fd92f825b3410ad54ebb94c4d92773dae12d1713",
40
+ "e2b_code_interpreter-2.11.0.tar.gz": "sha256-f5ef15c8fdc9079541b01f574d231727bdc1b842c515b506bb6335fbab657a3b"
41
41
  }
42
42
  }
43
43
  ]
@@ -49,42 +49,42 @@
49
49
  {
50
50
  "registry": "npm",
51
51
  "name": "@daytona/sdk",
52
- "version": "0.223.1",
52
+ "version": "0.224.1",
53
53
  "artifacts": {
54
- "0.223.1": "sha512-Ja6bacvUBuODjKcWGczZn6k9w+7veIces4k2tdizPUndj3pjgnHrphq/TbdIvJfKtz91yQ+S4mKoKaeuKQLc7g=="
54
+ "0.224.1": "sha512-ZQCY9qOXnAXpYD8KhMzn27VNk6KYfBYCpHhij5Th36+fMXfG8qpxvnb3xau/H7ZWN1HPBhlzjaHHn/J+ZhH/OQ=="
55
55
  }
56
56
  },
57
57
  {
58
58
  "registry": "pypi",
59
59
  "name": "daytona",
60
- "version": "0.223.1",
60
+ "version": "0.224.1",
61
61
  "artifacts": {
62
- "daytona-0.223.1-py3-none-any.whl": "sha256-768564fbbe45a91eb0ba6e5e0f36a743e17cc14b7a3a2108aae931ae820a15c1",
63
- "daytona-0.223.1.tar.gz": "sha256-72a4a7a795f44aa678daad52d74bd69d11eeacd894f310895a313200ea8fec1f"
62
+ "daytona-0.224.1-py3-none-any.whl": "sha256-2dedf1ef0c5f98dd0c3a70ab130284abdd7414a3b8a6f6452842c4f5dcc2a583",
63
+ "daytona-0.224.1.tar.gz": "sha256-02d5a2fa8099f18503310a80b6b807c5fb18863738c13026ea4dad21a454a831"
64
64
  }
65
65
  },
66
66
  {
67
67
  "registry": "npm",
68
68
  "name": "@daytona/api-client",
69
- "version": "0.223.1",
69
+ "version": "0.224.1",
70
70
  "artifacts": {
71
- "0.223.1": "sha512-p/NaCr3NbKUKPwqDBJBHHvToUMqh7QIyHT5rENzJYSrs9RCMfsifbtTpe0nHyOokfZhIceHWFcOtT2JwJYmSKQ=="
71
+ "0.224.1": "sha512-RFsDcGuifpyKnUHlfTLC9jDXXg7ZwciKlzmy0MBGcG5VKSRdwlRyqCaM9g6/k7m5eQ+N1ieQR2JAjZnVWn23YQ=="
72
72
  }
73
73
  },
74
74
  {
75
75
  "registry": "npm",
76
76
  "name": "@daytona/toolbox-api-client",
77
- "version": "0.223.1",
77
+ "version": "0.224.1",
78
78
  "artifacts": {
79
- "0.223.1": "sha512-Sl91T6kLIfilU5njZWGzU8KAeHtOfv6pw6iPO1JmX8UhjqfriOy6exPyCxSiBpmyZsQy0eL80IecdbTZPvnmcQ=="
79
+ "0.224.1": "sha512-fiuBJedfubBMoLh1Z7VdAWsgnQaYGsQMZoAGV12IZ3R5D/ELFATd4tq/jW1mhSl7X27lxqSmtkHvaQt3ELRNPA=="
80
80
  }
81
81
  },
82
82
  {
83
83
  "registry": "npm",
84
84
  "name": "@daytona/analytics-api-client",
85
- "version": "0.223.1",
85
+ "version": "0.224.1",
86
86
  "artifacts": {
87
- "0.223.1": "sha512-LntjeNKKHpjzpCwgGbfYRvQ733b7SLfGpeM5ZTA12YK82YfvssGPDRkfo7xi88ndsbYteE+L9TpqYx3aH3WncA=="
87
+ "0.224.1": "sha512-CDW5CWbf5Ql0h31uZDD0vcOjJ8T0KimARqgni6gc9YICAoN0tx3getO4CDySTgjJpiYwH1qw4zlJs+h36L0T8w=="
88
88
  }
89
89
  }
90
90
  ]
@@ -96,27 +96,27 @@
96
96
  {
97
97
  "registry": "npm",
98
98
  "name": "@vercel/sandbox",
99
- "version": "3.6.1",
99
+ "version": "3.8.0",
100
100
  "artifacts": {
101
- "3.6.1": "sha512-U6dwyadp2SmW/M96W2Bb3UjIql6TOOYwu9McUIwob209pj0A3ks/wKrMv7lCE7INx50J5zOpqLhMOnFa+Yodlg=="
101
+ "3.8.0": "sha512-2ib+Dl8WG898OBmtep33UtE6pGbvNA9WClT7NHqQ0tch1Lq1OjQ/gmfjDT32C3HvyPA4YBXoLiJDVWZXURQW8w=="
102
102
  }
103
103
  },
104
104
  {
105
105
  "registry": "pypi",
106
106
  "name": "vercel",
107
- "version": "0.11.6",
107
+ "version": "0.12.0",
108
108
  "artifacts": {
109
- "vercel-0.11.6-py3-none-any.whl": "sha256-3dfad0bfc6a6ba380246acec7346ed89020247e16e4294d88f3d9a296d2d5f43",
110
- "vercel-0.11.6.tar.gz": "sha256-af96132f898e0bc8421e5ae16a0d16fd973aaebaf3f0852d3ffef076af7a22ed"
109
+ "vercel-0.12.0-py3-none-any.whl": "sha256-1075d70fb0da3a62469360f8ee08da93e8c6aef7bfb125e4df33cee27c182c8d",
110
+ "vercel-0.12.0.tar.gz": "sha256-88f21af66e0ddd39bf640994366a4a327dc581abd3824482abe64be38f5e5fa7"
111
111
  }
112
112
  },
113
113
  {
114
114
  "registry": "pypi",
115
115
  "name": "vercel-sandbox",
116
- "version": "0.9.0",
116
+ "version": "0.9.1",
117
117
  "artifacts": {
118
- "vercel_sandbox-0.9.0-py3-none-any.whl": "sha256-eebc4ecd430ff3845f4f5a36c18d7ba80405f459533bb0d206caed9b2a3ed5ab",
119
- "vercel_sandbox-0.9.0.tar.gz": "sha256-5b75e3aead43f9b9dea6c74d5fabdf5539b874c6d9e65cb6570ee0ac077848fb"
118
+ "vercel_sandbox-0.9.1-py3-none-any.whl": "sha256-ff4d51d66e5d4ab5a37559d7828706ea5f77c95cc7d34ba3590d590d71fb7f92",
119
+ "vercel_sandbox-0.9.1.tar.gz": "sha256-3aa377e771acdac99d2370a8586fef354b732a73e944fc8de434ddab8e169970"
120
120
  }
121
121
  }
122
122
  ]
@@ -128,18 +128,18 @@
128
128
  {
129
129
  "registry": "npm",
130
130
  "name": "@blaxel/core",
131
- "version": "0.3.25",
131
+ "version": "0.3.30",
132
132
  "artifacts": {
133
- "0.3.25": "sha512-K6aGUyIpgrPnkpwMOI/U/gbZwveOMu1Am04pkawZQjkp7NUa/roG0HC6NJPBp3AVVJY3CQtkGSWpAJ2DV4ZKpw=="
133
+ "0.3.30": "sha512-By64a1IAd68RSZNgBuTlt7sh+V9iKwyCh9KoAzEbsWoKvf/wfD5s9rLSV4Nf0DLgAOyVqEGES8NTxgoqTHNM/g=="
134
134
  }
135
135
  },
136
136
  {
137
137
  "registry": "pypi",
138
138
  "name": "blaxel",
139
- "version": "0.4.13",
139
+ "version": "0.4.18",
140
140
  "artifacts": {
141
- "blaxel-0.4.13-py3-none-any.whl": "sha256-b8817718ca63a2b31a5026f98c7191d5ed8f2f4c1aafc2d4aa57491a560a2146",
142
- "blaxel-0.4.13.tar.gz": "sha256-a036256792e85238724b8bce38fb7c0b4f661fe4c3ac576258a8be1736ac8483"
141
+ "blaxel-0.4.18-py3-none-any.whl": "sha256-a6ed0c49798c21933e842cb9baba268a242bf7a4db6ecd411f48457f47933095",
142
+ "blaxel-0.4.18.tar.gz": "sha256-77f23b3b5771e0bfc512c94692c8d1b6d10845d7cac1ae24a66bedd08c25a146"
143
143
  }
144
144
  }
145
145
  ]
@@ -211,9 +211,32 @@
211
211
  {
212
212
  "registry": "npm",
213
213
  "name": "freestyle",
214
- "version": "0.2.17",
214
+ "version": "0.2.20",
215
215
  "artifacts": {
216
- "0.2.17": "sha512-SQRRJAP+y56/nIDwmqJG5Y5IqqKYAmABqv/gjyzANy0wUe3cqnV1iD14nU9lQAYWtQ5UCl+lnE38nXZFKO0J9Q=="
216
+ "0.2.20": "sha512-IElfZHSGQO93RUUd9rqluWF69xyp5Kp0GII3JvrlZJpkZ/2nInFoDkfObOT6e2yyt+2hOdPR75BV9HqNwLCvkA=="
217
+ }
218
+ }
219
+ ]
220
+ },
221
+ {
222
+ "id": "morph",
223
+ "status": "partial",
224
+ "upstreams": [
225
+ {
226
+ "registry": "npm",
227
+ "name": "morphcloud",
228
+ "version": "0.0.20",
229
+ "artifacts": {
230
+ "0.0.20": "sha512-zcExVlRmQCcOz7pjcLXTSy2caNrRGx/b1DCz7r9YfzYfThA6IHO4Wafd6KFKtsubm6U5Ag/67cjoa7FDOk5T5g=="
231
+ }
232
+ },
233
+ {
234
+ "registry": "pypi",
235
+ "name": "morphcloud",
236
+ "version": "0.1.115",
237
+ "artifacts": {
238
+ "morphcloud-0.1.115-py3-none-any.whl": "sha256-f41f9e51dae3b7837c5a932c0e8e720d0722429f7bfd261ade89a14bbebdbff6",
239
+ "morphcloud-0.1.115.tar.gz": "sha256-ffd08a4cb906c5b188728e4d3e9e0cf60d9596dcdc7a9a57591a62399691cdcc"
217
240
  }
218
241
  }
219
242
  ]
@@ -225,47 +248,10 @@
225
248
  {
226
249
  "registry": "pypi",
227
250
  "name": "prime-sandboxes",
228
- "version": "0.4.1",
251
+ "version": "0.4.5",
229
252
  "artifacts": {
230
- "prime_sandboxes-0.4.1-py3-none-any.whl": "sha256-1a1bb96afacc66d690815be82c0b7af180ea141421b7d180b4a0adbada4f38f0",
231
- "prime_sandboxes-0.4.1.tar.gz": "sha256-53f7577dc9070e3b8e30db360f9e3cce3bcc35f8765b26f24f64dbc3c7763b06"
232
- },
233
- "latestReview": {
234
- "version": "0.4.3",
235
- "artifacts": {
236
- "prime_sandboxes-0.4.3-py3-none-any.whl": "sha256-dd26007838c25b5d38a8b7af0514c07027b783406c0ea5b9fcf0eb74a45139bd",
237
- "prime_sandboxes-0.4.3.tar.gz": "sha256-a2169182f74307485c73f897e224c978eba3276133ddb40715be4d346594c487"
238
- },
239
- "reviewedAt": "2026-10-08",
240
- "disposition": "held-for-sdk-qualification",
241
- "evidence": {
242
- "sourceUrls": [
243
- "https://pypi.org/pypi/prime-sandboxes/0.4.3/json",
244
- "https://files.pythonhosted.org/packages/d8/1b/01e02c9d2346956f5ed77d269f836905a017ad796a4b4c719debd8942dc4/prime_sandboxes-0.4.3.tar.gz",
245
- "https://files.pythonhosted.org/packages/e1/5f/d0b5cd1dabdb6e5cb1ab5d84c8ba9a96e2a9a0be8913ec9db9177c9645fb/prime_sandboxes-0.4.3-py3-none-any.whl",
246
- "https://github.com/PrimeIntellect-ai/prime/tree/main/packages/prime-sandboxes"
247
- ],
248
- "artifactSha256": {
249
- "prime_sandboxes-0.4.3-py3-none-any.whl": "dd26007838c25b5d38a8b7af0514c07027b783406c0ea5b9fcf0eb74a45139bd",
250
- "prime_sandboxes-0.4.3.tar.gz": "a2169182f74307485c73f897e224c978eba3276133ddb40715be4d346594c487"
251
- },
252
- "changes": [
253
- "Source diff of the 0.4.1 and 0.4.2 sdists, downloaded and hashed on the Mac, nothing installed or run: README, __init__, models.py, sandbox.py, one test changed; tests/test_checkpoints.py added.",
254
- "Adds filesystem checkpoints: SandboxCheckpoint, CheckpointLookupError and BatchCheckpointResponse models; checkpoint, get_checkpoint, get_checkpoints (batch of up to 100 ids), wait_for_checkpoint and list_checkpoints on the sync and async clients; CreateSandboxRequest takes checkpoint_id with a validate_restore_source check.",
255
- "CreateSandboxRequest.docker_image becomes Optional (None when restoring from a checkpoint) and disk_size_gb's default 5.0 becomes None.",
256
- "Background job launch: the working_dir prefix is 'cd DIR || exit 1;' instead of 'cd DIR &&', and the launch cwd is / for an absolute working_dir.",
257
- "Source diff of the 0.4.2 and 0.4.3 sdists, downloaded and hashed on the Mac, nothing installed or run; the wheel's package source matched the sdist's: __init__, core/client.py, models.py, sandbox.py and tests/test_checkpoints.py changed.",
258
- "Adds checkpoint deletion: delete_checkpoint (DELETE /sandbox/checkpoints/{id}, 409 while pending or the active tip) and delete_sandbox_checkpoints (DELETE /sandbox/{id}/checkpoints) on the sync and async clients, with DeleteSandboxCheckpointsResponse and CheckpointDeleteError (NOT_FOUND or CONFLICT) models exported.",
259
- "The core client returns {} for an HTTP 204 instead of parsing an empty body.",
260
- "No existing method was removed or renamed. Installed consumer qualification against withruntime/prime is not run; the supported pin stays 0.4.1."
261
- ]
262
- },
263
- "between": {
264
- "0.4.2": {
265
- "prime_sandboxes-0.4.2-py3-none-any.whl": "sha256-ed59f001c7575339d6c903166c5468f783eda0997586ec6476fd8b35f65746f9",
266
- "prime_sandboxes-0.4.2.tar.gz": "sha256-4990a724cac0a662fde6e12e7eccfee092a78679cc568653b8ef52008dfa28e4"
267
- }
268
- }
253
+ "prime_sandboxes-0.4.5-py3-none-any.whl": "sha256-3f24ed4830d2d823169fdb2df75de3b8355224bf867c0208d47eab0d3b33bb33",
254
+ "prime_sandboxes-0.4.5.tar.gz": "sha256-4f7b7e50d3d60d3b459fb3ace5713e7d9eb136ac0aa79cf0e7ee7c75c63b0d82"
269
255
  }
270
256
  }
271
257
  ]
@@ -277,45 +263,18 @@
277
263
  {
278
264
  "registry": "npm",
279
265
  "name": "modal",
280
- "version": "0.11.0",
266
+ "version": "0.11.1",
281
267
  "artifacts": {
282
- "0.11.0": "sha512-Kvy2nejPkice2FI82p5e8TJrFDy0BaSYZjJVmvnTnu51bOH9Ok7IRtp8NavBQqMuXhbpbj6gRULwxsjNkweF6A=="
268
+ "0.11.1": "sha512-RVb84wPZGG4zd3q2Fuww/ku5kZbp9sDkSUVqIc2VdKa+2QQyuqM/puVDbeVze8XN9tdUp9IJZRbdECJmz56TeQ=="
283
269
  }
284
270
  },
285
271
  {
286
272
  "registry": "pypi",
287
273
  "name": "modal",
288
- "version": "1.6.0",
274
+ "version": "1.6.2",
289
275
  "artifacts": {
290
- "modal-1.6.0-py3-none-any.whl": "sha256-2f5981ba656570ad96379d29f0ddff876880708c84966024ce130e9e1794fa68",
291
- "modal-1.6.0.tar.gz": "sha256-c5dd551b5e0a283f3c764476c0a4ebe5bdef1e4a69432fa27e1b1ad8ca5e0817"
292
- },
293
- "latestReview": {
294
- "version": "1.6.1",
295
- "artifacts": {
296
- "modal-1.6.1-py3-none-any.whl": "sha256-f408ef88563003a83e491a6be09d4221eaa6e038fa4faa2ad8b15b25afe949a4",
297
- "modal-1.6.1.tar.gz": "sha256-ff17768f67a65595aa7882e893e6cb78e2e001b3653aa52cfe98d4051d8d9e9e"
298
- },
299
- "reviewedAt": "2026-10-03",
300
- "disposition": "held-for-sdk-qualification",
301
- "evidence": {
302
- "sourceUrls": [
303
- "https://pypi.org/pypi/modal/1.6.1/json",
304
- "https://files.pythonhosted.org/packages/65/ba/2b36899ea5633bf101e6ba6f7e95a4da3e4b1f57f52bd0ba8f4cfd12e808/modal-1.6.1.tar.gz",
305
- "https://files.pythonhosted.org/packages/d2/3c/6b7d9a15dab9af2833ce674bbc72b5654d4099d5b088f1cc1eda3f8249ca/modal-1.6.1-py3-none-any.whl"
306
- ],
307
- "artifactSha256": {
308
- "modal-1.6.1-py3-none-any.whl": "f408ef88563003a83e491a6be09d4221eaa6e038fa4faa2ad8b15b25afe949a4",
309
- "modal-1.6.1.tar.gz": "ff17768f67a65595aa7882e893e6cb78e2e001b3653aa52cfe98d4051d8d9e9e"
310
- },
311
- "changes": [
312
- "Source diff of the 1.6.0 and 1.6.1 sdists, downloaded and hashed on the Mac, nothing installed or run; the 1.6.0 hashes match the pin. No file added or removed; 37 files changed, most in sandbox.py, the CLI and the generated protos.",
313
- "Sandbox v2 calls send a per-sandbox token (x-modal-sandbox-token, from the create response) beside the auth token through a new _v2_metadata helper, including command router access.",
314
- "Experimental sidecars take include_oidc_identity_token and proxy, refused for GPU sandboxes. Server sessions retry start with an idempotency key for up to 25 minutes; the CLI gains endpoint commands; stats types gain container_total_count; agent detection reads tool variables before AGENT and AI_AGENT.",
315
- "Requirements: protobuf below 8.0 instead of 7.0, synchronicity ~=0.12.6 instead of ~=0.12.5. Some iterator return types become AsyncGenerator.",
316
- "No public Sandbox, ContainerProcess, Image, App or file method used by withruntime/modal was removed or renamed; that drop-in does not import modal. Installed consumer qualification is not run; the supported pin stays 1.6.0."
317
- ]
318
- }
276
+ "modal-1.6.2-py3-none-any.whl": "sha256-1a6c8409e315785137615601cac940de3d72462c0059b9cd0faf5d17615bacf0",
277
+ "modal-1.6.2.tar.gz": "sha256-f96bcd2de02abb74ac8ec3ff7d62400403633867a42c9c7b43f69f75ea00b952"
319
278
  }
320
279
  }
321
280
  ]
@@ -332,11 +291,12 @@
332
291
  "0.12.10": "sha512-245s6xEdR1v0Jti0YYd8ORWcTG/f/ksjJfpubvnbky0KxFC/ZDOpbpNKdtyiRBYZqmJGtEncYW7Cwge47tDrpg=="
333
292
  },
334
293
  "unsupported": {
335
- "version": "1.0.0",
294
+ "version": "1.0.1",
336
295
  "artifacts": {
337
- "1.0.0": "sha512-+TZVuCey6OBDTvPLWisq4Ie7/R5Zy3zFyYOFCNRpdEIyQsKq3xwzpctonE43DfZ+wYZvvu6QYpR138PayDjF+A=="
296
+ "1.0.0": "sha512-+TZVuCey6OBDTvPLWisq4Ie7/R5Zy3zFyYOFCNRpdEIyQsKq3xwzpctonE43DfZ+wYZvvu6QYpR138PayDjF+A==",
297
+ "1.0.1": "sha512-8Qvv2SbMGfDW+zo0AkwaDna+b+IbXPgMKjelu6UZla1jyTwt1Ye0Z4LEahwoXtIMbpQvopr9NvXtLm+abA7+Tw=="
338
298
  },
339
- "reason": "1.0 removes getSandbox, the Sandbox class, exec, processes, sessions and preview proxying and keeps only Files, S3Mount and DirectoryBackup for the caller's own Durable Object; withruntime/cloudflare implements the 0.x API"
299
+ "reason": "1.0 removes getSandbox, the Sandbox class, exec, processes, sessions and preview proxying and keeps only Files, S3Mount and DirectoryBackup for the caller's own Durable Object; withruntime/cloudflare implements the 0.x API. 1.0.1 keeps that API: the same runtime code, its declarations export the same names inline, zod moves from 4.5.4 to 4.6.5, and README example links change"
340
300
  }
341
301
  }
342
302
  ]
@@ -28,8 +28,19 @@ export interface Config {
28
28
  clientId: string;
29
29
  clientSecret: string;
30
30
  };
31
+ /** Blaxel's product token for an integration built on the SDK
32
+ * (`<name>/<semver>`), which Blaxel appends to its User-Agent. Kept and
33
+ * checked as Blaxel does; never sent, as Runtime does not attribute traffic
34
+ * by it. */
35
+ integration?: string;
31
36
  [key: string]: unknown;
32
37
  }
38
+ /** Blaxel's `settings.integration`: the token given to `initialize` or set,
39
+ * then BL_INTEGRATION; `""` when none, or when it is not `<name>/<semver>`
40
+ * (warned once per value, as Blaxel does). */
41
+ export declare function integrationToken(): string;
42
+ /** Sets Blaxel's `settings.integration`; undefined goes back to BL_INTEGRATION. */
43
+ export declare function setIntegrationToken(value: string | undefined): void;
33
44
  /** Blaxel's `initialize(config)`: a Runtime key given as `apikey` is used from
34
45
  * then on. A Blaxel key is refused while RUNTIME_API_KEY is not set, and never
35
46
  * sent. `workspace` means nothing on Runtime and is ignored. */
@@ -3,12 +3,38 @@ import { CredentialsError, NotSupportedError } from "./errors.js";
3
3
  const env = (name) => typeof process === "undefined" ? undefined : process.env[name];
4
4
  const isRuntimeKey = (key) => key.startsWith("rtcloud_");
5
5
  let configured;
6
+ let integration;
7
+ let warnedIntegration;
8
+ /** Blaxel's check of an integration token: `<name>/<semver>`, lowercase name. */
9
+ const INTEGRATION_TOKEN = /^[a-z0-9][a-z0-9._-]*\/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
10
+ /** Blaxel's `settings.integration`: the token given to `initialize` or set,
11
+ * then BL_INTEGRATION; `""` when none, or when it is not `<name>/<semver>`
12
+ * (warned once per value, as Blaxel does). */
13
+ export function integrationToken() {
14
+ const value = integration ?? env("BL_INTEGRATION") ?? "";
15
+ if (!value)
16
+ return "";
17
+ if (!INTEGRATION_TOKEN.test(value)) {
18
+ if (warnedIntegration !== value) {
19
+ warnedIntegration = value;
20
+ console.warn(`Ignoring invalid Blaxel integration token ${JSON.stringify(value)}: expected <name>/<semver> with a lowercase name`);
21
+ }
22
+ return "";
23
+ }
24
+ return value;
25
+ }
26
+ /** Sets Blaxel's `settings.integration`; undefined goes back to BL_INTEGRATION. */
27
+ export function setIntegrationToken(value) {
28
+ integration = value;
29
+ }
6
30
  /** Blaxel's `initialize(config)`: a Runtime key given as `apikey` is used from
7
31
  * then on. A Blaxel key is refused while RUNTIME_API_KEY is not set, and never
8
32
  * sent. `workspace` means nothing on Runtime and is ignored. */
9
33
  export function initialize(config = {}) {
10
34
  if (config.clientCredentials !== undefined)
11
35
  throw new NotSupportedError("Blaxel client credentials (clientCredentials)", "Use a Runtime key: set RUNTIME_API_KEY, or run `npx withruntime login` once.");
36
+ if ("integration" in config)
37
+ integration = config.integration;
12
38
  const key = config.apikey ?? config.apiKey;
13
39
  if (key === undefined || key === "")
14
40
  return;
@@ -51,6 +77,8 @@ export function clientFor(options = {}) {
51
77
  export function resetClients() {
52
78
  clients.clear();
53
79
  configured = undefined;
80
+ integration = undefined;
81
+ warnedIntegration = undefined;
54
82
  }
55
83
  /** Blaxel's default region, from BL_REGION. */
56
84
  export function defaultRegion() {
@@ -63,3 +63,68 @@ export declare function guard<T>(work: () => Promise<T>): Promise<T>;
63
63
  export declare function isNotFound(error: unknown): boolean;
64
64
  /** Runtime's error code on either shape. */
65
65
  export declare function codeOf(error: unknown): string | undefined;
66
+ /** Codes Blaxel's edge gateway returns. */
67
+ export type BlaxelGatewayErrorCode = "ROUTE_NOT_FOUND" | "WORKLOAD_NOT_FOUND" | "WORKSPACE_NOT_FOUND" | "WORKLOAD_UNAVAILABLE" | "WORKLOAD_FAILED" | "ROUTING_UNAVAILABLE" | "AUTHENTICATION_REQUIRED" | "AUTHENTICATION_FAILED" | "TOKEN_REVOKED" | "FORBIDDEN" | "BAD_REQUEST" | "USAGE_LIMIT_EXCEEDED" | "POLICY_VIOLATION" | "UPSTREAM_CONNECT_FAILED" | "UPSTREAM_CONNECT_TIMEOUT" | "UPSTREAM_ERROR" | "UPSTREAM_TIMEOUT" | "GATEWAY_INTERNAL_ERROR";
68
+ /** Blaxel's authentication codes from sandbox creation and fork. */
69
+ export type BlaxelAuthErrorCode = "TOKEN_REVOKED" | "UNAUTHORIZED" | "UNAUTHORIZED_WORKSPACE" | "AUTHENTICATION_UNAVAILABLE" | "WORKSPACE_REQUIRED";
70
+ /** Blaxel's codes for creating or forking a sandbox. */
71
+ export type BlaxelSandboxCreationErrorCode = "READ_FAILED" | "PARSE_FAILED" | "VALIDATION_FAILED" | "VALIDATION_ERROR" | "INVALID_INPUT" | "INVALID_IMAGE" | "IMAGE_NOT_FOUND" | "UPLOAD_NOT_SUPPORTED" | "UNSUPPORTED_GENERATION" | "KERNEL_GENERATION_MISMATCH" | "INVALID_PORTS" | "INVALID_REGION" | "REGION_MISMATCH" | "INVALID_VOLUME" | "INVALID_VOLUME_COUNT" | "INVALID_VOLUME_REGION" | "VOLUME_ALREADY_ATTACHED" | "VOLUME_PROVIDER_MISMATCH" | "VOLUME_NOT_FOUND" | "WORKSPACE_NOT_FOUND" | "ACCOUNT_NOT_FOUND" | "SANDBOX_ALREADY_EXISTS" | "SANDBOX_DELETION_IN_PROGRESS" | "SANDBOX_DELETED" | "VOLUME_DELETED" | "CREATION_TIMEOUT" | "QUOTA_EXCEEDED" | "RATE_LIMIT_EXCEEDED" | "WORKSPACE_RATE_LIMIT_EXCEEDED" | "SERVICE_UNAVAILABLE" | "DATABASE_ERROR" | "LOCK_ACQUISITION_FAILED" | "VOLUME_LOOKUP_FAILED" | "BUILD_TRIGGER_ERROR" | "PRESIGNED_URL_ERROR" | "UPLOAD_UNAVAILABLE" | "DEPLOYMENT_FAILED" | "CLUSTER_GATEWAY_ERROR" | "LOCKDOWN_ERROR" | "PROXY_CONFIG_ERROR" | "VALIDATED_DATA_ERROR" | "WORKSPACE_DATA_MISSING" | "CALLBACK_SEND_FAILED" | "FORK_FAILED" | "HANDLER_ERROR" | "INTERNAL_ERROR" | "UNKNOWN_ERROR";
72
+ export type BlaxelErrorCode = BlaxelGatewayErrorCode | BlaxelAuthErrorCode | BlaxelSandboxCreationErrorCode;
73
+ export type BlaxelErrorCodeValue = BlaxelErrorCode | (string & Record<never, never>) | number;
74
+ export type BlaxelApiErrorBody = {
75
+ error: string;
76
+ code: number;
77
+ };
78
+ export type BlaxelActionErrorBody = {
79
+ code: BlaxelSandboxCreationErrorCode | BlaxelAuthErrorCode | (string & Record<never, never>);
80
+ message: string;
81
+ status_code: number;
82
+ reason?: string;
83
+ step?: string;
84
+ workspace?: string;
85
+ sandbox_name?: string;
86
+ timestamp?: string;
87
+ cause?: string;
88
+ details?: Record<string, unknown>;
89
+ };
90
+ export type BlaxelPlatformErrorBody = {
91
+ error: {
92
+ code: BlaxelGatewayErrorCode | (string & Record<never, never>);
93
+ message: string;
94
+ status: number;
95
+ origin?: "platform";
96
+ retryable?: boolean;
97
+ dispatch_state?: "not_dispatched" | "dispatched_unknown";
98
+ safe_to_retry_request?: boolean;
99
+ action?: string;
100
+ do_not?: string;
101
+ docs_url?: string;
102
+ timestamp?: string;
103
+ };
104
+ };
105
+ export type BlaxelSandboxApiErrorBody = {
106
+ error: string;
107
+ };
108
+ export type BlaxelErrorLike = ResponseError | SandboxCreationTimeoutError | BlaxelApiErrorBody | Pick<BlaxelActionErrorBody, "code" | "message" | "status_code"> | {
109
+ error: Pick<BlaxelPlatformErrorBody["error"], "code" | "message" | "status">;
110
+ };
111
+ /** True for an error this package throws for an API failure (ResponseError,
112
+ * SandboxGatewayError, SandboxCreationTimeoutError) or a raw Blaxel error body
113
+ * (`{ error, code }`, `{ code, message, status_code }`,
114
+ * `{ error: { code, message, status } }`). False for plain errors, strings and
115
+ * NotSupportedError, which is a refusal made here, not an API failure. Never
116
+ * throws. */
117
+ export declare function isBlaxelError(err: unknown): err is BlaxelErrorLike;
118
+ /** The error's code, then its body's, then the X-Blaxel-Error-Code header. A
119
+ * ResponseError from Runtime answers its HTTP status (its `code`); Runtime's
120
+ * own code is `runtimeCode`. Never throws. */
121
+ export declare function getBlaxelErrorCode(err: unknown): BlaxelErrorCodeValue | undefined;
122
+ /** The HTTP status: the error's, its response's, then its body's (`status`,
123
+ * `status_code` or a numeric `code`). Never throws. */
124
+ export declare function getBlaxelErrorStatus(err: unknown): number | undefined;
125
+ /** The error's message, else its body's message or error text. Never throws. */
126
+ export declare function getBlaxelErrorMessage(err: unknown): string | undefined;
127
+ /** Blaxel's request id headers (X-Cf-Request-Id, X-Amz-Cf-Id, CF-Ray) on the
128
+ * error's response, else the Runtime request id a ResponseError carries
129
+ * (`requestId`). Never throws. */
130
+ export declare function getBlaxelErrorRequestId(err: unknown): string | undefined;