@opencoredev/sandbox-sdk 0.2.0 → 1.0.0-beta.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 (166) hide show
  1. package/CHANGELOG.md +32 -11
  2. package/README.md +350 -25
  3. package/dist/ai.d.ts +5 -0
  4. package/dist/ai.js +1 -0
  5. package/dist/chunk-59t3rqja.js +2 -0
  6. package/dist/chunk-cwx6cc31.js +2 -0
  7. package/dist/chunk-exv1kf89.js +60 -0
  8. package/dist/chunk-gc8zdxyb.js +2 -0
  9. package/dist/chunk-hjzhc3qg.js +40 -0
  10. package/dist/chunk-md6fmprc.js +1 -0
  11. package/dist/chunk-t5vr9nd8.js +8 -0
  12. package/dist/chunk-v6y7eqxw.js +27 -0
  13. package/dist/chunk-yed8mvs7.js +2 -0
  14. package/dist/chunk-yrsb6hws.js +5 -0
  15. package/dist/chunk-z9rjzn28.js +2 -0
  16. package/dist/errors.d.ts +60 -0
  17. package/dist/files.d.ts +57 -0
  18. package/dist/git.d.ts +28 -0
  19. package/dist/handle.d.ts +4 -0
  20. package/dist/index.d.ts +17 -0
  21. package/dist/index.js +1 -0
  22. package/dist/keys.d.ts +5 -0
  23. package/dist/logs.d.ts +8 -0
  24. package/dist/mastra.d.ts +43 -0
  25. package/dist/mastra.js +1 -0
  26. package/dist/memory.d.ts +34 -0
  27. package/dist/memory.js +11 -0
  28. package/dist/openai.d.ts +39 -0
  29. package/dist/openai.js +1 -0
  30. package/dist/peer.d.ts +5 -0
  31. package/dist/processes.d.ts +71 -0
  32. package/dist/provider.d.ts +138 -0
  33. package/dist/provider.js +0 -0
  34. package/dist/providers/agentos/errors.d.ts +4 -0
  35. package/dist/providers/agentos/index.d.ts +11 -0
  36. package/dist/providers/agentos/index.js +2 -0
  37. package/dist/providers/boat/index.d.ts +23 -0
  38. package/dist/providers/boat/index.js +1 -0
  39. package/dist/providers/boat-api/errors.d.ts +6 -0
  40. package/dist/providers/boat-api/exec.d.ts +11 -0
  41. package/dist/providers/boat-api/index.d.ts +22 -0
  42. package/dist/providers/boxd/errors.d.ts +3 -0
  43. package/dist/providers/boxd/execute.d.ts +3 -0
  44. package/dist/providers/boxd/guest.d.ts +14 -0
  45. package/dist/providers/boxd/index.d.ts +23 -0
  46. package/dist/providers/boxd/index.js +85 -0
  47. package/dist/providers/boxd/transfers.d.ts +19 -0
  48. package/dist/providers/daytona/buffered.d.ts +3 -0
  49. package/dist/providers/daytona/errors.d.ts +3 -0
  50. package/dist/providers/daytona/exec.d.ts +14 -0
  51. package/dist/providers/daytona/index.d.ts +24 -0
  52. package/dist/providers/daytona/index.js +88 -0
  53. package/dist/providers/e2b/errors.d.ts +3 -0
  54. package/dist/providers/e2b/index.d.ts +15 -0
  55. package/dist/providers/e2b/index.js +1 -0
  56. package/dist/providers/freestyle/deadline.d.ts +4 -0
  57. package/dist/providers/freestyle/errors.d.ts +16 -0
  58. package/dist/providers/freestyle/execute.d.ts +12 -0
  59. package/dist/providers/freestyle/index.d.ts +14 -0
  60. package/dist/providers/freestyle/index.js +133 -0
  61. package/dist/providers/freestyle/wire.d.ts +10 -0
  62. package/dist/providers/local/docker.d.ts +32 -0
  63. package/dist/providers/local/index.d.ts +17 -0
  64. package/dist/providers/local/index.js +2 -0
  65. package/dist/providers/railway/errors.d.ts +4 -0
  66. package/dist/providers/railway/index.d.ts +24 -0
  67. package/dist/providers/railway/index.js +1 -0
  68. package/dist/providers/sandboxer/index.d.ts +33 -0
  69. package/dist/providers/sandboxer/index.js +1 -0
  70. package/dist/providers/superserve/bootstrap.d.ts +11 -0
  71. package/dist/providers/superserve/errors.d.ts +3 -0
  72. package/dist/providers/superserve/execute.d.ts +13 -0
  73. package/dist/providers/superserve/index.d.ts +23 -0
  74. package/dist/providers/superserve/index.js +126 -0
  75. package/dist/providers/tenki/deadline.d.ts +2 -0
  76. package/dist/providers/tenki/errors.d.ts +10 -0
  77. package/dist/providers/tenki/exec.d.ts +4 -0
  78. package/dist/providers/tenki/files.d.ts +3 -0
  79. package/dist/providers/tenki/index.d.ts +28 -0
  80. package/dist/providers/tenki/index.js +172 -0
  81. package/dist/providers/tenki/ready.d.ts +7 -0
  82. package/dist/providers/tenki/stream.d.ts +3 -0
  83. package/dist/providers/upstash/buffered.d.ts +3 -0
  84. package/dist/providers/upstash/errors.d.ts +3 -0
  85. package/dist/providers/upstash/exec.d.ts +18 -0
  86. package/dist/providers/upstash/files.d.ts +15 -0
  87. package/dist/providers/upstash/index.d.ts +38 -0
  88. package/dist/providers/upstash/index.js +111 -0
  89. package/dist/providers/vercel/errors.d.ts +3 -0
  90. package/dist/providers/vercel/index.d.ts +14 -0
  91. package/dist/providers/vercel/index.js +1 -0
  92. package/dist/providers/vercel/provider.d.ts +10 -0
  93. package/dist/providers/vercel/transport.d.ts +40 -0
  94. package/dist/run.d.ts +41 -0
  95. package/dist/testing.d.ts +17 -0
  96. package/dist/testing.js +6 -0
  97. package/dist/tool-security.d.ts +9 -0
  98. package/dist/tools.d.ts +117 -0
  99. package/dist/tools.js +1 -0
  100. package/dist/types.d.ts +189 -0
  101. package/package.json +164 -106
  102. package/dist/agentos-CbrZW7R0.mjs +0 -390
  103. package/dist/agentos-CbrZW7R0.mjs.map +0 -1
  104. package/dist/ai/harness.d.mts +0 -16
  105. package/dist/ai/harness.mjs +0 -69
  106. package/dist/ai/harness.mjs.map +0 -1
  107. package/dist/ai/index.d.mts +0 -54
  108. package/dist/ai/index.mjs +0 -4
  109. package/dist/ai-DeFa8yPk.mjs +0 -243
  110. package/dist/ai-DeFa8yPk.mjs.map +0 -1
  111. package/dist/capabilities-BWvOVFbH.d.mts +0 -15
  112. package/dist/capabilities-CaSNd6J1.mjs +0 -125
  113. package/dist/capabilities-CaSNd6J1.mjs.map +0 -1
  114. package/dist/capabilities-xs9kaHrK.mjs +0 -28
  115. package/dist/capabilities-xs9kaHrK.mjs.map +0 -1
  116. package/dist/errors-BuF9bYOQ.mjs +0 -68
  117. package/dist/errors-BuF9bYOQ.mjs.map +0 -1
  118. package/dist/eve/index.d.mts +0 -19
  119. package/dist/eve/index.mjs +0 -155
  120. package/dist/eve/index.mjs.map +0 -1
  121. package/dist/index-CkTwqD0X.d.mts +0 -25
  122. package/dist/index-Dh9xob2s.d.mts +0 -31
  123. package/dist/index.d.mts +0 -5
  124. package/dist/index.mjs +0 -40
  125. package/dist/index.mjs.map +0 -1
  126. package/dist/managed-provider-BsZGVQ4I.mjs +0 -148
  127. package/dist/managed-provider-BsZGVQ4I.mjs.map +0 -1
  128. package/dist/mastra/index.d.mts +0 -118
  129. package/dist/mastra/index.mjs +0 -662
  130. package/dist/mastra/index.mjs.map +0 -1
  131. package/dist/metadata.d.mts +0 -34
  132. package/dist/metadata.mjs +0 -135
  133. package/dist/metadata.mjs.map +0 -1
  134. package/dist/provider-DOBErkBO.d.mts +0 -91
  135. package/dist/provider-utils-CfB9nvJx.mjs +0 -57
  136. package/dist/provider-utils-CfB9nvJx.mjs.map +0 -1
  137. package/dist/providers/agentos/index.d.mts +0 -7
  138. package/dist/providers/agentos/index.mjs +0 -9
  139. package/dist/providers/box/index.d.mts +0 -34
  140. package/dist/providers/box/index.mjs +0 -348
  141. package/dist/providers/box/index.mjs.map +0 -1
  142. package/dist/providers/daytona/index.d.mts +0 -21
  143. package/dist/providers/daytona/index.mjs +0 -206
  144. package/dist/providers/daytona/index.mjs.map +0 -1
  145. package/dist/providers/e2b/index.d.mts +0 -17
  146. package/dist/providers/e2b/index.mjs +0 -169
  147. package/dist/providers/e2b/index.mjs.map +0 -1
  148. package/dist/providers/local/index.d.mts +0 -22
  149. package/dist/providers/local/index.mjs +0 -22
  150. package/dist/providers/local/index.mjs.map +0 -1
  151. package/dist/providers/railway/index.d.mts +0 -29
  152. package/dist/providers/railway/index.mjs +0 -211
  153. package/dist/providers/railway/index.mjs.map +0 -1
  154. package/dist/providers/upstash/index.d.mts +0 -17
  155. package/dist/providers/upstash/index.mjs +0 -211
  156. package/dist/providers/upstash/index.mjs.map +0 -1
  157. package/dist/providers/vercel/index.d.mts +0 -28
  158. package/dist/providers/vercel/index.mjs +0 -186
  159. package/dist/providers/vercel/index.mjs.map +0 -1
  160. package/dist/sandbox-DdEqoXJF.d.mts +0 -26
  161. package/dist/sandbox-DgtY5hvt.mjs +0 -112
  162. package/dist/sandbox-DgtY5hvt.mjs.map +0 -1
  163. package/dist/testing/index.d.mts +0 -27
  164. package/dist/testing/index.mjs +0 -173
  165. package/dist/testing/index.mjs.map +0 -1
  166. package/dist/types-Bv6I2U1c.d.mts +0 -103
