isol8 0.1.0-alpha.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -2
- package/dist/cli.js +255 -33
- package/dist/cli.js.map +8 -6
- package/dist/index.js +157 -12
- package/dist/index.js.map +7 -6
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/client/remote.d.ts.map +1 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/engine/concurrency.d.ts.map +1 -0
- package/dist/{engine → src/engine}/docker.d.ts +26 -0
- package/dist/src/engine/docker.d.ts.map +1 -0
- package/dist/src/engine/image-builder.d.ts.map +1 -0
- package/dist/src/engine/pool.d.ts.map +1 -0
- package/dist/src/engine/utils.d.ts.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/runtime/adapter.d.ts.map +1 -0
- package/dist/src/runtime/adapters/bash.d.ts.map +1 -0
- package/dist/src/runtime/adapters/bun.d.ts.map +1 -0
- package/dist/src/runtime/adapters/deno.d.ts.map +1 -0
- package/dist/src/runtime/adapters/node.d.ts.map +1 -0
- package/dist/src/runtime/adapters/python.d.ts.map +1 -0
- package/dist/src/runtime/index.d.ts.map +1 -0
- package/dist/src/server/auth.d.ts.map +1 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/{types.d.ts → src/types.d.ts} +4 -4
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/version.d.ts +15 -0
- package/dist/src/version.d.ts.map +1 -0
- package/package.json +11 -5
- package/schema/isol8.config.schema.json +10 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/client/remote.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/engine/concurrency.d.ts.map +0 -1
- package/dist/engine/docker.d.ts.map +0 -1
- package/dist/engine/image-builder.d.ts.map +0 -1
- package/dist/engine/pool.d.ts.map +0 -1
- package/dist/engine/utils.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/runtime/adapter.d.ts.map +0 -1
- package/dist/runtime/adapters/bash.d.ts.map +0 -1
- package/dist/runtime/adapters/bun.d.ts.map +0 -1
- package/dist/runtime/adapters/deno.d.ts.map +0 -1
- package/dist/runtime/adapters/node.d.ts.map +0 -1
- package/dist/runtime/adapters/python.d.ts.map +0 -1
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/server/auth.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
- /package/dist/{client → src/client}/remote.d.ts +0 -0
- /package/dist/{config.d.ts → src/config.d.ts} +0 -0
- /package/dist/{engine → src/engine}/concurrency.d.ts +0 -0
- /package/dist/{engine → src/engine}/image-builder.d.ts +0 -0
- /package/dist/{engine → src/engine}/pool.d.ts +0 -0
- /package/dist/{engine → src/engine}/utils.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/adapter.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/adapters/bash.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/adapters/bun.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/adapters/deno.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/adapters/node.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/adapters/python.d.ts +0 -0
- /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
- /package/dist/{server → src/server}/auth.d.ts +0 -0
- /package/dist/{server → src/server}/index.d.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -135,8 +135,8 @@ var DEFAULT_CONFIG = {
|
|
|
135
135
|
memoryLimit: "512m",
|
|
136
136
|
cpuLimit: 1,
|
|
137
137
|
network: "none",
|
|
138
|
-
sandboxSize: "
|
|
139
|
-
tmpSize: "
|
|
138
|
+
sandboxSize: "512m",
|
|
139
|
+
tmpSize: "256m"
|
|
140
140
|
},
|
|
141
141
|
network: {
|
|
142
142
|
whitelist: [],
|
|
@@ -619,11 +619,11 @@ function wrapWithTimeout(cmd, timeoutSec) {
|
|
|
619
619
|
function getInstallCommand(runtime, packages) {
|
|
620
620
|
switch (runtime) {
|
|
621
621
|
case "python":
|
|
622
|
-
return ["pip", "install", "--no-cache-dir", "--break-system-packages", ...packages];
|
|
622
|
+
return ["pip", "install", "--user", "--no-cache-dir", "--break-system-packages", ...packages];
|
|
623
623
|
case "node":
|
|
624
|
-
return ["npm", "install", "-g", ...packages];
|
|
624
|
+
return ["npm", "install", "-g", "--prefix=/sandbox/.npm-global", ...packages];
|
|
625
625
|
case "bun":
|
|
626
|
-
return ["bun", "install", "-g", ...packages];
|
|
626
|
+
return ["bun", "install", "-g", "--global-dir=/sandbox/.bun-global", ...packages];
|
|
627
627
|
case "deno":
|
|
628
628
|
return ["sh", "-c", packages.map((p) => `deno cache ${p}`).join(" && ")];
|
|
629
629
|
case "bash":
|
|
@@ -635,10 +635,23 @@ function getInstallCommand(runtime, packages) {
|
|
|
635
635
|
async function installPackages(container, runtime, packages) {
|
|
636
636
|
const cmd = getInstallCommand(runtime, packages);
|
|
637
637
|
console.error(`[DEBUG] Installing packages: ${JSON.stringify(cmd)}`);
|
|
638
|
+
const env = [
|
|
639
|
+
"PATH=/sandbox/.local/bin:/sandbox/.npm-global/bin:/sandbox/.bun-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"
|
|
640
|
+
];
|
|
641
|
+
if (runtime === "python") {
|
|
642
|
+
env.push("PYTHONUSERBASE=/sandbox/.local");
|
|
643
|
+
} else if (runtime === "node") {
|
|
644
|
+
env.push("NPM_CONFIG_PREFIX=/sandbox/.npm-global");
|
|
645
|
+
env.push("NPM_CONFIG_CACHE=/sandbox/.npm-cache");
|
|
646
|
+
env.push("npm_config_cache=/sandbox/.npm-cache");
|
|
647
|
+
} else if (runtime === "deno") {
|
|
648
|
+
env.push("DENO_DIR=/sandbox/.deno");
|
|
649
|
+
}
|
|
638
650
|
const exec = await container.exec({
|
|
639
651
|
Cmd: cmd,
|
|
640
652
|
AttachStdout: true,
|
|
641
|
-
AttachStderr: true
|
|
653
|
+
AttachStderr: true,
|
|
654
|
+
Env: env
|
|
642
655
|
});
|
|
643
656
|
const stream = await exec.start({ Detach: false, Tty: false });
|
|
644
657
|
return new Promise((resolve2, reject) => {
|
|
@@ -698,8 +711,8 @@ class DockerIsol8 {
|
|
|
698
711
|
this.defaultTimeoutMs = options.timeoutMs ?? 30000;
|
|
699
712
|
this.overrideImage = options.image;
|
|
700
713
|
this.semaphore = new Semaphore(maxConcurrent);
|
|
701
|
-
this.sandboxSize = options.sandboxSize ?? "
|
|
702
|
-
this.tmpSize = options.tmpSize ?? "
|
|
714
|
+
this.sandboxSize = options.sandboxSize ?? "512m";
|
|
715
|
+
this.tmpSize = options.tmpSize ?? "256m";
|
|
703
716
|
}
|
|
704
717
|
async start() {}
|
|
705
718
|
async stop() {
|
|
@@ -1012,8 +1025,8 @@ class DockerIsol8 {
|
|
|
1012
1025
|
PidsLimit: this.pidsLimit,
|
|
1013
1026
|
ReadonlyRootfs: this.readonlyRootFs,
|
|
1014
1027
|
Tmpfs: {
|
|
1015
|
-
"/tmp": `rw,noexec,nosuid,size=${this.tmpSize}`,
|
|
1016
|
-
[SANDBOX_WORKDIR]: `rw,size=${this.sandboxSize}`
|
|
1028
|
+
"/tmp": `rw,noexec,nosuid,nodev,size=${this.tmpSize}`,
|
|
1029
|
+
[SANDBOX_WORKDIR]: `rw,exec,nosuid,nodev,size=${this.sandboxSize}`
|
|
1017
1030
|
},
|
|
1018
1031
|
SecurityOpt: ["no-new-privileges"]
|
|
1019
1032
|
};
|
|
@@ -1027,7 +1040,11 @@ class DockerIsol8 {
|
|
|
1027
1040
|
buildEnv(extra) {
|
|
1028
1041
|
const env = [
|
|
1029
1042
|
"PYTHONUNBUFFERED=1",
|
|
1030
|
-
"
|
|
1043
|
+
"PYTHONUSERBASE=/sandbox/.local",
|
|
1044
|
+
"NPM_CONFIG_PREFIX=/sandbox/.npm-global",
|
|
1045
|
+
"DENO_DIR=/sandbox/.deno",
|
|
1046
|
+
"PATH=/sandbox/.local/bin:/sandbox/.npm-global/bin:/sandbox/.bun-global/bin:/usr/local/bin:/usr/bin:/bin",
|
|
1047
|
+
"NODE_PATH=/usr/local/lib/node_modules:/sandbox/.npm-global/lib/node_modules:/sandbox/node_modules"
|
|
1031
1048
|
];
|
|
1032
1049
|
for (const [key, value] of Object.entries(this.secrets)) {
|
|
1033
1050
|
env.push(`${key}=${value}`);
|
|
@@ -1166,6 +1183,26 @@ class DockerIsol8 {
|
|
|
1166
1183
|
}
|
|
1167
1184
|
return result.trimEnd();
|
|
1168
1185
|
}
|
|
1186
|
+
static async cleanup(docker) {
|
|
1187
|
+
const dockerInstance = docker ?? new Docker;
|
|
1188
|
+
const containers = await dockerInstance.listContainers({ all: true });
|
|
1189
|
+
const isol8Containers = containers.filter((c) => c.Image.startsWith("isol8:") || c.Image.startsWith("isol8-custom:"));
|
|
1190
|
+
let removed = 0;
|
|
1191
|
+
let failed = 0;
|
|
1192
|
+
const errors = [];
|
|
1193
|
+
for (const containerInfo of isol8Containers) {
|
|
1194
|
+
try {
|
|
1195
|
+
const container = dockerInstance.getContainer(containerInfo.Id);
|
|
1196
|
+
await container.remove({ force: true });
|
|
1197
|
+
removed++;
|
|
1198
|
+
} catch (err) {
|
|
1199
|
+
failed++;
|
|
1200
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
1201
|
+
errors.push(`${containerInfo.Id.slice(0, 12)}: ${errorMsg}`);
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
return { removed, failed, errors };
|
|
1205
|
+
}
|
|
1169
1206
|
}
|
|
1170
1207
|
// src/server/index.ts
|
|
1171
1208
|
import { Hono } from "hono";
|
|
@@ -1341,10 +1378,118 @@ function createServer(options) {
|
|
|
1341
1378
|
port: options.port
|
|
1342
1379
|
};
|
|
1343
1380
|
}
|
|
1381
|
+
// package.json
|
|
1382
|
+
var package_default = {
|
|
1383
|
+
name: "isol8",
|
|
1384
|
+
version: "0.2.0",
|
|
1385
|
+
description: "Secure code execution engine for AI agents",
|
|
1386
|
+
author: "Illusion47586",
|
|
1387
|
+
license: "MIT",
|
|
1388
|
+
repository: {
|
|
1389
|
+
type: "git",
|
|
1390
|
+
url: "https://github.com/Illusion47586/isol8.git"
|
|
1391
|
+
},
|
|
1392
|
+
homepage: "https://github.com/Illusion47586/isol8",
|
|
1393
|
+
bugs: {
|
|
1394
|
+
url: "https://github.com/Illusion47586/isol8/issues"
|
|
1395
|
+
},
|
|
1396
|
+
keywords: [
|
|
1397
|
+
"sandbox",
|
|
1398
|
+
"docker",
|
|
1399
|
+
"code-execution",
|
|
1400
|
+
"isolation",
|
|
1401
|
+
"security",
|
|
1402
|
+
"ai-agents",
|
|
1403
|
+
"container",
|
|
1404
|
+
"runtime"
|
|
1405
|
+
],
|
|
1406
|
+
type: "module",
|
|
1407
|
+
main: "./dist/index.js",
|
|
1408
|
+
types: "./dist/index.d.ts",
|
|
1409
|
+
exports: {
|
|
1410
|
+
".": {
|
|
1411
|
+
import: "./dist/index.js",
|
|
1412
|
+
types: "./dist/index.d.ts"
|
|
1413
|
+
},
|
|
1414
|
+
"./schema": "./schema/isol8.config.schema.json"
|
|
1415
|
+
},
|
|
1416
|
+
bin: {
|
|
1417
|
+
isol8: "./dist/cli.js"
|
|
1418
|
+
},
|
|
1419
|
+
scripts: {
|
|
1420
|
+
dev: "bun run src/cli.ts",
|
|
1421
|
+
build: "bun run scripts/build.ts",
|
|
1422
|
+
test: "bun test",
|
|
1423
|
+
"lint:check": "ultracite check",
|
|
1424
|
+
"lint:fix": "ultracite fix",
|
|
1425
|
+
bench: "bunx tsx benchmarks/spawn.ts",
|
|
1426
|
+
"bench:pool": "bunx tsx benchmarks/spawn-pool.ts",
|
|
1427
|
+
"bench:detailed": "bunx tsx benchmarks/spawn-detailed.ts",
|
|
1428
|
+
"docs:dev": "cd docs && mint dev",
|
|
1429
|
+
"docs:validate": "cd docs && mint validate",
|
|
1430
|
+
"docs:broken-links": "cd docs && mint broken-links",
|
|
1431
|
+
schema: "ts-json-schema-generator --path src/types.ts --type Isol8UserConfig --tsconfig tsconfig.json -o schema/isol8.config.schema.json && ultracite fix schema/isol8.config.schema.json",
|
|
1432
|
+
"publish:alpha": "bun run build && bun publish --tag alpha --access public --ignore-scripts",
|
|
1433
|
+
prepare: "simple-git-hooks"
|
|
1434
|
+
},
|
|
1435
|
+
dependencies: {
|
|
1436
|
+
commander: "^14.0.3",
|
|
1437
|
+
dockerode: "^4.0.9",
|
|
1438
|
+
hono: "^4.11.9",
|
|
1439
|
+
ora: "^9.3.0"
|
|
1440
|
+
},
|
|
1441
|
+
devDependencies: {
|
|
1442
|
+
"@biomejs/biome": "^2.3.15",
|
|
1443
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
1444
|
+
"@semantic-release/git": "^10.0.1",
|
|
1445
|
+
"@semantic-release/github": "^12.0.6",
|
|
1446
|
+
"@semantic-release/npm": "^13.1.4",
|
|
1447
|
+
"@types/bun": "latest",
|
|
1448
|
+
"@types/dockerode": "^4.0.1",
|
|
1449
|
+
"@types/node": "^25.2.3",
|
|
1450
|
+
"lint-staged": "^16.2.7",
|
|
1451
|
+
mint: "^4.2.348",
|
|
1452
|
+
"semantic-release": "^25.0.3",
|
|
1453
|
+
"simple-git-hooks": "^2.13.1",
|
|
1454
|
+
"ts-json-schema-generator": "^2.5.0",
|
|
1455
|
+
typescript: "^5.9.3",
|
|
1456
|
+
ultracite: "^7.2.0"
|
|
1457
|
+
},
|
|
1458
|
+
files: [
|
|
1459
|
+
"dist",
|
|
1460
|
+
"schema",
|
|
1461
|
+
"docker",
|
|
1462
|
+
"README.md",
|
|
1463
|
+
"LICENSE"
|
|
1464
|
+
],
|
|
1465
|
+
jsonValidation: [
|
|
1466
|
+
{
|
|
1467
|
+
fileMatch: "isol8.config.json",
|
|
1468
|
+
url: "./schema/isol8.config.schema.json"
|
|
1469
|
+
}
|
|
1470
|
+
],
|
|
1471
|
+
"simple-git-hooks": {
|
|
1472
|
+
"pre-commit": "bun run lint-staged"
|
|
1473
|
+
},
|
|
1474
|
+
"lint-staged": {
|
|
1475
|
+
"*.{ts,tsx}": [
|
|
1476
|
+
"ultracite fix",
|
|
1477
|
+
"bash -c 'bunx tsc --noEmit -p tsconfig.json'"
|
|
1478
|
+
],
|
|
1479
|
+
"src/types.ts": [
|
|
1480
|
+
"bash -c 'bun run schema'",
|
|
1481
|
+
"git add schema/isol8.config.schema.json"
|
|
1482
|
+
]
|
|
1483
|
+
}
|
|
1484
|
+
};
|
|
1485
|
+
|
|
1486
|
+
// src/version.ts
|
|
1487
|
+
var VERSION = package_default.version;
|
|
1344
1488
|
export {
|
|
1345
1489
|
loadConfig,
|
|
1346
1490
|
createServer,
|
|
1347
1491
|
bashAdapter,
|
|
1492
|
+
VERSION,
|
|
1348
1493
|
RuntimeRegistry,
|
|
1349
1494
|
RemoteIsol8,
|
|
1350
1495
|
PythonAdapter,
|
|
@@ -1354,4 +1499,4 @@ export {
|
|
|
1354
1499
|
BunAdapter
|
|
1355
1500
|
};
|
|
1356
1501
|
|
|
1357
|
-
//# debugId=
|
|
1502
|
+
//# debugId=50BAE19553D7B16164756E2164756E21
|