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.
Files changed (66) hide show
  1. package/README.md +39 -2
  2. package/dist/cli.js +255 -33
  3. package/dist/cli.js.map +8 -6
  4. package/dist/index.js +157 -12
  5. package/dist/index.js.map +7 -6
  6. package/dist/src/cli.d.ts.map +1 -0
  7. package/dist/src/client/remote.d.ts.map +1 -0
  8. package/dist/src/config.d.ts.map +1 -0
  9. package/dist/src/engine/concurrency.d.ts.map +1 -0
  10. package/dist/{engine → src/engine}/docker.d.ts +26 -0
  11. package/dist/src/engine/docker.d.ts.map +1 -0
  12. package/dist/src/engine/image-builder.d.ts.map +1 -0
  13. package/dist/src/engine/pool.d.ts.map +1 -0
  14. package/dist/src/engine/utils.d.ts.map +1 -0
  15. package/dist/{index.d.ts → src/index.d.ts} +1 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/runtime/adapter.d.ts.map +1 -0
  18. package/dist/src/runtime/adapters/bash.d.ts.map +1 -0
  19. package/dist/src/runtime/adapters/bun.d.ts.map +1 -0
  20. package/dist/src/runtime/adapters/deno.d.ts.map +1 -0
  21. package/dist/src/runtime/adapters/node.d.ts.map +1 -0
  22. package/dist/src/runtime/adapters/python.d.ts.map +1 -0
  23. package/dist/src/runtime/index.d.ts.map +1 -0
  24. package/dist/src/server/auth.d.ts.map +1 -0
  25. package/dist/src/server/index.d.ts.map +1 -0
  26. package/dist/{types.d.ts → src/types.d.ts} +4 -4
  27. package/dist/src/types.d.ts.map +1 -0
  28. package/dist/src/version.d.ts +15 -0
  29. package/dist/src/version.d.ts.map +1 -0
  30. package/package.json +11 -5
  31. package/schema/isol8.config.schema.json +10 -0
  32. package/dist/cli.d.ts.map +0 -1
  33. package/dist/client/remote.d.ts.map +0 -1
  34. package/dist/config.d.ts.map +0 -1
  35. package/dist/engine/concurrency.d.ts.map +0 -1
  36. package/dist/engine/docker.d.ts.map +0 -1
  37. package/dist/engine/image-builder.d.ts.map +0 -1
  38. package/dist/engine/pool.d.ts.map +0 -1
  39. package/dist/engine/utils.d.ts.map +0 -1
  40. package/dist/index.d.ts.map +0 -1
  41. package/dist/runtime/adapter.d.ts.map +0 -1
  42. package/dist/runtime/adapters/bash.d.ts.map +0 -1
  43. package/dist/runtime/adapters/bun.d.ts.map +0 -1
  44. package/dist/runtime/adapters/deno.d.ts.map +0 -1
  45. package/dist/runtime/adapters/node.d.ts.map +0 -1
  46. package/dist/runtime/adapters/python.d.ts.map +0 -1
  47. package/dist/runtime/index.d.ts.map +0 -1
  48. package/dist/server/auth.d.ts.map +0 -1
  49. package/dist/server/index.d.ts.map +0 -1
  50. package/dist/types.d.ts.map +0 -1
  51. /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
  52. /package/dist/{client → src/client}/remote.d.ts +0 -0
  53. /package/dist/{config.d.ts → src/config.d.ts} +0 -0
  54. /package/dist/{engine → src/engine}/concurrency.d.ts +0 -0
  55. /package/dist/{engine → src/engine}/image-builder.d.ts +0 -0
  56. /package/dist/{engine → src/engine}/pool.d.ts +0 -0
  57. /package/dist/{engine → src/engine}/utils.d.ts +0 -0
  58. /package/dist/{runtime → src/runtime}/adapter.d.ts +0 -0
  59. /package/dist/{runtime → src/runtime}/adapters/bash.d.ts +0 -0
  60. /package/dist/{runtime → src/runtime}/adapters/bun.d.ts +0 -0
  61. /package/dist/{runtime → src/runtime}/adapters/deno.d.ts +0 -0
  62. /package/dist/{runtime → src/runtime}/adapters/node.d.ts +0 -0
  63. /package/dist/{runtime → src/runtime}/adapters/python.d.ts +0 -0
  64. /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
  65. /package/dist/{server → src/server}/auth.d.ts +0 -0
  66. /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: "64m",
139
- tmpSize: "64m"
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 ?? "64m";
702
- this.tmpSize = options.tmpSize ?? "64m";
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
- "NODE_PATH=/usr/local/lib/node_modules:/sandbox/node_modules"
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=56FC4587DCE2E9EC64756E2164756E21
1502
+ //# debugId=50BAE19553D7B16164756E2164756E21