@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,348 +0,0 @@
1
- import { t as SandboxError } from "../../errors-BuF9bYOQ.mjs";
2
- import "../../capabilities-xs9kaHrK.mjs";
3
- import "../../sandbox-DgtY5hvt.mjs";
4
- import { n as boxCapabilities } from "../../capabilities-CaSNd6J1.mjs";
5
- import { t as withManagedSessions } from "../../managed-provider-BsZGVQ4I.mjs";
6
- import { a as unsupportedSnapshots, i as unsupported, n as portResult, r as toUint8Array, t as commandString } from "../../provider-utils-CfB9nvJx.mjs";
7
- import { BoxApi, Configuration } from "@asciidev/box-sdk";
8
-
9
- //#region src/providers/box/index.ts
10
- const DEFAULT_BASE_URL = "https://ascii.dev/api/box/v1";
11
- const MAX_COMMAND_TIMEOUT_MS = 6e4;
12
- function box(options = {}) {
13
- const readyTimeoutMs = options.readyTimeout ?? 6e5;
14
- const publicPorts = options.public ?? true;
15
- return withManagedSessions({
16
- id: "box",
17
- capabilities: boxCapabilities,
18
- async create(createOptions) {
19
- const apiKey = options.apiKey ?? process.env.BOX_API_KEY;
20
- if (!apiKey) throw new SandboxError({
21
- code: "authentication",
22
- provider: "box",
23
- operation: "sandbox.create",
24
- message: "BOX_API_KEY is required to create an Ascii Box"
25
- });
26
- const client = new BoxApi(new Configuration({
27
- basePath: options.baseUrl ?? process.env.BOX_BASE_URL ?? DEFAULT_BASE_URL,
28
- accessToken: apiKey
29
- }));
30
- assertNotAborted(createOptions.signal);
31
- const id = (await client.create({ createBoxRequest: {
32
- ttlSeconds: options.ttlSeconds,
33
- noEnv: options.noEnv,
34
- env: { ...createOptions.env }
35
- } }, { signal: createOptions.signal })).box.id;
36
- let native;
37
- try {
38
- native = {
39
- client,
40
- box: await waitUntilBoxReady(client, id, createOptions.signal, createOptions.timeout ?? readyTimeoutMs),
41
- readyTimeoutMs
42
- };
43
- if (options.name) native.box = (await client.update({
44
- boxId: id,
45
- updateBoxRequest: { name: options.name }
46
- })).box;
47
- assertSucceeded(await execute(client, id, {
48
- command: commandString({
49
- command: "mkdir",
50
- args: [
51
- "-p",
52
- "--",
53
- toRemotePath(createOptions.cwd)
54
- ]
55
- }),
56
- timeoutMs: MAX_COMMAND_TIMEOUT_MS,
57
- signal: createOptions.signal
58
- }), "sandbox.create.cwd");
59
- return {
60
- id,
61
- raw: native,
62
- capabilities: boxCapabilities,
63
- files: {
64
- async write(path, value) {
65
- const remotePath = toRemotePath(path);
66
- assertSucceeded(await execute(client, id, {
67
- command: commandString({
68
- command: "mkdir",
69
- args: [
70
- "-p",
71
- "--",
72
- remotePath.includes("/") ? remotePath.slice(0, remotePath.lastIndexOf("/")) : "."
73
- ]
74
- }),
75
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
76
- }), "files.write.mkdir");
77
- await client.writeFile({
78
- boxId: id,
79
- fileWriteRequest: {
80
- path: remotePath,
81
- content: Buffer.from(await toUint8Array(value)).toString("base64"),
82
- encoding: "base64"
83
- }
84
- });
85
- },
86
- async read(path) {
87
- const response = await client.readFile({
88
- boxId: id,
89
- path: toRemotePath(path),
90
- encoding: "base64"
91
- });
92
- return new Uint8Array(Buffer.from(response.content, "base64"));
93
- },
94
- async list(path) {
95
- const result = await execute(client, id, {
96
- command: commandString({
97
- command: "python3",
98
- args: [
99
- "-c",
100
- DIRECTORY_LIST_SCRIPT,
101
- toRemotePath(path)
102
- ]
103
- }),
104
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
105
- });
106
- assertSucceeded(result, "files.list");
107
- return JSON.parse(result.stdout).map((entry) => ({
108
- name: entry.name,
109
- path: toVirtualPath(entry.path),
110
- type: entry.type,
111
- size: entry.type === "file" ? entry.size : void 0
112
- }));
113
- },
114
- async mkdir(path) {
115
- assertSucceeded(await execute(client, id, {
116
- command: commandString({
117
- command: "mkdir",
118
- args: [
119
- "-p",
120
- "--",
121
- toRemotePath(path)
122
- ]
123
- }),
124
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
125
- }), "files.mkdir");
126
- },
127
- async remove(path) {
128
- assertSucceeded(await execute(client, id, {
129
- command: commandString({
130
- command: "rm",
131
- args: [
132
- "-rf",
133
- "--",
134
- toRemotePath(path)
135
- ]
136
- }),
137
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
138
- }), "files.remove");
139
- },
140
- async exists(path) {
141
- const result = await execute(client, id, {
142
- command: commandString({
143
- command: "test",
144
- args: ["-e", toRemotePath(path)]
145
- }),
146
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
147
- });
148
- if (result.exitCode === 0) return true;
149
- if (result.exitCode === 1) return false;
150
- assertSucceeded(result, "files.exists");
151
- return false;
152
- }
153
- },
154
- async run(command, runOptions) {
155
- const result = await execute(client, id, {
156
- command: withEnvironment(command, runOptions.env),
157
- cwd: toRemotePath(runOptions.cwd),
158
- timeoutMs: runOptions.timeout,
159
- signal: runOptions.signal
160
- });
161
- if (result.timedOut) throw new SandboxError({
162
- code: "timeout",
163
- provider: "box",
164
- operation: "process.run",
165
- message: `Command timed out after ${runOptions.timeout ?? 3e4}ms`
166
- });
167
- return {
168
- stdout: result.stdout,
169
- stderr: result.stderr,
170
- exitCode: result.exitCode ?? 1,
171
- success: result.success,
172
- signal: result.signal ?? void 0,
173
- durationMs: result.startedAt && result.finishedAt ? result.finishedAt.getTime() - result.startedAt.getTime() : void 0
174
- };
175
- },
176
- async start() {
177
- unsupported("box", "process.start");
178
- },
179
- async expose(port) {
180
- const hosted = await execute(client, id, {
181
- command: `host ${port} ${publicPorts ? "--public" : "--private"}`,
182
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
183
- });
184
- assertSucceeded(hosted, "ports.expose");
185
- const resolved = await execute(client, id, {
186
- command: `host url ${port}${publicPorts ? " --public" : ""}`,
187
- timeoutMs: MAX_COMMAND_TIMEOUT_MS
188
- });
189
- assertSucceeded(resolved, "ports.expose.url");
190
- const url = findUrl(`${resolved.stdout}\n${resolved.stderr}`) ?? findUrl(`${hosted.stdout}\n${hosted.stderr}`);
191
- if (!url) throw new Error(`Box host command did not return a URL for port ${port}`);
192
- const protectedUrl = new URL(url).searchParams.has("_token");
193
- return portResult(port, protectedUrl ? withoutProtectedToken(url) : url, !protectedUrl, protectedUrl, protectedUrl ? async (path = "/", init = {}) => fetch(withProtectedPath(url, path), init) : void 0);
194
- },
195
- snapshots: unsupportedSnapshots("box"),
196
- async stop() {
197
- await destroyBox(client, id, readyTimeoutMs);
198
- }
199
- };
200
- } catch (error) {
201
- await destroyBox(client, id, readyTimeoutMs).catch(() => void 0);
202
- throw error;
203
- }
204
- }
205
- }, [], {
206
- async stop(sandbox) {
207
- await sandbox.raw.client.stop({ boxId: sandbox.id });
208
- sandbox.raw.box = await waitForState(sandbox.raw.client, sandbox.id, ["archived"], sandbox.raw.readyTimeoutMs);
209
- },
210
- async resume(sandbox) {
211
- await sandbox.raw.client.resume({ boxId: sandbox.id });
212
- sandbox.raw.box = await waitUntilBoxReady(sandbox.raw.client, sandbox.id, void 0, sandbox.raw.readyTimeoutMs);
213
- },
214
- async destroy(sandbox) {
215
- await destroyBox(sandbox.raw.client, sandbox.id, sandbox.raw.readyTimeoutMs);
216
- }
217
- });
218
- }
219
- const DIRECTORY_LIST_SCRIPT = [
220
- "import json, os, sys",
221
- "result = []",
222
- "for entry in os.scandir(sys.argv[1]):",
223
- " kind = 'symlink' if entry.is_symlink() else ('directory' if entry.is_dir() else ('file' if entry.is_file() else 'unknown'))",
224
- " result.append({'name': entry.name, 'path': entry.path, 'type': kind, 'size': entry.stat(follow_symlinks=False).st_size})",
225
- "print(json.dumps(result))"
226
- ].join("\n");
227
- async function execute(client, boxId, options) {
228
- assertNotAborted(options.signal);
229
- if (options.timeoutMs !== void 0 && options.timeoutMs > MAX_COMMAND_TIMEOUT_MS) throw new SandboxError({
230
- code: "invalid_input",
231
- provider: "box",
232
- operation: "process.run",
233
- message: "Ascii Box commands support a maximum timeout of 60000ms"
234
- });
235
- return client.command({
236
- boxId,
237
- commandRequest: {
238
- command: options.command,
239
- cwd: options.cwd,
240
- timeoutSeconds: options.timeoutMs === void 0 ? void 0 : Math.max(1, Math.ceil(options.timeoutMs / 1e3))
241
- }
242
- }, { signal: options.signal });
243
- }
244
- function withEnvironment(input, environment) {
245
- const command = commandString(input);
246
- const entries = Object.entries(environment ?? {});
247
- if (entries.length === 0) return command;
248
- return `env ${entries.map(([key, value]) => shellQuote(`${key}=${value}`)).join(" ")} sh -c ${shellQuote(command)}`;
249
- }
250
- function toRemotePath(path) {
251
- return path === "/" ? "." : path.replace(/^\/+/, "");
252
- }
253
- function toVirtualPath(path) {
254
- return `/${path.replace(/^\.\/?/, "")}`.replace(/\/$/, "") || "/";
255
- }
256
- function assertSucceeded(result, operation) {
257
- if (result.exitCode === 0) return;
258
- throw new Error(`${operation} failed: ${result.stderr || result.stdout || `exit ${result.exitCode}`}`);
259
- }
260
- function findUrl(output) {
261
- return output.match(/https:\/\/[^\s"']+/)?.[0]?.replace(/[),.;]+$/, "");
262
- }
263
- function withProtectedPath(base, path) {
264
- const protectedUrl = new URL(base);
265
- const target = new URL(path, base);
266
- if (target.origin !== protectedUrl.origin) throw new SandboxError({
267
- code: "invalid_input",
268
- provider: "box",
269
- operation: "port.request",
270
- message: "Protected Ascii Box preview requests must stay on the preview origin"
271
- });
272
- for (const [key, value] of protectedUrl.searchParams) target.searchParams.set(key, value);
273
- return target;
274
- }
275
- function withoutProtectedToken(url) {
276
- const exposed = new URL(url);
277
- exposed.searchParams.delete("_token");
278
- return exposed.toString();
279
- }
280
- async function waitForState(client, boxId, states, timeoutMs) {
281
- const deadline = Date.now() + timeoutMs;
282
- for (;;) {
283
- const current = (await client.get({ boxId })).box;
284
- if (states.includes(current.state)) return current;
285
- if (current.state === "error") throw new Error("Box entered terminal state error");
286
- if (Date.now() >= deadline) throw new Error("Timed out waiting for Box state");
287
- await new Promise((resolve) => setTimeout(resolve, 1e3));
288
- }
289
- }
290
- async function destroyBox(client, boxId, timeoutMs) {
291
- try {
292
- await client.remove({ boxId });
293
- return;
294
- } catch (error) {
295
- if (!hasResponseStatus(error, 409)) throw error;
296
- }
297
- await client.stop({ boxId });
298
- await waitForState(client, boxId, ["archived"], timeoutMs);
299
- await client.remove({ boxId });
300
- }
301
- function hasResponseStatus(error, status) {
302
- return typeof error === "object" && error !== null && "response" in error && typeof error.response === "object" && error.response !== null && "status" in error.response && error.response.status === status;
303
- }
304
- async function waitUntilBoxReady(client, boxId, signal, timeoutMs = 6e5) {
305
- const deadline = Date.now() + timeoutMs;
306
- for (;;) {
307
- assertNotAborted(signal);
308
- const current = (await client.get({ boxId }, { signal })).box;
309
- if ([
310
- "ready",
311
- "idle",
312
- "running"
313
- ].includes(current.state)) return current;
314
- if ([
315
- "archived",
316
- "archiving",
317
- "error"
318
- ].includes(current.state)) throw new Error(`Box entered terminal state ${current.state}`);
319
- const remainingMs = deadline - Date.now();
320
- if (remainingMs <= 0) throw new Error(`Sandbox creation timed out after ${timeoutMs}ms`);
321
- await abortableDelay(Math.min(1e3, remainingMs), signal);
322
- }
323
- }
324
- function abortableDelay(ms, signal) {
325
- if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));
326
- assertNotAborted(signal);
327
- return new Promise((resolve, reject) => {
328
- const timer = setTimeout(() => {
329
- signal.removeEventListener("abort", onAbort);
330
- resolve();
331
- }, ms);
332
- const onAbort = () => {
333
- clearTimeout(timer);
334
- reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
335
- };
336
- signal.addEventListener("abort", onAbort, { once: true });
337
- });
338
- }
339
- function assertNotAborted(signal) {
340
- if (signal?.aborted) throw signal.reason ?? new DOMException("Aborted", "AbortError");
341
- }
342
- function shellQuote(value) {
343
- return `'${value.replaceAll("'", `'"'"'`)}'`;
344
- }
345
-
346
- //#endregion
347
- export { box, boxCapabilities };
348
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["native: AsciiBoxSandbox | undefined"],"sources":["../../../src/providers/box/index.ts"],"sourcesContent":["import { BoxApi, Configuration, type Box as NativeBox } from \"@asciidev/box-sdk\";\nimport { SandboxError } from \"../../core/errors\";\nimport type { SandboxProvider } from \"../../core/provider\";\nimport type { CommandInput } from \"../../core/types\";\nimport { withManagedSessions } from \"../../internal/managed-provider\";\nimport {\n commandString,\n portResult,\n toUint8Array,\n unsupported,\n unsupportedSnapshots,\n} from \"../../internal/provider-utils\";\nimport { boxCapabilities } from \"../capabilities\";\n\nconst DEFAULT_BASE_URL = \"https://ascii.dev/api/box/v1\";\nconst MAX_COMMAND_TIMEOUT_MS = 60_000;\n\nexport interface BoxOptions {\n /** Box API key. Defaults to BOX_API_KEY. */\n apiKey?: string;\n /** Box API base URL. Defaults to BOX_BASE_URL, then the public v1 endpoint. */\n baseUrl?: string;\n /** Seconds before Box automatically archives. The service default is one hour. */\n ttlSeconds?: number | null;\n /** Withhold account-level secrets from the Box. */\n noEnv?: boolean;\n /** Friendly Box name applied after provisioning. */\n name?: string;\n /** Return ungated hosted URLs instead of protected URLs. Defaults to true. */\n public?: boolean;\n /** Maximum time to wait for provisioning, in milliseconds. Defaults to 10 minutes. */\n readyTimeout?: number;\n}\n\nexport interface AsciiBoxSandbox {\n readonly client: BoxApi;\n box: NativeBox;\n readonly readyTimeoutMs: number;\n}\n\nexport { boxCapabilities } from \"../capabilities\";\n\nexport function box(options: BoxOptions = {}): SandboxProvider<AsciiBoxSandbox> {\n const readyTimeoutMs = options.readyTimeout ?? 600_000;\n const publicPorts = options.public ?? true;\n\n const provider: SandboxProvider<AsciiBoxSandbox> = {\n id: \"box\",\n capabilities: boxCapabilities,\n async create(createOptions) {\n const apiKey = options.apiKey ?? process.env.BOX_API_KEY;\n if (!apiKey) {\n throw new SandboxError({\n code: \"authentication\",\n provider: \"box\",\n operation: \"sandbox.create\",\n message: \"BOX_API_KEY is required to create an Ascii Box\",\n });\n }\n const client = new BoxApi(\n new Configuration({\n basePath: options.baseUrl ?? process.env.BOX_BASE_URL ?? DEFAULT_BASE_URL,\n accessToken: apiKey,\n }),\n );\n assertNotAborted(createOptions.signal);\n const created = await client.create(\n {\n createBoxRequest: {\n ttlSeconds: options.ttlSeconds,\n noEnv: options.noEnv,\n env: { ...createOptions.env },\n },\n },\n { signal: createOptions.signal },\n );\n const id = created.box.id;\n let native: AsciiBoxSandbox | undefined;\n try {\n const ready = await waitUntilBoxReady(\n client,\n id,\n createOptions.signal,\n createOptions.timeout ?? readyTimeoutMs,\n );\n native = { client, box: ready, readyTimeoutMs };\n if (options.name) {\n native.box = (\n await client.update({ boxId: id, updateBoxRequest: { name: options.name } })\n ).box;\n }\n\n const remoteRoot = toRemotePath(createOptions.cwd);\n const mkdir = await execute(client, id, {\n command: commandString({ command: \"mkdir\", args: [\"-p\", \"--\", remoteRoot] }),\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n signal: createOptions.signal,\n });\n assertSucceeded(mkdir, \"sandbox.create.cwd\");\n return {\n id,\n raw: native,\n capabilities: boxCapabilities,\n files: {\n async write(path, value) {\n const remotePath = toRemotePath(path);\n const parent = remotePath.includes(\"/\")\n ? remotePath.slice(0, remotePath.lastIndexOf(\"/\"))\n : \".\";\n const mkdirResult = await execute(client, id, {\n command: commandString({ command: \"mkdir\", args: [\"-p\", \"--\", parent] }),\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n assertSucceeded(mkdirResult, \"files.write.mkdir\");\n await client.writeFile({\n boxId: id,\n fileWriteRequest: {\n path: remotePath,\n content: Buffer.from(await toUint8Array(value)).toString(\"base64\"),\n encoding: \"base64\",\n },\n });\n },\n async read(path) {\n const response = await client.readFile({\n boxId: id,\n path: toRemotePath(path),\n encoding: \"base64\",\n });\n return new Uint8Array(Buffer.from(response.content, \"base64\"));\n },\n async list(path) {\n const result = await execute(client, id, {\n command: commandString({\n command: \"python3\",\n args: [\"-c\", DIRECTORY_LIST_SCRIPT, toRemotePath(path)],\n }),\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n assertSucceeded(result, \"files.list\");\n const entries = JSON.parse(result.stdout) as NativeDirectoryEntry[];\n return entries.map((entry) => ({\n name: entry.name,\n path: toVirtualPath(entry.path),\n type: entry.type,\n size: entry.type === \"file\" ? entry.size : undefined,\n }));\n },\n async mkdir(path) {\n const result = await execute(client, id, {\n command: commandString({\n command: \"mkdir\",\n args: [\"-p\", \"--\", toRemotePath(path)],\n }),\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n assertSucceeded(result, \"files.mkdir\");\n },\n async remove(path) {\n const result = await execute(client, id, {\n command: commandString({\n command: \"rm\",\n args: [\"-rf\", \"--\", toRemotePath(path)],\n }),\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n assertSucceeded(result, \"files.remove\");\n },\n async exists(path) {\n const result = await execute(client, id, {\n command: commandString({\n command: \"test\",\n args: [\"-e\", toRemotePath(path)],\n }),\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n if (result.exitCode === 0) return true;\n if (result.exitCode === 1) return false;\n assertSucceeded(result, \"files.exists\");\n return false;\n },\n },\n async run(command, runOptions) {\n const result = await execute(client, id, {\n command: withEnvironment(command, runOptions.env),\n cwd: toRemotePath(runOptions.cwd!),\n timeoutMs: runOptions.timeout,\n signal: runOptions.signal,\n });\n if (result.timedOut) {\n throw new SandboxError({\n code: \"timeout\",\n provider: \"box\",\n operation: \"process.run\",\n message: `Command timed out after ${runOptions.timeout ?? 30_000}ms`,\n });\n }\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 1,\n success: result.success,\n signal: result.signal ?? undefined,\n durationMs:\n result.startedAt && result.finishedAt\n ? result.finishedAt.getTime() - result.startedAt.getTime()\n : undefined,\n };\n },\n async start() {\n unsupported(\"box\", \"process.start\");\n },\n async expose(port) {\n const visibility = publicPorts ? \"--public\" : \"--private\";\n const hosted = await execute(client, id, {\n command: `host ${port} ${visibility}`,\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n assertSucceeded(hosted, \"ports.expose\");\n const resolved = await execute(client, id, {\n command: `host url ${port}${publicPorts ? \" --public\" : \"\"}`,\n timeoutMs: MAX_COMMAND_TIMEOUT_MS,\n });\n assertSucceeded(resolved, \"ports.expose.url\");\n const url =\n findUrl(`${resolved.stdout}\\n${resolved.stderr}`) ??\n findUrl(`${hosted.stdout}\\n${hosted.stderr}`);\n if (!url) throw new Error(`Box host command did not return a URL for port ${port}`);\n const protectedUrl = new URL(url).searchParams.has(\"_token\");\n const exposedUrl = protectedUrl ? withoutProtectedToken(url) : url;\n return portResult(\n port,\n exposedUrl,\n !protectedUrl,\n protectedUrl,\n protectedUrl\n ? async (path = \"/\", init = {}) => fetch(withProtectedPath(url, path), init)\n : undefined,\n );\n },\n snapshots: unsupportedSnapshots(\"box\"),\n async stop() {\n await destroyBox(client, id, readyTimeoutMs);\n },\n };\n } catch (error) {\n await destroyBox(client, id, readyTimeoutMs).catch(() => undefined);\n throw error;\n }\n },\n };\n\n return withManagedSessions(provider, [], {\n async stop(sandbox) {\n await sandbox.raw.client.stop({ boxId: sandbox.id });\n sandbox.raw.box = await waitForState(\n sandbox.raw.client,\n sandbox.id,\n [\"archived\"],\n sandbox.raw.readyTimeoutMs,\n );\n },\n async resume(sandbox) {\n await sandbox.raw.client.resume({ boxId: sandbox.id });\n sandbox.raw.box = await waitUntilBoxReady(\n sandbox.raw.client,\n sandbox.id,\n undefined,\n sandbox.raw.readyTimeoutMs,\n );\n },\n async destroy(sandbox) {\n await destroyBox(sandbox.raw.client, sandbox.id, sandbox.raw.readyTimeoutMs);\n },\n });\n}\n\ninterface NativeDirectoryEntry {\n name: string;\n path: string;\n type: \"file\" | \"directory\" | \"symlink\" | \"unknown\";\n size: number;\n}\n\nconst DIRECTORY_LIST_SCRIPT = [\n \"import json, os, sys\",\n \"result = []\",\n \"for entry in os.scandir(sys.argv[1]):\",\n \" kind = 'symlink' if entry.is_symlink() else ('directory' if entry.is_dir() else ('file' if entry.is_file() else 'unknown'))\",\n \" result.append({'name': entry.name, 'path': entry.path, 'type': kind, 'size': entry.stat(follow_symlinks=False).st_size})\",\n \"print(json.dumps(result))\",\n].join(\"\\n\");\n\ntype CommandResponse = Awaited<ReturnType<BoxApi[\"command\"]>>;\n\nasync function execute(\n client: BoxApi,\n boxId: string,\n options: {\n command: string;\n cwd?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n },\n): Promise<CommandResponse> {\n assertNotAborted(options.signal);\n if (options.timeoutMs !== undefined && options.timeoutMs > MAX_COMMAND_TIMEOUT_MS) {\n throw new SandboxError({\n code: \"invalid_input\",\n provider: \"box\",\n operation: \"process.run\",\n message: \"Ascii Box commands support a maximum timeout of 60000ms\",\n });\n }\n return client.command(\n {\n boxId,\n commandRequest: {\n command: options.command,\n cwd: options.cwd,\n timeoutSeconds:\n options.timeoutMs === undefined\n ? undefined\n : Math.max(1, Math.ceil(options.timeoutMs / 1_000)),\n },\n },\n { signal: options.signal },\n );\n}\n\nfunction withEnvironment(\n input: CommandInput,\n environment: Readonly<Record<string, string>> | undefined,\n): string {\n const command = commandString(input);\n const entries = Object.entries(environment ?? {});\n if (entries.length === 0) return command;\n const assignments = entries.map(([key, value]) => shellQuote(`${key}=${value}`));\n return `env ${assignments.join(\" \")} sh -c ${shellQuote(command)}`;\n}\n\nfunction toRemotePath(path: string): string {\n return path === \"/\" ? \".\" : path.replace(/^\\/+/, \"\");\n}\n\nfunction toVirtualPath(path: string): string {\n return `/${path.replace(/^\\.\\/?/, \"\")}`.replace(/\\/$/, \"\") || \"/\";\n}\n\nfunction assertSucceeded(result: CommandResponse, operation: string): void {\n if (result.exitCode === 0) return;\n throw new Error(\n `${operation} failed: ${result.stderr || result.stdout || `exit ${result.exitCode}`}`,\n );\n}\n\nfunction findUrl(output: string): string | undefined {\n return output.match(/https:\\/\\/[^\\s\"']+/)?.[0]?.replace(/[),.;]+$/, \"\");\n}\n\nfunction withProtectedPath(base: string, path: string): URL {\n const protectedUrl = new URL(base);\n const target = new URL(path, base);\n if (target.origin !== protectedUrl.origin) {\n throw new SandboxError({\n code: \"invalid_input\",\n provider: \"box\",\n operation: \"port.request\",\n message: \"Protected Ascii Box preview requests must stay on the preview origin\",\n });\n }\n for (const [key, value] of protectedUrl.searchParams) target.searchParams.set(key, value);\n return target;\n}\n\nfunction withoutProtectedToken(url: string): string {\n const exposed = new URL(url);\n exposed.searchParams.delete(\"_token\");\n return exposed.toString();\n}\n\nasync function waitForState(\n client: BoxApi,\n boxId: string,\n states: ReadonlyArray<NativeBox[\"state\"]>,\n timeoutMs: number,\n): Promise<NativeBox> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const current = (await client.get({ boxId })).box;\n if (states.includes(current.state)) return current;\n if (current.state === \"error\") throw new Error(\"Box entered terminal state error\");\n if (Date.now() >= deadline) throw new Error(\"Timed out waiting for Box state\");\n await new Promise((resolve) => setTimeout(resolve, 1_000));\n }\n}\n\nasync function destroyBox(client: BoxApi, boxId: string, timeoutMs: number): Promise<void> {\n try {\n await client.remove({ boxId });\n return;\n } catch (error) {\n if (!hasResponseStatus(error, 409)) throw error;\n }\n await client.stop({ boxId });\n await waitForState(client, boxId, [\"archived\"], timeoutMs);\n await client.remove({ boxId });\n}\n\nfunction hasResponseStatus(error: unknown, status: number): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"response\" in error &&\n typeof error.response === \"object\" &&\n error.response !== null &&\n \"status\" in error.response &&\n error.response.status === status\n );\n}\n\nasync function waitUntilBoxReady(\n client: BoxApi,\n boxId: string,\n signal?: AbortSignal,\n timeoutMs = 600_000,\n): Promise<NativeBox> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n assertNotAborted(signal);\n const current = (await client.get({ boxId }, { signal })).box;\n if ([\"ready\", \"idle\", \"running\"].includes(current.state)) return current;\n if ([\"archived\", \"archiving\", \"error\"].includes(current.state)) {\n throw new Error(`Box entered terminal state ${current.state}`);\n }\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n throw new Error(`Sandbox creation timed out after ${timeoutMs}ms`);\n }\n await abortableDelay(Math.min(1_000, remainingMs), signal);\n }\n}\n\nfunction abortableDelay(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));\n assertNotAborted(signal);\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction assertNotAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n\nexport type BoxSandbox = AsciiBoxSandbox;\n"],"mappings":"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"}
@@ -1,21 +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 { r as daytonaCapabilities } from "../../capabilities-BWvOVFbH.mjs";
6
- import { Sandbox as DaytonaSandbox } from "@daytona/sdk";
7
-
8
- //#region src/providers/daytona/index.d.ts
9
- interface DaytonaOptions {
10
- apiKey?: string;
11
- apiUrl?: string;
12
- target?: string;
13
- image?: string;
14
- language?: string;
15
- name?: string;
16
- public?: boolean;
17
- }
18
- declare function daytona(options?: DaytonaOptions): SandboxProvider<DaytonaSandbox>;
19
- //#endregion
20
- export { DaytonaOptions, type DaytonaSandbox, daytona, daytonaCapabilities };
21
- //# sourceMappingURL=index.d.mts.map
@@ -1,206 +0,0 @@
1
- import { r as normalizeError } from "../../errors-BuF9bYOQ.mjs";
2
- import "../../capabilities-xs9kaHrK.mjs";
3
- import "../../sandbox-DgtY5hvt.mjs";
4
- import { r as daytonaCapabilities } from "../../capabilities-CaSNd6J1.mjs";
5
- import { t as withManagedSessions } from "../../managed-provider-BsZGVQ4I.mjs";
6
- import { a as unsupportedSnapshots, n as portResult, r as toUint8Array, t as commandString } from "../../provider-utils-CfB9nvJx.mjs";
7
- import { randomUUID } from "node:crypto";
8
- import { Daytona } from "@daytona/sdk";
9
-
10
- //#region src/providers/daytona/index.ts
11
- function daytona(options = {}) {
12
- return withManagedSessions({
13
- id: "daytona",
14
- capabilities: daytonaCapabilities,
15
- async create(createOptions) {
16
- const client = new Daytona({
17
- apiKey: options.apiKey,
18
- apiUrl: options.apiUrl,
19
- target: options.target
20
- });
21
- const raw = await client.create({
22
- ...options.image ? { image: options.image } : {},
23
- language: options.language,
24
- name: options.name,
25
- public: options.public,
26
- envVars: { ...createOptions.env }
27
- }, { timeout: createOptions.timeout ? Math.ceil(createOptions.timeout / 1e3) : void 0 });
28
- let remoteCwd;
29
- try {
30
- remoteCwd = `${(await raw.getWorkDir() ?? createOptions.cwd).replace(/\/$/, "")}/${createOptions.cwd.replace(/^\/+/, "")}`;
31
- try {
32
- await raw.fs.getFileDetails(remoteCwd);
33
- } catch (error) {
34
- if (!isDaytonaNotFound(error, "sandbox.create.cwd")) throw error;
35
- await raw.fs.createFolder(remoteCwd, "755");
36
- }
37
- } catch (error) {
38
- await client.delete(raw);
39
- throw error;
40
- }
41
- const toRemotePath = (path) => replacePathPrefix(path, createOptions.cwd, remoteCwd);
42
- const toVirtualPath = (path) => replacePathPrefix(path, remoteCwd, createOptions.cwd);
43
- return {
44
- id: raw.id,
45
- raw,
46
- capabilities: daytonaCapabilities,
47
- files: {
48
- async write(path, value) {
49
- await raw.fs.uploadFile(Buffer.from(await toUint8Array(value)), toRemotePath(path));
50
- },
51
- async read(path) {
52
- return new Uint8Array(await raw.fs.downloadFile(toRemotePath(path)));
53
- },
54
- async list(path) {
55
- const remotePath = toRemotePath(path);
56
- return (await raw.fs.listFiles(remotePath)).map((entry) => ({
57
- name: entry.name,
58
- path: toVirtualPath(entry.path ?? `${remotePath.replace(/\/$/, "")}/${entry.name}`),
59
- type: entry.isDir ? "directory" : "file",
60
- size: entry.size
61
- }));
62
- },
63
- async mkdir(path) {
64
- await raw.fs.createFolder(toRemotePath(path), "755");
65
- },
66
- async remove(path) {
67
- await raw.fs.deleteFile(toRemotePath(path), true);
68
- },
69
- async exists(path) {
70
- try {
71
- await raw.fs.getFileDetails(toRemotePath(path));
72
- return true;
73
- } catch (error) {
74
- if (isDaytonaNotFound(error, "files.exists")) return false;
75
- throw error;
76
- }
77
- }
78
- },
79
- async run(command, runOptions) {
80
- try {
81
- const started = performance.now();
82
- const result = await raw.process.executeCommand(commandString(command), toRemotePath(runOptions.cwd), { ...runOptions.env }, runOptions.timeout ? Math.ceil(runOptions.timeout / 1e3) : void 0);
83
- return {
84
- stdout: result.result,
85
- stderr: "",
86
- exitCode: result.exitCode,
87
- success: result.exitCode === 0,
88
- durationMs: Math.round(performance.now() - started)
89
- };
90
- } catch (error) {
91
- throw normalizeError("daytona", "process.run", error);
92
- }
93
- },
94
- async start(command, runOptions) {
95
- const sessionId = `sandbox-sdk-${randomUUID()}`;
96
- await raw.process.createSession(sessionId);
97
- const commandId = (await raw.process.executeSessionCommand(sessionId, {
98
- command: sessionCommand(commandString(command), toRemotePath(runOptions.cwd), runOptions.env),
99
- runAsync: true,
100
- suppressInputEcho: true
101
- }, runOptions.timeout ? Math.ceil(runOptions.timeout / 1e3) : void 0)).cmdId;
102
- const events = [];
103
- const waiters = /* @__PURE__ */ new Set();
104
- let running = true;
105
- let killed = false;
106
- let exitCode = 1;
107
- let resolveKilled;
108
- const killedPromise = new Promise((resolve) => {
109
- resolveKilled = resolve;
110
- });
111
- const push = (stream, data) => {
112
- events.push({
113
- stream,
114
- data,
115
- timestamp: /* @__PURE__ */ new Date()
116
- });
117
- for (const wake of waiters) wake();
118
- waiters.clear();
119
- };
120
- const completed = raw.process.getSessionCommandLogs(sessionId, commandId, (data) => push("stdout", data), (data) => push("stderr", data)).then(async () => {
121
- exitCode = (await raw.process.getSessionCommand(sessionId, commandId)).exitCode ?? 1;
122
- }).catch((error) => {
123
- if (!killed) throw error;
124
- }).finally(() => {
125
- running = false;
126
- for (const wake of waiters) wake();
127
- waiters.clear();
128
- });
129
- return {
130
- id: commandId,
131
- async status() {
132
- if (killed) return "killed";
133
- if (!running) return "exited";
134
- return (await raw.process.getSessionCommand(sessionId, commandId)).exitCode == null ? "running" : "exited";
135
- },
136
- async *output() {
137
- let index = 0;
138
- while (running || index < events.length) {
139
- while (index < events.length) yield events[index++];
140
- if (!running) break;
141
- await new Promise((resolve) => waiters.add(resolve));
142
- }
143
- },
144
- write: (value) => raw.process.sendSessionCommandInput(sessionId, commandId, typeof value === "string" ? value : new TextDecoder().decode(value)),
145
- async wait() {
146
- await Promise.race([completed, killedPromise]);
147
- return { exitCode };
148
- },
149
- async kill() {
150
- killed = true;
151
- try {
152
- await raw.process.deleteSession(sessionId);
153
- } catch (error) {
154
- killed = false;
155
- throw error;
156
- }
157
- exitCode = 137;
158
- running = false;
159
- resolveKilled();
160
- for (const wake of waiters) wake();
161
- waiters.clear();
162
- }
163
- };
164
- },
165
- async expose(port) {
166
- const preview = await raw.getPreviewLink(port);
167
- return portResult(port, preview.url, raw.public, !raw.public, (path = "/", init = {}) => fetch(new URL(path, preview.url), {
168
- ...init,
169
- headers: {
170
- ...Object.fromEntries(new Headers(init.headers)),
171
- ...preview.token ? { "x-daytona-preview-token": preview.token } : {}
172
- }
173
- }));
174
- },
175
- snapshots: unsupportedSnapshots("daytona"),
176
- async stop() {
177
- await client.delete(raw);
178
- }
179
- };
180
- }
181
- }, [], {
182
- stop: (sandbox) => sandbox.raw.stop(),
183
- resume: (sandbox) => sandbox.raw.start(),
184
- destroy: (sandbox) => sandbox.raw.delete()
185
- });
186
- }
187
- function isDaytonaNotFound(error, operation) {
188
- if (typeof error === "object" && error !== null && "statusCode" in error && error.statusCode === 404) return true;
189
- return normalizeError("daytona", operation, error).code === "not_found";
190
- }
191
- function replacePathPrefix(path, from, to) {
192
- if (path === from) return to;
193
- const prefix = `${from.replace(/\/$/, "")}/`;
194
- return path.startsWith(prefix) ? `${to.replace(/\/$/, "")}/${path.slice(prefix.length)}` : path;
195
- }
196
- function sessionCommand(command, cwd, env) {
197
- const assignments = Object.entries(env ?? {}).map(([key, value]) => shellQuote(`${key}=${value}`));
198
- return `cd ${shellQuote(cwd)} && ${assignments.length ? `env ${assignments.join(" ")} ` : ""}${command}`;
199
- }
200
- function shellQuote(value) {
201
- return `'${value.replaceAll("'", `'"'"'`)}'`;
202
- }
203
-
204
- //#endregion
205
- export { daytona, daytonaCapabilities };
206
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["remoteCwd: string","events: ProcessOutputEvent[]","resolveKilled!: () => void"],"sources":["../../../src/providers/daytona/index.ts"],"sourcesContent":["import { Daytona, type Sandbox as DaytonaSandbox } from \"@daytona/sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { normalizeError } from \"../../core/errors\";\nimport type { SandboxProvider } from \"../../core/provider\";\nimport type { ProcessOutputEvent, SandboxProcess } from \"../../core/types\";\nimport {\n commandString,\n portResult,\n toUint8Array,\n unsupportedSnapshots,\n} from \"../../internal/provider-utils\";\nimport { daytonaCapabilities } from \"../capabilities\";\nimport { withManagedSessions } from \"../../internal/managed-provider\";\n\nexport interface DaytonaOptions {\n apiKey?: string;\n apiUrl?: string;\n target?: string;\n image?: string;\n language?: string;\n name?: string;\n public?: boolean;\n}\n\nexport { daytonaCapabilities } from \"../capabilities\";\n\nexport function daytona(options: DaytonaOptions = {}): SandboxProvider<DaytonaSandbox> {\n return withManagedSessions(\n {\n id: \"daytona\",\n capabilities: daytonaCapabilities,\n async create(createOptions) {\n const client = new Daytona({\n apiKey: options.apiKey,\n apiUrl: options.apiUrl,\n target: options.target,\n });\n const raw = await client.create(\n {\n ...(options.image ? { image: options.image } : {}),\n language: options.language,\n name: options.name,\n public: options.public,\n envVars: { ...createOptions.env },\n },\n {\n timeout: createOptions.timeout ? Math.ceil(createOptions.timeout / 1_000) : undefined,\n },\n );\n let remoteCwd: string;\n try {\n const nativeWorkDir = (await raw.getWorkDir()) ?? createOptions.cwd;\n remoteCwd = `${nativeWorkDir.replace(/\\/$/, \"\")}/${createOptions.cwd.replace(/^\\/+/, \"\")}`;\n try {\n await raw.fs.getFileDetails(remoteCwd);\n } catch (error) {\n if (!isDaytonaNotFound(error, \"sandbox.create.cwd\")) throw error;\n await raw.fs.createFolder(remoteCwd, \"755\");\n }\n } catch (error) {\n await client.delete(raw);\n throw error;\n }\n const toRemotePath = (path: string) =>\n replacePathPrefix(path, createOptions.cwd, remoteCwd);\n const toVirtualPath = (path: string) =>\n replacePathPrefix(path, remoteCwd, createOptions.cwd);\n return {\n id: raw.id,\n raw,\n capabilities: daytonaCapabilities,\n files: {\n async write(path, value) {\n await raw.fs.uploadFile(Buffer.from(await toUint8Array(value)), toRemotePath(path));\n },\n async read(path) {\n return new Uint8Array(await raw.fs.downloadFile(toRemotePath(path)));\n },\n async list(path) {\n const remotePath = toRemotePath(path);\n return (await raw.fs.listFiles(remotePath)).map((entry) => ({\n name: entry.name,\n path: toVirtualPath(entry.path ?? `${remotePath.replace(/\\/$/, \"\")}/${entry.name}`),\n type: entry.isDir ? (\"directory\" as const) : (\"file\" as const),\n size: entry.size,\n }));\n },\n async mkdir(path) {\n await raw.fs.createFolder(toRemotePath(path), \"755\");\n },\n async remove(path) {\n await raw.fs.deleteFile(toRemotePath(path), true);\n },\n async exists(path) {\n try {\n await raw.fs.getFileDetails(toRemotePath(path));\n return true;\n } catch (error) {\n if (isDaytonaNotFound(error, \"files.exists\")) return false;\n throw error;\n }\n },\n },\n async run(command, runOptions) {\n try {\n const started = performance.now();\n const result = await raw.process.executeCommand(\n commandString(command),\n toRemotePath(runOptions.cwd!),\n { ...runOptions.env },\n runOptions.timeout ? Math.ceil(runOptions.timeout / 1_000) : undefined,\n );\n return {\n stdout: result.result,\n stderr: \"\",\n exitCode: result.exitCode,\n success: result.exitCode === 0,\n durationMs: Math.round(performance.now() - started),\n };\n } catch (error) {\n throw normalizeError(\"daytona\", \"process.run\", error);\n }\n },\n async start(command, runOptions) {\n const sessionId = `sandbox-sdk-${randomUUID()}`;\n await raw.process.createSession(sessionId);\n const response = await raw.process.executeSessionCommand(\n sessionId,\n {\n command: sessionCommand(\n commandString(command),\n toRemotePath(runOptions.cwd!),\n runOptions.env,\n ),\n runAsync: true,\n suppressInputEcho: true,\n },\n runOptions.timeout ? Math.ceil(runOptions.timeout / 1_000) : undefined,\n );\n const commandId = response.cmdId;\n const events: ProcessOutputEvent[] = [];\n const waiters = new Set<() => void>();\n let running = true;\n let killed = false;\n let exitCode = 1;\n let resolveKilled!: () => void;\n const killedPromise = new Promise<void>((resolve) => {\n resolveKilled = resolve;\n });\n const push = (stream: \"stdout\" | \"stderr\", data: string) => {\n events.push({ stream, data, timestamp: new Date() });\n for (const wake of waiters) wake();\n waiters.clear();\n };\n const completed = raw.process\n .getSessionCommandLogs(\n sessionId,\n commandId,\n (data) => push(\"stdout\", data),\n (data) => push(\"stderr\", data),\n )\n .then(async () => {\n const info = await raw.process.getSessionCommand(sessionId, commandId);\n exitCode = info.exitCode ?? 1;\n })\n .catch((error) => {\n if (!killed) throw error;\n })\n .finally(() => {\n running = false;\n for (const wake of waiters) wake();\n waiters.clear();\n });\n const process: SandboxProcess = {\n id: commandId,\n async status() {\n if (killed) return \"killed\";\n if (!running) return \"exited\";\n const commandInfo = await raw.process.getSessionCommand(sessionId, commandId);\n return commandInfo.exitCode == null ? \"running\" : \"exited\";\n },\n async *output() {\n let index = 0;\n while (running || index < events.length) {\n while (index < events.length) yield events[index++]!;\n if (!running) break;\n await new Promise<void>((resolve) => waiters.add(resolve));\n }\n },\n write: (value) =>\n raw.process.sendSessionCommandInput(\n sessionId,\n commandId,\n typeof value === \"string\" ? value : new TextDecoder().decode(value),\n ),\n async wait() {\n await Promise.race([completed, killedPromise]);\n return { exitCode };\n },\n async kill() {\n killed = true;\n try {\n await raw.process.deleteSession(sessionId);\n } catch (error) {\n killed = false;\n throw error;\n }\n exitCode = 137;\n running = false;\n resolveKilled();\n for (const wake of waiters) wake();\n waiters.clear();\n },\n };\n return process;\n },\n async expose(port) {\n const preview = await raw.getPreviewLink(port);\n return portResult(port, preview.url, raw.public, !raw.public, (path = \"/\", init = {}) =>\n fetch(new URL(path, preview.url), {\n ...init,\n headers: {\n ...Object.fromEntries(new Headers(init.headers)),\n ...(preview.token ? { \"x-daytona-preview-token\": preview.token } : {}),\n },\n }),\n );\n },\n snapshots: unsupportedSnapshots(\"daytona\"),\n async stop() {\n await client.delete(raw);\n },\n };\n },\n },\n [],\n {\n stop: (sandbox) => sandbox.raw.stop(),\n resume: (sandbox) => sandbox.raw.start(),\n destroy: (sandbox) => sandbox.raw.delete(),\n },\n );\n}\n\nexport type { DaytonaSandbox };\n\nfunction isDaytonaNotFound(error: unknown, operation: string): boolean {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"statusCode\" in error &&\n error.statusCode === 404\n ) {\n return true;\n }\n return normalizeError(\"daytona\", operation, error).code === \"not_found\";\n}\n\nfunction replacePathPrefix(path: string, from: string, to: string): string {\n if (path === from) return to;\n const prefix = `${from.replace(/\\/$/, \"\")}/`;\n return path.startsWith(prefix) ? `${to.replace(/\\/$/, \"\")}/${path.slice(prefix.length)}` : path;\n}\n\nfunction sessionCommand(\n command: string,\n cwd: string,\n env: Readonly<Record<string, string>> | undefined,\n): string {\n const assignments = Object.entries(env ?? {}).map(([key, value]) =>\n shellQuote(`${key}=${value}`),\n );\n return `cd ${shellQuote(cwd)} && ${assignments.length ? `env ${assignments.join(\" \")} ` : \"\"}${command}`;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n"],"mappings":"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"}