@bunny-agent/sandbox-sandock 0.9.28
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/LICENSE +201 -0
- package/README.md +143 -0
- package/dist/__tests__/sandock-sandbox.test.d.ts +2 -0
- package/dist/__tests__/sandock-sandbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandock-sandbox.test.js +531 -0
- package/dist/__tests__/sandock-sandbox.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/sandock-sandbox.d.ts +132 -0
- package/dist/sandock-sandbox.d.ts.map +1 -0
- package/dist/sandock-sandbox.js +537 -0
- package/dist/sandock-sandbox.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { SandockSandbox } from "../sandock-sandbox.js";
|
|
3
|
+
// Mock the sandock SDK
|
|
4
|
+
vi.mock("sandock", () => ({
|
|
5
|
+
createSandockClient: vi.fn(() => ({
|
|
6
|
+
DELETE: vi.fn().mockResolvedValue({
|
|
7
|
+
data: { data: { id: "sandbox-123", deleted: true } },
|
|
8
|
+
error: null,
|
|
9
|
+
}),
|
|
10
|
+
// High-level sandbox API with streaming support
|
|
11
|
+
sandbox: {
|
|
12
|
+
create: vi.fn().mockResolvedValue({
|
|
13
|
+
success: true,
|
|
14
|
+
data: { id: "sandbox-123" },
|
|
15
|
+
}),
|
|
16
|
+
start: vi.fn().mockResolvedValue({
|
|
17
|
+
success: true,
|
|
18
|
+
data: { id: "sandbox-123", started: true },
|
|
19
|
+
}),
|
|
20
|
+
get: vi.fn().mockResolvedValue({
|
|
21
|
+
success: true,
|
|
22
|
+
data: { id: "sandbox-123", status: "RUNNING" },
|
|
23
|
+
}),
|
|
24
|
+
shell: vi.fn().mockImplementation((_sandboxId, _command, callbacks) => {
|
|
25
|
+
// Simulate streaming output
|
|
26
|
+
if (callbacks?.onStdout) {
|
|
27
|
+
callbacks.onStdout("command output");
|
|
28
|
+
}
|
|
29
|
+
return Promise.resolve({
|
|
30
|
+
success: true,
|
|
31
|
+
data: {
|
|
32
|
+
stdout: "command output",
|
|
33
|
+
stderr: "",
|
|
34
|
+
exitCode: 0,
|
|
35
|
+
timedOut: false,
|
|
36
|
+
durationMs: 100,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}),
|
|
40
|
+
stop: vi.fn().mockResolvedValue({
|
|
41
|
+
success: true,
|
|
42
|
+
data: { id: "sandbox-123", stopped: true },
|
|
43
|
+
}),
|
|
44
|
+
delete: vi.fn().mockResolvedValue({
|
|
45
|
+
success: true,
|
|
46
|
+
data: { id: "sandbox-123", deleted: true },
|
|
47
|
+
}),
|
|
48
|
+
},
|
|
49
|
+
// High-level fs API
|
|
50
|
+
fs: {
|
|
51
|
+
write: vi.fn().mockResolvedValue({
|
|
52
|
+
success: true,
|
|
53
|
+
data: true,
|
|
54
|
+
}),
|
|
55
|
+
},
|
|
56
|
+
// High-level volume API
|
|
57
|
+
volume: {
|
|
58
|
+
getByName: vi.fn().mockResolvedValue({
|
|
59
|
+
success: true,
|
|
60
|
+
data: { id: "volume-123", status: "ready" },
|
|
61
|
+
}),
|
|
62
|
+
},
|
|
63
|
+
})),
|
|
64
|
+
}));
|
|
65
|
+
describe("SandockSandbox", () => {
|
|
66
|
+
beforeEach(() => {
|
|
67
|
+
vi.clearAllMocks();
|
|
68
|
+
// Set API key for tests
|
|
69
|
+
process.env.SANDOCK_API_KEY = "test-api-key";
|
|
70
|
+
});
|
|
71
|
+
describe("constructor", () => {
|
|
72
|
+
it("should use default values", () => {
|
|
73
|
+
const sandbox = new SandockSandbox();
|
|
74
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
75
|
+
});
|
|
76
|
+
it("should accept custom options", () => {
|
|
77
|
+
const sandbox = new SandockSandbox({
|
|
78
|
+
baseUrl: "https://custom.sandock.ai",
|
|
79
|
+
apiKey: "custom-api-key",
|
|
80
|
+
image: "python:3.11-slim",
|
|
81
|
+
workdir: "/app",
|
|
82
|
+
memoryLimitMb: 1024,
|
|
83
|
+
cpuShares: 512,
|
|
84
|
+
keep: false,
|
|
85
|
+
command: ["/bin/sh", "-c", "echo hello"],
|
|
86
|
+
});
|
|
87
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
88
|
+
});
|
|
89
|
+
it("should warn when SANDOCK_API_KEY is not set", () => {
|
|
90
|
+
delete process.env.SANDOCK_API_KEY;
|
|
91
|
+
const consoleSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
92
|
+
new SandockSandbox();
|
|
93
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("SANDOCK_API_KEY not set"));
|
|
94
|
+
consoleSpy.mockRestore();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("attach", () => {
|
|
98
|
+
it("should implement SandboxAdapter interface", () => {
|
|
99
|
+
const sandbox = new SandockSandbox();
|
|
100
|
+
expect(typeof sandbox.attach).toBe("function");
|
|
101
|
+
});
|
|
102
|
+
it("should return a handle with required methods", async () => {
|
|
103
|
+
const sandbox = new SandockSandbox();
|
|
104
|
+
const handle = await sandbox.attach();
|
|
105
|
+
expect(typeof handle.exec).toBe("function");
|
|
106
|
+
expect(typeof handle.upload).toBe("function");
|
|
107
|
+
expect(typeof handle.destroy).toBe("function");
|
|
108
|
+
});
|
|
109
|
+
it("should create and start sandbox via API", async () => {
|
|
110
|
+
const sandbox = new SandockSandbox();
|
|
111
|
+
const handle = await sandbox.attach();
|
|
112
|
+
expect(handle).toBeDefined();
|
|
113
|
+
});
|
|
114
|
+
it("should pass command option to Sandock API when provided", async () => {
|
|
115
|
+
const { createSandockClient } = await import("sandock");
|
|
116
|
+
const mockCreateClient = createSandockClient;
|
|
117
|
+
const sandbox = new SandockSandbox({
|
|
118
|
+
command: ["/bin/sh", "-c", "echo hello"],
|
|
119
|
+
});
|
|
120
|
+
await sandbox.attach();
|
|
121
|
+
// The client is created in the constructor, get the returned mock
|
|
122
|
+
const mockClient = mockCreateClient.mock.results[mockCreateClient.mock.results.length - 1].value;
|
|
123
|
+
expect(mockClient.sandbox.create).toHaveBeenCalledWith(expect.objectContaining({
|
|
124
|
+
command: ["/bin/sh", "-c", "echo hello"],
|
|
125
|
+
}));
|
|
126
|
+
});
|
|
127
|
+
it("should not pass command to Sandock API when not provided", async () => {
|
|
128
|
+
const { createSandockClient } = await import("sandock");
|
|
129
|
+
const mockCreateClient = createSandockClient;
|
|
130
|
+
const sandbox = new SandockSandbox();
|
|
131
|
+
await sandbox.attach();
|
|
132
|
+
const mockClient = mockCreateClient.mock.results[mockCreateClient.mock.results.length - 1].value;
|
|
133
|
+
expect(mockClient.sandbox.create).toHaveBeenCalledWith(expect.objectContaining({
|
|
134
|
+
command: undefined,
|
|
135
|
+
}));
|
|
136
|
+
});
|
|
137
|
+
it("should call start after STOPPED; attach when start reports started", async () => {
|
|
138
|
+
const { createSandockClient } = await import("sandock");
|
|
139
|
+
const mockCreateClient = createSandockClient;
|
|
140
|
+
const get = vi.fn().mockResolvedValue({
|
|
141
|
+
success: true,
|
|
142
|
+
data: { id: "reuse-1", status: "STOPPED" },
|
|
143
|
+
});
|
|
144
|
+
const start = vi.fn().mockResolvedValue({
|
|
145
|
+
success: true,
|
|
146
|
+
data: { id: "reuse-1", started: true },
|
|
147
|
+
});
|
|
148
|
+
mockCreateClient.mockReturnValueOnce({
|
|
149
|
+
sandbox: {
|
|
150
|
+
create: vi.fn().mockResolvedValue({
|
|
151
|
+
success: true,
|
|
152
|
+
data: { id: "reuse-1" },
|
|
153
|
+
}),
|
|
154
|
+
start,
|
|
155
|
+
get,
|
|
156
|
+
shell: vi.fn().mockResolvedValue({
|
|
157
|
+
success: true,
|
|
158
|
+
data: {
|
|
159
|
+
stdout: "",
|
|
160
|
+
stderr: "",
|
|
161
|
+
exitCode: 0,
|
|
162
|
+
timedOut: false,
|
|
163
|
+
durationMs: 0,
|
|
164
|
+
},
|
|
165
|
+
}),
|
|
166
|
+
stop: vi.fn().mockResolvedValue({
|
|
167
|
+
success: true,
|
|
168
|
+
data: { id: "reuse-1", stopped: true },
|
|
169
|
+
}),
|
|
170
|
+
delete: vi.fn().mockResolvedValue({
|
|
171
|
+
success: true,
|
|
172
|
+
data: { id: "reuse-1", deleted: true },
|
|
173
|
+
}),
|
|
174
|
+
},
|
|
175
|
+
fs: {
|
|
176
|
+
write: vi.fn().mockResolvedValue({ success: true, data: true }),
|
|
177
|
+
read: vi.fn(),
|
|
178
|
+
list: vi.fn(),
|
|
179
|
+
delete: vi.fn(),
|
|
180
|
+
},
|
|
181
|
+
volume: {
|
|
182
|
+
getByName: vi.fn().mockResolvedValue({
|
|
183
|
+
success: true,
|
|
184
|
+
data: { id: "volume-123", status: "ready" },
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
DELETE: vi.fn().mockResolvedValue({
|
|
188
|
+
data: { data: { id: "reuse-1", deleted: true } },
|
|
189
|
+
error: null,
|
|
190
|
+
}),
|
|
191
|
+
});
|
|
192
|
+
const sandbox = new SandockSandbox({
|
|
193
|
+
sandboxId: "reuse-1",
|
|
194
|
+
timeout: 5000,
|
|
195
|
+
});
|
|
196
|
+
const handle = await sandbox.attach();
|
|
197
|
+
expect(start).toHaveBeenCalledWith("reuse-1");
|
|
198
|
+
expect(get.mock.calls.length).toBe(1);
|
|
199
|
+
expect(handle).toBeDefined();
|
|
200
|
+
expect(handle.getSandboxId()).toBe("reuse-1");
|
|
201
|
+
});
|
|
202
|
+
it("should create a new sandbox when start() returns started false on STOPPED", async () => {
|
|
203
|
+
const { createSandockClient } = await import("sandock");
|
|
204
|
+
const mockCreateClient = createSandockClient;
|
|
205
|
+
const staleId = "stale-reuse";
|
|
206
|
+
const get = vi.fn().mockResolvedValue({
|
|
207
|
+
success: true,
|
|
208
|
+
data: { id: staleId, status: "STOPPED" },
|
|
209
|
+
});
|
|
210
|
+
const start = vi.fn().mockResolvedValue({
|
|
211
|
+
success: true,
|
|
212
|
+
data: { id: staleId, started: false },
|
|
213
|
+
});
|
|
214
|
+
const create = vi.fn().mockResolvedValue({
|
|
215
|
+
success: true,
|
|
216
|
+
data: { id: "sandbox-123" },
|
|
217
|
+
});
|
|
218
|
+
mockCreateClient.mockReturnValueOnce({
|
|
219
|
+
sandbox: {
|
|
220
|
+
create,
|
|
221
|
+
start,
|
|
222
|
+
get,
|
|
223
|
+
shell: vi.fn().mockResolvedValue({
|
|
224
|
+
success: true,
|
|
225
|
+
data: {
|
|
226
|
+
stdout: "",
|
|
227
|
+
stderr: "",
|
|
228
|
+
exitCode: 0,
|
|
229
|
+
timedOut: false,
|
|
230
|
+
durationMs: 0,
|
|
231
|
+
},
|
|
232
|
+
}),
|
|
233
|
+
stop: vi.fn().mockResolvedValue({
|
|
234
|
+
success: true,
|
|
235
|
+
data: { id: "sandbox-123", stopped: true },
|
|
236
|
+
}),
|
|
237
|
+
delete: vi.fn().mockResolvedValue({
|
|
238
|
+
success: true,
|
|
239
|
+
data: { id: "sandbox-123", deleted: true },
|
|
240
|
+
}),
|
|
241
|
+
},
|
|
242
|
+
fs: {
|
|
243
|
+
write: vi.fn().mockResolvedValue({ success: true, data: true }),
|
|
244
|
+
read: vi.fn(),
|
|
245
|
+
list: vi.fn(),
|
|
246
|
+
delete: vi.fn(),
|
|
247
|
+
},
|
|
248
|
+
volume: {
|
|
249
|
+
getByName: vi.fn().mockResolvedValue({
|
|
250
|
+
success: true,
|
|
251
|
+
data: { id: "volume-123", status: "ready" },
|
|
252
|
+
}),
|
|
253
|
+
},
|
|
254
|
+
DELETE: vi.fn().mockResolvedValue({
|
|
255
|
+
data: { data: { id: "sandbox-123", deleted: true } },
|
|
256
|
+
error: null,
|
|
257
|
+
}),
|
|
258
|
+
});
|
|
259
|
+
const sandbox = new SandockSandbox({
|
|
260
|
+
sandboxId: staleId,
|
|
261
|
+
timeout: 5000,
|
|
262
|
+
});
|
|
263
|
+
const handle = await sandbox.attach();
|
|
264
|
+
expect(start).toHaveBeenCalledWith(staleId);
|
|
265
|
+
expect(create).toHaveBeenCalled();
|
|
266
|
+
expect(handle.getSandboxId()).toBe("sandbox-123");
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
describe("SandboxHandle", () => {
|
|
270
|
+
it("should execute commands and return output", async () => {
|
|
271
|
+
const sandbox = new SandockSandbox();
|
|
272
|
+
const handle = await sandbox.attach();
|
|
273
|
+
const chunks = [];
|
|
274
|
+
for await (const chunk of handle.exec(["echo", "hello"])) {
|
|
275
|
+
chunks.push(chunk);
|
|
276
|
+
}
|
|
277
|
+
expect(chunks.length).toBeGreaterThan(0);
|
|
278
|
+
const output = new TextDecoder().decode(chunks[0]);
|
|
279
|
+
expect(output).toBe("command output");
|
|
280
|
+
});
|
|
281
|
+
it("should upload files via API", async () => {
|
|
282
|
+
const sandbox = new SandockSandbox();
|
|
283
|
+
const handle = await sandbox.attach();
|
|
284
|
+
await handle.upload([{ path: "test.txt", content: "Hello, World!" }], "/workspace");
|
|
285
|
+
// No error means success
|
|
286
|
+
});
|
|
287
|
+
it("should destroy sandbox via API", async () => {
|
|
288
|
+
const sandbox = new SandockSandbox();
|
|
289
|
+
const handle = await sandbox.attach();
|
|
290
|
+
await handle.destroy();
|
|
291
|
+
// No error means success
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
describe("SandockSandbox Configuration", () => {
|
|
296
|
+
beforeEach(() => {
|
|
297
|
+
process.env.SANDOCK_API_KEY = "test-api-key";
|
|
298
|
+
});
|
|
299
|
+
it("should support custom base URLs", () => {
|
|
300
|
+
const sandbox = new SandockSandbox({
|
|
301
|
+
baseUrl: "https://custom.sandock.ai",
|
|
302
|
+
});
|
|
303
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
304
|
+
});
|
|
305
|
+
it("should support custom Docker images", () => {
|
|
306
|
+
const images = [
|
|
307
|
+
"sandockai/sandock-code:latest",
|
|
308
|
+
"python:3.11-slim",
|
|
309
|
+
"node:20-slim",
|
|
310
|
+
];
|
|
311
|
+
for (const image of images) {
|
|
312
|
+
const sandbox = new SandockSandbox({ image });
|
|
313
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
it("should support memory and CPU limits", () => {
|
|
317
|
+
const sandbox = new SandockSandbox({
|
|
318
|
+
memoryLimitMb: 2048,
|
|
319
|
+
cpuShares: 1024,
|
|
320
|
+
});
|
|
321
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
322
|
+
});
|
|
323
|
+
it("should support keep option", () => {
|
|
324
|
+
const keepTrue = new SandockSandbox({ keep: true });
|
|
325
|
+
const keepFalse = new SandockSandbox({ keep: false });
|
|
326
|
+
expect(keepTrue).toBeInstanceOf(SandockSandbox);
|
|
327
|
+
expect(keepFalse).toBeInstanceOf(SandockSandbox);
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
describe("SandockSandbox Cache and Reuse", () => {
|
|
331
|
+
beforeEach(() => {
|
|
332
|
+
process.env.SANDOCK_API_KEY = "test-api-key";
|
|
333
|
+
vi.clearAllMocks();
|
|
334
|
+
});
|
|
335
|
+
it("should return same handle when attach() is called multiple times on same instance", async () => {
|
|
336
|
+
const sandbox = new SandockSandbox();
|
|
337
|
+
const handle1 = await sandbox.attach();
|
|
338
|
+
const handle2 = await sandbox.attach();
|
|
339
|
+
// Sandock generates new ID each time, but same instance should return cached handle
|
|
340
|
+
// Note: getHandle() returns the current handle if attached
|
|
341
|
+
expect(sandbox.getHandle()).toBeDefined();
|
|
342
|
+
// Both handles should be valid
|
|
343
|
+
expect(handle1).toBeDefined();
|
|
344
|
+
expect(handle2).toBeDefined();
|
|
345
|
+
});
|
|
346
|
+
it("should generate unique ID for each attach() call", async () => {
|
|
347
|
+
const sandbox = new SandockSandbox();
|
|
348
|
+
const handle1 = await sandbox.attach();
|
|
349
|
+
// Note: Each attach() generates a new ID, but same instance returns cached handle
|
|
350
|
+
// This test verifies the caching behavior within the same instance
|
|
351
|
+
expect(handle1).toBeDefined();
|
|
352
|
+
});
|
|
353
|
+
it("should cache sandbox instances in memory", async () => {
|
|
354
|
+
// The cache is static and shared across all SandockSandbox instances
|
|
355
|
+
const sandbox1 = new SandockSandbox();
|
|
356
|
+
const handle1 = await sandbox1.attach();
|
|
357
|
+
// Same instance should return a handle (may be different due to ID generation)
|
|
358
|
+
const handle2 = await sandbox1.attach();
|
|
359
|
+
expect(handle1).toBeDefined();
|
|
360
|
+
expect(handle2).toBeDefined();
|
|
361
|
+
// Both should have required methods
|
|
362
|
+
expect(typeof handle1.exec).toBe("function");
|
|
363
|
+
expect(typeof handle2.exec).toBe("function");
|
|
364
|
+
});
|
|
365
|
+
it("should create new sandbox when cache is empty", async () => {
|
|
366
|
+
const sandbox = new SandockSandbox();
|
|
367
|
+
const handle = await sandbox.attach();
|
|
368
|
+
expect(handle).toBeDefined();
|
|
369
|
+
expect(typeof handle.exec).toBe("function");
|
|
370
|
+
expect(typeof handle.upload).toBe("function");
|
|
371
|
+
expect(typeof handle.destroy).toBe("function");
|
|
372
|
+
});
|
|
373
|
+
it("should document cache limitations (process-local only)", () => {
|
|
374
|
+
// Sandock cache is process-local and does not persist across:
|
|
375
|
+
// - Process restarts
|
|
376
|
+
// - Different processes
|
|
377
|
+
// - Different machines
|
|
378
|
+
const sandbox = new SandockSandbox();
|
|
379
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
380
|
+
// Cache is managed internally via static Map
|
|
381
|
+
});
|
|
382
|
+
it("should support cache eviction when full", async () => {
|
|
383
|
+
// MAX_CACHE_SIZE is 50, so after 50 instances, oldest will be evicted
|
|
384
|
+
const sandboxes = [];
|
|
385
|
+
const handles = [];
|
|
386
|
+
// Create multiple sandbox instances
|
|
387
|
+
for (let i = 0; i < 5; i++) {
|
|
388
|
+
const sandbox = new SandockSandbox();
|
|
389
|
+
sandboxes.push(sandbox);
|
|
390
|
+
const handle = await sandbox.attach();
|
|
391
|
+
handles.push(handle);
|
|
392
|
+
expect(handle).toBeDefined();
|
|
393
|
+
}
|
|
394
|
+
// All should work, cache eviction happens internally
|
|
395
|
+
expect(handles.length).toBe(5);
|
|
396
|
+
});
|
|
397
|
+
it("should skip initialization for cached instances", async () => {
|
|
398
|
+
const sandbox = new SandockSandbox();
|
|
399
|
+
const handle1 = await sandbox.attach();
|
|
400
|
+
// Second attach on same instance should return a handle
|
|
401
|
+
// Note: Sandock generates new ID each time, but uses cache for same ID
|
|
402
|
+
const handle2 = await sandbox.attach();
|
|
403
|
+
expect(handle1).toBeDefined();
|
|
404
|
+
expect(handle2).toBeDefined();
|
|
405
|
+
// Both handles should work
|
|
406
|
+
expect(typeof handle1.exec).toBe("function");
|
|
407
|
+
expect(typeof handle2.exec).toBe("function");
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
describe("SandockSandbox Volume Persistence", () => {
|
|
411
|
+
beforeEach(() => {
|
|
412
|
+
process.env.SANDOCK_API_KEY = "test-api-key";
|
|
413
|
+
vi.clearAllMocks();
|
|
414
|
+
});
|
|
415
|
+
it("should support volume-based persistence", async () => {
|
|
416
|
+
const volumeName = "my-project-volume";
|
|
417
|
+
const sandbox = new SandockSandbox({
|
|
418
|
+
volumes: [{ volumeName, volumeMountPath: "/bunny-agent" }],
|
|
419
|
+
});
|
|
420
|
+
const handle = await sandbox.attach();
|
|
421
|
+
expect(handle).toBeDefined();
|
|
422
|
+
// Volume would be created/retrieved and mounted
|
|
423
|
+
});
|
|
424
|
+
it("should create volume if it doesn't exist", async () => {
|
|
425
|
+
const sandbox = new SandockSandbox({
|
|
426
|
+
volumes: [{ volumeName: "new-volume", volumeMountPath: "/bunny-agent" }],
|
|
427
|
+
});
|
|
428
|
+
const handle = await sandbox.attach();
|
|
429
|
+
expect(handle).toBeDefined();
|
|
430
|
+
// Volume would be created with createIfNotExists = true
|
|
431
|
+
});
|
|
432
|
+
it("should use existing volume if it exists", async () => {
|
|
433
|
+
const sandbox = new SandockSandbox({
|
|
434
|
+
volumes: [
|
|
435
|
+
{ volumeName: "existing-volume", volumeMountPath: "/bunny-agent" },
|
|
436
|
+
],
|
|
437
|
+
});
|
|
438
|
+
const handle = await sandbox.attach();
|
|
439
|
+
expect(handle).toBeDefined();
|
|
440
|
+
// Would get existing volume and mount it
|
|
441
|
+
});
|
|
442
|
+
it("should mount volume at specified path", () => {
|
|
443
|
+
const sandbox = new SandockSandbox({
|
|
444
|
+
volumes: [{ volumeName: "test-volume", volumeMountPath: "/custom/path" }],
|
|
445
|
+
});
|
|
446
|
+
expect(sandbox).toBeInstanceOf(SandockSandbox);
|
|
447
|
+
// Volume would be mounted at /custom/path instead of default /bunny-agent
|
|
448
|
+
});
|
|
449
|
+
it("should skip initialization when files exist in volume", async () => {
|
|
450
|
+
// When reusing sandbox with existing volume:
|
|
451
|
+
// - needsInit = false (files are in volume)
|
|
452
|
+
// - Skip upload of runner bundle and templates
|
|
453
|
+
const sandbox = new SandockSandbox({
|
|
454
|
+
volumes: [
|
|
455
|
+
{ volumeName: "existing-volume", volumeMountPath: "/bunny-agent" },
|
|
456
|
+
],
|
|
457
|
+
});
|
|
458
|
+
const handle = await sandbox.attach();
|
|
459
|
+
expect(handle).toBeDefined();
|
|
460
|
+
});
|
|
461
|
+
it("should wait for volume to be ready", async () => {
|
|
462
|
+
const sandbox = new SandockSandbox({
|
|
463
|
+
volumes: [{ volumeName: "test-volume", volumeMountPath: "/bunny-agent" }],
|
|
464
|
+
});
|
|
465
|
+
const handle = await sandbox.attach();
|
|
466
|
+
expect(handle).toBeDefined();
|
|
467
|
+
// In real scenario, would wait for volume.status === "ready"
|
|
468
|
+
});
|
|
469
|
+
it("should skip initialization when reusing existing sandbox with volume", async () => {
|
|
470
|
+
const volumeName = "existing-volume";
|
|
471
|
+
const sandbox = new SandockSandbox({
|
|
472
|
+
volumes: [{ volumeName, volumeMountPath: "/bunny-agent" }],
|
|
473
|
+
});
|
|
474
|
+
// First attach would create and initialize
|
|
475
|
+
const handle1 = await sandbox.attach();
|
|
476
|
+
// Second attach on same instance returns cached handle
|
|
477
|
+
const handle2 = await sandbox.attach();
|
|
478
|
+
expect(handle1).toBeDefined();
|
|
479
|
+
expect(handle2).toBeDefined();
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
describe("Shell Escaping", () => {
|
|
483
|
+
// Test the escaping logic used in exec's baseCmd construction
|
|
484
|
+
// This mirrors the logic: command.map(arg => "'" + arg.replace(/'/g, "'\\''") + "'").join(" ")
|
|
485
|
+
function shellEscapeArgs(command) {
|
|
486
|
+
return command.length === 1
|
|
487
|
+
? command[0]
|
|
488
|
+
: command.map((arg) => "'" + arg.replace(/'/g, "'\\''") + "'").join(" ");
|
|
489
|
+
}
|
|
490
|
+
it("should wrap each argument in single quotes", () => {
|
|
491
|
+
const result = shellEscapeArgs(["echo", "hello world"]);
|
|
492
|
+
expect(result).toBe("'echo' 'hello world'");
|
|
493
|
+
});
|
|
494
|
+
it("should escape single quotes inside arguments", () => {
|
|
495
|
+
const result = shellEscapeArgs(["echo", "it's a test"]);
|
|
496
|
+
expect(result).toBe("'echo' 'it'\\''s a test'");
|
|
497
|
+
});
|
|
498
|
+
it("should handle arguments with newlines and special chars", () => {
|
|
499
|
+
const prompt = "You are an agent.\n## Environment\n- Platform: Buda";
|
|
500
|
+
const result = shellEscapeArgs([
|
|
501
|
+
"runner",
|
|
502
|
+
"--system-prompt",
|
|
503
|
+
prompt,
|
|
504
|
+
"--",
|
|
505
|
+
"hi",
|
|
506
|
+
]);
|
|
507
|
+
expect(result).toContain("'runner'");
|
|
508
|
+
expect(result).toContain("'--system-prompt'");
|
|
509
|
+
expect(result).toContain("'--'");
|
|
510
|
+
expect(result).toContain("'hi'");
|
|
511
|
+
// The prompt should be safely inside single quotes
|
|
512
|
+
expect(result).toContain("'" + prompt + "'");
|
|
513
|
+
});
|
|
514
|
+
it("should not wrap single-element commands", () => {
|
|
515
|
+
const result = shellEscapeArgs(["ls -la"]);
|
|
516
|
+
expect(result).toBe("ls -la");
|
|
517
|
+
});
|
|
518
|
+
it("should handle empty arguments", () => {
|
|
519
|
+
const result = shellEscapeArgs(["echo", ""]);
|
|
520
|
+
expect(result).toBe("'echo' ''");
|
|
521
|
+
});
|
|
522
|
+
it("should handle arguments with hash characters", () => {
|
|
523
|
+
const result = shellEscapeArgs(["echo", "# this is not a comment"]);
|
|
524
|
+
expect(result).toBe("'echo' '# this is not a comment'");
|
|
525
|
+
});
|
|
526
|
+
it("should handle arguments with double dashes", () => {
|
|
527
|
+
const result = shellEscapeArgs(["cmd", "--", "arg"]);
|
|
528
|
+
expect(result).toBe("'cmd' '--' 'arg'");
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
//# sourceMappingURL=sandock-sandbox.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandock-sandbox.test.js","sourceRoot":"","sources":["../../src/__tests__/sandock-sandbox.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,sBAAsB,CAAC"}
|