@bunny-agent/manager 0.9.51-beta.1 → 0.9.51-beta.2
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/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/__tests__/local-sandbox.test.d.ts +0 -2
- package/dist/__tests__/local-sandbox.test.d.ts.map +0 -1
- package/dist/__tests__/local-sandbox.test.js +0 -274
- package/dist/__tests__/local-sandbox.test.js.map +0 -1
- package/dist/local-sandbox.d.ts +0 -83
- package/dist/local-sandbox.d.ts.map +0 -1
- package/dist/local-sandbox.js +0 -364
- package/dist/local-sandbox.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,8 +6,6 @@ export type { IsBunnyAgentDaemonHealthyOptions } from "./daemon-health.js";
|
|
|
6
6
|
export { isBunnyAgentDaemonHealthy } from "./daemon-health.js";
|
|
7
7
|
export type { RunnerEnvParams, RunnerType } from "./env.js";
|
|
8
8
|
export { buildRunnerEnv } from "./env.js";
|
|
9
|
-
export type { LocalSandboxOptions } from "./local-sandbox.js";
|
|
10
|
-
export { LocalSandbox } from "./local-sandbox.js";
|
|
11
9
|
export { ConsoleTranscriptWriter, JsonlTranscriptWriter, MemoryTranscriptWriter, MultiTranscriptWriter, } from "./transcript.js";
|
|
12
10
|
export type { BunnyAgentCodingRunBody, BunnyAgentOptions, ExecOptions, Message, RunnerSpec, SandboxAdapter, SandboxHandle, StreamInput, ToolInputSchema, ToolRef, ToolRuntime, TranscriptEntry, TranscriptWriter, Volume, } from "./types.js";
|
|
13
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,sCAAsC,EACtC,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,sCAAsC,EACtC,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM1C,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,UAAU,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,eAAe,EACf,OAAO,EACP,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,MAAM,GACP,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,10 @@ export { DEFAULT_BUNNY_AGENT_DAEMON_URL } from "./constants.js";
|
|
|
4
4
|
export { isBunnyAgentDaemonHealthy } from "./daemon-health.js";
|
|
5
5
|
// Env helpers
|
|
6
6
|
export { buildRunnerEnv } from "./env.js";
|
|
7
|
-
//
|
|
8
|
-
|
|
7
|
+
// Local adapters live in their own packages, mirroring the cloud adapters:
|
|
8
|
+
// @bunny-agent/sandbox-local (LocalMachine — NO isolation) and
|
|
9
|
+
// @bunny-agent/sandbox-srt (SrtSandbox — OS-level isolation via
|
|
10
|
+
// @anthropic-ai/sandbox-runtime). Both are also re-exported from
|
|
11
|
+
// @bunny-agent/sdk for convenience.
|
|
9
12
|
export { ConsoleTranscriptWriter, JsonlTranscriptWriter, MemoryTranscriptWriter, MultiTranscriptWriter, } from "./transcript.js";
|
|
10
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,sCAAsC,EACtC,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,sCAAsC,EACtC,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,2EAA2E;AAC3E,+DAA+D;AAC/D,gEAAgE;AAChE,iEAAiE;AACjE,oCAAoC;AACpC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bunny-agent/manager",
|
|
3
|
-
"version": "0.9.51-beta.
|
|
3
|
+
"version": "0.9.51-beta.2",
|
|
4
4
|
"description": "BunnyAgent Manager - Manages sandbox and runner lifecycle, defines core interfaces",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"typescript": "^5.3.0",
|
|
40
40
|
"vitest": "^1.6.1"
|
|
41
41
|
},
|
|
42
|
+
"dependencies": {},
|
|
42
43
|
"scripts": {
|
|
43
44
|
"build": "tsc",
|
|
44
45
|
"dev": "tsc --watch",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local-sandbox.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/local-sandbox.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs/promises";
|
|
2
|
-
import * as os from "node:os";
|
|
3
|
-
import * as path from "node:path";
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { LocalSandbox } from "../local-sandbox.js";
|
|
6
|
-
describe("LocalSandbox", () => {
|
|
7
|
-
let tempDir;
|
|
8
|
-
beforeEach(async () => {
|
|
9
|
-
// Create a temporary directory for testing
|
|
10
|
-
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "local-sandbox-test-"));
|
|
11
|
-
});
|
|
12
|
-
afterEach(async () => {
|
|
13
|
-
// Clean up temporary directory
|
|
14
|
-
try {
|
|
15
|
-
await fs.rm(tempDir, { recursive: true, force: true });
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
console.warn(`Failed to clean up temp dir: ${tempDir}`, error);
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
describe("constructor", () => {
|
|
22
|
-
it("should create an instance with default options", () => {
|
|
23
|
-
const sandbox = new LocalSandbox();
|
|
24
|
-
expect(sandbox).toBeInstanceOf(LocalSandbox);
|
|
25
|
-
});
|
|
26
|
-
it("should accept custom options", () => {
|
|
27
|
-
const sandbox = new LocalSandbox({
|
|
28
|
-
workdir: tempDir,
|
|
29
|
-
defaultTimeout: 30000,
|
|
30
|
-
});
|
|
31
|
-
expect(sandbox).toBeInstanceOf(LocalSandbox);
|
|
32
|
-
});
|
|
33
|
-
it("should use process.cwd() as default workdir", () => {
|
|
34
|
-
const sandbox = new LocalSandbox();
|
|
35
|
-
expect(sandbox).toBeInstanceOf(LocalSandbox);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
describe("attach", () => {
|
|
39
|
-
it("should use workdir as working directory", async () => {
|
|
40
|
-
const sandbox = new LocalSandbox({
|
|
41
|
-
workdir: tempDir,
|
|
42
|
-
});
|
|
43
|
-
const handle = await sandbox.attach();
|
|
44
|
-
expect(handle).toBeDefined();
|
|
45
|
-
expect(handle.getWorkdir()).toBe(tempDir);
|
|
46
|
-
await handle.destroy();
|
|
47
|
-
});
|
|
48
|
-
it("should return a SandboxHandle", async () => {
|
|
49
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
50
|
-
const handle = await sandbox.attach();
|
|
51
|
-
expect(typeof handle.exec).toBe("function");
|
|
52
|
-
expect(typeof handle.upload).toBe("function");
|
|
53
|
-
expect(typeof handle.destroy).toBe("function");
|
|
54
|
-
await handle.destroy();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
describe("SandboxHandle.exec", () => {
|
|
58
|
-
it("should execute a simple command", async () => {
|
|
59
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
60
|
-
const handle = await sandbox.attach();
|
|
61
|
-
const chunks = [];
|
|
62
|
-
for await (const chunk of handle.exec(["echo", "hello world"])) {
|
|
63
|
-
chunks.push(new TextDecoder().decode(chunk));
|
|
64
|
-
}
|
|
65
|
-
const output = chunks.join("");
|
|
66
|
-
expect(output.trim()).toBe("hello world");
|
|
67
|
-
await handle.destroy();
|
|
68
|
-
});
|
|
69
|
-
it("should execute commands in specified working directory", async () => {
|
|
70
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
71
|
-
const handle = await sandbox.attach();
|
|
72
|
-
// Create a subdirectory
|
|
73
|
-
const subDir = "subdir";
|
|
74
|
-
await handle.upload([], subDir); // Creates the directory
|
|
75
|
-
// Create a test file in the subdirectory
|
|
76
|
-
await handle.upload([{ path: "test.txt", content: "test content" }], subDir);
|
|
77
|
-
// List files in the subdirectory
|
|
78
|
-
const chunks = [];
|
|
79
|
-
for await (const chunk of handle.exec(["ls"], { cwd: subDir })) {
|
|
80
|
-
chunks.push(new TextDecoder().decode(chunk));
|
|
81
|
-
}
|
|
82
|
-
const output = chunks.join("");
|
|
83
|
-
expect(output).toContain("test.txt");
|
|
84
|
-
await handle.destroy();
|
|
85
|
-
});
|
|
86
|
-
it("should pass environment variables", async () => {
|
|
87
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
88
|
-
const handle = await sandbox.attach();
|
|
89
|
-
const chunks = [];
|
|
90
|
-
for await (const chunk of handle.exec(["sh", "-c", "echo $TEST_VAR"], {
|
|
91
|
-
env: { TEST_VAR: "test-value" },
|
|
92
|
-
})) {
|
|
93
|
-
chunks.push(new TextDecoder().decode(chunk));
|
|
94
|
-
}
|
|
95
|
-
const output = chunks.join("");
|
|
96
|
-
expect(output.trim()).toBe("test-value");
|
|
97
|
-
await handle.destroy();
|
|
98
|
-
});
|
|
99
|
-
it("should throw error for non-existent command", async () => {
|
|
100
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
101
|
-
const handle = await sandbox.attach();
|
|
102
|
-
await expect(async () => {
|
|
103
|
-
const chunks = [];
|
|
104
|
-
for await (const chunk of handle.exec([
|
|
105
|
-
"non-existent-command-xyz123",
|
|
106
|
-
])) {
|
|
107
|
-
chunks.push(chunk);
|
|
108
|
-
}
|
|
109
|
-
}).rejects.toThrow();
|
|
110
|
-
await handle.destroy();
|
|
111
|
-
});
|
|
112
|
-
it("should throw error for empty command", async () => {
|
|
113
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
114
|
-
const handle = await sandbox.attach();
|
|
115
|
-
await expect(async () => {
|
|
116
|
-
const chunks = [];
|
|
117
|
-
for await (const chunk of handle.exec([])) {
|
|
118
|
-
chunks.push(chunk);
|
|
119
|
-
}
|
|
120
|
-
}).rejects.toThrow("Command cannot be empty");
|
|
121
|
-
await handle.destroy();
|
|
122
|
-
});
|
|
123
|
-
it("should handle command timeout", async () => {
|
|
124
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
125
|
-
const handle = await sandbox.attach();
|
|
126
|
-
await expect(async () => {
|
|
127
|
-
const chunks = [];
|
|
128
|
-
for await (const chunk of handle.exec(["sleep", "10"], {
|
|
129
|
-
timeout: 100, // 100ms timeout
|
|
130
|
-
})) {
|
|
131
|
-
chunks.push(chunk);
|
|
132
|
-
}
|
|
133
|
-
}).rejects.toThrow(/timed out/i);
|
|
134
|
-
await handle.destroy();
|
|
135
|
-
}, 10000); // Test timeout of 10 seconds
|
|
136
|
-
it("should support abort signal", async () => {
|
|
137
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
138
|
-
const handle = await sandbox.attach();
|
|
139
|
-
const abortController = new AbortController();
|
|
140
|
-
// Abort after 100ms
|
|
141
|
-
setTimeout(() => abortController.abort(), 100);
|
|
142
|
-
await expect(async () => {
|
|
143
|
-
const chunks = [];
|
|
144
|
-
for await (const chunk of handle.exec(["sleep", "10"], {
|
|
145
|
-
signal: abortController.signal,
|
|
146
|
-
})) {
|
|
147
|
-
chunks.push(chunk);
|
|
148
|
-
}
|
|
149
|
-
}).rejects.toThrow();
|
|
150
|
-
await handle.destroy();
|
|
151
|
-
}, 10000);
|
|
152
|
-
});
|
|
153
|
-
describe("SandboxHandle.upload", () => {
|
|
154
|
-
it("should upload a single file", async () => {
|
|
155
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
156
|
-
const handle = await sandbox.attach();
|
|
157
|
-
await handle.upload([{ path: "test.txt", content: "Hello, World!" }], ".");
|
|
158
|
-
// Verify the file was created
|
|
159
|
-
const filePath = path.join(tempDir, "test.txt");
|
|
160
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
161
|
-
expect(content).toBe("Hello, World!");
|
|
162
|
-
await handle.destroy();
|
|
163
|
-
});
|
|
164
|
-
it("should upload multiple files", async () => {
|
|
165
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
166
|
-
const handle = await sandbox.attach();
|
|
167
|
-
await handle.upload([
|
|
168
|
-
{ path: "file1.txt", content: "Content 1" },
|
|
169
|
-
{ path: "file2.txt", content: "Content 2" },
|
|
170
|
-
{ path: "file3.txt", content: "Content 3" },
|
|
171
|
-
], "uploads");
|
|
172
|
-
// Verify all files were created
|
|
173
|
-
const uploadsDir = path.join(tempDir, "uploads");
|
|
174
|
-
const files = await fs.readdir(uploadsDir);
|
|
175
|
-
expect(files).toContain("file1.txt");
|
|
176
|
-
expect(files).toContain("file2.txt");
|
|
177
|
-
expect(files).toContain("file3.txt");
|
|
178
|
-
await handle.destroy();
|
|
179
|
-
});
|
|
180
|
-
it("should upload binary content", async () => {
|
|
181
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
182
|
-
const handle = await sandbox.attach();
|
|
183
|
-
const binaryData = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]); // "Hello"
|
|
184
|
-
await handle.upload([{ path: "binary.dat", content: binaryData }], ".");
|
|
185
|
-
// Verify the binary file
|
|
186
|
-
const filePath = path.join(tempDir, "binary.dat");
|
|
187
|
-
const content = await fs.readFile(filePath);
|
|
188
|
-
expect(content).toEqual(Buffer.from(binaryData));
|
|
189
|
-
await handle.destroy();
|
|
190
|
-
});
|
|
191
|
-
it("should create nested directories", async () => {
|
|
192
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
193
|
-
const handle = await sandbox.attach();
|
|
194
|
-
await handle.upload([{ path: "deep/nested/dir/file.txt", content: "Nested content" }], ".");
|
|
195
|
-
// Verify nested file
|
|
196
|
-
const filePath = path.join(tempDir, "deep/nested/dir/file.txt");
|
|
197
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
198
|
-
expect(content).toBe("Nested content");
|
|
199
|
-
await handle.destroy();
|
|
200
|
-
});
|
|
201
|
-
it("should upload to custom target directory", async () => {
|
|
202
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
203
|
-
const handle = await sandbox.attach();
|
|
204
|
-
await handle.upload([{ path: "file.txt", content: "Custom target" }], "custom/target");
|
|
205
|
-
// Verify file in custom location
|
|
206
|
-
const filePath = path.join(tempDir, "custom/target/file.txt");
|
|
207
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
208
|
-
expect(content).toBe("Custom target");
|
|
209
|
-
await handle.destroy();
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
describe("SandboxHandle.destroy", () => {
|
|
213
|
-
it("should complete successfully", async () => {
|
|
214
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
215
|
-
const handle = await sandbox.attach();
|
|
216
|
-
await expect(handle.destroy()).resolves.toBeUndefined();
|
|
217
|
-
});
|
|
218
|
-
it("should not delete the working directory by default", async () => {
|
|
219
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
220
|
-
const handle = await sandbox.attach();
|
|
221
|
-
await handle.upload([{ path: "file.txt", content: "Test" }], ".");
|
|
222
|
-
await handle.destroy();
|
|
223
|
-
// Directory should still exist
|
|
224
|
-
const stat = await fs.stat(tempDir);
|
|
225
|
-
expect(stat.isDirectory()).toBe(true);
|
|
226
|
-
// File should still exist
|
|
227
|
-
const filePath = path.join(tempDir, "file.txt");
|
|
228
|
-
const fileStat = await fs.stat(filePath);
|
|
229
|
-
expect(fileStat.isFile()).toBe(true);
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
describe("Integration tests", () => {
|
|
233
|
-
it("should support a complete workflow", async () => {
|
|
234
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
235
|
-
const handle = await sandbox.attach();
|
|
236
|
-
// Upload a Python script
|
|
237
|
-
await handle.upload([
|
|
238
|
-
{
|
|
239
|
-
path: "script.py",
|
|
240
|
-
content: 'print("Hello from Python!")\nprint("Line 2")',
|
|
241
|
-
},
|
|
242
|
-
], ".");
|
|
243
|
-
// Execute the script
|
|
244
|
-
const chunks = [];
|
|
245
|
-
for await (const chunk of handle.exec(["python3", "script.py"])) {
|
|
246
|
-
chunks.push(new TextDecoder().decode(chunk));
|
|
247
|
-
}
|
|
248
|
-
const output = chunks.join("");
|
|
249
|
-
expect(output).toContain("Hello from Python!");
|
|
250
|
-
expect(output).toContain("Line 2");
|
|
251
|
-
await handle.destroy();
|
|
252
|
-
});
|
|
253
|
-
it("should handle multiple sequential commands", async () => {
|
|
254
|
-
const sandbox = new LocalSandbox({ workdir: tempDir });
|
|
255
|
-
const handle = await sandbox.attach();
|
|
256
|
-
// Create a file
|
|
257
|
-
await handle.upload([{ path: "data.txt", content: "test data" }], ".");
|
|
258
|
-
// Read the file with cat
|
|
259
|
-
const chunks1 = [];
|
|
260
|
-
for await (const chunk of handle.exec(["cat", "data.txt"])) {
|
|
261
|
-
chunks1.push(new TextDecoder().decode(chunk));
|
|
262
|
-
}
|
|
263
|
-
expect(chunks1.join("")).toContain("test data");
|
|
264
|
-
// List files
|
|
265
|
-
const chunks2 = [];
|
|
266
|
-
for await (const chunk of handle.exec(["ls", "-la"])) {
|
|
267
|
-
chunks2.push(new TextDecoder().decode(chunk));
|
|
268
|
-
}
|
|
269
|
-
expect(chunks2.join("")).toContain("data.txt");
|
|
270
|
-
await handle.destroy();
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
//# sourceMappingURL=local-sandbox.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local-sandbox.test.js","sourceRoot":"","sources":["../../src/__tests__/local-sandbox.test.ts"],"names":[],"mappings":"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"}
|
package/dist/local-sandbox.d.ts
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import type { SandboxAdapter, SandboxHandle } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Options for creating a LocalSandbox instance
|
|
4
|
-
*/
|
|
5
|
-
export interface LocalSandboxOptions {
|
|
6
|
-
/** Working directory for all operations (defaults to process.cwd()) */
|
|
7
|
-
workdir?: string;
|
|
8
|
-
/** Path to the agent template directory to copy into the sandbox workdir */
|
|
9
|
-
templatesPath?: string;
|
|
10
|
-
/** Default timeout for commands in milliseconds (default: 300000 = 5 min) */
|
|
11
|
-
defaultTimeout?: number;
|
|
12
|
-
/** Environment variables to pass to all commands */
|
|
13
|
-
env?: Record<string, string>;
|
|
14
|
-
/** Runner command to execute in the sandbox (default: ["bunny-agent", "run"]) */
|
|
15
|
-
runnerCommand?: string[];
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Local sandbox implementation that runs commands on the local machine.
|
|
19
|
-
*
|
|
20
|
-
* This adapter is useful for:
|
|
21
|
-
* - Development and testing
|
|
22
|
-
* - Running agents locally without cloud dependencies
|
|
23
|
-
* - Quick prototyping
|
|
24
|
-
*
|
|
25
|
-
* Warning: This runs commands directly on your local machine with your user's
|
|
26
|
-
* permissions. Use with caution and only with trusted code.
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```typescript
|
|
30
|
-
* import { LocalSandbox, BunnyAgent } from "@bunny-agent/manager";
|
|
31
|
-
*
|
|
32
|
-
* // Create sandbox with template
|
|
33
|
-
* const sandbox = new LocalSandbox({
|
|
34
|
-
* workdir: "/tmp/my-sandbox",
|
|
35
|
-
* templatesPath: "/path/to/agent-template",
|
|
36
|
-
* });
|
|
37
|
-
*
|
|
38
|
-
* const agent = new BunnyAgent({
|
|
39
|
-
* sandbox,
|
|
40
|
-
* runner: {
|
|
41
|
-
* model: "claude-sonnet-4-20250514",
|
|
42
|
-
* },
|
|
43
|
-
* });
|
|
44
|
-
*
|
|
45
|
-
* // Attach copies template files to workdir and returns handle
|
|
46
|
-
* const handle = await sandbox.attach();
|
|
47
|
-
* const result = await handle.runCommand("ls -la");
|
|
48
|
-
* console.log(result.stdout);
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export declare class LocalSandbox implements SandboxAdapter {
|
|
52
|
-
private readonly workdir;
|
|
53
|
-
private readonly templatesPath;
|
|
54
|
-
private readonly defaultTimeout;
|
|
55
|
-
private readonly env;
|
|
56
|
-
private readonly runnerCommand;
|
|
57
|
-
/** Current handle for the sandbox instance */
|
|
58
|
-
private currentHandle;
|
|
59
|
-
constructor(options?: LocalSandboxOptions);
|
|
60
|
-
getHandle(): SandboxHandle | null;
|
|
61
|
-
/**
|
|
62
|
-
* Get the environment variables configured for this sandbox.
|
|
63
|
-
*/
|
|
64
|
-
getEnv(): Record<string, string>;
|
|
65
|
-
/**
|
|
66
|
-
* Get the working directory configured for this sandbox.
|
|
67
|
-
*/
|
|
68
|
-
getWorkdir(): string;
|
|
69
|
-
/**
|
|
70
|
-
* Get the runner command to execute in the sandbox.
|
|
71
|
-
*/
|
|
72
|
-
getRunnerCommand(): string[];
|
|
73
|
-
attach(): Promise<SandboxHandle>;
|
|
74
|
-
/**
|
|
75
|
-
* Recursively copy a directory
|
|
76
|
-
*/
|
|
77
|
-
private copyDir;
|
|
78
|
-
/**
|
|
79
|
-
* Reset the sandbox, clearing the current handle.
|
|
80
|
-
*/
|
|
81
|
-
reset(): void;
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=local-sandbox.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local-sandbox.d.ts","sourceRoot":"","sources":["../src/local-sandbox.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAe,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IAEzC,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAAmC;gBAE5C,OAAO,GAAE,mBAAwB;IAQ7C,SAAS,IAAI,aAAa,GAAG,IAAI;IAIjC;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIhC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAItB,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IA0DtC;;OAEG;YACW,OAAO;IAcrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/local-sandbox.js
DELETED
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import * as fs from "node:fs/promises";
|
|
3
|
-
import * as path from "node:path";
|
|
4
|
-
import { buildRunnerEnv } from "./env.js";
|
|
5
|
-
/**
|
|
6
|
-
* Local sandbox implementation that runs commands on the local machine.
|
|
7
|
-
*
|
|
8
|
-
* This adapter is useful for:
|
|
9
|
-
* - Development and testing
|
|
10
|
-
* - Running agents locally without cloud dependencies
|
|
11
|
-
* - Quick prototyping
|
|
12
|
-
*
|
|
13
|
-
* Warning: This runs commands directly on your local machine with your user's
|
|
14
|
-
* permissions. Use with caution and only with trusted code.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* import { LocalSandbox, BunnyAgent } from "@bunny-agent/manager";
|
|
19
|
-
*
|
|
20
|
-
* // Create sandbox with template
|
|
21
|
-
* const sandbox = new LocalSandbox({
|
|
22
|
-
* workdir: "/tmp/my-sandbox",
|
|
23
|
-
* templatesPath: "/path/to/agent-template",
|
|
24
|
-
* });
|
|
25
|
-
*
|
|
26
|
-
* const agent = new BunnyAgent({
|
|
27
|
-
* sandbox,
|
|
28
|
-
* runner: {
|
|
29
|
-
* model: "claude-sonnet-4-20250514",
|
|
30
|
-
* },
|
|
31
|
-
* });
|
|
32
|
-
*
|
|
33
|
-
* // Attach copies template files to workdir and returns handle
|
|
34
|
-
* const handle = await sandbox.attach();
|
|
35
|
-
* const result = await handle.runCommand("ls -la");
|
|
36
|
-
* console.log(result.stdout);
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
export class LocalSandbox {
|
|
40
|
-
workdir;
|
|
41
|
-
templatesPath;
|
|
42
|
-
defaultTimeout;
|
|
43
|
-
env;
|
|
44
|
-
runnerCommand;
|
|
45
|
-
/** Current handle for the sandbox instance */
|
|
46
|
-
currentHandle = null;
|
|
47
|
-
constructor(options = {}) {
|
|
48
|
-
this.workdir = options.workdir ?? process.cwd();
|
|
49
|
-
this.templatesPath = options.templatesPath;
|
|
50
|
-
this.defaultTimeout = options.defaultTimeout ?? 300000; // 5 min for agent runs
|
|
51
|
-
this.env = options.env ?? {};
|
|
52
|
-
this.runnerCommand = options.runnerCommand ?? ["bunny-agent", "run"];
|
|
53
|
-
}
|
|
54
|
-
getHandle() {
|
|
55
|
-
return this.currentHandle;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Get the environment variables configured for this sandbox.
|
|
59
|
-
*/
|
|
60
|
-
getEnv() {
|
|
61
|
-
return { ...this.env };
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Get the working directory configured for this sandbox.
|
|
65
|
-
*/
|
|
66
|
-
getWorkdir() {
|
|
67
|
-
return this.currentHandle?.getWorkdir() ?? this.workdir;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Get the runner command to execute in the sandbox.
|
|
71
|
-
*/
|
|
72
|
-
getRunnerCommand() {
|
|
73
|
-
return [...this.runnerCommand];
|
|
74
|
-
}
|
|
75
|
-
async attach() {
|
|
76
|
-
// Return existing handle if already attached
|
|
77
|
-
if (this.currentHandle) {
|
|
78
|
-
return this.currentHandle;
|
|
79
|
-
}
|
|
80
|
-
// Use workdir as the working directory
|
|
81
|
-
const workdir = this.workdir;
|
|
82
|
-
// Clear template files before copying (only .claude dir and CLAUDE.md)
|
|
83
|
-
if (this.templatesPath) {
|
|
84
|
-
const claudeDir = path.join(workdir, ".claude");
|
|
85
|
-
const claudeMd = path.join(workdir, "CLAUDE.md");
|
|
86
|
-
await fs.rm(claudeDir, { recursive: true, force: true }).catch(() => { });
|
|
87
|
-
await fs.rm(claudeMd, { force: true }).catch(() => { });
|
|
88
|
-
console.log(`[LocalSandbox] Cleared template files: .claude, CLAUDE.md`);
|
|
89
|
-
}
|
|
90
|
-
// Create the directory if it doesn't exist
|
|
91
|
-
await fs.mkdir(workdir, { recursive: true });
|
|
92
|
-
console.log(`[LocalSandbox] Using directory: ${workdir}`);
|
|
93
|
-
// Copy all files from templatesPath to workdir if specified
|
|
94
|
-
if (this.templatesPath) {
|
|
95
|
-
try {
|
|
96
|
-
const stat = await fs.stat(this.templatesPath);
|
|
97
|
-
if (stat.isDirectory()) {
|
|
98
|
-
await this.copyDir(this.templatesPath, workdir);
|
|
99
|
-
console.log(`[LocalSandbox] Copied template directory: ${this.templatesPath} -> ${workdir}`);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
console.warn(`[LocalSandbox] templatesPath is not a directory: ${this.templatesPath}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
console.warn(`[LocalSandbox] Failed to copy template directory: ${this.templatesPath}`, err);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
const handle = new LocalSandboxHandle(workdir, this.defaultTimeout, this.env);
|
|
110
|
-
// Store the handle
|
|
111
|
-
this.currentHandle = handle;
|
|
112
|
-
return handle;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Recursively copy a directory
|
|
116
|
-
*/
|
|
117
|
-
async copyDir(src, dest) {
|
|
118
|
-
await fs.mkdir(dest, { recursive: true });
|
|
119
|
-
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
120
|
-
for (const entry of entries) {
|
|
121
|
-
const srcPath = path.join(src, entry.name);
|
|
122
|
-
const destPath = path.join(dest, entry.name);
|
|
123
|
-
if (entry.isDirectory()) {
|
|
124
|
-
await this.copyDir(srcPath, destPath);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
await fs.copyFile(srcPath, destPath);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Reset the sandbox, clearing the current handle.
|
|
133
|
-
*/
|
|
134
|
-
reset() {
|
|
135
|
-
this.currentHandle = null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Handle for a local sandbox instance
|
|
140
|
-
*/
|
|
141
|
-
class LocalSandboxHandle {
|
|
142
|
-
workDir;
|
|
143
|
-
defaultTimeout;
|
|
144
|
-
env;
|
|
145
|
-
_sandboxId;
|
|
146
|
-
constructor(workDir, defaultTimeout, env) {
|
|
147
|
-
this.workDir = workDir;
|
|
148
|
-
this.defaultTimeout = defaultTimeout;
|
|
149
|
-
this.env = env;
|
|
150
|
-
this._sandboxId = `local-${crypto.randomUUID()}`;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Get the sandbox instance ID.
|
|
154
|
-
*/
|
|
155
|
-
getSandboxId() {
|
|
156
|
-
return this._sandboxId;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Local sandbox has no volumes.
|
|
160
|
-
*/
|
|
161
|
-
getVolumes() {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Get the working directory for this sandbox handle
|
|
166
|
-
*/
|
|
167
|
-
getWorkdir() {
|
|
168
|
-
return this.workDir;
|
|
169
|
-
}
|
|
170
|
-
async *exec(command, opts = {}) {
|
|
171
|
-
if (command.length === 0) {
|
|
172
|
-
throw new Error("Command cannot be empty");
|
|
173
|
-
}
|
|
174
|
-
const cwd = opts.cwd ? path.resolve(this.workDir, opts.cwd) : this.workDir;
|
|
175
|
-
const timeout = opts.timeout ?? this.defaultTimeout;
|
|
176
|
-
const baseInherit = { ...process.env, ...this.env, ...opts.env };
|
|
177
|
-
const env = buildRunnerEnv({
|
|
178
|
-
inherit: baseInherit,
|
|
179
|
-
});
|
|
180
|
-
console.log(`[LocalSandbox] Executing command: ${command.join(" ")}`);
|
|
181
|
-
console.log(`[LocalSandbox] Working directory: ${cwd}`);
|
|
182
|
-
console.log(`[LocalSandbox] ENV AWS_BEARER_TOKEN_BEDROCK: ${env.AWS_BEARER_TOKEN_BEDROCK ? "SET" : "NOT SET"}`);
|
|
183
|
-
console.log(`[LocalSandbox] ENV CLAUDE_CODE_USE_BEDROCK: ${env.CLAUDE_CODE_USE_BEDROCK || "NOT SET"}`);
|
|
184
|
-
console.log(`[LocalSandbox] ENV ANTHROPIC_API_KEY: ${env.ANTHROPIC_API_KEY ? "SET" : "NOT SET"}`);
|
|
185
|
-
// Ensure the working directory exists
|
|
186
|
-
await fs.mkdir(cwd, { recursive: true });
|
|
187
|
-
const [cmd, ...args] = command;
|
|
188
|
-
const child = spawn(cmd, args, {
|
|
189
|
-
cwd,
|
|
190
|
-
env,
|
|
191
|
-
shell: false,
|
|
192
|
-
});
|
|
193
|
-
let timeoutId;
|
|
194
|
-
let isTimedOut = false;
|
|
195
|
-
let isAborted = false;
|
|
196
|
-
// Set up timeout if specified
|
|
197
|
-
if (timeout > 0) {
|
|
198
|
-
timeoutId = setTimeout(() => {
|
|
199
|
-
isTimedOut = true;
|
|
200
|
-
child.kill("SIGTERM");
|
|
201
|
-
// Force kill after 5 seconds if still running
|
|
202
|
-
setTimeout(() => {
|
|
203
|
-
if (!child.killed) {
|
|
204
|
-
child.kill("SIGKILL");
|
|
205
|
-
}
|
|
206
|
-
}, 5000);
|
|
207
|
-
}, timeout);
|
|
208
|
-
}
|
|
209
|
-
// Set up abort signal if provided
|
|
210
|
-
const abortHandler = () => {
|
|
211
|
-
isAborted = true;
|
|
212
|
-
child.kill("SIGTERM");
|
|
213
|
-
setTimeout(() => {
|
|
214
|
-
if (!child.killed) {
|
|
215
|
-
child.kill("SIGKILL");
|
|
216
|
-
}
|
|
217
|
-
}, 5000);
|
|
218
|
-
};
|
|
219
|
-
if (opts.signal) {
|
|
220
|
-
opts.signal.addEventListener("abort", abortHandler);
|
|
221
|
-
}
|
|
222
|
-
// Handle spawn errors (e.g., command not found)
|
|
223
|
-
const spawnError = await new Promise((resolve) => {
|
|
224
|
-
child.once("error", resolve);
|
|
225
|
-
child.once("spawn", () => resolve(null));
|
|
226
|
-
});
|
|
227
|
-
if (spawnError) {
|
|
228
|
-
if (timeoutId) {
|
|
229
|
-
clearTimeout(timeoutId);
|
|
230
|
-
}
|
|
231
|
-
if (opts.signal) {
|
|
232
|
-
opts.signal.removeEventListener("abort", abortHandler);
|
|
233
|
-
}
|
|
234
|
-
throw spawnError;
|
|
235
|
-
}
|
|
236
|
-
// Buffer stderr for error reporting; also mirror to the parent process so
|
|
237
|
-
// subprocess diagnostics (e.g. [bunny-agent:pi] skill load) are visible on success.
|
|
238
|
-
const stderrChunks = [];
|
|
239
|
-
child.stderr.on("data", (chunk) => {
|
|
240
|
-
stderrChunks.push(chunk);
|
|
241
|
-
process.stderr.write(chunk);
|
|
242
|
-
});
|
|
243
|
-
try {
|
|
244
|
-
// Yield stdout chunks
|
|
245
|
-
for await (const chunk of child.stdout) {
|
|
246
|
-
yield chunk;
|
|
247
|
-
}
|
|
248
|
-
// Wait for the process to complete
|
|
249
|
-
const exitCode = await new Promise((resolve, reject) => {
|
|
250
|
-
child.on("error", reject);
|
|
251
|
-
child.on("close", (code) => resolve(code ?? 0));
|
|
252
|
-
});
|
|
253
|
-
if (timeoutId) {
|
|
254
|
-
clearTimeout(timeoutId);
|
|
255
|
-
}
|
|
256
|
-
if (isAborted) {
|
|
257
|
-
throw new Error("Command was aborted");
|
|
258
|
-
}
|
|
259
|
-
if (isTimedOut) {
|
|
260
|
-
throw new Error(`Command timed out after ${timeout}ms`);
|
|
261
|
-
}
|
|
262
|
-
if (exitCode !== 0) {
|
|
263
|
-
const stderr = stderrChunks.length
|
|
264
|
-
? Buffer.concat(stderrChunks).toString("utf-8").trim()
|
|
265
|
-
: "";
|
|
266
|
-
if (stderr) {
|
|
267
|
-
console.error(`[LocalSandbox] Command failed (exit ${exitCode}) stderr:\n${stderr}`);
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
console.error(`[LocalSandbox] Command failed with exit ${exitCode} (no stderr). Run manually to see output: ${command.join(" ")}`);
|
|
271
|
-
}
|
|
272
|
-
// User-facing message: show the actual error from stderr (where it failed)
|
|
273
|
-
const lines = stderr
|
|
274
|
-
.split(/\n/)
|
|
275
|
-
.map((l) => l.trim())
|
|
276
|
-
.filter(Boolean);
|
|
277
|
-
const lastLine = lines.length > 0 ? lines[lines.length - 1] : "";
|
|
278
|
-
const hasErrorLike = (s) => /error|Error|Fatal|TypeError|SyntaxError|Exception/i.test(s);
|
|
279
|
-
const errorLine = lines.filter(hasErrorLike).pop() ?? lastLine;
|
|
280
|
-
const userMessage = errorLine
|
|
281
|
-
? errorLine.replace(/\s+/g, " ").slice(0, 500)
|
|
282
|
-
: stderr
|
|
283
|
-
? `Command failed (exit ${exitCode}). See server logs for stderr.`
|
|
284
|
-
: `Command failed with exit ${exitCode}.`;
|
|
285
|
-
throw new Error(userMessage);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
catch (error) {
|
|
289
|
-
if (timeoutId) {
|
|
290
|
-
clearTimeout(timeoutId);
|
|
291
|
-
}
|
|
292
|
-
throw error;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
async upload(files, targetDir) {
|
|
296
|
-
const resolvedTargetDir = path.resolve(this.workDir, targetDir);
|
|
297
|
-
console.log(`[LocalSandbox] Uploading ${files.length} file(s) to ${resolvedTargetDir}`);
|
|
298
|
-
// Create target directory
|
|
299
|
-
await fs.mkdir(resolvedTargetDir, { recursive: true });
|
|
300
|
-
// Write each file
|
|
301
|
-
for (const file of files) {
|
|
302
|
-
const filePath = path.join(resolvedTargetDir, file.path);
|
|
303
|
-
const fileDir = path.dirname(filePath);
|
|
304
|
-
// Ensure the file's directory exists
|
|
305
|
-
await fs.mkdir(fileDir, { recursive: true });
|
|
306
|
-
// Write the file
|
|
307
|
-
const content = typeof file.content === "string"
|
|
308
|
-
? Buffer.from(file.content, "utf-8")
|
|
309
|
-
: file.content;
|
|
310
|
-
await fs.writeFile(filePath, content);
|
|
311
|
-
console.log(`[LocalSandbox] Wrote file: ${filePath}`);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
async readFile(filePath) {
|
|
315
|
-
const resolvedPath = path.resolve(this.workDir, filePath);
|
|
316
|
-
const content = await fs.readFile(resolvedPath, "utf-8");
|
|
317
|
-
return content;
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Execute a command and wait for completion, returning stdout, stderr, and exit code
|
|
321
|
-
*/
|
|
322
|
-
async runCommand(command) {
|
|
323
|
-
console.log(`[LocalSandbox] Running command: ${command}`);
|
|
324
|
-
return new Promise((resolve, reject) => {
|
|
325
|
-
// Use sh -c to execute the command
|
|
326
|
-
const child = spawn("sh", ["-c", command], {
|
|
327
|
-
cwd: this.workDir,
|
|
328
|
-
env: { ...process.env, ...this.env }, // Use instance env
|
|
329
|
-
stdio: "pipe",
|
|
330
|
-
});
|
|
331
|
-
let stdout = "";
|
|
332
|
-
let stderr = "";
|
|
333
|
-
child.stdout?.on("data", (data) => {
|
|
334
|
-
stdout += data.toString();
|
|
335
|
-
});
|
|
336
|
-
child.stderr?.on("data", (data) => {
|
|
337
|
-
stderr += data.toString();
|
|
338
|
-
});
|
|
339
|
-
child.on("close", (code) => {
|
|
340
|
-
resolve({
|
|
341
|
-
stdout,
|
|
342
|
-
stderr,
|
|
343
|
-
exitCode: code ?? 0,
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
child.on("error", reject);
|
|
347
|
-
// Timeout handling
|
|
348
|
-
const timeout = this.defaultTimeout;
|
|
349
|
-
const timeoutId = setTimeout(() => {
|
|
350
|
-
child.kill();
|
|
351
|
-
reject(new Error(`Command timed out after ${timeout}ms`));
|
|
352
|
-
}, timeout);
|
|
353
|
-
child.on("close", () => {
|
|
354
|
-
clearTimeout(timeoutId);
|
|
355
|
-
});
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
async destroy() {
|
|
359
|
-
console.log(`[LocalSandbox] Cleanup complete for: ${this.workDir}`);
|
|
360
|
-
// Note: We don't delete the directory by default to preserve work
|
|
361
|
-
// Users can manually delete it if needed
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
//# sourceMappingURL=local-sandbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local-sandbox.js","sourceRoot":"","sources":["../src/local-sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAmB1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IAChB,aAAa,CAAqB;IAClC,cAAc,CAAS;IACvB,GAAG,CAAyB;IAC5B,aAAa,CAAW;IAEzC,8CAA8C;IACtC,aAAa,GAA8B,IAAI,CAAC;IAExD,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC,uBAAuB;QAC/E,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,6CAA6C;QAC7C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,uCAAuC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,uEAAuE;QACvE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAEjD,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACzE,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEvD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;QAED,2CAA2C;QAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QAE1D,4DAA4D;QAC5D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAChD,OAAO,CAAC,GAAG,CACT,6CAA6C,IAAI,CAAC,aAAa,OAAO,OAAO,EAAE,CAChF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,oDAAoD,IAAI,CAAC,aAAa,EAAE,CACzE,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,qDAAqD,IAAI,CAAC,aAAa,EAAE,EACzE,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,kBAAkB,CACnC,OAAO,EACP,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,GAAG,CACT,CAAC;QAEF,mBAAmB;QACnB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAE5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,IAAY;QAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,kBAAkB;IACL,OAAO,CAAS;IAChB,cAAc,CAAS;IACvB,GAAG,CAAyB;IAC5B,UAAU,CAAS;IAEpC,YACE,OAAe,EACf,cAAsB,EACtB,GAA2B;QAE3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,SAAS,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CACT,OAAiB,EACjB,OAAoB,EAAE;QAEtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC;QACpD,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,cAAc,CAAC;YACzB,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CACT,gDAAgD,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CACnG,CAAC;QACF,OAAO,CAAC,GAAG,CACT,+CAA+C,GAAG,CAAC,uBAAuB,IAAI,SAAS,EAAE,CAC1F,CAAC;QACF,OAAO,CAAC,GAAG,CACT,yCAAyC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CACrF,CAAC;QAEF,sCAAsC;QACtC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG;YACH,GAAG;YACH,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,IAAI,SAAqC,CAAC;QAC1C,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,8BAA8B;QAC9B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,UAAU,GAAG,IAAI,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,8CAA8C;gBAC9C,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,SAAS,GAAG,IAAI,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC;QAED,gDAAgD;QAChD,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,EAAE;YAC7D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,UAAU,CAAC;QACnB,CAAC;QAED,0EAA0E;QAC1E,oFAAoF;QACpF,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,sBAAsB;YACtB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACvC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC7D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM;oBAChC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;oBACtD,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CACX,uCAAuC,QAAQ,cAAc,MAAM,EAAE,CACtE,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CACX,2CAA2C,QAAQ,6CAA6C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACpH,CAAC;gBACJ,CAAC;gBACD,2EAA2E;gBAC3E,MAAM,KAAK,GAAG,MAAM;qBACjB,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CACjC,oDAAoD,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;gBAC/D,MAAM,WAAW,GAAG,SAAS;oBAC3B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAC9C,CAAC,CAAC,MAAM;wBACN,CAAC,CAAC,wBAAwB,QAAQ,gCAAgC;wBAClE,CAAC,CAAC,4BAA4B,QAAQ,GAAG,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAA4D,EAC5D,SAAiB;QAEjB,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CACT,4BAA4B,KAAK,CAAC,MAAM,eAAe,iBAAiB,EAAE,CAC3E,CAAC;QAEF,0BAA0B;QAC1B,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,kBAAkB;QAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEvC,qCAAqC;YACrC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7C,iBAAiB;YACjB,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;gBAC9B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;gBACpC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAEnB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,OAAe;QAEf,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QAE1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,mCAAmC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;gBACzC,GAAG,EAAE,IAAI,CAAC,OAAO;gBACjB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,mBAAmB;gBACzD,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC;oBACN,MAAM;oBACN,MAAM;oBACN,QAAQ,EAAE,IAAI,IAAI,CAAC;iBACpB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE1B,mBAAmB;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;YACpC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAC,CAAC;YAC5D,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,CAAC,GAAG,CAAC,wCAAwC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,kEAAkE;QAClE,yCAAyC;IAC3C,CAAC;CACF"}
|