@cogitator-ai/sandbox 0.2.29 → 0.4.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 +28 -2
- package/dist/executors/docker.d.ts +10 -0
- package/dist/executors/docker.d.ts.map +1 -1
- package/dist/executors/docker.js +75 -40
- package/dist/executors/docker.js.map +1 -1
- package/dist/executors/native.d.ts +3 -0
- package/dist/executors/native.d.ts.map +1 -1
- package/dist/executors/native.js +102 -36
- package/dist/executors/native.js.map +1 -1
- package/dist/executors/wasm.d.ts +11 -8
- package/dist/executors/wasm.d.ts.map +1 -1
- package/dist/executors/wasm.js +139 -89
- package/dist/executors/wasm.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/pool/container-pool.d.ts +2 -0
- package/dist/pool/container-pool.d.ts.map +1 -1
- package/dist/pool/container-pool.js +29 -4
- package/dist/pool/container-pool.js.map +1 -1
- package/dist/sandbox-manager.d.ts +2 -1
- package/dist/sandbox-manager.d.ts.map +1 -1
- package/dist/sandbox-manager.js +24 -31
- package/dist/sandbox-manager.js.map +1 -1
- package/dist/utils/output-collector.d.ts +12 -0
- package/dist/utils/output-collector.d.ts.map +1 -0
- package/dist/utils/output-collector.js +24 -0
- package/dist/utils/output-collector.js.map +1 -0
- package/dist/utils/parse-resources.d.ts +2 -1
- package/dist/utils/parse-resources.d.ts.map +1 -1
- package/dist/utils/parse-resources.js +8 -7
- package/dist/utils/parse-resources.js.map +1 -1
- package/package.json +15 -13
package/dist/executors/wasm.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* WASM sandbox executor - isolated execution via Extism
|
|
3
3
|
*
|
|
4
4
|
* Provides fast, memory-safe execution of WASM modules.
|
|
5
|
-
*
|
|
6
|
-
* Memory: 1-10MB per plugin (vs Docker 50-200MB)
|
|
5
|
+
* Every plugin runs in its own worker thread so timeouts can terminate runaway modules.
|
|
7
6
|
*/
|
|
8
7
|
import { BaseSandboxExecutor } from './base.js';
|
|
9
8
|
import { readFile } from 'node:fs/promises';
|
|
@@ -13,12 +12,15 @@ const DEFAULT_TIMEOUT = 30_000;
|
|
|
13
12
|
const DEFAULT_FUNCTION = 'run';
|
|
14
13
|
const MAX_OUTPUT_SIZE = 50_000;
|
|
15
14
|
const DEFAULT_CACHE_SIZE = 10;
|
|
15
|
+
const DEFAULT_MEMORY_PAGES = 256;
|
|
16
16
|
export class WasmSandboxExecutor extends BaseSandboxExecutor {
|
|
17
17
|
type = 'wasm';
|
|
18
18
|
createPlugin;
|
|
19
|
-
|
|
19
|
+
idlePlugins = new Map();
|
|
20
|
+
activePlugins = new Set();
|
|
21
|
+
idleCount = 0;
|
|
22
|
+
generation = 0;
|
|
20
23
|
options;
|
|
21
|
-
cacheOrder = [];
|
|
22
24
|
constructor(options = {}) {
|
|
23
25
|
super();
|
|
24
26
|
this.options = options;
|
|
@@ -34,16 +36,12 @@ export class WasmSandboxExecutor extends BaseSandboxExecutor {
|
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
async disconnect() {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
this.pluginCache.clear();
|
|
46
|
-
this.cacheOrder = [];
|
|
39
|
+
this.generation++;
|
|
40
|
+
const plugins = [...this.activePlugins, ...[...this.idlePlugins.values()].flat()];
|
|
41
|
+
this.idlePlugins.clear();
|
|
42
|
+
this.activePlugins.clear();
|
|
43
|
+
this.idleCount = 0;
|
|
44
|
+
await Promise.all(plugins.map((plugin) => this.closePlugin(plugin)));
|
|
47
45
|
return this.success(undefined);
|
|
48
46
|
}
|
|
49
47
|
async isAvailable() {
|
|
@@ -59,69 +57,110 @@ export class WasmSandboxExecutor extends BaseSandboxExecutor {
|
|
|
59
57
|
}
|
|
60
58
|
const startTime = Date.now();
|
|
61
59
|
const timeout = request.timeout ?? config.timeout ?? DEFAULT_TIMEOUT;
|
|
62
|
-
const wasmModule = config.wasmModule;
|
|
63
|
-
const functionName = config.wasmFunction ?? DEFAULT_FUNCTION;
|
|
60
|
+
const wasmModule = config.wasmModule ?? this.options.wasm?.wasmModule;
|
|
61
|
+
const functionName = config.wasmFunction ?? this.options.wasm?.functionName ?? DEFAULT_FUNCTION;
|
|
64
62
|
if (!wasmModule) {
|
|
65
63
|
return this.failure('No WASM module specified in config');
|
|
66
64
|
}
|
|
65
|
+
const allowedHosts = config.network?.mode === 'none' ? [] : [...(config.network?.allowedHosts ?? [])].sort();
|
|
66
|
+
const useWasi = config.wasi ?? this.options.wasm?.wasi ?? false;
|
|
67
|
+
const spec = {
|
|
68
|
+
key: JSON.stringify([wasmModule, useWasi, allowedHosts]),
|
|
69
|
+
module: wasmModule,
|
|
70
|
+
useWasi,
|
|
71
|
+
allowedHosts,
|
|
72
|
+
};
|
|
73
|
+
let plugin;
|
|
67
74
|
try {
|
|
68
|
-
|
|
69
|
-
const input = this.buildInput(request);
|
|
70
|
-
const result = await this.executeWithTimeout(plugin, functionName, input, timeout);
|
|
71
|
-
return this.success({
|
|
72
|
-
stdout: result.stdout.slice(0, MAX_OUTPUT_SIZE),
|
|
73
|
-
stderr: result.stderr.slice(0, MAX_OUTPUT_SIZE),
|
|
74
|
-
exitCode: result.exitCode,
|
|
75
|
-
timedOut: result.timedOut,
|
|
76
|
-
duration: Date.now() - startTime,
|
|
77
|
-
});
|
|
75
|
+
plugin = await this.acquire(spec);
|
|
78
76
|
}
|
|
79
77
|
catch (error) {
|
|
80
|
-
return this.failure(`WASM execution failed: ${
|
|
78
|
+
return this.failure(`WASM execution failed: ${describeError(error)}`);
|
|
79
|
+
}
|
|
80
|
+
const generation = this.generation;
|
|
81
|
+
const outcome = await this.callWithTimeout(plugin, functionName, this.buildInput(request), timeout);
|
|
82
|
+
if (outcome.timedOut || generation !== this.generation) {
|
|
83
|
+
this.activePlugins.delete(plugin);
|
|
84
|
+
await this.closePlugin(plugin);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
await this.release(spec.key, plugin);
|
|
88
|
+
}
|
|
89
|
+
return this.success({
|
|
90
|
+
stdout: outcome.stdout.slice(0, MAX_OUTPUT_SIZE),
|
|
91
|
+
stderr: outcome.stderr.slice(0, MAX_OUTPUT_SIZE),
|
|
92
|
+
exitCode: outcome.exitCode,
|
|
93
|
+
timedOut: outcome.timedOut,
|
|
94
|
+
duration: Date.now() - startTime,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async acquire(spec) {
|
|
98
|
+
const idle = this.idlePlugins.get(spec.key);
|
|
99
|
+
const reused = idle?.pop();
|
|
100
|
+
if (reused) {
|
|
101
|
+
this.idleCount--;
|
|
102
|
+
if (idle?.length === 0)
|
|
103
|
+
this.idlePlugins.delete(spec.key);
|
|
104
|
+
this.activePlugins.add(reused);
|
|
105
|
+
return reused;
|
|
106
|
+
}
|
|
107
|
+
const manifest = {
|
|
108
|
+
...(await this.loadManifest(spec.module)),
|
|
109
|
+
memory: { maxPages: this.options.wasm?.memoryPages ?? DEFAULT_MEMORY_PAGES },
|
|
110
|
+
};
|
|
111
|
+
const plugin = await this.createPlugin(manifest, {
|
|
112
|
+
useWasi: spec.useWasi,
|
|
113
|
+
runInWorker: true,
|
|
114
|
+
allowedHosts: spec.allowedHosts,
|
|
115
|
+
});
|
|
116
|
+
this.activePlugins.add(plugin);
|
|
117
|
+
return plugin;
|
|
118
|
+
}
|
|
119
|
+
async release(key, plugin) {
|
|
120
|
+
this.activePlugins.delete(plugin);
|
|
121
|
+
const idle = this.idlePlugins.get(key) ?? [];
|
|
122
|
+
this.idlePlugins.delete(key);
|
|
123
|
+
idle.push(plugin);
|
|
124
|
+
this.idlePlugins.set(key, idle);
|
|
125
|
+
this.idleCount++;
|
|
126
|
+
const maxSize = Math.max(0, this.options.wasm?.cacheSize ?? DEFAULT_CACHE_SIZE);
|
|
127
|
+
while (this.idleCount > maxSize) {
|
|
128
|
+
const oldest = this.idlePlugins.keys().next();
|
|
129
|
+
if (oldest.done)
|
|
130
|
+
break;
|
|
131
|
+
const plugins = this.idlePlugins.get(oldest.value) ?? [];
|
|
132
|
+
const evicted = plugins.shift();
|
|
133
|
+
if (plugins.length === 0)
|
|
134
|
+
this.idlePlugins.delete(oldest.value);
|
|
135
|
+
if (!evicted)
|
|
136
|
+
continue;
|
|
137
|
+
this.idleCount--;
|
|
138
|
+
await this.closePlugin(evicted);
|
|
81
139
|
}
|
|
82
140
|
}
|
|
83
|
-
async
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const plugin = await this.createPlugin(source, { useWasi });
|
|
90
|
-
this.pluginCache.set(cacheKey, plugin);
|
|
91
|
-
this.cacheOrder.push(cacheKey);
|
|
92
|
-
const maxSize = this.options.wasm?.cacheSize ?? DEFAULT_CACHE_SIZE;
|
|
93
|
-
while (this.cacheOrder.length > maxSize) {
|
|
94
|
-
const oldKey = this.cacheOrder.shift();
|
|
95
|
-
const oldPlugin = this.pluginCache.get(oldKey);
|
|
96
|
-
if (oldPlugin) {
|
|
97
|
-
try {
|
|
98
|
-
await oldPlugin.close();
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
console.warn(`[wasm] Failed to close cached plugin ${oldKey}:`, error instanceof Error ? error.message : String(error));
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
this.pluginCache.delete(oldKey);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
141
|
+
async closePlugin(plugin) {
|
|
142
|
+
try {
|
|
143
|
+
await plugin.close();
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.warn('[wasm] Failed to close plugin:', error instanceof Error ? error.message : String(error));
|
|
107
147
|
}
|
|
108
|
-
return plugin;
|
|
109
148
|
}
|
|
110
|
-
async
|
|
149
|
+
async loadManifest(wasmModule) {
|
|
111
150
|
if (wasmModule.startsWith('http://') || wasmModule.startsWith('https://')) {
|
|
112
151
|
return { wasm: [{ url: wasmModule }] };
|
|
113
152
|
}
|
|
114
153
|
if (existsSync(wasmModule)) {
|
|
115
|
-
return await readFile(wasmModule);
|
|
154
|
+
return { wasm: [{ data: new Uint8Array(await readFile(wasmModule)) }] };
|
|
116
155
|
}
|
|
156
|
+
let resolved;
|
|
117
157
|
try {
|
|
118
|
-
|
|
119
|
-
const resolved = req.resolve(wasmModule);
|
|
120
|
-
return await readFile(resolved);
|
|
158
|
+
resolved = createRequire(import.meta.url).resolve(wasmModule);
|
|
121
159
|
}
|
|
122
160
|
catch {
|
|
123
161
|
throw new Error(`WASM module not found: ${wasmModule}`);
|
|
124
162
|
}
|
|
163
|
+
return { wasm: [{ data: new Uint8Array(await readFile(resolved)) }] };
|
|
125
164
|
}
|
|
126
165
|
buildInput(request) {
|
|
127
166
|
if (request.stdin) {
|
|
@@ -133,56 +172,67 @@ export class WasmSandboxExecutor extends BaseSandboxExecutor {
|
|
|
133
172
|
env: request.env ?? {},
|
|
134
173
|
});
|
|
135
174
|
}
|
|
136
|
-
async
|
|
137
|
-
const
|
|
175
|
+
async callWithTimeout(plugin, functionName, input, timeoutMs) {
|
|
176
|
+
const call = (async () => {
|
|
138
177
|
try {
|
|
139
178
|
const result = await plugin.call(functionName, input);
|
|
140
|
-
|
|
141
|
-
try {
|
|
142
|
-
const parsed = JSON.parse(output);
|
|
143
|
-
return {
|
|
144
|
-
stdout: typeof parsed.stdout === 'string' ? parsed.stdout : output,
|
|
145
|
-
stderr: typeof parsed.stderr === 'string' ? parsed.stderr : '',
|
|
146
|
-
exitCode: typeof parsed.exitCode === 'number' ? parsed.exitCode : 0,
|
|
147
|
-
timedOut: false,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
return {
|
|
152
|
-
stdout: output,
|
|
153
|
-
stderr: '',
|
|
154
|
-
exitCode: 0,
|
|
155
|
-
timedOut: false,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
179
|
+
return parseOutput(result ? new TextDecoder().decode(result) : '');
|
|
158
180
|
}
|
|
159
181
|
catch (error) {
|
|
160
182
|
return {
|
|
161
183
|
stdout: '',
|
|
162
|
-
stderr:
|
|
184
|
+
stderr: describeError(error),
|
|
163
185
|
exitCode: 1,
|
|
164
186
|
timedOut: false,
|
|
165
187
|
};
|
|
166
188
|
}
|
|
167
189
|
})();
|
|
168
|
-
let timer
|
|
169
|
-
const
|
|
190
|
+
let timer;
|
|
191
|
+
const timeout = new Promise((resolve) => {
|
|
170
192
|
timer = setTimeout(() => {
|
|
171
|
-
resolve({
|
|
172
|
-
stdout: '',
|
|
173
|
-
stderr: 'Execution timed out',
|
|
174
|
-
exitCode: 124,
|
|
175
|
-
timedOut: true,
|
|
176
|
-
});
|
|
193
|
+
resolve({ stdout: '', stderr: 'Execution timed out', exitCode: 124, timedOut: true });
|
|
177
194
|
}, timeoutMs);
|
|
178
195
|
});
|
|
179
196
|
try {
|
|
180
|
-
return await Promise.race([
|
|
197
|
+
return await Promise.race([call, timeout]);
|
|
181
198
|
}
|
|
182
199
|
finally {
|
|
183
|
-
|
|
184
|
-
|
|
200
|
+
clearTimeout(timer);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function describeError(error) {
|
|
205
|
+
if (error instanceof Error)
|
|
206
|
+
return error.message;
|
|
207
|
+
if (error && typeof error === 'object') {
|
|
208
|
+
const message = error.message;
|
|
209
|
+
if (typeof message === 'string')
|
|
210
|
+
return message;
|
|
211
|
+
try {
|
|
212
|
+
return JSON.stringify(error);
|
|
185
213
|
}
|
|
214
|
+
catch {
|
|
215
|
+
return String(error);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return String(error);
|
|
219
|
+
}
|
|
220
|
+
function parseOutput(output) {
|
|
221
|
+
try {
|
|
222
|
+
const parsed = JSON.parse(output);
|
|
223
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
224
|
+
const record = parsed;
|
|
225
|
+
return {
|
|
226
|
+
stdout: typeof record.stdout === 'string' ? record.stdout : output,
|
|
227
|
+
stderr: typeof record.stderr === 'string' ? record.stderr : '',
|
|
228
|
+
exitCode: typeof record.exitCode === 'number' ? record.exitCode : 0,
|
|
229
|
+
timedOut: false,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return { stdout: output, stderr: '', exitCode: 0, timedOut: false };
|
|
186
235
|
}
|
|
236
|
+
return { stdout: output, stderr: '', exitCode: 0, timedOut: false };
|
|
187
237
|
}
|
|
188
238
|
//# sourceMappingURL=wasm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/executors/wasm.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/executors/wasm.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @cogitator-ai/sandbox
|
|
3
3
|
*
|
|
4
|
-
* Docker
|
|
4
|
+
* Docker, WASM and native sandbox execution for Cogitator agents
|
|
5
5
|
*/
|
|
6
6
|
export { SandboxManager } from './sandbox-manager.js';
|
|
7
7
|
export { BaseSandboxExecutor, NativeSandboxExecutor, DockerSandboxExecutor, type DockerExecutorOptions, WasmSandboxExecutor, type WasmExecutorOptions, } from './executors/index.js';
|
|
8
|
-
export { ContainerPool, type ContainerPoolOptions, type ContainerCreateOptions, } from './pool/index.js';
|
|
8
|
+
export { ContainerPool, SANDBOX_CONTAINER_LABEL, type ContainerPoolOptions, type ContainerCreateOptions, } from './pool/index.js';
|
|
9
9
|
export { parseMemory, cpusToNanoCpus } from './utils/index.js';
|
|
10
|
-
export type { SandboxType, SandboxConfig, SandboxResourceLimits, SandboxNetworkConfig, SandboxMount, SandboxExecutionRequest, SandboxExecutionResult, SandboxManagerConfig, SandboxPoolConfig, SandboxDockerConfig, SandboxResult, } from '@cogitator-ai/types';
|
|
10
|
+
export type { SandboxType, SandboxConfig, SandboxResourceLimits, SandboxNetworkConfig, SandboxMount, SandboxExecutionRequest, SandboxExecutionResult, SandboxManagerConfig, SandboxPoolConfig, SandboxDockerConfig, SandboxWasmConfig, SandboxResult, } from '@cogitator-ai/types';
|
|
11
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;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,YAAY,EACV,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,YAAY,EACV,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @cogitator-ai/sandbox
|
|
3
3
|
*
|
|
4
|
-
* Docker
|
|
4
|
+
* Docker, WASM and native sandbox execution for Cogitator agents
|
|
5
5
|
*/
|
|
6
6
|
export { SandboxManager } from './sandbox-manager.js';
|
|
7
7
|
export { BaseSandboxExecutor, NativeSandboxExecutor, DockerSandboxExecutor, WasmSandboxExecutor, } from './executors/index.js';
|
|
8
|
-
export { ContainerPool, } from './pool/index.js';
|
|
8
|
+
export { ContainerPool, SANDBOX_CONTAINER_LABEL, } from './pool/index.js';
|
|
9
9
|
export { parseMemory, cpusToNanoCpus } from './utils/index.js';
|
|
10
10
|
//# 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;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EAErB,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EAErB,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,uBAAuB,GAGxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -9,6 +9,7 @@ export interface ContainerCreateOptions {
|
|
|
9
9
|
cpuShares?: number;
|
|
10
10
|
pidsLimit?: number;
|
|
11
11
|
networkMode?: string;
|
|
12
|
+
dns?: string[];
|
|
12
13
|
mounts?: SandboxMount[];
|
|
13
14
|
user?: string;
|
|
14
15
|
}
|
|
@@ -16,6 +17,7 @@ export interface ContainerPoolOptions {
|
|
|
16
17
|
maxSize?: number;
|
|
17
18
|
idleTimeoutMs?: number;
|
|
18
19
|
}
|
|
20
|
+
export declare const SANDBOX_CONTAINER_LABEL = "ai.cogitator.sandbox";
|
|
19
21
|
export declare class ContainerPool {
|
|
20
22
|
private docker;
|
|
21
23
|
private containers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-pool.d.ts","sourceRoot":"","sources":["../../src/pool/container-pool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"container-pool.d.ts","sourceRoot":"","sources":["../../src/pool/container-pool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAU/D,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAgB9D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAiC;gBAE7C,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB;IASxD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAwBjF,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB7E,eAAe;YAiDf,gBAAgB;YAmBhB,OAAO;IAgBf,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAQlC"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Container pool for reusing Docker containers
|
|
3
3
|
*/
|
|
4
|
+
import { cpusToNanoCpus } from '../utils/parse-resources.js';
|
|
5
|
+
export const SANDBOX_CONTAINER_LABEL = 'ai.cogitator.sandbox';
|
|
6
|
+
function poolKey(image, options) {
|
|
7
|
+
return JSON.stringify([
|
|
8
|
+
image,
|
|
9
|
+
options.memory ?? null,
|
|
10
|
+
options.cpus ?? null,
|
|
11
|
+
options.cpuShares ?? null,
|
|
12
|
+
options.pidsLimit ?? null,
|
|
13
|
+
options.networkMode ?? 'none',
|
|
14
|
+
options.dns ?? [],
|
|
15
|
+
(options.mounts ?? []).map((m) => [m.source, m.target, m.readOnly ?? false]),
|
|
16
|
+
options.user ?? null,
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
4
19
|
export class ContainerPool {
|
|
5
20
|
docker;
|
|
6
21
|
containers = [];
|
|
@@ -12,9 +27,11 @@ export class ContainerPool {
|
|
|
12
27
|
this.maxSize = options.maxSize ?? 5;
|
|
13
28
|
this.idleTimeoutMs = options.idleTimeoutMs ?? 60_000;
|
|
14
29
|
this.cleanupInterval = setInterval(() => void this.cleanup(), this.idleTimeoutMs / 2);
|
|
30
|
+
this.cleanupInterval.unref?.();
|
|
15
31
|
}
|
|
16
32
|
async acquire(image, options) {
|
|
17
|
-
const
|
|
33
|
+
const key = poolKey(image, options);
|
|
34
|
+
const available = this.containers.find((c) => !c.inUse && c.key === key);
|
|
18
35
|
if (available) {
|
|
19
36
|
available.inUse = true;
|
|
20
37
|
available.lastUsed = Date.now();
|
|
@@ -24,7 +41,7 @@ export class ContainerPool {
|
|
|
24
41
|
if (this.containers.length < this.maxSize) {
|
|
25
42
|
this.containers.push({
|
|
26
43
|
container,
|
|
27
|
-
|
|
44
|
+
key,
|
|
28
45
|
inUse: true,
|
|
29
46
|
lastUsed: Date.now(),
|
|
30
47
|
});
|
|
@@ -71,12 +88,14 @@ export class ContainerPool {
|
|
|
71
88
|
Image: image,
|
|
72
89
|
Cmd: ['sleep', 'infinity'],
|
|
73
90
|
User: options.user,
|
|
91
|
+
Labels: { [SANDBOX_CONTAINER_LABEL]: 'true' },
|
|
74
92
|
HostConfig: {
|
|
75
93
|
Memory: options.memory,
|
|
76
|
-
NanoCpus: options.cpus ?
|
|
94
|
+
NanoCpus: options.cpus ? cpusToNanoCpus(options.cpus) : undefined,
|
|
77
95
|
CpuShares: options.cpuShares,
|
|
78
96
|
PidsLimit: options.pidsLimit ?? 100,
|
|
79
97
|
NetworkMode: options.networkMode ?? 'none',
|
|
98
|
+
Dns: options.dns?.length ? options.dns : undefined,
|
|
80
99
|
Binds: binds,
|
|
81
100
|
SecurityOpt: ['no-new-privileges'],
|
|
82
101
|
CapDrop: ['ALL'],
|
|
@@ -84,7 +103,13 @@ export class ContainerPool {
|
|
|
84
103
|
},
|
|
85
104
|
WorkingDir: '/workspace',
|
|
86
105
|
});
|
|
87
|
-
|
|
106
|
+
try {
|
|
107
|
+
await container.start();
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
await this.destroyContainer(container);
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
88
113
|
return container;
|
|
89
114
|
}
|
|
90
115
|
async destroyContainer(container) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-pool.js","sourceRoot":"","sources":["../../src/pool/container-pool.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"container-pool.js","sourceRoot":"","sources":["../../src/pool/container-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,10 @@ import type { SandboxConfig, SandboxExecutionRequest, SandboxExecutionResult, Sa
|
|
|
5
5
|
export declare class SandboxManager {
|
|
6
6
|
private executors;
|
|
7
7
|
private config;
|
|
8
|
-
private
|
|
8
|
+
private initPromise?;
|
|
9
9
|
constructor(config?: SandboxManagerConfig);
|
|
10
10
|
initialize(): Promise<void>;
|
|
11
|
+
private initializeExecutors;
|
|
11
12
|
execute(request: SandboxExecutionRequest, config: SandboxConfig): Promise<SandboxResult<SandboxExecutionResult>>;
|
|
12
13
|
isDockerAvailable(): Promise<boolean>;
|
|
13
14
|
isWasmAvailable(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-manager.d.ts","sourceRoot":"","sources":["../src/sandbox-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAM7B,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"sandbox-manager.d.ts","sourceRoot":"","sources":["../src/sandbox-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAM7B,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAC,CAAgB;gBAExB,MAAM,GAAE,oBAAyB;IAI7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,mBAAmB;IAqC3B,OAAO,CACX,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IA+B3C,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAMrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAMnC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAUhC"}
|
package/dist/sandbox-manager.js
CHANGED
|
@@ -7,13 +7,15 @@ import { WasmSandboxExecutor } from './executors/wasm.js';
|
|
|
7
7
|
export class SandboxManager {
|
|
8
8
|
executors = new Map();
|
|
9
9
|
config;
|
|
10
|
-
|
|
10
|
+
initPromise;
|
|
11
11
|
constructor(config = {}) {
|
|
12
12
|
this.config = config;
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
initialize() {
|
|
15
|
+
this.initPromise ??= this.initializeExecutors();
|
|
16
|
+
return this.initPromise;
|
|
17
|
+
}
|
|
18
|
+
async initializeExecutors() {
|
|
17
19
|
const native = new NativeSandboxExecutor();
|
|
18
20
|
await native.connect();
|
|
19
21
|
this.executors.set('native', native);
|
|
@@ -42,34 +44,9 @@ export class SandboxManager {
|
|
|
42
44
|
catch (error) {
|
|
43
45
|
console.warn('[sandbox] WASM initialization failed:', error instanceof Error ? error.message : String(error));
|
|
44
46
|
}
|
|
45
|
-
this.initialized = true;
|
|
46
47
|
}
|
|
47
48
|
async execute(request, config) {
|
|
48
49
|
await this.initialize();
|
|
49
|
-
const type = config.type;
|
|
50
|
-
const executor = this.executors.get(type);
|
|
51
|
-
if (!executor) {
|
|
52
|
-
if (type === 'wasm') {
|
|
53
|
-
console.warn('[sandbox] WASM unavailable, falling back to Docker');
|
|
54
|
-
const dockerExecutor = this.executors.get('docker');
|
|
55
|
-
if (dockerExecutor) {
|
|
56
|
-
return dockerExecutor.execute(request, { ...config, type: 'docker' });
|
|
57
|
-
}
|
|
58
|
-
console.warn('[sandbox] Docker also unavailable, falling back to native execution');
|
|
59
|
-
const nativeExecutor = this.executors.get('native');
|
|
60
|
-
if (nativeExecutor) {
|
|
61
|
-
return nativeExecutor.execute(request, { ...config, type: 'native' });
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (type === 'docker') {
|
|
65
|
-
console.warn('[sandbox] Docker unavailable, falling back to native execution');
|
|
66
|
-
const nativeExecutor = this.executors.get('native');
|
|
67
|
-
if (nativeExecutor) {
|
|
68
|
-
return nativeExecutor.execute(request, { ...config, type: 'native' });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return { success: false, error: `Sandbox type '${type}' not available` };
|
|
72
|
-
}
|
|
73
50
|
const mergedConfig = {
|
|
74
51
|
...this.config.defaults,
|
|
75
52
|
...config,
|
|
@@ -77,7 +54,20 @@ export class SandboxManager {
|
|
|
77
54
|
network: { ...this.config.defaults?.network, ...config.network },
|
|
78
55
|
env: { ...this.config.defaults?.env, ...config.env },
|
|
79
56
|
};
|
|
80
|
-
|
|
57
|
+
const type = mergedConfig.type;
|
|
58
|
+
const executor = this.executors.get(type);
|
|
59
|
+
if (executor) {
|
|
60
|
+
return executor.execute(request, mergedConfig);
|
|
61
|
+
}
|
|
62
|
+
const fallbackChain = type === 'wasm' ? ['docker', 'native'] : type === 'docker' ? ['native'] : [];
|
|
63
|
+
for (const fallback of fallbackChain) {
|
|
64
|
+
const fallbackExecutor = this.executors.get(fallback);
|
|
65
|
+
if (fallbackExecutor) {
|
|
66
|
+
console.warn(`[sandbox] ${type} unavailable, falling back to ${fallback} execution`);
|
|
67
|
+
return fallbackExecutor.execute(request, { ...mergedConfig, type: fallback });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { success: false, error: `Sandbox type '${type}' not available` };
|
|
81
71
|
}
|
|
82
72
|
async isDockerAvailable() {
|
|
83
73
|
await this.initialize();
|
|
@@ -90,11 +80,14 @@ export class SandboxManager {
|
|
|
90
80
|
return wasm ? wasm.isAvailable() : false;
|
|
91
81
|
}
|
|
92
82
|
async shutdown() {
|
|
83
|
+
const pending = this.initPromise;
|
|
84
|
+
this.initPromise = undefined;
|
|
85
|
+
if (pending)
|
|
86
|
+
await pending.catch(() => undefined);
|
|
93
87
|
for (const executor of this.executors.values()) {
|
|
94
88
|
await executor.disconnect();
|
|
95
89
|
}
|
|
96
90
|
this.executors.clear();
|
|
97
|
-
this.initialized = false;
|
|
98
91
|
}
|
|
99
92
|
}
|
|
100
93
|
//# sourceMappingURL=sandbox-manager.js.map
|