computesdk 1.1.1 → 1.3.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.
- package/README.md +3 -3
- package/dist/index.d.mts +68 -258
- package/dist/index.d.ts +68 -258
- package/dist/index.js +327 -708
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +324 -706
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -20,45 +20,29 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
|
|
23
|
+
CommandExitError: () => CommandExitError,
|
|
24
24
|
compute: () => compute,
|
|
25
25
|
createProvider: () => createProvider,
|
|
26
|
-
handleComputeRequest: () => handleComputeRequest
|
|
26
|
+
handleComputeRequest: () => handleComputeRequest,
|
|
27
|
+
isCommandExitError: () => isCommandExitError
|
|
27
28
|
});
|
|
28
29
|
module.exports = __toCommonJS(index_exports);
|
|
29
30
|
|
|
30
|
-
// src/sandbox.ts
|
|
31
|
-
var
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return await provider.sandbox.create(options);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get an existing sandbox by ID from a provider
|
|
40
|
-
*/
|
|
41
|
-
async getById(provider, sandboxId) {
|
|
42
|
-
return await provider.sandbox.getById(sandboxId);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* List all active sandboxes from a provider
|
|
46
|
-
*/
|
|
47
|
-
async list(provider) {
|
|
48
|
-
return await provider.sandbox.list();
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Destroy a sandbox via a provider
|
|
52
|
-
*/
|
|
53
|
-
async destroy(provider, sandboxId) {
|
|
54
|
-
return await provider.sandbox.destroy(sandboxId);
|
|
31
|
+
// src/types/sandbox.ts
|
|
32
|
+
var CommandExitError = class extends Error {
|
|
33
|
+
constructor(result) {
|
|
34
|
+
super(`Command exited with code ${result.exitCode}`);
|
|
35
|
+
this.result = result;
|
|
36
|
+
this.name = "CommandExitError";
|
|
55
37
|
}
|
|
56
38
|
};
|
|
39
|
+
function isCommandExitError(error) {
|
|
40
|
+
return typeof error === "object" && error !== null && "name" in error && error.name === "CommandExitError" && "result" in error;
|
|
41
|
+
}
|
|
57
42
|
|
|
58
43
|
// src/compute.ts
|
|
59
44
|
var ComputeManager = class {
|
|
60
45
|
constructor() {
|
|
61
|
-
this.sandboxManager = new SandboxManager();
|
|
62
46
|
this.config = null;
|
|
63
47
|
this.sandbox = {
|
|
64
48
|
/**
|
|
@@ -74,16 +58,16 @@ var ComputeManager = class {
|
|
|
74
58
|
* provider: e2b({ apiKey: 'your-key' })
|
|
75
59
|
* })
|
|
76
60
|
*
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
61
|
+
* // With default provider (both forms work)
|
|
62
|
+
* compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })
|
|
63
|
+
* const sandbox1 = await compute.sandbox.create({})
|
|
64
|
+
* const sandbox2 = await compute.sandbox.create()
|
|
81
65
|
* ```
|
|
82
66
|
*/
|
|
83
67
|
create: async (params) => {
|
|
84
68
|
const provider = params && "provider" in params && params.provider ? params.provider : this.getDefaultProvider();
|
|
85
69
|
const options = params?.options;
|
|
86
|
-
return await
|
|
70
|
+
return await provider.sandbox.create(options);
|
|
87
71
|
},
|
|
88
72
|
/**
|
|
89
73
|
* Get an existing sandbox by ID from a provider (or default provider if configured)
|
|
@@ -91,12 +75,12 @@ var ComputeManager = class {
|
|
|
91
75
|
getById: async (providerOrSandboxId, sandboxId) => {
|
|
92
76
|
if (typeof providerOrSandboxId === "string") {
|
|
93
77
|
const provider = this.getDefaultProvider();
|
|
94
|
-
return await
|
|
78
|
+
return await provider.sandbox.getById(providerOrSandboxId);
|
|
95
79
|
} else {
|
|
96
80
|
if (!sandboxId) {
|
|
97
81
|
throw new Error("sandboxId is required when provider is specified");
|
|
98
82
|
}
|
|
99
|
-
return await
|
|
83
|
+
return await providerOrSandboxId.sandbox.getById(sandboxId);
|
|
100
84
|
}
|
|
101
85
|
},
|
|
102
86
|
/**
|
|
@@ -104,7 +88,7 @@ var ComputeManager = class {
|
|
|
104
88
|
*/
|
|
105
89
|
list: async (provider) => {
|
|
106
90
|
const actualProvider = provider || this.getDefaultProvider();
|
|
107
|
-
return await
|
|
91
|
+
return await actualProvider.sandbox.list();
|
|
108
92
|
},
|
|
109
93
|
/**
|
|
110
94
|
* Destroy a sandbox via a provider (or default provider if configured)
|
|
@@ -112,12 +96,12 @@ var ComputeManager = class {
|
|
|
112
96
|
destroy: async (providerOrSandboxId, sandboxId) => {
|
|
113
97
|
if (typeof providerOrSandboxId === "string") {
|
|
114
98
|
const provider = this.getDefaultProvider();
|
|
115
|
-
return await
|
|
99
|
+
return await provider.sandbox.destroy(providerOrSandboxId);
|
|
116
100
|
} else {
|
|
117
101
|
if (!sandboxId) {
|
|
118
102
|
throw new Error("sandboxId is required when provider is specified");
|
|
119
103
|
}
|
|
120
|
-
return await
|
|
104
|
+
return await providerOrSandboxId.sandbox.destroy(sandboxId);
|
|
121
105
|
}
|
|
122
106
|
}
|
|
123
107
|
};
|
|
@@ -126,7 +110,17 @@ var ComputeManager = class {
|
|
|
126
110
|
* Set default configuration
|
|
127
111
|
*/
|
|
128
112
|
setConfig(config) {
|
|
129
|
-
|
|
113
|
+
if (!config.defaultProvider && !config.provider) {
|
|
114
|
+
throw new Error("Either defaultProvider or provider must be specified in setConfig");
|
|
115
|
+
}
|
|
116
|
+
if (config.defaultProvider && config.provider) {
|
|
117
|
+
console.warn("Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.");
|
|
118
|
+
}
|
|
119
|
+
const actualProvider = config.defaultProvider || config.provider;
|
|
120
|
+
this.config = {
|
|
121
|
+
provider: actualProvider,
|
|
122
|
+
defaultProvider: actualProvider
|
|
123
|
+
};
|
|
130
124
|
}
|
|
131
125
|
/**
|
|
132
126
|
* Get current configuration
|
|
@@ -146,7 +140,7 @@ var ComputeManager = class {
|
|
|
146
140
|
getDefaultProvider() {
|
|
147
141
|
if (!this.config?.provider) {
|
|
148
142
|
throw new Error(
|
|
149
|
-
"No default provider configured. Either call compute.setConfig({
|
|
143
|
+
"No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly."
|
|
150
144
|
);
|
|
151
145
|
}
|
|
152
146
|
return this.config.provider;
|
|
@@ -155,567 +149,281 @@ var ComputeManager = class {
|
|
|
155
149
|
// blob = new BlobManager();
|
|
156
150
|
// database = new DatabaseManager();
|
|
157
151
|
// git = new GitManager();
|
|
158
|
-
/**
|
|
159
|
-
* Get the sandbox manager (useful for testing)
|
|
160
|
-
*/
|
|
161
|
-
getSandboxManager() {
|
|
162
|
-
return this.sandboxManager;
|
|
163
|
-
}
|
|
164
152
|
};
|
|
165
153
|
var compute = new ComputeManager();
|
|
166
154
|
|
|
167
155
|
// src/request-handler.ts
|
|
168
|
-
async function
|
|
169
|
-
const { request, provider } = params;
|
|
156
|
+
async function executeAction(body, provider) {
|
|
170
157
|
try {
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
158
|
+
const { action, sandboxId } = body;
|
|
159
|
+
if (action === "compute.sandbox.create") {
|
|
160
|
+
const sandbox2 = await compute.sandbox.create({
|
|
161
|
+
provider,
|
|
162
|
+
options: body.options || { runtime: "python" }
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
success: true,
|
|
166
|
+
sandboxId: sandbox2.sandboxId,
|
|
167
|
+
provider: provider.name
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (action === "compute.sandbox.list") {
|
|
171
|
+
const sandboxes = await compute.sandbox.list(provider);
|
|
172
|
+
return {
|
|
173
|
+
success: true,
|
|
174
|
+
sandboxId: "",
|
|
175
|
+
provider: provider.name,
|
|
176
|
+
sandboxes: sandboxes.map((sb) => ({
|
|
177
|
+
sandboxId: sb.sandboxId,
|
|
178
|
+
provider: sb.provider
|
|
179
|
+
}))
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (action === "compute.sandbox.destroy") {
|
|
183
|
+
if (!sandboxId) {
|
|
184
|
+
throw new Error("sandboxId is required for destroy action");
|
|
183
185
|
}
|
|
186
|
+
await compute.sandbox.destroy(provider, sandboxId);
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
sandboxId,
|
|
190
|
+
provider: provider.name
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (!sandboxId) {
|
|
194
|
+
throw new Error("sandboxId is required for this action");
|
|
195
|
+
}
|
|
196
|
+
const sandbox = await compute.sandbox.getById(provider, sandboxId);
|
|
197
|
+
if (!sandbox) {
|
|
198
|
+
throw new Error(`Sandbox ${sandboxId} not found`);
|
|
199
|
+
}
|
|
200
|
+
if (action === "compute.sandbox.getInfo") {
|
|
201
|
+
const result = await sandbox.getInfo();
|
|
202
|
+
return {
|
|
203
|
+
success: true,
|
|
204
|
+
sandboxId,
|
|
205
|
+
provider: provider.name,
|
|
206
|
+
info: {
|
|
207
|
+
id: result.id,
|
|
208
|
+
provider: result.provider,
|
|
209
|
+
runtime: result.runtime,
|
|
210
|
+
status: result.status,
|
|
211
|
+
createdAt: result.createdAt.toISOString(),
|
|
212
|
+
timeout: result.timeout,
|
|
213
|
+
metadata: result.metadata
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (action === "compute.sandbox.runCode") {
|
|
218
|
+
if (!body.code) throw new Error("code is required");
|
|
219
|
+
const result = await sandbox.runCode(body.code, body.runtime);
|
|
220
|
+
return {
|
|
221
|
+
success: true,
|
|
222
|
+
sandboxId,
|
|
223
|
+
provider: provider.name,
|
|
224
|
+
result: {
|
|
225
|
+
stdout: result.stdout,
|
|
226
|
+
stderr: result.stderr,
|
|
227
|
+
exitCode: result.exitCode,
|
|
228
|
+
executionTime: result.executionTime
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (action === "compute.sandbox.runCommand") {
|
|
233
|
+
if (!body.command) throw new Error("command is required");
|
|
234
|
+
const result = await sandbox.runCommand(body.command, body.args);
|
|
235
|
+
return {
|
|
236
|
+
success: true,
|
|
237
|
+
sandboxId,
|
|
238
|
+
provider: provider.name,
|
|
239
|
+
result: {
|
|
240
|
+
stdout: result.stdout,
|
|
241
|
+
stderr: result.stderr,
|
|
242
|
+
exitCode: result.exitCode,
|
|
243
|
+
executionTime: result.executionTime
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
if (action === "compute.sandbox.filesystem.readFile") {
|
|
248
|
+
if (!body.path) throw new Error("path is required");
|
|
249
|
+
const result = await sandbox.filesystem.readFile(body.path);
|
|
250
|
+
return {
|
|
251
|
+
success: true,
|
|
252
|
+
sandboxId,
|
|
253
|
+
provider: provider.name,
|
|
254
|
+
fileContent: result
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
if (action === "compute.sandbox.filesystem.writeFile") {
|
|
258
|
+
if (!body.path) throw new Error("path is required");
|
|
259
|
+
if (body.content === void 0) throw new Error("content is required");
|
|
260
|
+
await sandbox.filesystem.writeFile(body.path, body.content);
|
|
261
|
+
return { success: true, sandboxId, provider: provider.name };
|
|
262
|
+
}
|
|
263
|
+
if (action === "compute.sandbox.filesystem.mkdir") {
|
|
264
|
+
if (!body.path) throw new Error("path is required");
|
|
265
|
+
await sandbox.filesystem.mkdir(body.path);
|
|
266
|
+
return { success: true, sandboxId, provider: provider.name };
|
|
267
|
+
}
|
|
268
|
+
if (action === "compute.sandbox.filesystem.readdir") {
|
|
269
|
+
if (!body.path) throw new Error("path is required");
|
|
270
|
+
const result = await sandbox.filesystem.readdir(body.path);
|
|
271
|
+
return {
|
|
272
|
+
success: true,
|
|
273
|
+
sandboxId,
|
|
274
|
+
provider: provider.name,
|
|
275
|
+
files: result.map((entry) => ({
|
|
276
|
+
name: entry.name,
|
|
277
|
+
path: entry.path,
|
|
278
|
+
isDirectory: entry.isDirectory,
|
|
279
|
+
size: entry.size,
|
|
280
|
+
lastModified: entry.lastModified.toISOString()
|
|
281
|
+
}))
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
if (action === "compute.sandbox.filesystem.exists") {
|
|
285
|
+
if (!body.path) throw new Error("path is required");
|
|
286
|
+
const result = await sandbox.filesystem.exists(body.path);
|
|
287
|
+
return {
|
|
288
|
+
success: true,
|
|
289
|
+
sandboxId,
|
|
290
|
+
provider: provider.name,
|
|
291
|
+
exists: result
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
if (action === "compute.sandbox.filesystem.remove") {
|
|
295
|
+
if (!body.path) throw new Error("path is required");
|
|
296
|
+
await sandbox.filesystem.remove(body.path);
|
|
297
|
+
return { success: true, sandboxId, provider: provider.name };
|
|
298
|
+
}
|
|
299
|
+
throw new Error(`Unknown action: ${action}`);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
error: error instanceof Error ? error.message : "Unknown error occurred",
|
|
304
|
+
sandboxId: body.sandboxId || "",
|
|
305
|
+
provider: provider.name
|
|
184
306
|
};
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
sandboxId: "",
|
|
204
|
-
provider: provider.name
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
await compute.sandbox.destroy(provider, request.sandboxId);
|
|
208
|
-
return {
|
|
209
|
-
success: true,
|
|
210
|
-
sandboxId: request.sandboxId,
|
|
211
|
-
provider: provider.name
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
case "compute.sandbox.getInfo": {
|
|
215
|
-
if (!request.sandboxId) {
|
|
216
|
-
return {
|
|
217
|
-
success: false,
|
|
218
|
-
error: "Sandbox ID is required for getInfo action",
|
|
219
|
-
sandboxId: "",
|
|
220
|
-
provider: provider.name
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
224
|
-
const info = await sandbox.getInfo();
|
|
225
|
-
return {
|
|
226
|
-
success: true,
|
|
227
|
-
sandboxId: request.sandboxId,
|
|
228
|
-
provider: provider.name,
|
|
229
|
-
info: {
|
|
230
|
-
id: info.id,
|
|
231
|
-
provider: info.provider,
|
|
232
|
-
runtime: info.runtime,
|
|
233
|
-
status: info.status,
|
|
234
|
-
createdAt: info.createdAt.toISOString(),
|
|
235
|
-
timeout: info.timeout,
|
|
236
|
-
metadata: info.metadata
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
case "compute.sandbox.list": {
|
|
241
|
-
const sandboxes = await compute.sandbox.list(provider);
|
|
242
|
-
return {
|
|
243
|
-
success: true,
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async function handleComputeRequest(paramsOrRequestOrBody, provider) {
|
|
310
|
+
if (typeof paramsOrRequestOrBody === "object" && "request" in paramsOrRequestOrBody && "provider" in paramsOrRequestOrBody) {
|
|
311
|
+
const params = paramsOrRequestOrBody;
|
|
312
|
+
return await executeAction(params.request, params.provider);
|
|
313
|
+
}
|
|
314
|
+
if (!provider) {
|
|
315
|
+
throw new Error("Provider is required when not using object-style API");
|
|
316
|
+
}
|
|
317
|
+
const requestOrBody = paramsOrRequestOrBody;
|
|
318
|
+
try {
|
|
319
|
+
let body;
|
|
320
|
+
if (requestOrBody instanceof Request) {
|
|
321
|
+
if (requestOrBody.method !== "POST") {
|
|
322
|
+
return Response.json({
|
|
323
|
+
success: false,
|
|
324
|
+
error: "Only POST requests are supported",
|
|
244
325
|
sandboxId: "",
|
|
245
|
-
provider: provider.name,
|
|
246
|
-
sandboxes: sandboxes.map((sandbox) => ({
|
|
247
|
-
sandboxId: sandbox.sandboxId,
|
|
248
|
-
provider: sandbox.provider
|
|
249
|
-
}))
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
// Code execution
|
|
253
|
-
case "compute.sandbox.runCode": {
|
|
254
|
-
if (!request.code) {
|
|
255
|
-
return {
|
|
256
|
-
success: false,
|
|
257
|
-
error: "Code is required for runCode action",
|
|
258
|
-
sandboxId: request.sandboxId || "",
|
|
259
|
-
provider: provider.name
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
263
|
-
const result = await sandbox.runCode(request.code, request.runtime);
|
|
264
|
-
return {
|
|
265
|
-
success: true,
|
|
266
|
-
sandboxId: sandbox.sandboxId,
|
|
267
|
-
provider: provider.name,
|
|
268
|
-
result: {
|
|
269
|
-
stdout: result.stdout,
|
|
270
|
-
stderr: result.stderr,
|
|
271
|
-
exitCode: result.exitCode,
|
|
272
|
-
executionTime: result.executionTime
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
case "compute.sandbox.runCommand": {
|
|
277
|
-
if (!request.command) {
|
|
278
|
-
return {
|
|
279
|
-
success: false,
|
|
280
|
-
error: "Command is required for runCommand action",
|
|
281
|
-
sandboxId: request.sandboxId || "",
|
|
282
|
-
provider: provider.name
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
286
|
-
const result = await sandbox.runCommand(request.command, request.args);
|
|
287
|
-
return {
|
|
288
|
-
success: true,
|
|
289
|
-
sandboxId: sandbox.sandboxId,
|
|
290
|
-
provider: provider.name,
|
|
291
|
-
result: {
|
|
292
|
-
stdout: result.stdout,
|
|
293
|
-
stderr: result.stderr,
|
|
294
|
-
exitCode: result.exitCode,
|
|
295
|
-
executionTime: result.executionTime
|
|
296
|
-
}
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
// Filesystem operations
|
|
300
|
-
case "compute.sandbox.filesystem.readFile": {
|
|
301
|
-
if (!request.sandboxId) {
|
|
302
|
-
return {
|
|
303
|
-
success: false,
|
|
304
|
-
error: "Sandbox ID is required for filesystem operations",
|
|
305
|
-
sandboxId: "",
|
|
306
|
-
provider: provider.name
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
if (!request.path) {
|
|
310
|
-
return {
|
|
311
|
-
success: false,
|
|
312
|
-
error: "File path is required for readFile action",
|
|
313
|
-
sandboxId: request.sandboxId,
|
|
314
|
-
provider: provider.name
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
318
|
-
const content = await sandbox.filesystem.readFile(request.path);
|
|
319
|
-
return {
|
|
320
|
-
success: true,
|
|
321
|
-
sandboxId: request.sandboxId,
|
|
322
|
-
provider: provider.name,
|
|
323
|
-
fileContent: content
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
case "compute.sandbox.filesystem.writeFile": {
|
|
327
|
-
if (!request.sandboxId) {
|
|
328
|
-
return {
|
|
329
|
-
success: false,
|
|
330
|
-
error: "Sandbox ID is required for filesystem operations",
|
|
331
|
-
sandboxId: "",
|
|
332
|
-
provider: provider.name
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
if (!request.path) {
|
|
336
|
-
return {
|
|
337
|
-
success: false,
|
|
338
|
-
error: "File path is required for writeFile action",
|
|
339
|
-
sandboxId: request.sandboxId,
|
|
340
|
-
provider: provider.name
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
if (request.content === void 0) {
|
|
344
|
-
return {
|
|
345
|
-
success: false,
|
|
346
|
-
error: "File content is required for writeFile action",
|
|
347
|
-
sandboxId: request.sandboxId,
|
|
348
|
-
provider: provider.name
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
352
|
-
await sandbox.filesystem.writeFile(request.path, request.content);
|
|
353
|
-
return {
|
|
354
|
-
success: true,
|
|
355
|
-
sandboxId: request.sandboxId,
|
|
356
|
-
provider: provider.name
|
|
357
|
-
};
|
|
358
|
-
}
|
|
359
|
-
case "compute.sandbox.filesystem.mkdir": {
|
|
360
|
-
if (!request.sandboxId) {
|
|
361
|
-
return {
|
|
362
|
-
success: false,
|
|
363
|
-
error: "Sandbox ID is required for filesystem operations",
|
|
364
|
-
sandboxId: "",
|
|
365
|
-
provider: provider.name
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
if (!request.path) {
|
|
369
|
-
return {
|
|
370
|
-
success: false,
|
|
371
|
-
error: "Directory path is required for mkdir action",
|
|
372
|
-
sandboxId: request.sandboxId,
|
|
373
|
-
provider: provider.name
|
|
374
|
-
};
|
|
375
|
-
}
|
|
376
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
377
|
-
await sandbox.filesystem.mkdir(request.path);
|
|
378
|
-
return {
|
|
379
|
-
success: true,
|
|
380
|
-
sandboxId: request.sandboxId,
|
|
381
|
-
provider: provider.name
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
case "compute.sandbox.filesystem.readdir": {
|
|
385
|
-
if (!request.sandboxId) {
|
|
386
|
-
return {
|
|
387
|
-
success: false,
|
|
388
|
-
error: "Sandbox ID is required for filesystem operations",
|
|
389
|
-
sandboxId: "",
|
|
390
|
-
provider: provider.name
|
|
391
|
-
};
|
|
392
|
-
}
|
|
393
|
-
if (!request.path) {
|
|
394
|
-
return {
|
|
395
|
-
success: false,
|
|
396
|
-
error: "Directory path is required for readdir action",
|
|
397
|
-
sandboxId: request.sandboxId,
|
|
398
|
-
provider: provider.name
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
402
|
-
const entries = await sandbox.filesystem.readdir(request.path);
|
|
403
|
-
return {
|
|
404
|
-
success: true,
|
|
405
|
-
sandboxId: request.sandboxId,
|
|
406
|
-
provider: provider.name,
|
|
407
|
-
files: entries.map((entry) => ({
|
|
408
|
-
name: entry.name,
|
|
409
|
-
path: entry.path,
|
|
410
|
-
isDirectory: entry.isDirectory,
|
|
411
|
-
size: entry.size,
|
|
412
|
-
lastModified: entry.lastModified.toISOString()
|
|
413
|
-
}))
|
|
414
|
-
};
|
|
415
|
-
}
|
|
416
|
-
case "compute.sandbox.filesystem.exists": {
|
|
417
|
-
if (!request.sandboxId) {
|
|
418
|
-
return {
|
|
419
|
-
success: false,
|
|
420
|
-
error: "Sandbox ID is required for filesystem operations",
|
|
421
|
-
sandboxId: "",
|
|
422
|
-
provider: provider.name
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
if (!request.path) {
|
|
426
|
-
return {
|
|
427
|
-
success: false,
|
|
428
|
-
error: "Path is required for exists action",
|
|
429
|
-
sandboxId: request.sandboxId,
|
|
430
|
-
provider: provider.name
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
434
|
-
const exists = await sandbox.filesystem.exists(request.path);
|
|
435
|
-
return {
|
|
436
|
-
success: true,
|
|
437
|
-
sandboxId: request.sandboxId,
|
|
438
|
-
provider: provider.name,
|
|
439
|
-
exists
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
case "compute.sandbox.filesystem.remove": {
|
|
443
|
-
if (!request.sandboxId) {
|
|
444
|
-
return {
|
|
445
|
-
success: false,
|
|
446
|
-
error: "Sandbox ID is required for filesystem operations",
|
|
447
|
-
sandboxId: "",
|
|
448
|
-
provider: provider.name
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
if (!request.path) {
|
|
452
|
-
return {
|
|
453
|
-
success: false,
|
|
454
|
-
error: "Path is required for remove action",
|
|
455
|
-
sandboxId: request.sandboxId,
|
|
456
|
-
provider: provider.name
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
460
|
-
await sandbox.filesystem.remove(request.path);
|
|
461
|
-
return {
|
|
462
|
-
success: true,
|
|
463
|
-
sandboxId: request.sandboxId,
|
|
464
326
|
provider: provider.name
|
|
465
|
-
};
|
|
327
|
+
}, { status: 405 });
|
|
466
328
|
}
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
success: false,
|
|
472
|
-
error: "Sandbox ID is required for terminal operations",
|
|
473
|
-
sandboxId: "",
|
|
474
|
-
provider: provider.name
|
|
475
|
-
};
|
|
476
|
-
}
|
|
477
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
478
|
-
const terminal = await sandbox.terminal.create(request.terminalOptions);
|
|
479
|
-
return {
|
|
480
|
-
success: true,
|
|
481
|
-
sandboxId: request.sandboxId,
|
|
482
|
-
provider: provider.name,
|
|
483
|
-
terminal: {
|
|
484
|
-
pid: terminal.pid,
|
|
485
|
-
command: terminal.command,
|
|
486
|
-
status: terminal.status,
|
|
487
|
-
cols: terminal.cols,
|
|
488
|
-
rows: terminal.rows
|
|
489
|
-
}
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
case "compute.sandbox.terminal.list": {
|
|
493
|
-
if (!request.sandboxId) {
|
|
494
|
-
return {
|
|
495
|
-
success: false,
|
|
496
|
-
error: "Sandbox ID is required for terminal operations",
|
|
497
|
-
sandboxId: "",
|
|
498
|
-
provider: provider.name
|
|
499
|
-
};
|
|
500
|
-
}
|
|
501
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
502
|
-
const terminals = await sandbox.terminal.list();
|
|
503
|
-
return {
|
|
504
|
-
success: true,
|
|
505
|
-
sandboxId: request.sandboxId,
|
|
506
|
-
provider: provider.name,
|
|
507
|
-
terminals: terminals.map((terminal) => ({
|
|
508
|
-
pid: terminal.pid,
|
|
509
|
-
command: terminal.command,
|
|
510
|
-
status: terminal.status,
|
|
511
|
-
cols: terminal.cols,
|
|
512
|
-
rows: terminal.rows
|
|
513
|
-
}))
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
case "compute.sandbox.terminal.getById": {
|
|
517
|
-
if (!request.sandboxId) {
|
|
518
|
-
return {
|
|
519
|
-
success: false,
|
|
520
|
-
error: "Sandbox ID is required for terminal operations",
|
|
521
|
-
sandboxId: "",
|
|
522
|
-
provider: provider.name
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
if (!request.terminalId) {
|
|
526
|
-
return {
|
|
527
|
-
success: false,
|
|
528
|
-
error: "Terminal ID is required for getById action",
|
|
529
|
-
sandboxId: request.sandboxId,
|
|
530
|
-
provider: provider.name
|
|
531
|
-
};
|
|
532
|
-
}
|
|
533
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
534
|
-
const terminal = await sandbox.terminal.getById(request.terminalId);
|
|
535
|
-
if (!terminal) {
|
|
536
|
-
return {
|
|
537
|
-
success: false,
|
|
538
|
-
error: `Terminal with ID ${request.terminalId} not found`,
|
|
539
|
-
sandboxId: request.sandboxId,
|
|
540
|
-
provider: provider.name
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
return {
|
|
544
|
-
success: true,
|
|
545
|
-
sandboxId: request.sandboxId,
|
|
546
|
-
provider: provider.name,
|
|
547
|
-
terminal: {
|
|
548
|
-
pid: terminal.pid,
|
|
549
|
-
command: terminal.command,
|
|
550
|
-
status: terminal.status,
|
|
551
|
-
cols: terminal.cols,
|
|
552
|
-
rows: terminal.rows
|
|
553
|
-
}
|
|
554
|
-
};
|
|
555
|
-
}
|
|
556
|
-
case "compute.sandbox.terminal.destroy": {
|
|
557
|
-
if (!request.sandboxId) {
|
|
558
|
-
return {
|
|
559
|
-
success: false,
|
|
560
|
-
error: "Sandbox ID is required for terminal operations",
|
|
561
|
-
sandboxId: "",
|
|
562
|
-
provider: provider.name
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
if (!request.terminalId) {
|
|
566
|
-
return {
|
|
567
|
-
success: false,
|
|
568
|
-
error: "Terminal ID is required for destroy action",
|
|
569
|
-
sandboxId: request.sandboxId,
|
|
570
|
-
provider: provider.name
|
|
571
|
-
};
|
|
572
|
-
}
|
|
573
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
574
|
-
await sandbox.terminal.destroy(request.terminalId);
|
|
575
|
-
return {
|
|
576
|
-
success: true,
|
|
577
|
-
sandboxId: request.sandboxId,
|
|
578
|
-
provider: provider.name
|
|
579
|
-
};
|
|
580
|
-
}
|
|
581
|
-
// Terminal I/O operations
|
|
582
|
-
case "compute.sandbox.terminal.write": {
|
|
583
|
-
if (!request.sandboxId) {
|
|
584
|
-
return {
|
|
585
|
-
success: false,
|
|
586
|
-
error: "Sandbox ID is required for terminal operations",
|
|
587
|
-
sandboxId: "",
|
|
588
|
-
provider: provider.name
|
|
589
|
-
};
|
|
590
|
-
}
|
|
591
|
-
if (!request.terminalId) {
|
|
592
|
-
return {
|
|
593
|
-
success: false,
|
|
594
|
-
error: "Terminal ID is required for write action",
|
|
595
|
-
sandboxId: request.sandboxId,
|
|
596
|
-
provider: provider.name
|
|
597
|
-
};
|
|
598
|
-
}
|
|
599
|
-
if (!request.data) {
|
|
600
|
-
return {
|
|
601
|
-
success: false,
|
|
602
|
-
error: "Data is required for write action",
|
|
603
|
-
sandboxId: request.sandboxId,
|
|
604
|
-
provider: provider.name
|
|
605
|
-
};
|
|
606
|
-
}
|
|
607
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
608
|
-
const terminal = await sandbox.terminal.getById(request.terminalId);
|
|
609
|
-
if (!terminal) {
|
|
610
|
-
return {
|
|
611
|
-
success: false,
|
|
612
|
-
error: `Terminal with ID ${request.terminalId} not found`,
|
|
613
|
-
sandboxId: request.sandboxId,
|
|
614
|
-
provider: provider.name
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
await terminal.write(request.data);
|
|
618
|
-
return {
|
|
619
|
-
success: true,
|
|
620
|
-
sandboxId: request.sandboxId,
|
|
621
|
-
provider: provider.name
|
|
622
|
-
};
|
|
623
|
-
}
|
|
624
|
-
case "compute.sandbox.terminal.resize": {
|
|
625
|
-
if (!request.sandboxId) {
|
|
626
|
-
return {
|
|
627
|
-
success: false,
|
|
628
|
-
error: "Sandbox ID is required for terminal operations",
|
|
629
|
-
sandboxId: "",
|
|
630
|
-
provider: provider.name
|
|
631
|
-
};
|
|
632
|
-
}
|
|
633
|
-
if (!request.terminalId) {
|
|
634
|
-
return {
|
|
635
|
-
success: false,
|
|
636
|
-
error: "Terminal ID is required for resize action",
|
|
637
|
-
sandboxId: request.sandboxId,
|
|
638
|
-
provider: provider.name
|
|
639
|
-
};
|
|
640
|
-
}
|
|
641
|
-
if (!request.cols || !request.rows) {
|
|
642
|
-
return {
|
|
643
|
-
success: false,
|
|
644
|
-
error: "Cols and rows are required for resize action",
|
|
645
|
-
sandboxId: request.sandboxId,
|
|
646
|
-
provider: provider.name
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
650
|
-
const terminal = await sandbox.terminal.getById(request.terminalId);
|
|
651
|
-
if (!terminal) {
|
|
652
|
-
return {
|
|
653
|
-
success: false,
|
|
654
|
-
error: `Terminal with ID ${request.terminalId} not found`,
|
|
655
|
-
sandboxId: request.sandboxId,
|
|
656
|
-
provider: provider.name
|
|
657
|
-
};
|
|
658
|
-
}
|
|
659
|
-
await terminal.resize(request.cols, request.rows);
|
|
660
|
-
return {
|
|
661
|
-
success: true,
|
|
662
|
-
sandboxId: request.sandboxId,
|
|
663
|
-
provider: provider.name
|
|
664
|
-
};
|
|
665
|
-
}
|
|
666
|
-
case "compute.sandbox.terminal.kill": {
|
|
667
|
-
if (!request.sandboxId) {
|
|
668
|
-
return {
|
|
669
|
-
success: false,
|
|
670
|
-
error: "Sandbox ID is required for terminal operations",
|
|
671
|
-
sandboxId: "",
|
|
672
|
-
provider: provider.name
|
|
673
|
-
};
|
|
674
|
-
}
|
|
675
|
-
if (!request.terminalId) {
|
|
676
|
-
return {
|
|
677
|
-
success: false,
|
|
678
|
-
error: "Terminal ID is required for kill action",
|
|
679
|
-
sandboxId: request.sandboxId,
|
|
680
|
-
provider: provider.name
|
|
681
|
-
};
|
|
682
|
-
}
|
|
683
|
-
const sandbox = await getSandbox(request.sandboxId);
|
|
684
|
-
const terminal = await sandbox.terminal.getById(request.terminalId);
|
|
685
|
-
if (!terminal) {
|
|
686
|
-
return {
|
|
687
|
-
success: false,
|
|
688
|
-
error: `Terminal with ID ${request.terminalId} not found`,
|
|
689
|
-
sandboxId: request.sandboxId,
|
|
690
|
-
provider: provider.name
|
|
691
|
-
};
|
|
692
|
-
}
|
|
693
|
-
await terminal.kill();
|
|
694
|
-
return {
|
|
695
|
-
success: true,
|
|
696
|
-
sandboxId: request.sandboxId,
|
|
697
|
-
provider: provider.name
|
|
698
|
-
};
|
|
699
|
-
}
|
|
700
|
-
default:
|
|
701
|
-
return {
|
|
329
|
+
try {
|
|
330
|
+
body = await requestOrBody.json();
|
|
331
|
+
} catch (parseError) {
|
|
332
|
+
return Response.json({
|
|
702
333
|
success: false,
|
|
703
|
-
error:
|
|
704
|
-
sandboxId:
|
|
334
|
+
error: "Invalid JSON in request body",
|
|
335
|
+
sandboxId: "",
|
|
705
336
|
provider: provider.name
|
|
706
|
-
};
|
|
337
|
+
}, { status: 400 });
|
|
338
|
+
}
|
|
339
|
+
} else {
|
|
340
|
+
body = requestOrBody;
|
|
707
341
|
}
|
|
342
|
+
const result = await executeAction(body, provider);
|
|
343
|
+
return Response.json(result, {
|
|
344
|
+
status: result.success ? 200 : 500
|
|
345
|
+
});
|
|
708
346
|
} catch (error) {
|
|
709
|
-
return {
|
|
347
|
+
return Response.json({
|
|
710
348
|
success: false,
|
|
711
|
-
error: error instanceof Error ? error.message : "
|
|
712
|
-
sandboxId:
|
|
349
|
+
error: error instanceof Error ? error.message : "Request handling failed",
|
|
350
|
+
sandboxId: "",
|
|
713
351
|
provider: provider.name
|
|
714
|
-
};
|
|
352
|
+
}, { status: 500 });
|
|
715
353
|
}
|
|
716
354
|
}
|
|
717
355
|
|
|
718
356
|
// src/factory.ts
|
|
357
|
+
var defaultFilesystemMethods = {
|
|
358
|
+
readFile: async (sandbox, path, runCommand) => {
|
|
359
|
+
const result = await runCommand(sandbox, "cat", [path]);
|
|
360
|
+
if (result.exitCode !== 0) {
|
|
361
|
+
throw new Error(`Failed to read file ${path}: ${result.stderr}`);
|
|
362
|
+
}
|
|
363
|
+
return result.stdout.replace(/\n$/, "");
|
|
364
|
+
},
|
|
365
|
+
writeFile: async (sandbox, path, content, runCommand) => {
|
|
366
|
+
const result = await runCommand(sandbox, "sh", ["-c", `echo ${JSON.stringify(content)} > ${JSON.stringify(path)}`]);
|
|
367
|
+
if (result.exitCode !== 0) {
|
|
368
|
+
throw new Error(`Failed to write file ${path}: ${result.stderr}`);
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
mkdir: async (sandbox, path, runCommand) => {
|
|
372
|
+
const result = await runCommand(sandbox, "mkdir", ["-p", path]);
|
|
373
|
+
if (result.exitCode !== 0) {
|
|
374
|
+
throw new Error(`Failed to create directory ${path}: ${result.stderr}`);
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
readdir: async (sandbox, path, runCommand) => {
|
|
378
|
+
let result = await runCommand(sandbox, "ls", ["-la", path]);
|
|
379
|
+
let hasDetailedOutput = true;
|
|
380
|
+
if (result.exitCode !== 0) {
|
|
381
|
+
result = await runCommand(sandbox, "ls", ["-l", path]);
|
|
382
|
+
}
|
|
383
|
+
if (result.exitCode !== 0) {
|
|
384
|
+
result = await runCommand(sandbox, "ls", [path]);
|
|
385
|
+
hasDetailedOutput = false;
|
|
386
|
+
}
|
|
387
|
+
if (result.exitCode !== 0) {
|
|
388
|
+
throw new Error(`Failed to list directory ${path}: ${result.stderr}`);
|
|
389
|
+
}
|
|
390
|
+
const lines = (result.stdout || "").split("\n").filter((line) => line.trim() && !line.startsWith("total"));
|
|
391
|
+
return lines.map((line) => {
|
|
392
|
+
if (hasDetailedOutput && line.includes(" ")) {
|
|
393
|
+
const parts = line.trim().split(/\s+/);
|
|
394
|
+
const name = parts[parts.length - 1];
|
|
395
|
+
const isDirectory = line.startsWith("d");
|
|
396
|
+
return {
|
|
397
|
+
name,
|
|
398
|
+
path: `${path}/${name}`,
|
|
399
|
+
isDirectory,
|
|
400
|
+
size: parseInt(parts[4]) || 0,
|
|
401
|
+
lastModified: /* @__PURE__ */ new Date()
|
|
402
|
+
};
|
|
403
|
+
} else {
|
|
404
|
+
const name = line.trim();
|
|
405
|
+
return {
|
|
406
|
+
name,
|
|
407
|
+
path: `${path}/${name}`,
|
|
408
|
+
isDirectory: false,
|
|
409
|
+
// Can't determine from simple ls
|
|
410
|
+
size: 0,
|
|
411
|
+
lastModified: /* @__PURE__ */ new Date()
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
},
|
|
416
|
+
exists: async (sandbox, path, runCommand) => {
|
|
417
|
+
const result = await runCommand(sandbox, "test", ["-e", path]);
|
|
418
|
+
return result.exitCode === 0;
|
|
419
|
+
},
|
|
420
|
+
remove: async (sandbox, path, runCommand) => {
|
|
421
|
+
const result = await runCommand(sandbox, "rm", ["-rf", path]);
|
|
422
|
+
if (result.exitCode !== 0) {
|
|
423
|
+
throw new Error(`Failed to remove ${path}: ${result.stderr}`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
};
|
|
719
427
|
var UnsupportedFileSystem = class {
|
|
720
428
|
constructor(providerName) {
|
|
721
429
|
this.providerName = providerName;
|
|
@@ -739,155 +447,51 @@ var UnsupportedFileSystem = class {
|
|
|
739
447
|
throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);
|
|
740
448
|
}
|
|
741
449
|
};
|
|
742
|
-
var UnsupportedTerminal = class {
|
|
743
|
-
constructor(providerName) {
|
|
744
|
-
this.providerName = providerName;
|
|
745
|
-
}
|
|
746
|
-
async create(_options) {
|
|
747
|
-
throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);
|
|
748
|
-
}
|
|
749
|
-
async getById(_terminalId) {
|
|
750
|
-
throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);
|
|
751
|
-
}
|
|
752
|
-
async list() {
|
|
753
|
-
throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);
|
|
754
|
-
}
|
|
755
|
-
async destroy(_terminalId) {
|
|
756
|
-
throw new Error(`Terminal operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);
|
|
757
|
-
}
|
|
758
|
-
};
|
|
759
450
|
var SupportedFileSystem = class {
|
|
760
|
-
constructor(sandbox, methods) {
|
|
451
|
+
constructor(sandbox, methods, allMethods) {
|
|
761
452
|
this.sandbox = sandbox;
|
|
762
453
|
this.methods = methods;
|
|
454
|
+
this.allMethods = allMethods;
|
|
763
455
|
}
|
|
764
456
|
async readFile(path) {
|
|
765
|
-
return this.methods.readFile(this.sandbox, path);
|
|
457
|
+
return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);
|
|
766
458
|
}
|
|
767
459
|
async writeFile(path, content) {
|
|
768
|
-
return this.methods.writeFile(this.sandbox, path, content);
|
|
460
|
+
return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);
|
|
769
461
|
}
|
|
770
462
|
async mkdir(path) {
|
|
771
|
-
return this.methods.mkdir(this.sandbox, path);
|
|
463
|
+
return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);
|
|
772
464
|
}
|
|
773
465
|
async readdir(path) {
|
|
774
|
-
return this.methods.readdir(this.sandbox, path);
|
|
466
|
+
return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);
|
|
775
467
|
}
|
|
776
468
|
async exists(path) {
|
|
777
|
-
return this.methods.exists(this.sandbox, path);
|
|
469
|
+
return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);
|
|
778
470
|
}
|
|
779
471
|
async remove(path) {
|
|
780
|
-
return this.methods.remove(this.sandbox, path);
|
|
781
|
-
}
|
|
782
|
-
};
|
|
783
|
-
var GeneratedTerminalSession = class {
|
|
784
|
-
constructor(terminal, sandbox, methods, terminalId, command, cols = 80, rows = 24) {
|
|
785
|
-
this.terminal = terminal;
|
|
786
|
-
this.sandbox = sandbox;
|
|
787
|
-
this.methods = methods;
|
|
788
|
-
this.pid = parseInt(terminalId);
|
|
789
|
-
this.command = command;
|
|
790
|
-
this.status = "running";
|
|
791
|
-
this.cols = cols;
|
|
792
|
-
this.rows = rows;
|
|
793
|
-
}
|
|
794
|
-
async write(data) {
|
|
795
|
-
return this.methods.write(this.sandbox, this.terminal, data);
|
|
796
|
-
}
|
|
797
|
-
async resize(cols, rows) {
|
|
798
|
-
return this.methods.resize(this.sandbox, this.terminal, cols, rows);
|
|
799
|
-
}
|
|
800
|
-
async kill() {
|
|
801
|
-
return this.methods.kill(this.sandbox, this.terminal);
|
|
802
|
-
}
|
|
803
|
-
};
|
|
804
|
-
var SupportedTerminal = class {
|
|
805
|
-
constructor(sandbox, methods) {
|
|
806
|
-
this.sandbox = sandbox;
|
|
807
|
-
this.methods = methods;
|
|
808
|
-
}
|
|
809
|
-
async create(options) {
|
|
810
|
-
let terminalSession;
|
|
811
|
-
const createOptions = {
|
|
812
|
-
...options,
|
|
813
|
-
onData: (data) => {
|
|
814
|
-
if (terminalSession?.onData) {
|
|
815
|
-
terminalSession.onData(data);
|
|
816
|
-
}
|
|
817
|
-
},
|
|
818
|
-
onExit: (exitCode) => {
|
|
819
|
-
if (terminalSession?.onExit) {
|
|
820
|
-
terminalSession.onExit(exitCode);
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
};
|
|
824
|
-
const result = await this.methods.create(this.sandbox, createOptions);
|
|
825
|
-
terminalSession = new GeneratedTerminalSession(
|
|
826
|
-
result.terminal,
|
|
827
|
-
this.sandbox,
|
|
828
|
-
this.methods,
|
|
829
|
-
result.terminalId,
|
|
830
|
-
options?.command || "bash",
|
|
831
|
-
options?.cols || 80,
|
|
832
|
-
options?.rows || 24
|
|
833
|
-
);
|
|
834
|
-
terminalSession.onData = options?.onData;
|
|
835
|
-
terminalSession.onExit = options?.onExit;
|
|
836
|
-
return terminalSession;
|
|
837
|
-
}
|
|
838
|
-
async getById(terminalId) {
|
|
839
|
-
const result = await this.methods.getById(this.sandbox, terminalId);
|
|
840
|
-
if (!result) return null;
|
|
841
|
-
return new GeneratedTerminalSession(
|
|
842
|
-
result.terminal,
|
|
843
|
-
this.sandbox,
|
|
844
|
-
this.methods,
|
|
845
|
-
result.terminalId,
|
|
846
|
-
"bash",
|
|
847
|
-
// Default command for existing terminals
|
|
848
|
-
80,
|
|
849
|
-
// Default cols
|
|
850
|
-
24
|
|
851
|
-
// Default rows
|
|
852
|
-
);
|
|
853
|
-
}
|
|
854
|
-
async list() {
|
|
855
|
-
const results = await this.methods.list(this.sandbox);
|
|
856
|
-
return results.map((result) => new GeneratedTerminalSession(
|
|
857
|
-
result.terminal,
|
|
858
|
-
this.sandbox,
|
|
859
|
-
this.methods,
|
|
860
|
-
result.terminalId,
|
|
861
|
-
"bash",
|
|
862
|
-
// Default command
|
|
863
|
-
80,
|
|
864
|
-
// Default cols
|
|
865
|
-
24
|
|
866
|
-
// Default rows
|
|
867
|
-
));
|
|
868
|
-
}
|
|
869
|
-
async destroy(terminalId) {
|
|
870
|
-
return this.methods.destroy(this.sandbox, terminalId);
|
|
472
|
+
return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);
|
|
871
473
|
}
|
|
872
474
|
};
|
|
873
475
|
var GeneratedSandbox = class {
|
|
874
|
-
constructor(sandbox, sandboxId, providerName, methods, config, destroyMethod) {
|
|
476
|
+
constructor(sandbox, sandboxId, providerName, methods, config, destroyMethod, providerInstance) {
|
|
875
477
|
this.sandbox = sandbox;
|
|
876
478
|
this.methods = methods;
|
|
877
479
|
this.config = config;
|
|
878
480
|
this.destroyMethod = destroyMethod;
|
|
481
|
+
this.providerInstance = providerInstance;
|
|
879
482
|
this.sandboxId = sandboxId;
|
|
880
483
|
this.provider = providerName;
|
|
881
484
|
if (methods.filesystem) {
|
|
882
|
-
this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem);
|
|
485
|
+
this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);
|
|
883
486
|
} else {
|
|
884
487
|
this.filesystem = new UnsupportedFileSystem(providerName);
|
|
885
488
|
}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
this.
|
|
489
|
+
}
|
|
490
|
+
getInstance() {
|
|
491
|
+
if (this.methods.getInstance) {
|
|
492
|
+
return this.methods.getInstance(this.sandbox);
|
|
890
493
|
}
|
|
494
|
+
return this.sandbox;
|
|
891
495
|
}
|
|
892
496
|
async runCode(code, runtime) {
|
|
893
497
|
return await this.methods.runCode(this.sandbox, code, runtime, this.config);
|
|
@@ -898,6 +502,12 @@ var GeneratedSandbox = class {
|
|
|
898
502
|
async getInfo() {
|
|
899
503
|
return await this.methods.getInfo(this.sandbox);
|
|
900
504
|
}
|
|
505
|
+
async getUrl(options) {
|
|
506
|
+
return await this.methods.getUrl(this.sandbox, options);
|
|
507
|
+
}
|
|
508
|
+
getProvider() {
|
|
509
|
+
return this.providerInstance;
|
|
510
|
+
}
|
|
901
511
|
async kill() {
|
|
902
512
|
await this.destroy();
|
|
903
513
|
}
|
|
@@ -906,10 +516,11 @@ var GeneratedSandbox = class {
|
|
|
906
516
|
}
|
|
907
517
|
};
|
|
908
518
|
var GeneratedSandboxManager = class {
|
|
909
|
-
constructor(config, providerName, methods) {
|
|
519
|
+
constructor(config, providerName, methods, providerInstance) {
|
|
910
520
|
this.config = config;
|
|
911
521
|
this.providerName = providerName;
|
|
912
522
|
this.methods = methods;
|
|
523
|
+
this.providerInstance = providerInstance;
|
|
913
524
|
this.activeSandboxes = /* @__PURE__ */ new Map();
|
|
914
525
|
}
|
|
915
526
|
async create(options) {
|
|
@@ -920,7 +531,8 @@ var GeneratedSandboxManager = class {
|
|
|
920
531
|
this.providerName,
|
|
921
532
|
this.methods,
|
|
922
533
|
this.config,
|
|
923
|
-
this.methods.destroy
|
|
534
|
+
this.methods.destroy,
|
|
535
|
+
this.providerInstance
|
|
924
536
|
);
|
|
925
537
|
this.activeSandboxes.set(result.sandboxId, sandbox);
|
|
926
538
|
return sandbox;
|
|
@@ -940,7 +552,8 @@ var GeneratedSandboxManager = class {
|
|
|
940
552
|
this.providerName,
|
|
941
553
|
this.methods,
|
|
942
554
|
this.config,
|
|
943
|
-
this.methods.destroy
|
|
555
|
+
this.methods.destroy,
|
|
556
|
+
this.providerInstance
|
|
944
557
|
);
|
|
945
558
|
this.activeSandboxes.set(result.sandboxId, sandbox);
|
|
946
559
|
return sandbox;
|
|
@@ -957,7 +570,8 @@ var GeneratedSandboxManager = class {
|
|
|
957
570
|
this.providerName,
|
|
958
571
|
this.methods,
|
|
959
572
|
this.config,
|
|
960
|
-
this.methods.destroy
|
|
573
|
+
this.methods.destroy,
|
|
574
|
+
this.providerInstance
|
|
961
575
|
);
|
|
962
576
|
this.activeSandboxes.set(result.sandboxId, sandbox);
|
|
963
577
|
}
|
|
@@ -976,20 +590,25 @@ var GeneratedProvider = class {
|
|
|
976
590
|
this.sandbox = new GeneratedSandboxManager(
|
|
977
591
|
config,
|
|
978
592
|
providerConfig.name,
|
|
979
|
-
providerConfig.methods.sandbox
|
|
593
|
+
providerConfig.methods.sandbox,
|
|
594
|
+
this
|
|
980
595
|
);
|
|
981
596
|
}
|
|
982
597
|
};
|
|
983
598
|
function createProvider(providerConfig) {
|
|
599
|
+
if (!providerConfig.methods.sandbox.filesystem) {
|
|
600
|
+
providerConfig.methods.sandbox.filesystem = defaultFilesystemMethods;
|
|
601
|
+
}
|
|
984
602
|
return (config) => {
|
|
985
603
|
return new GeneratedProvider(config, providerConfig);
|
|
986
604
|
};
|
|
987
605
|
}
|
|
988
606
|
// Annotate the CommonJS export names for ESM import in node:
|
|
989
607
|
0 && (module.exports = {
|
|
990
|
-
|
|
608
|
+
CommandExitError,
|
|
991
609
|
compute,
|
|
992
610
|
createProvider,
|
|
993
|
-
handleComputeRequest
|
|
611
|
+
handleComputeRequest,
|
|
612
|
+
isCommandExitError
|
|
994
613
|
});
|
|
995
614
|
//# sourceMappingURL=index.js.map
|