@@ -1,211 +0,0 @@
1
- import { t as SandboxError } from "../../errors-BuF9bYOQ.mjs";
2
- import "../../capabilities-xs9kaHrK.mjs";
3
- import "../../sandbox-DgtY5hvt.mjs";
4
- import { s as upstashCapabilities } from "../../capabilities-CaSNd6J1.mjs";
5
- import { t as withManagedSessions } from "../../managed-provider-BsZGVQ4I.mjs";
6
- import { i as unsupported, n as portResult, r as toUint8Array, t as commandString } from "../../provider-utils-CfB9nvJx.mjs";
7
- import { Box } from "@upstash/box";
8
-
9
- //#region src/providers/upstash/index.ts
10
- function upstash(options = {}) {
11
- const { public: publicPorts = true, ...boxOptions } = options;
12
- return withManagedSessions({
13
- id: "upstash",
14
- capabilities: upstashCapabilities,
15
- async create(createOptions) {
16
- assertNotAborted(createOptions.signal);
17
- const raw = await Box.create({
18
- ...boxOptions,
19
- env: { ...createOptions.env },
20
- timeout: boxOptions.timeout ?? createOptions.timeout
21
- });
22
- const remoteCwd = raw.cwd;
23
- const toRemotePath = (path) => replacePathPrefix(path, createOptions.cwd, remoteCwd);
24
- const toVirtualPath = (path) => replacePathPrefix(path, remoteCwd, createOptions.cwd);
25
- return {
26
- id: raw.id,
27
- raw,
28
- capabilities: upstashCapabilities,
29
- files: {
30
- async write(path, value) {
31
- const content = Buffer.from(await toUint8Array(value)).toString("base64");
32
- await raw.files.write({
33
- path: toRemotePath(path),
34
- content,
35
- encoding: "base64"
36
- });
37
- },
38
- async read(path) {
39
- const content = await raw.files.read(toRemotePath(path), { encoding: "base64" });
40
- return new Uint8Array(Buffer.from(content, "base64"));
41
- },
42
- async list(path) {
43
- return (await raw.files.list(toRemotePath(path))).map((entry) => ({
44
- name: entry.name,
45
- path: toVirtualPath(entry.path),
46
- type: entry.is_dir ? "directory" : "file",
47
- size: entry.size
48
- }));
49
- },
50
- async mkdir(path) {
51
- const result = await raw.exec.command(`mkdir -p ${shellQuote(toRemotePath(path))}`);
52
- assertCommandSucceeded(result.exitCode, result.result, "files.mkdir");
53
- },
54
- async remove(path) {
55
- const result = await raw.exec.command(`rm -rf -- ${shellQuote(toRemotePath(path))}`);
56
- assertCommandSucceeded(result.exitCode, result.result, "files.remove");
57
- },
58
- async exists(path) {
59
- return (await raw.exec.command(`test -e ${shellQuote(toRemotePath(path))}`)).exitCode === 0;
60
- }
61
- },
62
- async run(command, runOptions) {
63
- assertNotAborted(runOptions.signal);
64
- const started = performance.now();
65
- const run = await raw.exec.command(scopedCommand(command, runOptions, createOptions.cwd, remoteCwd));
66
- if (runOptions.timeout !== void 0 && run.exitCode === 124) throw new SandboxError({
67
- code: "timeout",
68
- provider: "upstash",
69
- operation: "process.run",
70
- message: `Command timed out after ${runOptions.timeout}ms`
71
- });
72
- return {
73
- stdout: run.result,
74
- stderr: "",
75
- exitCode: run.exitCode ?? 1,
76
- success: run.exitCode === 0,
77
- durationMs: Math.round(performance.now() - started)
78
- };
79
- },
80
- async start(command, runOptions) {
81
- assertNotAborted(runOptions.signal);
82
- const handle = await raw.exec.stream(scopedCommand(command, runOptions, createOptions.cwd, remoteCwd));
83
- const events = [];
84
- const waiters = /* @__PURE__ */ new Set();
85
- let status = "running";
86
- let exitCode = 1;
87
- const wake = () => {
88
- for (const waiter of waiters) waiter();
89
- waiters.clear();
90
- };
91
- const streamCompleted = consumeStream(handle, (chunk) => {
92
- if (chunk.type === "output") {
93
- events.push({
94
- stream: "stdout",
95
- data: chunk.data,
96
- timestamp: /* @__PURE__ */ new Date()
97
- });
98
- wake();
99
- } else exitCode = chunk.exitCode;
100
- }).then(() => {
101
- if (status === "running") status = "exited";
102
- return { exitCode };
103
- }).catch((error) => {
104
- status = "exited";
105
- throw error;
106
- }).finally(() => {
107
- wake();
108
- });
109
- return {
110
- id: handle.id,
111
- async status() {
112
- return status;
113
- },
114
- async *output() {
115
- let index = 0;
116
- while (status === "running" || index < events.length) {
117
- while (index < events.length) yield events[index++];
118
- if (status !== "running") break;
119
- await new Promise((resolve) => waiters.add(resolve));
120
- }
121
- },
122
- async write() {
123
- unsupported("upstash", "process.stdin");
124
- },
125
- wait: () => streamCompleted,
126
- async kill() {
127
- unsupported("upstash", "process.cancel");
128
- }
129
- };
130
- },
131
- async expose(port) {
132
- const preview = await raw.getPublicURL(port, publicPorts ? void 0 : { bearerToken: true });
133
- const token = preview.token;
134
- return portResult(port, preview.url, !token, Boolean(token), token ? (path = "/", init = {}) => fetch(new URL(path, preview.url), {
135
- ...init,
136
- headers: {
137
- ...Object.fromEntries(new Headers(init.headers)),
138
- authorization: `Bearer ${token}`
139
- }
140
- }) : void 0);
141
- },
142
- snapshots: {
143
- async create(snapshotOptions) {
144
- const snapshot = await raw.snapshot({ name: snapshotOptions?.name ?? `sandbox-sdk-${Date.now()}` });
145
- return {
146
- id: snapshot.id,
147
- name: snapshot.name,
148
- mode: "filesystem",
149
- createdAt: timestamp(snapshot.created_at)
150
- };
151
- },
152
- async delete(snapshot) {
153
- await raw.deleteSnapshot(typeof snapshot === "string" ? snapshot : snapshot.id);
154
- },
155
- async restore() {
156
- unsupported("upstash", "snapshot.restore");
157
- }
158
- },
159
- async stop() {
160
- await raw.delete();
161
- }
162
- };
163
- }
164
- }, [], {
165
- stop: (sandbox) => sandbox.raw.pause(),
166
- resume: (sandbox) => sandbox.raw.resume(),
167
- destroy: (sandbox) => sandbox.raw.delete(),
168
- setNetworkPolicy: (sandbox, policy) => sandbox.raw.updateNetworkPolicy(networkPolicy(policy))
169
- });
170
- }
171
- async function consumeStream(stream, onChunk) {
172
- for await (const chunk of stream) onChunk(chunk);
173
- }
174
- function scopedCommand(input, options, virtualCwd, remoteCwd) {
175
- const environment = Object.entries(options.env ?? {}).map(([key, value]) => shellQuote(`${key}=${value}`));
176
- const shell = `sh -c ${shellQuote(commandString(input))}`;
177
- const timed = options.timeout ? `timeout ${Math.max(1, Math.ceil(options.timeout / 1e3))}s ${shell}` : shell;
178
- return `cd ${shellQuote(replacePathPrefix(options.cwd ?? virtualCwd, virtualCwd, remoteCwd))} && ${environment.length ? `env ${environment.join(" ")} ` : ""}${timed} 2>&1`;
179
- }
180
- function replacePathPrefix(path, from, to) {
181
- if (path === from) return to;
182
- if (path.startsWith(`${from}/`)) return `${to}${path.slice(from.length)}`;
183
- return path;
184
- }
185
- function shellQuote(value) {
186
- return `'${value.replaceAll("'", `'"'"'`)}'`;
187
- }
188
- function assertNotAborted(signal) {
189
- if (signal?.aborted) throw signal.reason ?? new DOMException("Aborted", "AbortError");
190
- }
191
- function assertCommandSucceeded(exitCode, output, operation) {
192
- if (exitCode === 0) return;
193
- throw new Error(`${operation} failed${output ? `: ${output}` : ""}`);
194
- }
195
- function timestamp(value) {
196
- return new Date(value < 0xe8d4a51000 ? value * 1e3 : value);
197
- }
198
- function networkPolicy(policy) {
199
- if (policy.mode === "allow-all" || policy.mode === "deny-all") return { mode: policy.mode };
200
- if (policy.mode === "native") return policy.value;
201
- return {
202
- mode: "custom",
203
- allowedDomains: [...policy.allowedHosts ?? []],
204
- allowedCidrs: [...policy.allowedCIDRs ?? []],
205
- deniedCidrs: [...policy.deniedCIDRs ?? []]
206
- };
207
- }
208
-
209
- //#endregion
210
- export { upstash, upstashCapabilities };
211
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["events: ProcessOutputEvent[]","status: \"running\" | \"exited\""],"sources":["../../../src/providers/upstash/index.ts"],"sourcesContent":["import { Box, type BoxConfig, type ExecStreamChunk } from \"@upstash/box\";\nimport { SandboxError } from \"../../core/errors\";\nimport type { SandboxNetworkPolicy, SandboxProvider } from \"../../core/provider\";\nimport type {\n CommandInput,\n ProcessOutputEvent,\n RunOptions,\n SandboxProcess,\n SandboxSnapshot,\n} from \"../../core/types\";\nimport { withManagedSessions } from \"../../internal/managed-provider\";\nimport {\n commandString,\n portResult,\n toUint8Array,\n unsupported,\n} from \"../../internal/provider-utils\";\nimport { upstashCapabilities } from \"../capabilities\";\n\nexport type UpstashOptions = Omit<BoxConfig, \"env\"> & {\n /** Expose ports publicly. Set to false to return bearer-token URLs. */\n public?: boolean;\n};\n\nexport { upstashCapabilities } from \"../capabilities\";\n\nexport function upstash(options: UpstashOptions = {}): SandboxProvider<Box> {\n const { public: publicPorts = true, ...boxOptions } = options;\n\n return withManagedSessions(\n {\n id: \"upstash\",\n capabilities: upstashCapabilities,\n async create(createOptions) {\n assertNotAborted(createOptions.signal);\n const raw = await Box.create({\n ...boxOptions,\n env: { ...createOptions.env },\n timeout: boxOptions.timeout ?? createOptions.timeout,\n });\n const remoteCwd = raw.cwd;\n const toRemotePath = (path: string) =>\n replacePathPrefix(path, createOptions.cwd, remoteCwd);\n const toVirtualPath = (path: string) =>\n replacePathPrefix(path, remoteCwd, createOptions.cwd);\n\n return {\n id: raw.id,\n raw,\n capabilities: upstashCapabilities,\n files: {\n async write(path, value) {\n const content = Buffer.from(await toUint8Array(value)).toString(\"base64\");\n await raw.files.write({\n path: toRemotePath(path),\n content,\n encoding: \"base64\",\n });\n },\n async read(path) {\n const content = await raw.files.read(toRemotePath(path), {\n encoding: \"base64\",\n });\n return new Uint8Array(Buffer.from(content, \"base64\"));\n },\n async list(path) {\n return (await raw.files.list(toRemotePath(path))).map((entry) => ({\n name: entry.name,\n path: toVirtualPath(entry.path),\n type: entry.is_dir ? (\"directory\" as const) : (\"file\" as const),\n size: entry.size,\n }));\n },\n async mkdir(path) {\n const result = await raw.exec.command(`mkdir -p ${shellQuote(toRemotePath(path))}`);\n assertCommandSucceeded(result.exitCode, result.result, \"files.mkdir\");\n },\n async remove(path) {\n const result = await raw.exec.command(`rm -rf -- ${shellQuote(toRemotePath(path))}`);\n assertCommandSucceeded(result.exitCode, result.result, \"files.remove\");\n },\n async exists(path) {\n const result = await raw.exec.command(`test -e ${shellQuote(toRemotePath(path))}`);\n return result.exitCode === 0;\n },\n },\n async run(command, runOptions) {\n assertNotAborted(runOptions.signal);\n const started = performance.now();\n const run = await raw.exec.command(\n scopedCommand(command, runOptions, createOptions.cwd, remoteCwd),\n );\n if (runOptions.timeout !== undefined && run.exitCode === 124) {\n throw new SandboxError({\n code: \"timeout\",\n provider: \"upstash\",\n operation: \"process.run\",\n message: `Command timed out after ${runOptions.timeout}ms`,\n });\n }\n return {\n stdout: run.result,\n stderr: \"\",\n exitCode: run.exitCode ?? 1,\n success: run.exitCode === 0,\n durationMs: Math.round(performance.now() - started),\n };\n },\n async start(command, runOptions) {\n assertNotAborted(runOptions.signal);\n const handle = await raw.exec.stream(\n scopedCommand(command, runOptions, createOptions.cwd, remoteCwd),\n );\n const events: ProcessOutputEvent[] = [];\n const waiters = new Set<() => void>();\n let status: \"running\" | \"exited\" = \"running\";\n let exitCode = 1;\n const wake = () => {\n for (const waiter of waiters) waiter();\n waiters.clear();\n };\n const streamCompleted = consumeStream(handle, (chunk) => {\n if (chunk.type === \"output\") {\n events.push({\n stream: \"stdout\",\n data: chunk.data,\n timestamp: new Date(),\n });\n wake();\n } else {\n exitCode = chunk.exitCode;\n }\n })\n .then(() => {\n if (status === \"running\") status = \"exited\";\n return { exitCode };\n })\n .catch((error: unknown) => {\n status = \"exited\";\n throw error;\n })\n .finally(() => {\n wake();\n });\n\n return {\n id: handle.id,\n async status() {\n return status;\n },\n async *output() {\n let index = 0;\n while (status === \"running\" || index < events.length) {\n while (index < events.length) yield events[index++]!;\n if (status !== \"running\") break;\n await new Promise<void>((resolve) => waiters.add(resolve));\n }\n },\n async write() {\n unsupported(\"upstash\", \"process.stdin\");\n },\n wait: () => streamCompleted,\n async kill() {\n unsupported(\"upstash\", \"process.cancel\");\n },\n } satisfies SandboxProcess;\n },\n async expose(port) {\n const preview = await raw.getPublicURL(\n port,\n publicPorts ? undefined : { bearerToken: true },\n );\n const token = preview.token;\n return portResult(\n port,\n preview.url,\n !token,\n Boolean(token),\n token\n ? (path = \"/\", init = {}) =>\n fetch(new URL(path, preview.url), {\n ...init,\n headers: {\n ...Object.fromEntries(new Headers(init.headers)),\n authorization: `Bearer ${token}`,\n },\n })\n : undefined,\n );\n },\n snapshots: {\n async create(snapshotOptions) {\n const snapshot = await raw.snapshot({\n name: snapshotOptions?.name ?? `sandbox-sdk-${Date.now()}`,\n });\n return {\n id: snapshot.id,\n name: snapshot.name,\n mode: \"filesystem\",\n createdAt: timestamp(snapshot.created_at),\n } satisfies SandboxSnapshot;\n },\n async delete(snapshot) {\n await raw.deleteSnapshot(typeof snapshot === \"string\" ? snapshot : snapshot.id);\n },\n async restore() {\n unsupported(\"upstash\", \"snapshot.restore\");\n },\n },\n async stop() {\n await raw.delete();\n },\n };\n },\n },\n [],\n {\n stop: (sandbox) => sandbox.raw.pause(),\n resume: (sandbox) => sandbox.raw.resume(),\n destroy: (sandbox) => sandbox.raw.delete(),\n setNetworkPolicy: (sandbox, policy) => sandbox.raw.updateNetworkPolicy(networkPolicy(policy)),\n },\n );\n}\n\nasync function consumeStream(\n stream: AsyncIterable<ExecStreamChunk>,\n onChunk: (chunk: ExecStreamChunk) => void,\n): Promise<void> {\n for await (const chunk of stream) onChunk(chunk);\n}\n\nfunction scopedCommand(\n input: CommandInput,\n options: RunOptions,\n virtualCwd: string,\n remoteCwd: string,\n): string {\n const environment = Object.entries(options.env ?? {}).map(([key, value]) =>\n shellQuote(`${key}=${value}`),\n );\n const command = commandString(input);\n const shell = `sh -c ${shellQuote(command)}`;\n const timed = options.timeout\n ? `timeout ${Math.max(1, Math.ceil(options.timeout / 1_000))}s ${shell}`\n : shell;\n const cwd = replacePathPrefix(options.cwd ?? virtualCwd, virtualCwd, remoteCwd);\n return `cd ${shellQuote(cwd)} && ${\n environment.length ? `env ${environment.join(\" \")} ` : \"\"\n }${timed} 2>&1`;\n}\n\nfunction replacePathPrefix(path: string, from: string, to: string): string {\n if (path === from) return to;\n if (path.startsWith(`${from}/`)) return `${to}${path.slice(from.length)}`;\n return path;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n\nfunction assertNotAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction assertCommandSucceeded(exitCode: number | null, output: string, operation: string): void {\n if (exitCode === 0) return;\n throw new Error(`${operation} failed${output ? `: ${output}` : \"\"}`);\n}\n\nfunction timestamp(value: number): Date {\n return new Date(value < 1_000_000_000_000 ? value * 1_000 : value);\n}\n\nfunction networkPolicy(policy: SandboxNetworkPolicy): import(\"@upstash/box\").NetworkPolicy {\n if (policy.mode === \"allow-all\" || policy.mode === \"deny-all\") return { mode: policy.mode };\n if (policy.mode === \"native\") return policy.value as import(\"@upstash/box\").NetworkPolicy;\n return {\n mode: \"custom\",\n allowedDomains: [...(policy.allowedHosts ?? [])],\n allowedCidrs: [...(policy.allowedCIDRs ?? [])],\n deniedCidrs: [...(policy.deniedCIDRs ?? [])],\n };\n}\n\nexport type UpstashBox = Box;\n"],"mappings":";;;;;;;;;AA0BA,SAAgB,QAAQ,UAA0B,EAAE,EAAwB;CAC1E,MAAM,EAAE,QAAQ,cAAc,MAAM,GAAG,eAAe;AAEtD,QAAO,oBACL;EACE,IAAI;EACJ,cAAc;EACd,MAAM,OAAO,eAAe;AAC1B,oBAAiB,cAAc,OAAO;GACtC,MAAM,MAAM,MAAM,IAAI,OAAO;IAC3B,GAAG;IACH,KAAK,EAAE,GAAG,cAAc,KAAK;IAC7B,SAAS,WAAW,WAAW,cAAc;IAC9C,CAAC;GACF,MAAM,YAAY,IAAI;GACtB,MAAM,gBAAgB,SACpB,kBAAkB,MAAM,cAAc,KAAK,UAAU;GACvD,MAAM,iBAAiB,SACrB,kBAAkB,MAAM,WAAW,cAAc,IAAI;AAEvD,UAAO;IACL,IAAI,IAAI;IACR;IACA,cAAc;IACd,OAAO;KACL,MAAM,MAAM,MAAM,OAAO;MACvB,MAAM,UAAU,OAAO,KAAK,MAAM,aAAa,MAAM,CAAC,CAAC,SAAS,SAAS;AACzE,YAAM,IAAI,MAAM,MAAM;OACpB,MAAM,aAAa,KAAK;OACxB;OACA,UAAU;OACX,CAAC;;KAEJ,MAAM,KAAK,MAAM;MACf,MAAM,UAAU,MAAM,IAAI,MAAM,KAAK,aAAa,KAAK,EAAE,EACvD,UAAU,UACX,CAAC;AACF,aAAO,IAAI,WAAW,OAAO,KAAK,SAAS,SAAS,CAAC;;KAEvD,MAAM,KAAK,MAAM;AACf,cAAQ,MAAM,IAAI,MAAM,KAAK,aAAa,KAAK,CAAC,EAAE,KAAK,WAAW;OAChE,MAAM,MAAM;OACZ,MAAM,cAAc,MAAM,KAAK;OAC/B,MAAM,MAAM,SAAU,cAAyB;OAC/C,MAAM,MAAM;OACb,EAAE;;KAEL,MAAM,MAAM,MAAM;MAChB,MAAM,SAAS,MAAM,IAAI,KAAK,QAAQ,YAAY,WAAW,aAAa,KAAK,CAAC,GAAG;AACnF,6BAAuB,OAAO,UAAU,OAAO,QAAQ,cAAc;;KAEvE,MAAM,OAAO,MAAM;MACjB,MAAM,SAAS,MAAM,IAAI,KAAK,QAAQ,aAAa,WAAW,aAAa,KAAK,CAAC,GAAG;AACpF,6BAAuB,OAAO,UAAU,OAAO,QAAQ,eAAe;;KAExE,MAAM,OAAO,MAAM;AAEjB,cADe,MAAM,IAAI,KAAK,QAAQ,WAAW,WAAW,aAAa,KAAK,CAAC,GAAG,EACpE,aAAa;;KAE9B;IACD,MAAM,IAAI,SAAS,YAAY;AAC7B,sBAAiB,WAAW,OAAO;KACnC,MAAM,UAAU,YAAY,KAAK;KACjC,MAAM,MAAM,MAAM,IAAI,KAAK,QACzB,cAAc,SAAS,YAAY,cAAc,KAAK,UAAU,CACjE;AACD,SAAI,WAAW,YAAY,UAAa,IAAI,aAAa,IACvD,OAAM,IAAI,aAAa;MACrB,MAAM;MACN,UAAU;MACV,WAAW;MACX,SAAS,2BAA2B,WAAW,QAAQ;MACxD,CAAC;AAEJ,YAAO;MACL,QAAQ,IAAI;MACZ,QAAQ;MACR,UAAU,IAAI,YAAY;MAC1B,SAAS,IAAI,aAAa;MAC1B,YAAY,KAAK,MAAM,YAAY,KAAK,GAAG,QAAQ;MACpD;;IAEH,MAAM,MAAM,SAAS,YAAY;AAC/B,sBAAiB,WAAW,OAAO;KACnC,MAAM,SAAS,MAAM,IAAI,KAAK,OAC5B,cAAc,SAAS,YAAY,cAAc,KAAK,UAAU,CACjE;KACD,MAAMA,SAA+B,EAAE;KACvC,MAAM,0BAAU,IAAI,KAAiB;KACrC,IAAIC,SAA+B;KACnC,IAAI,WAAW;KACf,MAAM,aAAa;AACjB,WAAK,MAAM,UAAU,QAAS,SAAQ;AACtC,cAAQ,OAAO;;KAEjB,MAAM,kBAAkB,cAAc,SAAS,UAAU;AACvD,UAAI,MAAM,SAAS,UAAU;AAC3B,cAAO,KAAK;QACV,QAAQ;QACR,MAAM,MAAM;QACZ,2BAAW,IAAI,MAAM;QACtB,CAAC;AACF,aAAM;YAEN,YAAW,MAAM;OAEnB,CACC,WAAW;AACV,UAAI,WAAW,UAAW,UAAS;AACnC,aAAO,EAAE,UAAU;OACnB,CACD,OAAO,UAAmB;AACzB,eAAS;AACT,YAAM;OACN,CACD,cAAc;AACb,YAAM;OACN;AAEJ,YAAO;MACL,IAAI,OAAO;MACX,MAAM,SAAS;AACb,cAAO;;MAET,OAAO,SAAS;OACd,IAAI,QAAQ;AACZ,cAAO,WAAW,aAAa,QAAQ,OAAO,QAAQ;AACpD,eAAO,QAAQ,OAAO,OAAQ,OAAM,OAAO;AAC3C,YAAI,WAAW,UAAW;AAC1B,cAAM,IAAI,SAAe,YAAY,QAAQ,IAAI,QAAQ,CAAC;;;MAG9D,MAAM,QAAQ;AACZ,mBAAY,WAAW,gBAAgB;;MAEzC,YAAY;MACZ,MAAM,OAAO;AACX,mBAAY,WAAW,iBAAiB;;MAE3C;;IAEH,MAAM,OAAO,MAAM;KACjB,MAAM,UAAU,MAAM,IAAI,aACxB,MACA,cAAc,SAAY,EAAE,aAAa,MAAM,CAChD;KACD,MAAM,QAAQ,QAAQ;AACtB,YAAO,WACL,MACA,QAAQ,KACR,CAAC,OACD,QAAQ,MAAM,EACd,SACK,OAAO,KAAK,OAAO,EAAE,KACpB,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI,EAAE;MAChC,GAAG;MACH,SAAS;OACP,GAAG,OAAO,YAAY,IAAI,QAAQ,KAAK,QAAQ,CAAC;OAChD,eAAe,UAAU;OAC1B;MACF,CAAC,GACJ,OACL;;IAEH,WAAW;KACT,MAAM,OAAO,iBAAiB;MAC5B,MAAM,WAAW,MAAM,IAAI,SAAS,EAClC,MAAM,iBAAiB,QAAQ,eAAe,KAAK,KAAK,IACzD,CAAC;AACF,aAAO;OACL,IAAI,SAAS;OACb,MAAM,SAAS;OACf,MAAM;OACN,WAAW,UAAU,SAAS,WAAW;OAC1C;;KAEH,MAAM,OAAO,UAAU;AACrB,YAAM,IAAI,eAAe,OAAO,aAAa,WAAW,WAAW,SAAS,GAAG;;KAEjF,MAAM,UAAU;AACd,kBAAY,WAAW,mBAAmB;;KAE7C;IACD,MAAM,OAAO;AACX,WAAM,IAAI,QAAQ;;IAErB;;EAEJ,EACD,EAAE,EACF;EACE,OAAO,YAAY,QAAQ,IAAI,OAAO;EACtC,SAAS,YAAY,QAAQ,IAAI,QAAQ;EACzC,UAAU,YAAY,QAAQ,IAAI,QAAQ;EAC1C,mBAAmB,SAAS,WAAW,QAAQ,IAAI,oBAAoB,cAAc,OAAO,CAAC;EAC9F,CACF;;AAGH,eAAe,cACb,QACA,SACe;AACf,YAAW,MAAM,SAAS,OAAQ,SAAQ,MAAM;;AAGlD,SAAS,cACP,OACA,SACA,YACA,WACQ;CACR,MAAM,cAAc,OAAO,QAAQ,QAAQ,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,WAC/D,WAAW,GAAG,IAAI,GAAG,QAAQ,CAC9B;CAED,MAAM,QAAQ,SAAS,WADP,cAAc,MAAM,CACM;CAC1C,MAAM,QAAQ,QAAQ,UAClB,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,UAAU,IAAM,CAAC,CAAC,IAAI,UAC/D;AAEJ,QAAO,MAAM,WADD,kBAAkB,QAAQ,OAAO,YAAY,YAAY,UAAU,CACnD,CAAC,MAC3B,YAAY,SAAS,OAAO,YAAY,KAAK,IAAI,CAAC,KAAK,KACtD,MAAM;;AAGX,SAAS,kBAAkB,MAAc,MAAc,IAAoB;AACzE,KAAI,SAAS,KAAM,QAAO;AAC1B,KAAI,KAAK,WAAW,GAAG,KAAK,GAAG,CAAE,QAAO,GAAG,KAAK,KAAK,MAAM,KAAK,OAAO;AACvE,QAAO;;AAGT,SAAS,WAAW,OAAuB;AACzC,QAAO,IAAI,MAAM,WAAW,KAAK,QAAQ,CAAC;;AAG5C,SAAS,iBAAiB,QAA4B;AACpD,KAAI,QAAQ,QAAS,OAAM,OAAO,UAAU,IAAI,aAAa,WAAW,aAAa;;AAGvF,SAAS,uBAAuB,UAAyB,QAAgB,WAAyB;AAChG,KAAI,aAAa,EAAG;AACpB,OAAM,IAAI,MAAM,GAAG,UAAU,SAAS,SAAS,KAAK,WAAW,KAAK;;AAGtE,SAAS,UAAU,OAAqB;AACtC,QAAO,IAAI,KAAK,QAAQ,eAAoB,QAAQ,MAAQ,MAAM;;AAGpE,SAAS,cAAc,QAAoE;AACzF,KAAI,OAAO,SAAS,eAAe,OAAO,SAAS,WAAY,QAAO,EAAE,MAAM,OAAO,MAAM;AAC3F,KAAI,OAAO,SAAS,SAAU,QAAO,OAAO;AAC5C,QAAO;EACL,MAAM;EACN,gBAAgB,CAAC,GAAI,OAAO,gBAAgB,EAAE,CAAE;EAChD,cAAc,CAAC,GAAI,OAAO,gBAAgB,EAAE,CAAE;EAC9C,aAAa,CAAC,GAAI,OAAO,eAAe,EAAE,CAAE;EAC7C"}
@@ -1,28 +0,0 @@
1
- import "../../types-Bv6I2U1c.mjs";
2
- import { o as SandboxProvider } from "../../provider-DOBErkBO.mjs";
3
- import "../../index-Dh9xob2s.mjs";
4
- import "../../sandbox-DdEqoXJF.mjs";
5
- import { c as vercelCapabilities } from "../../capabilities-BWvOVFbH.mjs";
6
- import { Sandbox as VercelSandbox } from "@vercel/sandbox";
7
-
8
- //#region src/providers/vercel/index.d.ts
9
- interface VercelBaseOptions {
10
- runtime?: "node24" | "node22" | "node26" | "python3.13" | (string & {});
11
- name?: string;
12
- ports?: number[];
13
- /** Whether the sandbox persists across sessions. Defaults to true. */
14
- persistent?: boolean;
15
- }
16
- type VercelOptions = VercelBaseOptions & ({
17
- token: string;
18
- teamId: string;
19
- projectId: string;
20
- } | {
21
- token?: never;
22
- teamId?: never;
23
- projectId?: never;
24
- });
25
- declare function vercel(options?: VercelOptions): SandboxProvider<VercelSandbox>;
26
- //#endregion
27
- export { VercelOptions, type VercelSandbox, vercel, vercelCapabilities };
28
- //# sourceMappingURL=index.d.mts.map
@@ -1,186 +0,0 @@
1
- import { r as normalizeError, t as SandboxError } from "../../errors-BuF9bYOQ.mjs";
2
- import "../../capabilities-xs9kaHrK.mjs";
3
- import "../../sandbox-DgtY5hvt.mjs";
4
- import { c as vercelCapabilities } from "../../capabilities-CaSNd6J1.mjs";
5
- import { t as withManagedSessions } from "../../managed-provider-BsZGVQ4I.mjs";
6
- import { i as unsupported, n as portResult, r as toUint8Array } from "../../provider-utils-CfB9nvJx.mjs";
7
- import { Sandbox, Snapshot } from "@vercel/sandbox";
8
-
9
- //#region src/providers/vercel/index.ts
10
- function vercel(options = {}) {
11
- return withManagedSessions({
12
- id: "vercel",
13
- capabilities: vercelCapabilities,
14
- async create(createOptions) {
15
- const credentials = options.token && options.teamId && options.projectId ? {
16
- token: options.token,
17
- teamId: options.teamId,
18
- projectId: options.projectId
19
- } : {};
20
- const exposed = new Set(options.ports ?? []);
21
- const raw = await Sandbox.create({
22
- ...credentials,
23
- runtime: options.runtime ?? "node24",
24
- name: options.name,
25
- ports: [...exposed],
26
- persistent: options.persistent,
27
- timeout: createOptions.timeout,
28
- env: { ...createOptions.env },
29
- signal: createOptions.signal
30
- });
31
- const snapshots = /* @__PURE__ */ new Map();
32
- await raw.fs.mkdir(createOptions.cwd, { recursive: true });
33
- return {
34
- id: raw.name,
35
- raw,
36
- capabilities: vercelCapabilities,
37
- files: {
38
- async write(path, value) {
39
- await raw.fs.writeFile(path, await toUint8Array(value));
40
- },
41
- async read(path) {
42
- return new Uint8Array(await raw.fs.readFile(path));
43
- },
44
- async list(path) {
45
- const entries = await raw.fs.readdir(path, { withFileTypes: true });
46
- return Promise.all(entries.map(async (entry) => {
47
- const entryPath = `${path.replace(/\/$/, "")}/${entry.name}`;
48
- const info = await raw.fs.lstat(entryPath);
49
- return {
50
- name: entry.name,
51
- path: entryPath,
52
- type: entry.isFile() ? "file" : entry.isDirectory() ? "directory" : entry.isSymbolicLink() ? "symlink" : "unknown",
53
- size: entry.isFile() ? info.size : void 0
54
- };
55
- }));
56
- },
57
- async mkdir(path) {
58
- await raw.fs.mkdir(path, { recursive: true });
59
- },
60
- async remove(path) {
61
- await raw.fs.rm(path, {
62
- recursive: true,
63
- force: true
64
- });
65
- },
66
- exists: (path) => raw.fs.exists(path)
67
- },
68
- async run(command, runOptions) {
69
- try {
70
- const result = await runCommand(raw, command, runOptions, false);
71
- const [stdout, stderr] = await Promise.all([result.stdout({ signal: runOptions.signal }), result.stderr({ signal: runOptions.signal })]);
72
- if (runOptions.timeout !== void 0 && result.exitCode === 137 && result.durationMs !== void 0 && result.durationMs >= runOptions.timeout) throw new SandboxError({
73
- code: "timeout",
74
- provider: "vercel",
75
- operation: "process.run",
76
- message: `Command timed out after ${runOptions.timeout}ms`
77
- });
78
- return {
79
- stdout,
80
- stderr,
81
- exitCode: result.exitCode,
82
- success: result.exitCode === 0,
83
- durationMs: result.durationMs
84
- };
85
- } catch (error) {
86
- throw normalizeError("vercel", "process.run", error);
87
- }
88
- },
89
- async start(command, runOptions) {
90
- const handle = await runCommand(raw, command, runOptions, true);
91
- const events = [];
92
- let running = true;
93
- const stream = handle.logs({ signal: runOptions.signal });
94
- const completed = handle.wait().then((result) => ({ exitCode: result.exitCode }));
95
- return {
96
- id: handle.cmdId,
97
- async status() {
98
- return running ? "running" : "exited";
99
- },
100
- async *output() {
101
- try {
102
- for await (const event of stream) {
103
- const normalized = {
104
- stream: event.stream,
105
- data: event.data,
106
- timestamp: /* @__PURE__ */ new Date()
107
- };
108
- events.push(normalized);
109
- yield normalized;
110
- }
111
- } finally {
112
- running = false;
113
- }
114
- },
115
- async write() {
116
- unsupported("vercel", "process.stdin");
117
- },
118
- wait: () => completed,
119
- async kill(signal = "SIGTERM") {
120
- await handle.kill(signal);
121
- running = false;
122
- }
123
- };
124
- },
125
- async expose(port) {
126
- if (!exposed.has(port)) {
127
- exposed.add(port);
128
- await raw.update({ ports: [...exposed] });
129
- }
130
- return portResult(port, raw.domain(port), true, false);
131
- },
132
- snapshots: {
133
- async create() {
134
- const snapshot = await raw.snapshot();
135
- snapshots.set(snapshot.snapshotId, snapshot);
136
- return {
137
- id: snapshot.snapshotId,
138
- mode: "filesystem",
139
- createdAt: snapshot.createdAt
140
- };
141
- },
142
- async delete(snapshot) {
143
- const id = typeof snapshot === "string" ? snapshot : snapshot.id;
144
- await (snapshots.get(id) ?? await Snapshot.get({
145
- snapshotId: id,
146
- ...credentials
147
- })).delete();
148
- snapshots.delete(id);
149
- },
150
- async restore() {
151
- unsupported("vercel", "snapshot.restore");
152
- }
153
- },
154
- async stop() {
155
- if (raw.status !== "stopped") await raw.stop();
156
- }
157
- };
158
- }
159
- }, options.ports, {
160
- stop: async (sandbox) => {
161
- await sandbox.raw.stop();
162
- },
163
- destroy: (sandbox) => sandbox.raw.delete(),
164
- setPorts: (sandbox, ports, signal) => sandbox.raw.update({ ports: [...ports] }, { signal }),
165
- setNetworkPolicy: (sandbox, policy) => sandbox.raw.update({ networkPolicy: policy.mode === "allow-all" || policy.mode === "deny-all" ? policy.mode : policy.mode === "native" ? policy.value : { allow: [...policy.allowedHosts ?? []] } })
166
- });
167
- }
168
- async function runCommand(raw, input, options, detached) {
169
- const command = typeof input === "string" ? {
170
- command: "/bin/sh",
171
- args: ["-lc", input]
172
- } : input;
173
- return raw.runCommand({
174
- cmd: command.command,
175
- args: [...command.args ?? []],
176
- cwd: options.cwd,
177
- env: { ...options.env },
178
- signal: options.signal,
179
- timeoutMs: options.timeout,
180
- detached
181
- });
182
- }
183
-
184
- //#endregion
185
- export { vercel, vercelCapabilities };
186
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["VercelSandbox","events: ProcessOutputEvent[]","VercelSnapshot"],"sources":["../../../src/providers/vercel/index.ts"],"sourcesContent":["import { Sandbox as VercelSandbox, Snapshot as VercelSnapshot } from \"@vercel/sandbox\";\nimport { normalizeError, SandboxError } from \"../../core/errors\";\nimport type { SandboxProvider } from \"../../core/provider\";\nimport type {\n CommandInput,\n ProcessOutputEvent,\n SandboxProcess,\n SandboxSnapshot,\n} from \"../../core/types\";\nimport { portResult, toUint8Array, unsupported } from \"../../internal/provider-utils\";\nimport { vercelCapabilities } from \"../capabilities\";\nimport { withManagedSessions } from \"../../internal/managed-provider\";\n\ninterface VercelBaseOptions {\n runtime?: \"node24\" | \"node22\" | \"node26\" | \"python3.13\" | (string & {});\n name?: string;\n ports?: number[];\n /** Whether the sandbox persists across sessions. Defaults to true. */\n persistent?: boolean;\n}\n\nexport type VercelOptions = VercelBaseOptions &\n (\n | { token: string; teamId: string; projectId: string }\n | { token?: never; teamId?: never; projectId?: never }\n );\n\nexport { vercelCapabilities } from \"../capabilities\";\n\nexport function vercel(options: VercelOptions = {}): SandboxProvider<VercelSandbox> {\n return withManagedSessions(\n {\n id: \"vercel\",\n capabilities: vercelCapabilities,\n async create(createOptions) {\n const credentials =\n options.token && options.teamId && options.projectId\n ? {\n token: options.token,\n teamId: options.teamId,\n projectId: options.projectId,\n }\n : {};\n const exposed = new Set(options.ports ?? []);\n const raw = await VercelSandbox.create({\n ...credentials,\n runtime: options.runtime ?? \"node24\",\n name: options.name,\n ports: [...exposed],\n persistent: options.persistent,\n timeout: createOptions.timeout,\n env: { ...createOptions.env },\n signal: createOptions.signal,\n });\n const snapshots = new Map<string, VercelSnapshot>();\n await raw.fs.mkdir(createOptions.cwd, { recursive: true });\n return {\n id: raw.name,\n raw,\n capabilities: vercelCapabilities,\n files: {\n async write(path, value) {\n await raw.fs.writeFile(path, await toUint8Array(value));\n },\n async read(path) {\n return new Uint8Array(await raw.fs.readFile(path));\n },\n async list(path) {\n const entries = await raw.fs.readdir(path, {\n withFileTypes: true,\n });\n return Promise.all(\n entries.map(async (entry) => {\n const entryPath = `${path.replace(/\\/$/, \"\")}/${entry.name}`;\n const info = await raw.fs.lstat(entryPath);\n return {\n name: entry.name,\n path: entryPath,\n type: entry.isFile()\n ? (\"file\" as const)\n : entry.isDirectory()\n ? (\"directory\" as const)\n : entry.isSymbolicLink()\n ? (\"symlink\" as const)\n : (\"unknown\" as const),\n size: entry.isFile() ? info.size : undefined,\n };\n }),\n );\n },\n async mkdir(path) {\n await raw.fs.mkdir(path, { recursive: true });\n },\n async remove(path) {\n await raw.fs.rm(path, { recursive: true, force: true });\n },\n exists: (path) => raw.fs.exists(path),\n },\n async run(command, runOptions) {\n try {\n const result = await runCommand(raw, command, runOptions, false);\n const [stdout, stderr] = await Promise.all([\n result.stdout({ signal: runOptions.signal }),\n result.stderr({ signal: runOptions.signal }),\n ]);\n if (\n runOptions.timeout !== undefined &&\n result.exitCode === 137 &&\n result.durationMs !== undefined &&\n result.durationMs >= runOptions.timeout\n ) {\n throw new SandboxError({\n code: \"timeout\",\n provider: \"vercel\",\n operation: \"process.run\",\n message: `Command timed out after ${runOptions.timeout}ms`,\n });\n }\n return {\n stdout,\n stderr,\n exitCode: result.exitCode,\n success: result.exitCode === 0,\n durationMs: result.durationMs,\n };\n } catch (error) {\n throw normalizeError(\"vercel\", \"process.run\", error);\n }\n },\n async start(command, runOptions) {\n const handle = await runCommand(raw, command, runOptions, true);\n const events: ProcessOutputEvent[] = [];\n let running = true;\n const stream = handle.logs({ signal: runOptions.signal });\n const completed = handle.wait().then((result) => ({ exitCode: result.exitCode }));\n const process: SandboxProcess = {\n id: handle.cmdId,\n async status() {\n return running ? \"running\" : \"exited\";\n },\n async *output() {\n try {\n for await (const event of stream) {\n const normalized = {\n stream: event.stream,\n data: event.data,\n timestamp: new Date(),\n } satisfies ProcessOutputEvent;\n events.push(normalized);\n yield normalized;\n }\n } finally {\n running = false;\n }\n },\n async write() {\n unsupported(\"vercel\", \"process.stdin\");\n },\n wait: () => completed,\n async kill(signal = \"SIGTERM\") {\n await handle.kill(signal as Parameters<typeof handle.kill>[0]);\n running = false;\n },\n };\n return process;\n },\n async expose(port) {\n if (!exposed.has(port)) {\n exposed.add(port);\n await raw.update({ ports: [...exposed] });\n }\n const url = raw.domain(port);\n return portResult(port, url, true, false);\n },\n snapshots: {\n async create() {\n const snapshot = await raw.snapshot();\n snapshots.set(snapshot.snapshotId, snapshot);\n return {\n id: snapshot.snapshotId,\n mode: \"filesystem\",\n createdAt: snapshot.createdAt,\n } satisfies SandboxSnapshot;\n },\n async delete(snapshot) {\n const id = typeof snapshot === \"string\" ? snapshot : snapshot.id;\n const native =\n snapshots.get(id) ?? (await VercelSnapshot.get({ snapshotId: id, ...credentials }));\n await native.delete();\n snapshots.delete(id);\n },\n async restore() {\n unsupported(\"vercel\", \"snapshot.restore\");\n },\n },\n async stop() {\n if (raw.status !== \"stopped\") await raw.stop();\n },\n };\n },\n },\n options.ports,\n {\n stop: async (sandbox) => {\n await sandbox.raw.stop();\n },\n destroy: (sandbox) => sandbox.raw.delete(),\n setPorts: (sandbox, ports, signal) => sandbox.raw.update({ ports: [...ports] }, { signal }),\n setNetworkPolicy: (sandbox, policy) =>\n sandbox.raw.update({\n networkPolicy:\n policy.mode === \"allow-all\" || policy.mode === \"deny-all\"\n ? policy.mode\n : policy.mode === \"native\"\n ? (policy.value as import(\"@vercel/sandbox\").NetworkPolicy)\n : { allow: [...(policy.allowedHosts ?? [])] },\n }),\n },\n );\n}\n\nasync function runCommand(\n raw: VercelSandbox,\n input: CommandInput,\n options: import(\"../../core/types\").RunOptions,\n detached: false,\n): Promise<import(\"@vercel/sandbox\").CommandFinished>;\nasync function runCommand(\n raw: VercelSandbox,\n input: CommandInput,\n options: import(\"../../core/types\").RunOptions,\n detached: true,\n): Promise<import(\"@vercel/sandbox\").Command>;\nasync function runCommand(\n raw: VercelSandbox,\n input: CommandInput,\n options: import(\"../../core/types\").RunOptions,\n detached: boolean,\n) {\n const command = typeof input === \"string\" ? { command: \"/bin/sh\", args: [\"-lc\", input] } : input;\n return raw.runCommand({\n cmd: command.command,\n args: [...(command.args ?? [])],\n cwd: options.cwd,\n env: { ...options.env },\n signal: options.signal,\n timeoutMs: options.timeout,\n detached,\n });\n}\n\nexport type { VercelSandbox };\n"],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { f as Sandbox } from "./types-Bv6I2U1c.mjs";
2
- import { o as SandboxProvider } from "./provider-DOBErkBO.mjs";
3
-
4
- //#region src/core/sandbox.d.ts
5
- interface CreateSandboxOptions<TProvider extends SandboxProvider<unknown>> {
6
- provider: TProvider;
7
- cwd?: string;
8
- env?: Readonly<Record<string, string>>;
9
- timeout?: number;
10
- signal?: AbortSignal;
11
- }
12
- type RawOf<TProvider> = TProvider extends SandboxProvider<infer TRaw> ? TRaw : never;
13
- /**
14
- * Creates a normalized sandbox. Prefer `await using` so cleanup runs when the scope exits.
15
- */
16
- declare function createSandbox<TProvider extends SandboxProvider<unknown>>(options: CreateSandboxOptions<TProvider>): Promise<Sandbox<RawOf<TProvider>>>;
17
- /**
18
- * Runs a callback with a sandbox and stops it afterward.
19
- *
20
- * Prefer `await using` with `createSandbox()` in new code. This helper remains useful for
21
- * callback-style code and runtimes that do not parse explicit resource management syntax.
22
- */
23
- declare function withSandbox<TProvider extends SandboxProvider<unknown>, TResult>(options: CreateSandboxOptions<TProvider>, callback: (sandbox: Sandbox<RawOf<TProvider>>) => TResult | Promise<TResult>): Promise<TResult>;
24
- //#endregion
25
- export { createSandbox as n, withSandbox as r, CreateSandboxOptions as t };
26
- //# sourceMappingURL=sandbox-DdEqoXJF.d.mts.map
@@ -1,112 +0,0 @@
1
- import { r as normalizeError, t as SandboxError } from "./errors-BuF9bYOQ.mjs";
2
-
3
- //#region src/core/sandbox.ts
4
- function validateCwd(cwd) {
5
- if (!cwd.startsWith("/") || cwd.includes("\0")) throw new SandboxError({
6
- code: "invalid_input",
7
- provider: "core",
8
- operation: "create",
9
- message: "cwd must be an absolute path"
10
- });
11
- return cwd.replace(/\/$/, "") || "/";
12
- }
13
- function validatePath(cwd, value) {
14
- if (!value || value.includes("\0") || value.split("/").includes("..")) throw new SandboxError({
15
- code: "invalid_input",
16
- provider: "core",
17
- operation: "path",
18
- message: `Invalid sandbox path: ${value}`
19
- });
20
- if (value.startsWith("/")) return value.replace(/\/{2,}/g, "/");
21
- return `${cwd}/${value}`.replace(/\/{2,}/g, "/");
22
- }
23
- /**
24
- * Creates a normalized sandbox. Prefer `await using` so cleanup runs when the scope exits.
25
- */
26
- async function createSandbox(options) {
27
- const cwd = validateCwd(options.cwd ?? "/workspace");
28
- const env = options.env ?? {};
29
- let runtime;
30
- try {
31
- runtime = await options.provider.create({
32
- cwd,
33
- env,
34
- timeout: options.timeout,
35
- signal: options.signal
36
- });
37
- } catch (error) {
38
- throw normalizeError(options.provider.id, "sandbox.create", error);
39
- }
40
- let stopPromise;
41
- const stop = async () => {
42
- stopPromise ??= call("sandbox.stop", () => runtime.stop());
43
- return stopPromise;
44
- };
45
- const call = async (operation, fn) => {
46
- try {
47
- return await fn();
48
- } catch (error) {
49
- throw normalizeError(options.provider.id, operation, error);
50
- }
51
- };
52
- return {
53
- id: runtime.id,
54
- provider: options.provider.id,
55
- cwd,
56
- capabilities: runtime.capabilities,
57
- raw: runtime.raw,
58
- files: {
59
- write: async (path, value) => call("files.write", () => runtime.files.write(validatePath(cwd, path), value)),
60
- read: async (path) => call("files.read", () => runtime.files.read(validatePath(cwd, path))),
61
- text: async (path) => new TextDecoder().decode(await call("files.read", () => runtime.files.read(validatePath(cwd, path)))),
62
- list: async (path = ".") => call("files.list", () => runtime.files.list(path === "." ? cwd : validatePath(cwd, path))),
63
- mkdir: async (path) => call("files.mkdir", () => runtime.files.mkdir(validatePath(cwd, path))),
64
- remove: async (path) => call("files.remove", () => runtime.files.remove(validatePath(cwd, path))),
65
- exists: async (path) => call("files.exists", () => runtime.files.exists(validatePath(cwd, path)))
66
- },
67
- processes: { start: (command, runOptions = {}) => call("process.start", () => runtime.start(command, normalizeRunOptions(cwd, runOptions))) },
68
- ports: { expose: (port) => call("ports.expose", () => runtime.expose(port)) },
69
- snapshots: {
70
- create: (snapshotOptions) => call("snapshot.create", () => runtime.snapshots.create(snapshotOptions)),
71
- delete: (snapshot) => call("snapshot.delete", () => runtime.snapshots.delete(snapshot)),
72
- restore: (snapshot) => call("snapshot.restore", () => runtime.snapshots.restore(snapshot))
73
- },
74
- run: (command, runOptions = {}) => call("process.run", () => runtime.run(command, normalizeRunOptions(cwd, runOptions))),
75
- stop,
76
- [Symbol.asyncDispose]: stop
77
- };
78
- }
79
- function normalizeRunOptions(cwd, options) {
80
- return {
81
- ...options,
82
- cwd: options.cwd ? validatePath(cwd, options.cwd) : cwd
83
- };
84
- }
85
- /**
86
- * Runs a callback with a sandbox and stops it afterward.
87
- *
88
- * Prefer `await using` with `createSandbox()` in new code. This helper remains useful for
89
- * callback-style code and runtimes that do not parse explicit resource management syntax.
90
- */
91
- async function withSandbox(options, callback) {
92
- const sandbox = await createSandbox(options);
93
- try {
94
- const result = await callback(sandbox);
95
- await sandbox.stop();
96
- return result;
97
- } catch (error) {
98
- try {
99
- await sandbox.stop();
100
- } catch (cleanupError) {
101
- if (error instanceof Error) Object.defineProperty(error, "cleanupError", {
102
- value: cleanupError,
103
- enumerable: false
104
- });
105
- }
106
- throw error;
107
- }
108
- }
109
-
110
- //#endregion
111
- export { withSandbox as n, createSandbox as t };
112
- //# sourceMappingURL=sandbox-DgtY5hvt.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sandbox-DgtY5hvt.mjs","names":["stopPromise: Promise<void> | undefined"],"sources":["../src/core/sandbox.ts"],"sourcesContent":["import { normalizeError, SandboxError } from \"./errors\";\nimport type { SandboxProvider } from \"./provider\";\nimport type { FileValue, RunOptions, Sandbox } from \"./types\";\n\nexport interface CreateSandboxOptions<TProvider extends SandboxProvider<unknown>> {\n provider: TProvider;\n cwd?: string;\n env?: Readonly<Record<string, string>>;\n timeout?: number;\n signal?: AbortSignal;\n}\n\ntype RawOf<TProvider> = TProvider extends SandboxProvider<infer TRaw> ? TRaw : never;\n\nfunction validateCwd(cwd: string): string {\n if (!cwd.startsWith(\"/\") || cwd.includes(\"\\0\")) {\n throw new SandboxError({\n code: \"invalid_input\",\n provider: \"core\",\n operation: \"create\",\n message: \"cwd must be an absolute path\",\n });\n }\n return cwd.replace(/\\/$/, \"\") || \"/\";\n}\n\nfunction validatePath(cwd: string, value: string): string {\n if (!value || value.includes(\"\\0\") || value.split(\"/\").includes(\"..\")) {\n throw new SandboxError({\n code: \"invalid_input\",\n provider: \"core\",\n operation: \"path\",\n message: `Invalid sandbox path: ${value}`,\n });\n }\n if (value.startsWith(\"/\")) return value.replace(/\\/{2,}/g, \"/\");\n return `${cwd}/${value}`.replace(/\\/{2,}/g, \"/\");\n}\n\n/**\n * Creates a normalized sandbox. Prefer `await using` so cleanup runs when the scope exits.\n */\nexport async function createSandbox<TProvider extends SandboxProvider<unknown>>(\n options: CreateSandboxOptions<TProvider>,\n): Promise<Sandbox<RawOf<TProvider>>> {\n const cwd = validateCwd(options.cwd ?? \"/workspace\");\n const env = options.env ?? {};\n let runtime;\n try {\n runtime = await options.provider.create({\n cwd,\n env,\n timeout: options.timeout,\n signal: options.signal,\n });\n } catch (error) {\n throw normalizeError(options.provider.id, \"sandbox.create\", error);\n }\n let stopPromise: Promise<void> | undefined;\n const stop = async () => {\n stopPromise ??= call(\"sandbox.stop\", () => runtime.stop());\n return stopPromise;\n };\n const call = async <T>(operation: string, fn: () => Promise<T>): Promise<T> => {\n try {\n return await fn();\n } catch (error) {\n throw normalizeError(options.provider.id, operation, error);\n }\n };\n return {\n id: runtime.id,\n provider: options.provider.id,\n cwd,\n capabilities: runtime.capabilities,\n raw: runtime.raw as RawOf<TProvider>,\n files: {\n write: async (path: string, value: FileValue) =>\n call(\"files.write\", () => runtime.files.write(validatePath(cwd, path), value)),\n read: async (path: string) =>\n call(\"files.read\", () => runtime.files.read(validatePath(cwd, path))),\n text: async (path: string) =>\n new TextDecoder().decode(\n await call(\"files.read\", () => runtime.files.read(validatePath(cwd, path))),\n ),\n list: async (path = \".\") =>\n call(\"files.list\", () => runtime.files.list(path === \".\" ? cwd : validatePath(cwd, path))),\n mkdir: async (path: string) =>\n call(\"files.mkdir\", () => runtime.files.mkdir(validatePath(cwd, path))),\n remove: async (path: string) =>\n call(\"files.remove\", () => runtime.files.remove(validatePath(cwd, path))),\n exists: async (path: string) =>\n call(\"files.exists\", () => runtime.files.exists(validatePath(cwd, path))),\n },\n processes: {\n start: (command, runOptions = {}) =>\n call(\"process.start\", () => runtime.start(command, normalizeRunOptions(cwd, runOptions))),\n },\n ports: { expose: (port) => call(\"ports.expose\", () => runtime.expose(port)) },\n snapshots: {\n create: (snapshotOptions) =>\n call(\"snapshot.create\", () => runtime.snapshots.create(snapshotOptions)),\n delete: (snapshot) => call(\"snapshot.delete\", () => runtime.snapshots.delete(snapshot)),\n restore: (snapshot) => call(\"snapshot.restore\", () => runtime.snapshots.restore(snapshot)),\n },\n run: (command, runOptions = {}) =>\n call(\"process.run\", () => runtime.run(command, normalizeRunOptions(cwd, runOptions))),\n stop,\n [Symbol.asyncDispose]: stop,\n };\n}\n\nfunction normalizeRunOptions(cwd: string, options: RunOptions): RunOptions {\n return { ...options, cwd: options.cwd ? validatePath(cwd, options.cwd) : cwd };\n}\n\n/**\n * Runs a callback with a sandbox and stops it afterward.\n *\n * Prefer `await using` with `createSandbox()` in new code. This helper remains useful for\n * callback-style code and runtimes that do not parse explicit resource management syntax.\n */\nexport async function withSandbox<TProvider extends SandboxProvider<unknown>, TResult>(\n options: CreateSandboxOptions<TProvider>,\n callback: (sandbox: Sandbox<RawOf<TProvider>>) => TResult | Promise<TResult>,\n): Promise<TResult> {\n const sandbox = await createSandbox(options);\n try {\n const result = await callback(sandbox);\n await sandbox.stop();\n return result;\n } catch (error) {\n try {\n await sandbox.stop();\n } catch (cleanupError) {\n if (error instanceof Error) {\n Object.defineProperty(error, \"cleanupError\", { value: cleanupError, enumerable: false });\n }\n }\n throw error;\n }\n}\n"],"mappings":"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"}