isol8 0.4.1 → 0.4.3

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.js CHANGED
@@ -192,9 +192,12 @@ import Docker from "dockerode";
192
192
  var adapters = new Map;
193
193
  var extensionMap = new Map;
194
194
  var RuntimeRegistry = {
195
- register(adapter) {
195
+ register(adapter, aliases = []) {
196
196
  adapters.set(adapter.name, adapter);
197
197
  extensionMap.set(adapter.getFileExtension(), adapter);
198
+ for (const ext of aliases) {
199
+ extensionMap.set(ext, adapter);
200
+ }
198
201
  },
199
202
  get(name) {
200
203
  const adapter = adapters.get(name);
@@ -280,7 +283,7 @@ var NodeAdapter = {
280
283
  return ["node", "-e", code];
281
284
  },
282
285
  getFileExtension() {
283
- return ".js";
286
+ return ".mjs";
284
287
  }
285
288
  };
286
289
 
@@ -301,7 +304,7 @@ var PythonAdapter = {
301
304
 
302
305
  // src/runtime/index.ts
303
306
  RuntimeRegistry.register(PythonAdapter);
304
- RuntimeRegistry.register(NodeAdapter);
307
+ RuntimeRegistry.register(NodeAdapter, [".js", ".cjs"]);
305
308
  RuntimeRegistry.register(BunAdapter);
306
309
  RuntimeRegistry.register(bashAdapter);
307
310
  RuntimeRegistry.register(DenoAdapter);
@@ -790,7 +793,8 @@ class DockerIsol8 {
790
793
  if (this.network === "filtered") {
791
794
  await startProxy(container, this.networkFilter);
792
795
  }
793
- const filePath = `${SANDBOX_WORKDIR}/main${adapter.getFileExtension()}`;
796
+ const ext = req.fileExtension ?? adapter.getFileExtension();
797
+ const filePath = `${SANDBOX_WORKDIR}/main${ext}`;
794
798
  await writeFileViaExec(container, filePath, req.code);
795
799
  if (req.installPackages?.length) {
796
800
  await installPackages(container, req.runtime, req.installPackages);
@@ -864,7 +868,8 @@ class DockerIsol8 {
864
868
  if (this.network === "filtered") {
865
869
  await startProxy(container, this.networkFilter);
866
870
  }
867
- const filePath = `${SANDBOX_WORKDIR}/main${adapter.getFileExtension()}`;
871
+ const ext = req.fileExtension ?? adapter.getFileExtension();
872
+ const filePath = `${SANDBOX_WORKDIR}/main${ext}`;
868
873
  await writeFileViaExec(container, filePath, req.code);
869
874
  if (req.installPackages?.length) {
870
875
  await installPackages(container, req.runtime, req.installPackages);
@@ -921,7 +926,8 @@ class DockerIsol8 {
921
926
  } else if (this.persistentRuntime?.name !== adapter.name) {
922
927
  throw new Error(`Cannot switch runtime from "${this.persistentRuntime?.name}" to "${adapter.name}". Each persistent container supports a single runtime. Create a new Isol8 instance for a different runtime.`);
923
928
  }
924
- const filePath = `${SANDBOX_WORKDIR}/exec_${Date.now()}${adapter.getFileExtension()}`;
929
+ const ext = req.fileExtension ?? adapter.getFileExtension();
930
+ const filePath = `${SANDBOX_WORKDIR}/exec_${Date.now()}${ext}`;
925
931
  if (this.readonlyRootFs) {
926
932
  await writeFileViaExec(this.container, filePath, req.code);
927
933
  } else {
@@ -1383,7 +1389,7 @@ function createServer(options) {
1383
1389
  // package.json
1384
1390
  var package_default = {
1385
1391
  name: "isol8",
1386
- version: "0.4.0",
1392
+ version: "0.4.2",
1387
1393
  description: "Secure code execution engine for AI agents",
1388
1394
  author: "Illusion47586",
1389
1395
  license: "MIT",
@@ -1501,4 +1507,4 @@ export {
1501
1507
  BunAdapter
1502
1508
  };
1503
1509
 
1504
- //# debugId=E29B0D9338BB963564756E2164756E21
1510
+ //# debugId=E336C06AFE4446F964756E2164756E21
package/dist/index.js.map CHANGED
@@ -4,14 +4,14 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * @module client/remote\n *\n * HTTP client for communicating with a remote isol8 server. Implements the\n * {@link Isol8Engine} interface, so it can be used interchangeably with\n * {@link DockerIsol8} for local-vs-remote execution.\n */\n\nimport type {\n ExecutionRequest,\n ExecutionResult,\n Isol8Engine,\n Isol8Options,\n StreamEvent,\n} from \"../types\";\n\n/** Connection options for the remote isol8 client. */\nexport interface RemoteIsol8Options {\n /** Base URL of the isol8 server (e.g. `\"http://localhost:3000\"`). */\n host: string;\n /** API key for Bearer token authentication. */\n apiKey: string;\n /** Optional session ID for persistent mode. If set, the server maintains container state across calls. */\n sessionId?: string;\n}\n\n/**\n * Remote isol8 client that communicates with an isol8 server over HTTP.\n * Implements the {@link Isol8Engine} interface for seamless local/remote switching.\n *\n * @example\n * ```typescript\n * const isol8 = new RemoteIsol8(\n * { host: \"http://localhost:3000\", apiKey: \"secret\" },\n * { network: \"none\" }\n * );\n * await isol8.start();\n * const result = await isol8.execute({ code: \"print(1)\", runtime: \"python\" });\n * await isol8.stop();\n * ```\n */\nexport class RemoteIsol8 implements Isol8Engine {\n private readonly host: string;\n private readonly apiKey: string;\n private readonly sessionId?: string;\n private readonly isol8Options?: Isol8Options;\n\n /**\n * @param options - Connection options (host, API key, session ID).\n * @param isol8Options - Isol8 configuration to send to the server.\n */\n constructor(options: RemoteIsol8Options, isol8Options?: Isol8Options) {\n this.host = options.host.replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.sessionId = options.sessionId;\n this.isol8Options = isol8Options;\n }\n\n /** Verify the remote server is reachable by hitting the `/health` endpoint. */\n async start(): Promise<void> {\n // Verify server is reachable\n const res = await this.fetch(\"/health\");\n if (!res.ok) {\n throw new Error(`Remote server health check failed: ${res.status}`);\n }\n }\n\n /** Destroy the remote session (if persistent). No-op for ephemeral mode. */\n async stop(): Promise<void> {\n if (this.sessionId) {\n await this.fetch(`/session/${this.sessionId}`, { method: \"DELETE\" });\n }\n }\n\n /** Execute code on the remote server and return the result. */\n async execute(req: ExecutionRequest): Promise<ExecutionResult> {\n const res = await this.fetch(\"/execute\", {\n method: \"POST\",\n body: JSON.stringify({\n request: req,\n options: this.isol8Options,\n sessionId: this.sessionId,\n }),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(`Execution failed: ${(body as { error?: string }).error ?? res.statusText}`);\n }\n\n return res.json() as Promise<ExecutionResult>;\n }\n\n /**\n * Execute code on the remote server and stream output chunks via SSE.\n * Yields {@link StreamEvent} objects as they arrive from the server.\n */\n async *executeStream(req: ExecutionRequest): AsyncIterable<StreamEvent> {\n const res = await this.fetch(\"/execute/stream\", {\n method: \"POST\",\n body: JSON.stringify({\n request: req,\n options: this.isol8Options,\n sessionId: this.sessionId,\n }),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(`Stream failed: ${(body as { error?: string }).error ?? res.statusText}`);\n }\n\n if (!res.body) {\n throw new Error(\"No response body for streaming\");\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const json = line.slice(6).trim();\n if (json) {\n yield JSON.parse(json) as StreamEvent;\n }\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.startsWith(\"data: \")) {\n const json = buffer.slice(6).trim();\n if (json) {\n yield JSON.parse(json) as StreamEvent;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Upload a file to the remote container (persistent mode only).\n * Content is Base64-encoded for transport.\n */\n async putFile(path: string, content: Buffer | string): Promise<void> {\n if (!this.sessionId) {\n throw new Error(\"File operations require a sessionId (persistent mode)\");\n }\n\n const base64 =\n typeof content === \"string\"\n ? Buffer.from(content).toString(\"base64\")\n : content.toString(\"base64\");\n\n const res = await this.fetch(\"/file\", {\n method: \"POST\",\n body: JSON.stringify({\n sessionId: this.sessionId,\n path,\n content: base64,\n }),\n });\n\n if (!res.ok) {\n throw new Error(`File upload failed: ${res.statusText}`);\n }\n }\n\n /** Download a file from the remote container (persistent mode only). */\n async getFile(path: string): Promise<Buffer> {\n if (!this.sessionId) {\n throw new Error(\"File operations require a sessionId (persistent mode)\");\n }\n\n const params = new URLSearchParams({ sessionId: this.sessionId, path });\n const res = await this.fetch(`/file?${params}`);\n\n if (!res.ok) {\n throw new Error(`File download failed: ${res.statusText}`);\n }\n\n const body = (await res.json()) as { content: string };\n return Buffer.from(body.content, \"base64\");\n }\n\n /** Internal fetch wrapper that attaches auth and content-type headers. */\n private async fetch(path: string, init?: RequestInit): Promise<Response> {\n return globalThis.fetch(`${this.host}${path}`, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n ...(init?.headers ?? {}),\n },\n });\n }\n}\n",
6
6
  "/**\n * @module config\n *\n * Configuration discovery and loading for isol8. Searches for `isol8.config.json`\n * in the working directory and then in `~/.isol8/config.json`, merging any found\n * config with built-in defaults.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { Isol8Config } from \"./types\";\n\n/**\n * Built-in default configuration. Used as the base for all config merges.\n * All values here are the \"safe defaults\" — network disabled, conservative limits.\n */\nconst DEFAULT_CONFIG: Isol8Config = {\n maxConcurrent: 10,\n defaults: {\n timeoutMs: 30_000,\n memoryLimit: \"512m\",\n cpuLimit: 1.0,\n network: \"none\",\n sandboxSize: \"512m\",\n tmpSize: \"256m\",\n },\n network: {\n whitelist: [],\n blacklist: [],\n },\n cleanup: {\n autoPrune: true,\n maxContainerAgeMs: 3_600_000,\n },\n dependencies: {},\n};\n\n/**\n * Discovers and loads the isol8 configuration file.\n *\n * Search order (first match wins):\n * 1. `isol8.config.json` in CWD (or the provided `cwd` argument)\n * 2. `~/.isol8/config.json`\n *\n * If no config file is found, returns a copy of {@link DEFAULT_CONFIG}.\n * Partial configs are deep-merged with defaults — you only need to specify\n * the fields you want to override.\n *\n * @param cwd - Optional working directory to search from (defaults to `process.cwd()`).\n * @returns The resolved configuration.\n *\n * @example\n * ```typescript\n * const config = loadConfig();\n * console.log(config.defaults.timeoutMs); // 30000\n * ```\n */\nexport function loadConfig(cwd?: string): Isol8Config {\n const searchPaths = [\n join(resolve(cwd ?? process.cwd()), \"isol8.config.json\"),\n join(homedir(), \".isol8\", \"config.json\"),\n ];\n\n for (const configPath of searchPaths) {\n if (existsSync(configPath)) {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<Isol8Config>;\n return mergeConfig(DEFAULT_CONFIG, parsed);\n }\n }\n\n return { ...DEFAULT_CONFIG };\n}\n\n/**\n * Deep-merges a partial config with defaults. Each top-level section is merged\n * independently so that specifying e.g. `{ defaults: { timeoutMs: 5000 } }`\n * preserves all other default values.\n */\nfunction mergeConfig(defaults: Isol8Config, overrides: Partial<Isol8Config>): Isol8Config {\n return {\n maxConcurrent: overrides.maxConcurrent ?? defaults.maxConcurrent,\n defaults: {\n ...defaults.defaults,\n ...overrides.defaults,\n },\n network: {\n whitelist: overrides.network?.whitelist ?? defaults.network.whitelist,\n blacklist: overrides.network?.blacklist ?? defaults.network.blacklist,\n },\n cleanup: {\n ...defaults.cleanup,\n ...overrides.cleanup,\n },\n dependencies: {\n ...defaults.dependencies,\n ...overrides.dependencies,\n },\n };\n}\n\nexport { DEFAULT_CONFIG };\n",
7
- "/**\n * @module engine/docker\n *\n * The Docker-backed isol8 engine. Creates and manages Docker containers\n * for executing untrusted code with resource limits, network controls, and\n * output sanitization.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { PassThrough } from \"node:stream\";\nimport Docker from \"dockerode\";\nimport { RuntimeRegistry } from \"../runtime\";\nimport type { RuntimeAdapter } from \"../runtime/adapter\";\nimport type {\n ExecutionRequest,\n ExecutionResult,\n Isol8Engine,\n Isol8Mode,\n Isol8Options,\n NetworkFilterConfig,\n NetworkMode,\n StreamEvent,\n} from \"../types\";\nimport { Semaphore } from \"./concurrency\";\nimport { ContainerPool } from \"./pool\";\nimport {\n createTarBuffer,\n extractFromTar,\n maskSecrets,\n parseMemoryLimit,\n truncateOutput,\n} from \"./utils\";\n\n/**\n * Writes a file into a running container using `docker exec`.\n * This bypasses the `putArchive` limitation where Docker rejects archive\n * uploads when `ReadonlyRootfs` is enabled — even to writable tmpfs mounts.\n *\n * Uses detached exec with polling to avoid Bun/dockerode hijack incompatibilities.\n */\nasync function writeFileViaExec(\n container: Docker.Container,\n filePath: string,\n content: Buffer | string\n): Promise<void> {\n const data = typeof content === \"string\" ? Buffer.from(content, \"utf-8\") : content;\n const b64 = data.toString(\"base64\");\n\n const exec = await container.exec({\n Cmd: [\"sh\", \"-c\", `printf '%s' '${b64}' | base64 -d > ${filePath}`],\n });\n\n // Run detached — avoids hijack/stream issues with Bun\n await exec.start({ Detach: true });\n\n // Poll until the exec completes\n let info = await exec.inspect();\n while (info.Running) {\n await new Promise((r) => setTimeout(r, 50));\n info = await exec.inspect();\n }\n\n if (info.ExitCode !== 0) {\n throw new Error(`Failed to write file ${filePath} in container (exit code ${info.ExitCode})`);\n }\n}\n\n/**\n * Reads a file from a running container using `docker exec`.\n * This bypasses the `getArchive` limitation where Docker rejects archive\n * downloads when `ReadonlyRootfs` is enabled — even from writable tmpfs mounts.\n *\n * Works by running `base64 <path>` and decoding the output.\n */\nasync function readFileViaExec(container: Docker.Container, filePath: string): Promise<Buffer> {\n const exec = await container.exec({\n Cmd: [\"base64\", filePath],\n AttachStdout: true,\n AttachStderr: true,\n });\n\n const stream = await exec.start({ Tty: false });\n\n const chunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stdoutStream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stderrStream.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n await new Promise<void>((resolve, reject) => {\n stream.on(\"end\", resolve);\n stream.on(\"error\", reject);\n });\n\n const inspectResult = await exec.inspect();\n if (inspectResult.ExitCode !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\").trim();\n throw new Error(\n `Failed to read file ${filePath} in container: ${stderr} (exit code ${inspectResult.ExitCode})`\n );\n }\n\n const b64Output = Buffer.concat(chunks).toString(\"utf-8\").trim();\n return Buffer.from(b64Output, \"base64\");\n}\n\nconst SANDBOX_WORKDIR = \"/sandbox\";\nconst MAX_OUTPUT_BYTES = 1024 * 1024; // 1MB default\nconst PROXY_PORT = 8118;\nconst PROXY_STARTUP_TIMEOUT_MS = 5000;\nconst PROXY_POLL_INTERVAL_MS = 100;\n\n/**\n * Starts proxy.mjs inside the container for filtered network mode.\n * Waits until the proxy is listening on PROXY_PORT before returning.\n */\nasync function startProxy(\n container: Docker.Container,\n networkFilter?: { whitelist: string[]; blacklist: string[] }\n): Promise<void> {\n const envParts: string[] = [];\n if (networkFilter) {\n envParts.push(`ISOL8_WHITELIST='${JSON.stringify(networkFilter.whitelist)}'`);\n envParts.push(`ISOL8_BLACKLIST='${JSON.stringify(networkFilter.blacklist)}'`);\n }\n const envPrefix = envParts.length > 0 ? `${envParts.join(\" \")} ` : \"\";\n\n // Start proxy in background\n const startExec = await container.exec({\n Cmd: [\"sh\", \"-c\", `${envPrefix}node /usr/local/bin/proxy.mjs &`],\n });\n await startExec.start({ Detach: true });\n\n // Poll until proxy is ready\n const deadline = Date.now() + PROXY_STARTUP_TIMEOUT_MS;\n while (Date.now() < deadline) {\n try {\n const checkExec = await container.exec({\n Cmd: [\"sh\", \"-c\", `nc -z 127.0.0.1 ${PROXY_PORT} 2>/dev/null`],\n });\n await checkExec.start({ Detach: true });\n let info = await checkExec.inspect();\n while (info.Running) {\n await new Promise((r) => setTimeout(r, 50));\n info = await checkExec.inspect();\n }\n if (info.ExitCode === 0) {\n return;\n }\n } catch {\n // Ignore, keep polling\n }\n await new Promise((r) => setTimeout(r, PROXY_POLL_INTERVAL_MS));\n }\n throw new Error(\"Proxy failed to start within timeout\");\n}\n\n/**\n * Wraps a command with the `timeout` utility so the process is killed\n * after the specified duration. Returns the wrapped command.\n */\nfunction wrapWithTimeout(cmd: string[], timeoutSec: number): string[] {\n return [\"timeout\", \"-s\", \"KILL\", String(timeoutSec), ...cmd];\n}\n\n/**\n * Returns the package manager install command for a given runtime.\n */\nfunction getInstallCommand(runtime: string, packages: string[]): string[] {\n switch (runtime) {\n case \"python\":\n return [\"pip\", \"install\", \"--user\", \"--no-cache-dir\", \"--break-system-packages\", ...packages];\n case \"node\":\n // Install to /sandbox (local node_modules) so resolution works for both CJS and ESM\n return [\"npm\", \"install\", \"--prefix\", \"/sandbox\", ...packages];\n case \"bun\":\n // Bun global install - use /sandbox for writable location\n return [\"bun\", \"install\", \"-g\", \"--global-dir=/sandbox/.bun-global\", ...packages];\n case \"deno\":\n // Deno uses URL imports; cache modules to /sandbox\n return [\"sh\", \"-c\", packages.map((p) => `deno cache ${p}`).join(\" && \")];\n case \"bash\":\n return [\"apk\", \"add\", \"--no-cache\", ...packages];\n default:\n throw new Error(`Unknown runtime for package install: ${runtime}`);\n }\n}\n\n/**\n * Installs packages inside a container using the runtime's package manager.\n */\nasync function installPackages(\n container: Docker.Container,\n runtime: string,\n packages: string[]\n): Promise<void> {\n const cmd = getInstallCommand(runtime, packages);\n // Debug log\n console.error(`[DEBUG] Installing packages: ${JSON.stringify(cmd)}`);\n\n // Set environment for writable install locations\n // Use /sandbox instead of /tmp because /tmp has noexec flag which prevents loading .so files\n const env: string[] = [\n \"PATH=/sandbox/.local/bin:/sandbox/.npm-global/bin:/sandbox/.bun-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin\",\n ];\n\n if (runtime === \"python\") {\n env.push(\"PYTHONUSERBASE=/sandbox/.local\");\n } else if (runtime === \"node\") {\n env.push(\"NPM_CONFIG_PREFIX=/sandbox/.npm-global\");\n env.push(\"NPM_CONFIG_CACHE=/sandbox/.npm-cache\");\n env.push(\"npm_config_cache=/sandbox/.npm-cache\");\n } else if (runtime === \"bun\") {\n env.push(\"BUN_INSTALL_GLOBAL_DIR=/sandbox/.bun-global\");\n env.push(\"BUN_INSTALL_CACHE_DIR=/sandbox/.bun-cache\");\n env.push(\"BUN_INSTALL_BIN=/sandbox/.bun-global/bin\");\n } else if (runtime === \"deno\") {\n env.push(\"DENO_DIR=/sandbox/.deno\");\n }\n\n const exec = await container.exec({\n Cmd: cmd,\n AttachStdout: true,\n AttachStderr: true,\n Env: env,\n });\n\n const stream = await exec.start({ Detach: false, Tty: false });\n\n return new Promise<void>((resolve, reject) => {\n let stderr = \"\";\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stderrStream.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n\n stream.on(\"end\", async () => {\n try {\n const info = await exec.inspect();\n if (info.ExitCode !== 0) {\n reject(new Error(`Package install failed (exit code ${info.ExitCode}): ${stderr}`));\n } else {\n resolve();\n }\n } catch (err) {\n reject(err);\n }\n });\n\n stream.on(\"error\", reject);\n });\n}\n\n/** Options for constructing a {@link DockerIsol8} instance. Extends {@link Isol8Options} with Docker-specific settings. */\nexport interface DockerIsol8Options extends Isol8Options {\n /** Custom dockerode instance. Defaults to connecting to the local Docker socket. */\n docker?: Docker;\n}\n\n/**\n * Docker-backed isol8 engine that executes code in isolated containers.\n *\n * Supports two modes:\n * - **Ephemeral** — a new container is created and destroyed per `execute()` call.\n * - **Persistent** — a long-lived container is reused across calls, preserving state.\n *\n * @example\n * ```typescript\n * const isol8 = new DockerIsol8({ network: \"none\", memoryLimit: \"256m\" });\n * await isol8.start();\n * const result = await isol8.execute({ code: \"print(1+1)\", runtime: \"python\" });\n * await isol8.stop();\n * ```\n */\nexport class DockerIsol8 implements Isol8Engine {\n private readonly docker: Docker;\n private readonly mode: Isol8Mode;\n private readonly network: NetworkMode;\n private readonly networkFilter?: NetworkFilterConfig;\n private readonly cpuLimit: number;\n private readonly memoryLimit: string;\n private readonly pidsLimit: number;\n private readonly readonlyRootFs: boolean;\n private readonly maxOutputSize: number;\n private readonly secrets: Record<string, string>;\n private readonly defaultTimeoutMs: number;\n private readonly overrideImage?: string;\n private readonly semaphore: Semaphore;\n private readonly sandboxSize: string;\n private readonly tmpSize: string;\n\n private container: Docker.Container | null = null;\n private persistentRuntime: RuntimeAdapter | null = null;\n private pool: ContainerPool | null = null;\n\n /**\n * @param options - Sandbox configuration options.\n * @param maxConcurrent - Maximum number of concurrent executions (controls the internal semaphore).\n */\n constructor(options: DockerIsol8Options = {}, maxConcurrent = 10) {\n this.docker = options.docker ?? new Docker();\n this.mode = options.mode ?? \"ephemeral\";\n this.network = options.network ?? \"none\";\n this.networkFilter = options.networkFilter;\n this.cpuLimit = options.cpuLimit ?? 1.0;\n this.memoryLimit = options.memoryLimit ?? \"512m\";\n this.pidsLimit = options.pidsLimit ?? 64;\n this.readonlyRootFs = options.readonlyRootFs ?? true;\n this.maxOutputSize = options.maxOutputSize ?? MAX_OUTPUT_BYTES;\n this.secrets = options.secrets ?? {};\n this.defaultTimeoutMs = options.timeoutMs ?? 30_000;\n this.overrideImage = options.image;\n this.semaphore = new Semaphore(maxConcurrent);\n this.sandboxSize = options.sandboxSize ?? \"512m\";\n this.tmpSize = options.tmpSize ?? \"256m\";\n }\n\n /**\n * Initialize isol8. Currently a no-op — containers are created\n * lazily on first `execute()` call.\n */\n async start(): Promise<void> {\n // For persistent mode, container is started lazily on first execute\n // For ephemeral mode, this is a no-op\n }\n\n /** Stop and remove the container (if one exists). Safe to call multiple times. */\n async stop(): Promise<void> {\n if (this.container) {\n try {\n await this.container.stop({ t: 2 });\n } catch {\n // Container may already be stopped\n }\n try {\n await this.container.remove({ force: true });\n } catch {\n // Container may already be removed\n }\n this.container = null;\n this.persistentRuntime = null;\n }\n\n // Drain the warm container pool\n if (this.pool) {\n await this.pool.drain();\n this.pool = null;\n }\n }\n\n /**\n * Execute code in isol8. Acquires a semaphore permit to enforce\n * the concurrency limit, then delegates to ephemeral or persistent execution.\n */\n async execute(req: ExecutionRequest): Promise<ExecutionResult> {\n await this.semaphore.acquire();\n try {\n return this.mode === \"persistent\"\n ? await this.executePersistent(req)\n : await this.executeEphemeral(req);\n } finally {\n this.semaphore.release();\n }\n }\n\n /**\n * Upload a file into the running container via a tar archive.\n * Only available in persistent mode after at least one `execute()` call.\n *\n * @param path - Absolute path inside the container.\n * @param content - File contents.\n * @throws {Error} If no container is active.\n */\n async putFile(path: string, content: Buffer | string): Promise<void> {\n if (!this.container) {\n throw new Error(\"No active container. Call execute() first in persistent mode.\");\n }\n if (this.readonlyRootFs) {\n await writeFileViaExec(this.container, path, content);\n } else {\n const tar = createTarBuffer(path, content);\n await this.container.putArchive(tar, { path: \"/\" });\n }\n }\n\n /**\n * Download a file from the running container.\n *\n * @param path - Absolute path inside the container.\n * @returns File contents as a Buffer.\n * @throws {Error} If no container is active.\n */\n async getFile(path: string): Promise<Buffer> {\n if (!this.container) {\n throw new Error(\"No active container. Call execute() first in persistent mode.\");\n }\n\n if (this.readonlyRootFs) {\n return readFileViaExec(this.container, path);\n }\n\n const stream = await this.container.getArchive({ path });\n\n const chunks: Buffer[] = [];\n for await (const chunk of stream as AsyncIterable<Buffer>) {\n chunks.push(chunk);\n }\n const tarBuffer = Buffer.concat(chunks);\n return extractFromTar(tarBuffer, path);\n }\n\n /** The Docker container ID, or `null` if no container is active. Used by the server for session tracking. */\n get containerId(): string | null {\n return this.container?.id ?? null;\n }\n\n /**\n * Execute code and stream output chunks as they arrive.\n * Yields {@link StreamEvent} objects for stdout, stderr, exit, and error events.\n */\n async *executeStream(req: ExecutionRequest): AsyncIterable<StreamEvent> {\n await this.semaphore.acquire();\n try {\n const adapter = this.getAdapter(req.runtime);\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n const image = await this.resolveImage(adapter);\n\n // Create container (always ephemeral-style for streaming)\n const container = await this.docker.createContainer({\n Image: image,\n Cmd: [\"sleep\", \"infinity\"],\n WorkingDir: SANDBOX_WORKDIR,\n Env: this.buildEnv(),\n NetworkDisabled: this.network === \"none\",\n HostConfig: this.buildHostConfig(),\n StopTimeout: 2,\n });\n\n try {\n await container.start();\n\n if (this.network === \"filtered\") {\n await startProxy(container, this.networkFilter);\n }\n\n // Write code\n const filePath = `${SANDBOX_WORKDIR}/main${adapter.getFileExtension()}`;\n await writeFileViaExec(container, filePath, req.code);\n\n // Install packages if requested\n if (req.installPackages?.length) {\n await installPackages(container, req.runtime, req.installPackages);\n }\n\n // Inject input files\n if (req.files) {\n for (const [fPath, fContent] of Object.entries(req.files)) {\n await writeFileViaExec(container, fPath, fContent);\n }\n }\n\n // Build command\n const rawCmd = adapter.getCommand(req.code, filePath);\n const timeoutSec = Math.ceil(timeoutMs / 1000);\n let cmd: string[];\n if (req.stdin) {\n const stdinPath = `${SANDBOX_WORKDIR}/_stdin`;\n await writeFileViaExec(container, stdinPath, req.stdin);\n const cmdStr = rawCmd.map((a) => `'${a.replace(/'/g, \"'\\\\''\")}'`).join(\" \");\n cmd = wrapWithTimeout([\"sh\", \"-c\", `cat ${stdinPath} | ${cmdStr}`], timeoutSec);\n } else {\n cmd = wrapWithTimeout(rawCmd, timeoutSec);\n }\n\n const exec = await container.exec({\n Cmd: cmd,\n Env: this.buildEnv(req.env),\n AttachStdout: true,\n AttachStderr: true,\n WorkingDir: SANDBOX_WORKDIR,\n });\n\n const execStream = await exec.start({ Tty: false });\n\n yield* this.streamExecOutput(execStream, exec, container, timeoutMs);\n } finally {\n try {\n await container.remove({ force: true });\n } catch {\n // Best effort cleanup\n }\n }\n } finally {\n this.semaphore.release();\n }\n }\n\n // ─── Private methods ───\n\n private async resolveImage(adapter: RuntimeAdapter): Promise<string> {\n if (this.overrideImage) {\n return this.overrideImage;\n }\n // Prefer custom image if it exists\n const customTag = `${adapter.image}-custom`;\n try {\n await this.docker.getImage(customTag).inspect();\n return customTag;\n } catch {\n return adapter.image;\n }\n }\n\n private async executeEphemeral(req: ExecutionRequest): Promise<ExecutionResult> {\n const adapter = this.getAdapter(req.runtime);\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n const image = await this.resolveImage(adapter);\n\n // Lazily initialize the container pool\n if (!this.pool) {\n this.pool = new ContainerPool({\n docker: this.docker,\n poolSize: 2,\n createOptions: {\n Cmd: [\"sleep\", \"infinity\"],\n WorkingDir: SANDBOX_WORKDIR,\n Env: this.buildEnv(),\n NetworkDisabled: this.network === \"none\",\n HostConfig: this.buildHostConfig(),\n StopTimeout: 2,\n },\n });\n }\n\n // Acquire a pre-warmed container from the pool\n const container = await this.pool.acquire(image);\n\n try {\n // Start proxy for filtered network mode\n if (this.network === \"filtered\") {\n await startProxy(container, this.networkFilter);\n }\n\n // Write code to the active tmpfs via exec (putArchive fails with ReadonlyRootfs)\n const filePath = `${SANDBOX_WORKDIR}/main${adapter.getFileExtension()}`;\n await writeFileViaExec(container, filePath, req.code);\n\n // Install packages if requested\n if (req.installPackages?.length) {\n await installPackages(container, req.runtime, req.installPackages);\n }\n\n // Execute the actual command, wrapped with timeout to ensure kill on expiry\n const rawCmd = adapter.getCommand(req.code, filePath);\n const timeoutSec = Math.ceil(timeoutMs / 1000);\n\n // Handle stdin: write to file and pipe into command\n let cmd: string[];\n if (req.stdin) {\n const stdinPath = `${SANDBOX_WORKDIR}/_stdin`;\n await writeFileViaExec(container, stdinPath, req.stdin);\n const cmdStr = rawCmd.map((a) => `'${a.replace(/'/g, \"'\\\\''\")}' `).join(\"\");\n cmd = wrapWithTimeout([\"sh\", \"-c\", `cat ${stdinPath} | ${cmdStr}`], timeoutSec);\n } else {\n cmd = wrapWithTimeout(rawCmd, timeoutSec);\n }\n\n // Inject input files\n if (req.files) {\n for (const [fPath, fContent] of Object.entries(req.files)) {\n await writeFileViaExec(container, fPath, fContent);\n }\n }\n\n const exec = await container.exec({\n Cmd: cmd,\n Env: this.buildEnv(req.env),\n AttachStdout: true,\n AttachStderr: true,\n WorkingDir: SANDBOX_WORKDIR,\n });\n\n const start = performance.now();\n const execStream = await exec.start({ Tty: false });\n\n const { stdout, stderr, truncated } = await this.collectExecOutput(\n execStream,\n container,\n timeoutMs\n );\n const durationMs = Math.round(performance.now() - start);\n\n const inspectResult = await exec.inspect();\n\n return {\n stdout: this.postProcessOutput(stdout, truncated),\n stderr: this.postProcessOutput(stderr, false),\n exitCode: inspectResult.ExitCode ?? 1,\n durationMs,\n truncated,\n executionId: randomUUID(),\n runtime: req.runtime,\n timestamp: new Date().toISOString(),\n containerId: container.id,\n ...(req.outputPaths ? { files: await this.retrieveFiles(container, req.outputPaths) } : {}),\n };\n } finally {\n // Return container to pool for reuse (pool will clean sandbox)\n await this.pool!.release(container, image);\n }\n }\n\n private async executePersistent(req: ExecutionRequest): Promise<ExecutionResult> {\n const adapter = this.getAdapter(req.runtime);\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n\n // Lazily create the persistent container\n if (!this.container) {\n await this.startPersistentContainer(adapter);\n } else if (this.persistentRuntime?.name !== adapter.name) {\n throw new Error(\n `Cannot switch runtime from \"${this.persistentRuntime?.name}\" to \"${adapter.name}\". Each persistent container supports a single runtime. Create a new Isol8 instance for a different runtime.`\n );\n }\n\n const filePath = `${SANDBOX_WORKDIR}/exec_${Date.now()}${adapter.getFileExtension()}`;\n\n // Write code to the container\n if (this.readonlyRootFs) {\n await writeFileViaExec(this.container!, filePath, req.code);\n } else {\n const tar = createTarBuffer(filePath, req.code);\n await this.container!.putArchive(tar, { path: \"/\" });\n }\n\n // Inject input files\n if (req.files) {\n for (const [fPath, fContent] of Object.entries(req.files)) {\n if (this.readonlyRootFs) {\n await writeFileViaExec(this.container!, fPath, fContent);\n } else {\n const tar = createTarBuffer(fPath, fContent);\n await this.container!.putArchive(tar, { path: \"/\" });\n }\n }\n }\n\n const rawCmd = adapter.getCommand(req.code, filePath);\n const timeoutSec = Math.ceil(timeoutMs / 1000);\n\n // Install packages if requested\n if (req.installPackages?.length) {\n await installPackages(this.container!, req.runtime, req.installPackages);\n }\n\n // Handle stdin\n let cmd: string[];\n if (req.stdin) {\n const stdinPath = `${SANDBOX_WORKDIR}/_stdin_${Date.now()}`;\n await writeFileViaExec(this.container!, stdinPath, req.stdin);\n const cmdStr = rawCmd.map((a) => `'${a.replace(/'/g, \"'\\\\''\")}' `).join(\"\");\n cmd = wrapWithTimeout([\"sh\", \"-c\", `cat ${stdinPath} | ${cmdStr}`], timeoutSec);\n } else {\n cmd = wrapWithTimeout(rawCmd, timeoutSec);\n }\n\n const execEnv = this.buildEnv(req.env);\n\n const exec = await this.container!.exec({\n Cmd: cmd,\n Env: execEnv,\n AttachStdout: true,\n AttachStderr: true,\n WorkingDir: SANDBOX_WORKDIR,\n });\n\n const start = performance.now();\n const execStream = await exec.start({ Tty: false });\n\n const { stdout, stderr, truncated } = await this.collectExecOutput(\n execStream,\n this.container!,\n timeoutMs\n );\n const durationMs = Math.round(performance.now() - start);\n\n const inspectResult = await exec.inspect();\n\n return {\n stdout: this.postProcessOutput(stdout, truncated),\n stderr: this.postProcessOutput(stderr, false),\n exitCode: inspectResult.ExitCode ?? 1,\n durationMs,\n truncated,\n executionId: randomUUID(),\n runtime: req.runtime,\n timestamp: new Date().toISOString(),\n containerId: this.container?.id,\n ...(req.outputPaths\n ? { files: await this.retrieveFiles(this.container!, req.outputPaths) }\n : {}),\n };\n }\n\n private async retrieveFiles(\n container: Docker.Container,\n paths: string[]\n ): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n for (const p of paths) {\n try {\n const buf = this.readonlyRootFs\n ? await readFileViaExec(container, p)\n : await this.getFileFromContainer(container, p);\n files[p] = buf.toString(\"base64\");\n } catch {\n // Skip files that don't exist\n }\n }\n return files;\n }\n\n private async getFileFromContainer(container: Docker.Container, path: string): Promise<Buffer> {\n const stream = await container.getArchive({ path });\n const chunks: Buffer[] = [];\n for await (const chunk of stream as AsyncIterable<Buffer>) {\n chunks.push(chunk);\n }\n return extractFromTar(Buffer.concat(chunks), path);\n }\n\n private async startPersistentContainer(adapter: RuntimeAdapter): Promise<void> {\n const image = await this.resolveImage(adapter);\n\n this.container = await this.docker.createContainer({\n Image: image,\n Cmd: [\"sleep\", \"infinity\"],\n WorkingDir: SANDBOX_WORKDIR,\n Env: this.buildEnv(),\n NetworkDisabled: this.network === \"none\",\n HostConfig: this.buildHostConfig(),\n StopTimeout: 2,\n Labels: {\n \"isol8.managed\": \"true\",\n \"isol8.runtime\": adapter.name,\n },\n });\n\n await this.container.start();\n\n // Start proxy for filtered network mode\n if (this.network === \"filtered\") {\n await startProxy(this.container, this.networkFilter);\n }\n\n this.persistentRuntime = adapter;\n }\n\n private getAdapter(runtime: string): RuntimeAdapter {\n return RuntimeRegistry.get(runtime);\n }\n\n private buildHostConfig(): Docker.HostConfig {\n const config: Docker.HostConfig = {\n Memory: parseMemoryLimit(this.memoryLimit),\n NanoCpus: Math.floor(this.cpuLimit * 1e9),\n PidsLimit: this.pidsLimit,\n ReadonlyRootfs: this.readonlyRootFs,\n Tmpfs: {\n \"/tmp\": `rw,noexec,nosuid,nodev,size=${this.tmpSize}`,\n [SANDBOX_WORKDIR]: `rw,exec,nosuid,nodev,size=${this.sandboxSize}`,\n },\n SecurityOpt: [\"no-new-privileges\"],\n };\n\n if (this.network === \"filtered\") {\n config.NetworkMode = \"bridge\";\n } else if (this.network === \"host\") {\n config.NetworkMode = \"host\";\n }\n\n return config;\n }\n\n private buildEnv(extra?: Record<string, string>): string[] {\n const env: string[] = [\n \"PYTHONUNBUFFERED=1\",\n \"PYTHONUSERBASE=/sandbox/.local\",\n \"NPM_CONFIG_PREFIX=/sandbox/.npm-global\",\n \"DENO_DIR=/sandbox/.deno\",\n \"PATH=/sandbox/.local/bin:/sandbox/.npm-global/bin:/sandbox/.bun-global/bin:/usr/local/bin:/usr/bin:/bin\",\n \"NODE_PATH=/usr/local/lib/node_modules:/sandbox/.npm-global/lib/node_modules:/sandbox/node_modules\",\n ];\n\n // Add secrets as env vars\n for (const [key, value] of Object.entries(this.secrets)) {\n env.push(`${key}=${value}`);\n }\n\n // Add extra env vars\n if (extra) {\n for (const [key, value] of Object.entries(extra)) {\n env.push(`${key}=${value}`);\n }\n }\n\n // Add proxy config for filtered mode\n if (this.network === \"filtered\" && this.networkFilter) {\n env.push(`ISOL8_WHITELIST=${JSON.stringify(this.networkFilter.whitelist)}`);\n env.push(`ISOL8_BLACKLIST=${JSON.stringify(this.networkFilter.blacklist)}`);\n env.push(`HTTP_PROXY=http://127.0.0.1:${PROXY_PORT}`);\n env.push(`HTTPS_PROXY=http://127.0.0.1:${PROXY_PORT}`);\n env.push(`http_proxy=http://127.0.0.1:${PROXY_PORT}`);\n env.push(`https_proxy=http://127.0.0.1:${PROXY_PORT}`);\n }\n\n return env;\n }\n\n private async *streamExecOutput(\n stream: NodeJS.ReadableStream,\n exec: Docker.Exec,\n container: Docker.Container,\n timeoutMs: number\n ): AsyncGenerator<StreamEvent> {\n // Bridge event-based stream to async generator via a queue\n const queue: StreamEvent[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n\n const push = (event: StreamEvent) => {\n queue.push(event);\n if (resolve) {\n resolve();\n resolve = null;\n }\n };\n\n const timer = setTimeout(() => {\n push({ type: \"error\", data: \"EXECUTION TIMED OUT\" });\n push({ type: \"exit\", data: \"137\" });\n done = true;\n }, timeoutMs);\n\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stdoutStream.on(\"data\", (chunk: Buffer) => {\n let text = chunk.toString(\"utf-8\");\n if (Object.keys(this.secrets).length > 0) {\n text = maskSecrets(text, this.secrets);\n }\n push({ type: \"stdout\", data: text });\n });\n\n stderrStream.on(\"data\", (chunk: Buffer) => {\n let text = chunk.toString(\"utf-8\");\n if (Object.keys(this.secrets).length > 0) {\n text = maskSecrets(text, this.secrets);\n }\n push({ type: \"stderr\", data: text });\n });\n\n stream.on(\"end\", async () => {\n clearTimeout(timer);\n try {\n const info = await exec.inspect();\n push({ type: \"exit\", data: (info.ExitCode ?? 0).toString() });\n } catch {\n push({ type: \"exit\", data: \"1\" });\n }\n done = true;\n });\n\n stream.on(\"error\", (err: Error) => {\n clearTimeout(timer);\n push({ type: \"error\", data: err.message });\n push({ type: \"exit\", data: \"1\" });\n done = true;\n });\n\n // Drain the queue as events arrive\n while (!done || queue.length > 0) {\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (resolve) {\n await new Promise<void>((r) => {\n resolve = r;\n });\n } else {\n await new Promise((r) => setTimeout(r, 10));\n }\n }\n }\n\n private async collectExecOutput(\n stream: NodeJS.ReadableStream,\n container: Docker.Container,\n timeoutMs: number\n ): Promise<{ stdout: string; stderr: string; truncated: boolean }> {\n return new Promise((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let truncated = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n resolve({ stdout, stderr: `${stderr}\\n--- EXECUTION TIMED OUT ---`, truncated });\n }, timeoutMs);\n\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stdoutStream.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf-8\");\n if (stdout.length > this.maxOutputSize) {\n const result = truncateOutput(stdout, this.maxOutputSize);\n stdout = result.text;\n truncated = true;\n }\n });\n\n stderrStream.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf-8\");\n if (stderr.length > this.maxOutputSize) {\n const result = truncateOutput(stderr, this.maxOutputSize);\n stderr = result.text;\n truncated = true;\n }\n });\n\n stream.on(\"end\", () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve({ stdout, stderr, truncated });\n });\n\n stream.on(\"error\", (err: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n reject(err);\n });\n });\n }\n\n private postProcessOutput(output: string, _truncated: boolean): string {\n let result = output;\n\n // Mask secrets\n if (Object.keys(this.secrets).length > 0) {\n result = maskSecrets(result, this.secrets);\n }\n\n // Trim trailing whitespace\n return result.trimEnd();\n }\n\n /**\n * Remove all isol8 containers (both running and stopped).\n *\n * This static utility method finds and removes all containers created by isol8,\n * identified by images starting with `isol8:` or `isol8-custom:`.\n *\n * @param docker - Optional Docker instance. If not provided, creates a new one.\n * @returns Promise resolving to an object with counts of removed and failed containers.\n *\n * @example\n * ```typescript\n * import { DockerIsol8 } from \"isol8\";\n *\n * // Remove all isol8 containers\n * const result = await DockerIsol8.cleanup();\n * console.log(`Removed ${result.removed} containers`);\n * if (result.failed > 0) {\n * console.log(`Failed to remove ${result.failed} containers`);\n * }\n * ```\n */\n static async cleanup(\n docker?: Docker\n ): Promise<{ removed: number; failed: number; errors: string[] }> {\n const dockerInstance = docker ?? new Docker();\n\n // Find all isol8 containers\n const containers = await dockerInstance.listContainers({ all: true });\n const isol8Containers = containers.filter(\n (c) => c.Image.startsWith(\"isol8:\") || c.Image.startsWith(\"isol8-custom:\")\n );\n\n let removed = 0;\n let failed = 0;\n const errors: string[] = [];\n\n for (const containerInfo of isol8Containers) {\n try {\n const container = dockerInstance.getContainer(containerInfo.Id);\n await container.remove({ force: true });\n removed++;\n } catch (err) {\n failed++;\n const errorMsg = err instanceof Error ? err.message : String(err);\n errors.push(`${containerInfo.Id.slice(0, 12)}: ${errorMsg}`);\n }\n }\n\n return { removed, failed, errors };\n }\n}\n",
8
- "/**\n * @module runtime/adapter\n *\n * Defines the {@link RuntimeAdapter} interface and the global {@link RuntimeRegistry}\n * for looking up runtime adapters by name or file extension.\n */\n\nimport type { Runtime } from \"../types\";\n\n/**\n * A runtime adapter provides the container image and command construction\n * for a specific language runtime (Python, Node, Bun, Deno).\n *\n * Adapters are registered in {@link RuntimeRegistry} and looked up by name\n * or by file extension when the runtime is auto-detected.\n */\nexport interface RuntimeAdapter {\n /** Runtime identifier (e.g. `\"python\"`, `\"node\"`). */\n readonly name: Runtime;\n\n /** Docker image tag for this runtime (e.g. `\"isol8:python\"`). */\n readonly image: string;\n\n /**\n * Build the shell command to execute code.\n *\n * @param code - The source code string. Used for inline execution.\n * @param filePath - If provided, the code is read from this file inside the container.\n * @returns Command array (e.g. `[\"python3\", \"-c\", \"print(1)\"]`).\n */\n getCommand(code: string, filePath?: string): string[];\n\n /** Default file extension for this runtime (e.g. `\".py\"`). */\n getFileExtension(): string;\n}\n\nconst adapters = new Map<string, RuntimeAdapter>();\n\nconst extensionMap = new Map<string, RuntimeAdapter>();\n\n/**\n * Central registry of all available runtime adapters.\n *\n * Built-in adapters (Python, Node, Bun, Deno) are registered automatically\n * when `src/runtime/index.ts` is imported.\n */\nexport const RuntimeRegistry = {\n /**\n * Register a runtime adapter. Overwrites any existing adapter with the same\n * name or file extension.\n */\n register(adapter: RuntimeAdapter): void {\n adapters.set(adapter.name, adapter);\n extensionMap.set(adapter.getFileExtension(), adapter);\n },\n\n /**\n * Look up a runtime adapter by name.\n *\n * @param name - Runtime name (e.g. `\"python\"`).\n * @throws {Error} If no adapter is registered with that name.\n */\n get(name: string): RuntimeAdapter {\n const adapter = adapters.get(name);\n if (!adapter) {\n throw new Error(`Unknown runtime: \"${name}\". Available: ${[...adapters.keys()].join(\", \")}`);\n }\n return adapter;\n },\n\n /**\n * Auto-detect the runtime from a filename's extension.\n *\n * @param filename - Filename or path (e.g. `\"script.py\"`, `\"app.js\"`).\n * @throws {Error} If the extension doesn't match any registered adapter.\n */\n detect(filename: string): RuntimeAdapter {\n const ext = `.${filename.split(\".\").pop()}`;\n const adapter = extensionMap.get(ext);\n if (!adapter) {\n throw new Error(\n `Cannot detect runtime for \"${filename}\". Known extensions: ${[...extensionMap.keys()].join(\", \")}`\n );\n }\n return adapter;\n },\n\n /** Returns all registered runtime adapters. */\n list(): RuntimeAdapter[] {\n return [...adapters.values()];\n },\n};\n",
7
+ "/**\n * @module engine/docker\n *\n * The Docker-backed isol8 engine. Creates and manages Docker containers\n * for executing untrusted code with resource limits, network controls, and\n * output sanitization.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { PassThrough } from \"node:stream\";\nimport Docker from \"dockerode\";\nimport { RuntimeRegistry } from \"../runtime\";\nimport type { RuntimeAdapter } from \"../runtime/adapter\";\nimport type {\n ExecutionRequest,\n ExecutionResult,\n Isol8Engine,\n Isol8Mode,\n Isol8Options,\n NetworkFilterConfig,\n NetworkMode,\n StreamEvent,\n} from \"../types\";\nimport { Semaphore } from \"./concurrency\";\nimport { ContainerPool } from \"./pool\";\nimport {\n createTarBuffer,\n extractFromTar,\n maskSecrets,\n parseMemoryLimit,\n truncateOutput,\n} from \"./utils\";\n\n/**\n * Writes a file into a running container using `docker exec`.\n * This bypasses the `putArchive` limitation where Docker rejects archive\n * uploads when `ReadonlyRootfs` is enabled — even to writable tmpfs mounts.\n *\n * Uses detached exec with polling to avoid Bun/dockerode hijack incompatibilities.\n */\nasync function writeFileViaExec(\n container: Docker.Container,\n filePath: string,\n content: Buffer | string\n): Promise<void> {\n const data = typeof content === \"string\" ? Buffer.from(content, \"utf-8\") : content;\n const b64 = data.toString(\"base64\");\n\n const exec = await container.exec({\n Cmd: [\"sh\", \"-c\", `printf '%s' '${b64}' | base64 -d > ${filePath}`],\n });\n\n // Run detached — avoids hijack/stream issues with Bun\n await exec.start({ Detach: true });\n\n // Poll until the exec completes\n let info = await exec.inspect();\n while (info.Running) {\n await new Promise((r) => setTimeout(r, 50));\n info = await exec.inspect();\n }\n\n if (info.ExitCode !== 0) {\n throw new Error(`Failed to write file ${filePath} in container (exit code ${info.ExitCode})`);\n }\n}\n\n/**\n * Reads a file from a running container using `docker exec`.\n * This bypasses the `getArchive` limitation where Docker rejects archive\n * downloads when `ReadonlyRootfs` is enabled — even from writable tmpfs mounts.\n *\n * Works by running `base64 <path>` and decoding the output.\n */\nasync function readFileViaExec(container: Docker.Container, filePath: string): Promise<Buffer> {\n const exec = await container.exec({\n Cmd: [\"base64\", filePath],\n AttachStdout: true,\n AttachStderr: true,\n });\n\n const stream = await exec.start({ Tty: false });\n\n const chunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stdoutStream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stderrStream.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n await new Promise<void>((resolve, reject) => {\n stream.on(\"end\", resolve);\n stream.on(\"error\", reject);\n });\n\n const inspectResult = await exec.inspect();\n if (inspectResult.ExitCode !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\").trim();\n throw new Error(\n `Failed to read file ${filePath} in container: ${stderr} (exit code ${inspectResult.ExitCode})`\n );\n }\n\n const b64Output = Buffer.concat(chunks).toString(\"utf-8\").trim();\n return Buffer.from(b64Output, \"base64\");\n}\n\nconst SANDBOX_WORKDIR = \"/sandbox\";\nconst MAX_OUTPUT_BYTES = 1024 * 1024; // 1MB default\nconst PROXY_PORT = 8118;\nconst PROXY_STARTUP_TIMEOUT_MS = 5000;\nconst PROXY_POLL_INTERVAL_MS = 100;\n\n/**\n * Starts proxy.mjs inside the container for filtered network mode.\n * Waits until the proxy is listening on PROXY_PORT before returning.\n */\nasync function startProxy(\n container: Docker.Container,\n networkFilter?: { whitelist: string[]; blacklist: string[] }\n): Promise<void> {\n const envParts: string[] = [];\n if (networkFilter) {\n envParts.push(`ISOL8_WHITELIST='${JSON.stringify(networkFilter.whitelist)}'`);\n envParts.push(`ISOL8_BLACKLIST='${JSON.stringify(networkFilter.blacklist)}'`);\n }\n const envPrefix = envParts.length > 0 ? `${envParts.join(\" \")} ` : \"\";\n\n // Start proxy in background\n const startExec = await container.exec({\n Cmd: [\"sh\", \"-c\", `${envPrefix}node /usr/local/bin/proxy.mjs &`],\n });\n await startExec.start({ Detach: true });\n\n // Poll until proxy is ready\n const deadline = Date.now() + PROXY_STARTUP_TIMEOUT_MS;\n while (Date.now() < deadline) {\n try {\n const checkExec = await container.exec({\n Cmd: [\"sh\", \"-c\", `nc -z 127.0.0.1 ${PROXY_PORT} 2>/dev/null`],\n });\n await checkExec.start({ Detach: true });\n let info = await checkExec.inspect();\n while (info.Running) {\n await new Promise((r) => setTimeout(r, 50));\n info = await checkExec.inspect();\n }\n if (info.ExitCode === 0) {\n return;\n }\n } catch {\n // Ignore, keep polling\n }\n await new Promise((r) => setTimeout(r, PROXY_POLL_INTERVAL_MS));\n }\n throw new Error(\"Proxy failed to start within timeout\");\n}\n\n/**\n * Wraps a command with the `timeout` utility so the process is killed\n * after the specified duration. Returns the wrapped command.\n */\nfunction wrapWithTimeout(cmd: string[], timeoutSec: number): string[] {\n return [\"timeout\", \"-s\", \"KILL\", String(timeoutSec), ...cmd];\n}\n\n/**\n * Returns the package manager install command for a given runtime.\n */\nfunction getInstallCommand(runtime: string, packages: string[]): string[] {\n switch (runtime) {\n case \"python\":\n return [\"pip\", \"install\", \"--user\", \"--no-cache-dir\", \"--break-system-packages\", ...packages];\n case \"node\":\n // Install to /sandbox (local node_modules) so resolution works for both CJS and ESM\n return [\"npm\", \"install\", \"--prefix\", \"/sandbox\", ...packages];\n case \"bun\":\n // Bun global install - use /sandbox for writable location\n return [\"bun\", \"install\", \"-g\", \"--global-dir=/sandbox/.bun-global\", ...packages];\n case \"deno\":\n // Deno uses URL imports; cache modules to /sandbox\n return [\"sh\", \"-c\", packages.map((p) => `deno cache ${p}`).join(\" && \")];\n case \"bash\":\n return [\"apk\", \"add\", \"--no-cache\", ...packages];\n default:\n throw new Error(`Unknown runtime for package install: ${runtime}`);\n }\n}\n\n/**\n * Installs packages inside a container using the runtime's package manager.\n */\nasync function installPackages(\n container: Docker.Container,\n runtime: string,\n packages: string[]\n): Promise<void> {\n const cmd = getInstallCommand(runtime, packages);\n // Debug log\n console.error(`[DEBUG] Installing packages: ${JSON.stringify(cmd)}`);\n\n // Set environment for writable install locations\n // Use /sandbox instead of /tmp because /tmp has noexec flag which prevents loading .so files\n const env: string[] = [\n \"PATH=/sandbox/.local/bin:/sandbox/.npm-global/bin:/sandbox/.bun-global/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin\",\n ];\n\n if (runtime === \"python\") {\n env.push(\"PYTHONUSERBASE=/sandbox/.local\");\n } else if (runtime === \"node\") {\n env.push(\"NPM_CONFIG_PREFIX=/sandbox/.npm-global\");\n env.push(\"NPM_CONFIG_CACHE=/sandbox/.npm-cache\");\n env.push(\"npm_config_cache=/sandbox/.npm-cache\");\n } else if (runtime === \"bun\") {\n env.push(\"BUN_INSTALL_GLOBAL_DIR=/sandbox/.bun-global\");\n env.push(\"BUN_INSTALL_CACHE_DIR=/sandbox/.bun-cache\");\n env.push(\"BUN_INSTALL_BIN=/sandbox/.bun-global/bin\");\n } else if (runtime === \"deno\") {\n env.push(\"DENO_DIR=/sandbox/.deno\");\n }\n\n const exec = await container.exec({\n Cmd: cmd,\n AttachStdout: true,\n AttachStderr: true,\n Env: env,\n });\n\n const stream = await exec.start({ Detach: false, Tty: false });\n\n return new Promise<void>((resolve, reject) => {\n let stderr = \"\";\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stderrStream.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n\n stream.on(\"end\", async () => {\n try {\n const info = await exec.inspect();\n if (info.ExitCode !== 0) {\n reject(new Error(`Package install failed (exit code ${info.ExitCode}): ${stderr}`));\n } else {\n resolve();\n }\n } catch (err) {\n reject(err);\n }\n });\n\n stream.on(\"error\", reject);\n });\n}\n\n/** Options for constructing a {@link DockerIsol8} instance. Extends {@link Isol8Options} with Docker-specific settings. */\nexport interface DockerIsol8Options extends Isol8Options {\n /** Custom dockerode instance. Defaults to connecting to the local Docker socket. */\n docker?: Docker;\n}\n\n/**\n * Docker-backed isol8 engine that executes code in isolated containers.\n *\n * Supports two modes:\n * - **Ephemeral** — a new container is created and destroyed per `execute()` call.\n * - **Persistent** — a long-lived container is reused across calls, preserving state.\n *\n * @example\n * ```typescript\n * const isol8 = new DockerIsol8({ network: \"none\", memoryLimit: \"256m\" });\n * await isol8.start();\n * const result = await isol8.execute({ code: \"print(1+1)\", runtime: \"python\" });\n * await isol8.stop();\n * ```\n */\nexport class DockerIsol8 implements Isol8Engine {\n private readonly docker: Docker;\n private readonly mode: Isol8Mode;\n private readonly network: NetworkMode;\n private readonly networkFilter?: NetworkFilterConfig;\n private readonly cpuLimit: number;\n private readonly memoryLimit: string;\n private readonly pidsLimit: number;\n private readonly readonlyRootFs: boolean;\n private readonly maxOutputSize: number;\n private readonly secrets: Record<string, string>;\n private readonly defaultTimeoutMs: number;\n private readonly overrideImage?: string;\n private readonly semaphore: Semaphore;\n private readonly sandboxSize: string;\n private readonly tmpSize: string;\n\n private container: Docker.Container | null = null;\n private persistentRuntime: RuntimeAdapter | null = null;\n private pool: ContainerPool | null = null;\n\n /**\n * @param options - Sandbox configuration options.\n * @param maxConcurrent - Maximum number of concurrent executions (controls the internal semaphore).\n */\n constructor(options: DockerIsol8Options = {}, maxConcurrent = 10) {\n this.docker = options.docker ?? new Docker();\n this.mode = options.mode ?? \"ephemeral\";\n this.network = options.network ?? \"none\";\n this.networkFilter = options.networkFilter;\n this.cpuLimit = options.cpuLimit ?? 1.0;\n this.memoryLimit = options.memoryLimit ?? \"512m\";\n this.pidsLimit = options.pidsLimit ?? 64;\n this.readonlyRootFs = options.readonlyRootFs ?? true;\n this.maxOutputSize = options.maxOutputSize ?? MAX_OUTPUT_BYTES;\n this.secrets = options.secrets ?? {};\n this.defaultTimeoutMs = options.timeoutMs ?? 30_000;\n this.overrideImage = options.image;\n this.semaphore = new Semaphore(maxConcurrent);\n this.sandboxSize = options.sandboxSize ?? \"512m\";\n this.tmpSize = options.tmpSize ?? \"256m\";\n }\n\n /**\n * Initialize isol8. Currently a no-op — containers are created\n * lazily on first `execute()` call.\n */\n async start(): Promise<void> {\n // For persistent mode, container is started lazily on first execute\n // For ephemeral mode, this is a no-op\n }\n\n /** Stop and remove the container (if one exists). Safe to call multiple times. */\n async stop(): Promise<void> {\n if (this.container) {\n try {\n await this.container.stop({ t: 2 });\n } catch {\n // Container may already be stopped\n }\n try {\n await this.container.remove({ force: true });\n } catch {\n // Container may already be removed\n }\n this.container = null;\n this.persistentRuntime = null;\n }\n\n // Drain the warm container pool\n if (this.pool) {\n await this.pool.drain();\n this.pool = null;\n }\n }\n\n /**\n * Execute code in isol8. Acquires a semaphore permit to enforce\n * the concurrency limit, then delegates to ephemeral or persistent execution.\n */\n async execute(req: ExecutionRequest): Promise<ExecutionResult> {\n await this.semaphore.acquire();\n try {\n return this.mode === \"persistent\"\n ? await this.executePersistent(req)\n : await this.executeEphemeral(req);\n } finally {\n this.semaphore.release();\n }\n }\n\n /**\n * Upload a file into the running container via a tar archive.\n * Only available in persistent mode after at least one `execute()` call.\n *\n * @param path - Absolute path inside the container.\n * @param content - File contents.\n * @throws {Error} If no container is active.\n */\n async putFile(path: string, content: Buffer | string): Promise<void> {\n if (!this.container) {\n throw new Error(\"No active container. Call execute() first in persistent mode.\");\n }\n if (this.readonlyRootFs) {\n await writeFileViaExec(this.container, path, content);\n } else {\n const tar = createTarBuffer(path, content);\n await this.container.putArchive(tar, { path: \"/\" });\n }\n }\n\n /**\n * Download a file from the running container.\n *\n * @param path - Absolute path inside the container.\n * @returns File contents as a Buffer.\n * @throws {Error} If no container is active.\n */\n async getFile(path: string): Promise<Buffer> {\n if (!this.container) {\n throw new Error(\"No active container. Call execute() first in persistent mode.\");\n }\n\n if (this.readonlyRootFs) {\n return readFileViaExec(this.container, path);\n }\n\n const stream = await this.container.getArchive({ path });\n\n const chunks: Buffer[] = [];\n for await (const chunk of stream as AsyncIterable<Buffer>) {\n chunks.push(chunk);\n }\n const tarBuffer = Buffer.concat(chunks);\n return extractFromTar(tarBuffer, path);\n }\n\n /** The Docker container ID, or `null` if no container is active. Used by the server for session tracking. */\n get containerId(): string | null {\n return this.container?.id ?? null;\n }\n\n /**\n * Execute code and stream output chunks as they arrive.\n * Yields {@link StreamEvent} objects for stdout, stderr, exit, and error events.\n */\n async *executeStream(req: ExecutionRequest): AsyncIterable<StreamEvent> {\n await this.semaphore.acquire();\n try {\n const adapter = this.getAdapter(req.runtime);\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n const image = await this.resolveImage(adapter);\n\n // Create container (always ephemeral-style for streaming)\n const container = await this.docker.createContainer({\n Image: image,\n Cmd: [\"sleep\", \"infinity\"],\n WorkingDir: SANDBOX_WORKDIR,\n Env: this.buildEnv(),\n NetworkDisabled: this.network === \"none\",\n HostConfig: this.buildHostConfig(),\n StopTimeout: 2,\n });\n\n try {\n await container.start();\n\n if (this.network === \"filtered\") {\n await startProxy(container, this.networkFilter);\n }\n\n // Write code\n const ext = req.fileExtension ?? adapter.getFileExtension();\n const filePath = `${SANDBOX_WORKDIR}/main${ext}`;\n await writeFileViaExec(container, filePath, req.code);\n\n // Install packages if requested\n if (req.installPackages?.length) {\n await installPackages(container, req.runtime, req.installPackages);\n }\n\n // Inject input files\n if (req.files) {\n for (const [fPath, fContent] of Object.entries(req.files)) {\n await writeFileViaExec(container, fPath, fContent);\n }\n }\n\n // Build command\n const rawCmd = adapter.getCommand(req.code, filePath);\n const timeoutSec = Math.ceil(timeoutMs / 1000);\n let cmd: string[];\n if (req.stdin) {\n const stdinPath = `${SANDBOX_WORKDIR}/_stdin`;\n await writeFileViaExec(container, stdinPath, req.stdin);\n const cmdStr = rawCmd.map((a) => `'${a.replace(/'/g, \"'\\\\''\")}'`).join(\" \");\n cmd = wrapWithTimeout([\"sh\", \"-c\", `cat ${stdinPath} | ${cmdStr}`], timeoutSec);\n } else {\n cmd = wrapWithTimeout(rawCmd, timeoutSec);\n }\n\n const exec = await container.exec({\n Cmd: cmd,\n Env: this.buildEnv(req.env),\n AttachStdout: true,\n AttachStderr: true,\n WorkingDir: SANDBOX_WORKDIR,\n });\n\n const execStream = await exec.start({ Tty: false });\n\n yield* this.streamExecOutput(execStream, exec, container, timeoutMs);\n } finally {\n try {\n await container.remove({ force: true });\n } catch {\n // Best effort cleanup\n }\n }\n } finally {\n this.semaphore.release();\n }\n }\n\n // ─── Private methods ───\n\n private async resolveImage(adapter: RuntimeAdapter): Promise<string> {\n if (this.overrideImage) {\n return this.overrideImage;\n }\n // Prefer custom image if it exists\n const customTag = `${adapter.image}-custom`;\n try {\n await this.docker.getImage(customTag).inspect();\n return customTag;\n } catch {\n return adapter.image;\n }\n }\n\n private async executeEphemeral(req: ExecutionRequest): Promise<ExecutionResult> {\n const adapter = this.getAdapter(req.runtime);\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n const image = await this.resolveImage(adapter);\n\n // Lazily initialize the container pool\n if (!this.pool) {\n this.pool = new ContainerPool({\n docker: this.docker,\n poolSize: 2,\n createOptions: {\n Cmd: [\"sleep\", \"infinity\"],\n WorkingDir: SANDBOX_WORKDIR,\n Env: this.buildEnv(),\n NetworkDisabled: this.network === \"none\",\n HostConfig: this.buildHostConfig(),\n StopTimeout: 2,\n },\n });\n }\n\n // Acquire a pre-warmed container from the pool\n const container = await this.pool.acquire(image);\n\n try {\n // Start proxy for filtered network mode\n if (this.network === \"filtered\") {\n await startProxy(container, this.networkFilter);\n }\n\n // Write code to the active tmpfs via exec (putArchive fails with ReadonlyRootfs)\n const ext = req.fileExtension ?? adapter.getFileExtension();\n const filePath = `${SANDBOX_WORKDIR}/main${ext}`;\n await writeFileViaExec(container, filePath, req.code);\n\n // Install packages if requested\n if (req.installPackages?.length) {\n await installPackages(container, req.runtime, req.installPackages);\n }\n\n // Execute the actual command, wrapped with timeout to ensure kill on expiry\n const rawCmd = adapter.getCommand(req.code, filePath);\n const timeoutSec = Math.ceil(timeoutMs / 1000);\n\n // Handle stdin: write to file and pipe into command\n let cmd: string[];\n if (req.stdin) {\n const stdinPath = `${SANDBOX_WORKDIR}/_stdin`;\n await writeFileViaExec(container, stdinPath, req.stdin);\n const cmdStr = rawCmd.map((a) => `'${a.replace(/'/g, \"'\\\\''\")}' `).join(\"\");\n cmd = wrapWithTimeout([\"sh\", \"-c\", `cat ${stdinPath} | ${cmdStr}`], timeoutSec);\n } else {\n cmd = wrapWithTimeout(rawCmd, timeoutSec);\n }\n\n // Inject input files\n if (req.files) {\n for (const [fPath, fContent] of Object.entries(req.files)) {\n await writeFileViaExec(container, fPath, fContent);\n }\n }\n\n const exec = await container.exec({\n Cmd: cmd,\n Env: this.buildEnv(req.env),\n AttachStdout: true,\n AttachStderr: true,\n WorkingDir: SANDBOX_WORKDIR,\n });\n\n const start = performance.now();\n const execStream = await exec.start({ Tty: false });\n\n const { stdout, stderr, truncated } = await this.collectExecOutput(\n execStream,\n container,\n timeoutMs\n );\n const durationMs = Math.round(performance.now() - start);\n\n const inspectResult = await exec.inspect();\n\n return {\n stdout: this.postProcessOutput(stdout, truncated),\n stderr: this.postProcessOutput(stderr, false),\n exitCode: inspectResult.ExitCode ?? 1,\n durationMs,\n truncated,\n executionId: randomUUID(),\n runtime: req.runtime,\n timestamp: new Date().toISOString(),\n containerId: container.id,\n ...(req.outputPaths ? { files: await this.retrieveFiles(container, req.outputPaths) } : {}),\n };\n } finally {\n // Return container to pool for reuse (pool will clean sandbox)\n await this.pool!.release(container, image);\n }\n }\n\n private async executePersistent(req: ExecutionRequest): Promise<ExecutionResult> {\n const adapter = this.getAdapter(req.runtime);\n const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;\n\n // Lazily create the persistent container\n if (!this.container) {\n await this.startPersistentContainer(adapter);\n } else if (this.persistentRuntime?.name !== adapter.name) {\n throw new Error(\n `Cannot switch runtime from \"${this.persistentRuntime?.name}\" to \"${adapter.name}\". Each persistent container supports a single runtime. Create a new Isol8 instance for a different runtime.`\n );\n }\n\n const ext = req.fileExtension ?? adapter.getFileExtension();\n const filePath = `${SANDBOX_WORKDIR}/exec_${Date.now()}${ext}`;\n\n // Write code to the container\n if (this.readonlyRootFs) {\n await writeFileViaExec(this.container!, filePath, req.code);\n } else {\n const tar = createTarBuffer(filePath, req.code);\n await this.container!.putArchive(tar, { path: \"/\" });\n }\n\n // Inject input files\n if (req.files) {\n for (const [fPath, fContent] of Object.entries(req.files)) {\n if (this.readonlyRootFs) {\n await writeFileViaExec(this.container!, fPath, fContent);\n } else {\n const tar = createTarBuffer(fPath, fContent);\n await this.container!.putArchive(tar, { path: \"/\" });\n }\n }\n }\n\n const rawCmd = adapter.getCommand(req.code, filePath);\n const timeoutSec = Math.ceil(timeoutMs / 1000);\n\n // Install packages if requested\n if (req.installPackages?.length) {\n await installPackages(this.container!, req.runtime, req.installPackages);\n }\n\n // Handle stdin\n let cmd: string[];\n if (req.stdin) {\n const stdinPath = `${SANDBOX_WORKDIR}/_stdin_${Date.now()}`;\n await writeFileViaExec(this.container!, stdinPath, req.stdin);\n const cmdStr = rawCmd.map((a) => `'${a.replace(/'/g, \"'\\\\''\")}' `).join(\"\");\n cmd = wrapWithTimeout([\"sh\", \"-c\", `cat ${stdinPath} | ${cmdStr}`], timeoutSec);\n } else {\n cmd = wrapWithTimeout(rawCmd, timeoutSec);\n }\n\n const execEnv = this.buildEnv(req.env);\n\n const exec = await this.container!.exec({\n Cmd: cmd,\n Env: execEnv,\n AttachStdout: true,\n AttachStderr: true,\n WorkingDir: SANDBOX_WORKDIR,\n });\n\n const start = performance.now();\n const execStream = await exec.start({ Tty: false });\n\n const { stdout, stderr, truncated } = await this.collectExecOutput(\n execStream,\n this.container!,\n timeoutMs\n );\n const durationMs = Math.round(performance.now() - start);\n\n const inspectResult = await exec.inspect();\n\n return {\n stdout: this.postProcessOutput(stdout, truncated),\n stderr: this.postProcessOutput(stderr, false),\n exitCode: inspectResult.ExitCode ?? 1,\n durationMs,\n truncated,\n executionId: randomUUID(),\n runtime: req.runtime,\n timestamp: new Date().toISOString(),\n containerId: this.container?.id,\n ...(req.outputPaths\n ? { files: await this.retrieveFiles(this.container!, req.outputPaths) }\n : {}),\n };\n }\n\n private async retrieveFiles(\n container: Docker.Container,\n paths: string[]\n ): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n for (const p of paths) {\n try {\n const buf = this.readonlyRootFs\n ? await readFileViaExec(container, p)\n : await this.getFileFromContainer(container, p);\n files[p] = buf.toString(\"base64\");\n } catch {\n // Skip files that don't exist\n }\n }\n return files;\n }\n\n private async getFileFromContainer(container: Docker.Container, path: string): Promise<Buffer> {\n const stream = await container.getArchive({ path });\n const chunks: Buffer[] = [];\n for await (const chunk of stream as AsyncIterable<Buffer>) {\n chunks.push(chunk);\n }\n return extractFromTar(Buffer.concat(chunks), path);\n }\n\n private async startPersistentContainer(adapter: RuntimeAdapter): Promise<void> {\n const image = await this.resolveImage(adapter);\n\n this.container = await this.docker.createContainer({\n Image: image,\n Cmd: [\"sleep\", \"infinity\"],\n WorkingDir: SANDBOX_WORKDIR,\n Env: this.buildEnv(),\n NetworkDisabled: this.network === \"none\",\n HostConfig: this.buildHostConfig(),\n StopTimeout: 2,\n Labels: {\n \"isol8.managed\": \"true\",\n \"isol8.runtime\": adapter.name,\n },\n });\n\n await this.container.start();\n\n // Start proxy for filtered network mode\n if (this.network === \"filtered\") {\n await startProxy(this.container, this.networkFilter);\n }\n\n this.persistentRuntime = adapter;\n }\n\n private getAdapter(runtime: string): RuntimeAdapter {\n return RuntimeRegistry.get(runtime);\n }\n\n private buildHostConfig(): Docker.HostConfig {\n const config: Docker.HostConfig = {\n Memory: parseMemoryLimit(this.memoryLimit),\n NanoCpus: Math.floor(this.cpuLimit * 1e9),\n PidsLimit: this.pidsLimit,\n ReadonlyRootfs: this.readonlyRootFs,\n Tmpfs: {\n \"/tmp\": `rw,noexec,nosuid,nodev,size=${this.tmpSize}`,\n [SANDBOX_WORKDIR]: `rw,exec,nosuid,nodev,size=${this.sandboxSize}`,\n },\n SecurityOpt: [\"no-new-privileges\"],\n };\n\n if (this.network === \"filtered\") {\n config.NetworkMode = \"bridge\";\n } else if (this.network === \"host\") {\n config.NetworkMode = \"host\";\n }\n\n return config;\n }\n\n private buildEnv(extra?: Record<string, string>): string[] {\n const env: string[] = [\n \"PYTHONUNBUFFERED=1\",\n \"PYTHONUSERBASE=/sandbox/.local\",\n \"NPM_CONFIG_PREFIX=/sandbox/.npm-global\",\n \"DENO_DIR=/sandbox/.deno\",\n \"PATH=/sandbox/.local/bin:/sandbox/.npm-global/bin:/sandbox/.bun-global/bin:/usr/local/bin:/usr/bin:/bin\",\n \"NODE_PATH=/usr/local/lib/node_modules:/sandbox/.npm-global/lib/node_modules:/sandbox/node_modules\",\n ];\n\n // Add secrets as env vars\n for (const [key, value] of Object.entries(this.secrets)) {\n env.push(`${key}=${value}`);\n }\n\n // Add extra env vars\n if (extra) {\n for (const [key, value] of Object.entries(extra)) {\n env.push(`${key}=${value}`);\n }\n }\n\n // Add proxy config for filtered mode\n if (this.network === \"filtered\" && this.networkFilter) {\n env.push(`ISOL8_WHITELIST=${JSON.stringify(this.networkFilter.whitelist)}`);\n env.push(`ISOL8_BLACKLIST=${JSON.stringify(this.networkFilter.blacklist)}`);\n env.push(`HTTP_PROXY=http://127.0.0.1:${PROXY_PORT}`);\n env.push(`HTTPS_PROXY=http://127.0.0.1:${PROXY_PORT}`);\n env.push(`http_proxy=http://127.0.0.1:${PROXY_PORT}`);\n env.push(`https_proxy=http://127.0.0.1:${PROXY_PORT}`);\n }\n\n return env;\n }\n\n private async *streamExecOutput(\n stream: NodeJS.ReadableStream,\n exec: Docker.Exec,\n container: Docker.Container,\n timeoutMs: number\n ): AsyncGenerator<StreamEvent> {\n // Bridge event-based stream to async generator via a queue\n const queue: StreamEvent[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n\n const push = (event: StreamEvent) => {\n queue.push(event);\n if (resolve) {\n resolve();\n resolve = null;\n }\n };\n\n const timer = setTimeout(() => {\n push({ type: \"error\", data: \"EXECUTION TIMED OUT\" });\n push({ type: \"exit\", data: \"137\" });\n done = true;\n }, timeoutMs);\n\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stdoutStream.on(\"data\", (chunk: Buffer) => {\n let text = chunk.toString(\"utf-8\");\n if (Object.keys(this.secrets).length > 0) {\n text = maskSecrets(text, this.secrets);\n }\n push({ type: \"stdout\", data: text });\n });\n\n stderrStream.on(\"data\", (chunk: Buffer) => {\n let text = chunk.toString(\"utf-8\");\n if (Object.keys(this.secrets).length > 0) {\n text = maskSecrets(text, this.secrets);\n }\n push({ type: \"stderr\", data: text });\n });\n\n stream.on(\"end\", async () => {\n clearTimeout(timer);\n try {\n const info = await exec.inspect();\n push({ type: \"exit\", data: (info.ExitCode ?? 0).toString() });\n } catch {\n push({ type: \"exit\", data: \"1\" });\n }\n done = true;\n });\n\n stream.on(\"error\", (err: Error) => {\n clearTimeout(timer);\n push({ type: \"error\", data: err.message });\n push({ type: \"exit\", data: \"1\" });\n done = true;\n });\n\n // Drain the queue as events arrive\n while (!done || queue.length > 0) {\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (resolve) {\n await new Promise<void>((r) => {\n resolve = r;\n });\n } else {\n await new Promise((r) => setTimeout(r, 10));\n }\n }\n }\n\n private async collectExecOutput(\n stream: NodeJS.ReadableStream,\n container: Docker.Container,\n timeoutMs: number\n ): Promise<{ stdout: string; stderr: string; truncated: boolean }> {\n return new Promise((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let truncated = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n resolve({ stdout, stderr: `${stderr}\\n--- EXECUTION TIMED OUT ---`, truncated });\n }, timeoutMs);\n\n const stdoutStream = new PassThrough();\n const stderrStream = new PassThrough();\n\n container.modem.demuxStream(stream, stdoutStream, stderrStream);\n\n stdoutStream.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf-8\");\n if (stdout.length > this.maxOutputSize) {\n const result = truncateOutput(stdout, this.maxOutputSize);\n stdout = result.text;\n truncated = true;\n }\n });\n\n stderrStream.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf-8\");\n if (stderr.length > this.maxOutputSize) {\n const result = truncateOutput(stderr, this.maxOutputSize);\n stderr = result.text;\n truncated = true;\n }\n });\n\n stream.on(\"end\", () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve({ stdout, stderr, truncated });\n });\n\n stream.on(\"error\", (err: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n reject(err);\n });\n });\n }\n\n private postProcessOutput(output: string, _truncated: boolean): string {\n let result = output;\n\n // Mask secrets\n if (Object.keys(this.secrets).length > 0) {\n result = maskSecrets(result, this.secrets);\n }\n\n // Trim trailing whitespace\n return result.trimEnd();\n }\n\n /**\n * Remove all isol8 containers (both running and stopped).\n *\n * This static utility method finds and removes all containers created by isol8,\n * identified by images starting with `isol8:` or `isol8-custom:`.\n *\n * @param docker - Optional Docker instance. If not provided, creates a new one.\n * @returns Promise resolving to an object with counts of removed and failed containers.\n *\n * @example\n * ```typescript\n * import { DockerIsol8 } from \"isol8\";\n *\n * // Remove all isol8 containers\n * const result = await DockerIsol8.cleanup();\n * console.log(`Removed ${result.removed} containers`);\n * if (result.failed > 0) {\n * console.log(`Failed to remove ${result.failed} containers`);\n * }\n * ```\n */\n static async cleanup(\n docker?: Docker\n ): Promise<{ removed: number; failed: number; errors: string[] }> {\n const dockerInstance = docker ?? new Docker();\n\n // Find all isol8 containers\n const containers = await dockerInstance.listContainers({ all: true });\n const isol8Containers = containers.filter(\n (c) => c.Image.startsWith(\"isol8:\") || c.Image.startsWith(\"isol8-custom:\")\n );\n\n let removed = 0;\n let failed = 0;\n const errors: string[] = [];\n\n for (const containerInfo of isol8Containers) {\n try {\n const container = dockerInstance.getContainer(containerInfo.Id);\n await container.remove({ force: true });\n removed++;\n } catch (err) {\n failed++;\n const errorMsg = err instanceof Error ? err.message : String(err);\n errors.push(`${containerInfo.Id.slice(0, 12)}: ${errorMsg}`);\n }\n }\n\n return { removed, failed, errors };\n }\n}\n",
8
+ "/**\n * @module runtime/adapter\n *\n * Defines the {@link RuntimeAdapter} interface and the global {@link RuntimeRegistry}\n * for looking up runtime adapters by name or file extension.\n */\n\nimport type { Runtime } from \"../types\";\n\n/**\n * A runtime adapter provides the container image and command construction\n * for a specific language runtime (Python, Node, Bun, Deno).\n *\n * Adapters are registered in {@link RuntimeRegistry} and looked up by name\n * or by file extension when the runtime is auto-detected.\n */\nexport interface RuntimeAdapter {\n /** Runtime identifier (e.g. `\"python\"`, `\"node\"`). */\n readonly name: Runtime;\n\n /** Docker image tag for this runtime (e.g. `\"isol8:python\"`). */\n readonly image: string;\n\n /**\n * Build the shell command to execute code.\n *\n * @param code - The source code string. Used for inline execution.\n * @param filePath - If provided, the code is read from this file inside the container.\n * @returns Command array (e.g. `[\"python3\", \"-c\", \"print(1)\"]`).\n */\n getCommand(code: string, filePath?: string): string[];\n\n /** Default file extension for this runtime (e.g. `\".py\"`). */\n getFileExtension(): string;\n}\n\nconst adapters = new Map<string, RuntimeAdapter>();\n\nconst extensionMap = new Map<string, RuntimeAdapter>();\n\n/**\n * Central registry of all available runtime adapters.\n *\n * Built-in adapters (Python, Node, Bun, Deno) are registered automatically\n * when `src/runtime/index.ts` is imported.\n */\nexport const RuntimeRegistry = {\n /**\n * Register a runtime adapter. Overwrites any existing adapter with the same\n * name or file extension.\n *\n * @param adapter - The adapter to register.\n * @param aliases - Additional file extensions to map to this adapter (e.g. `[\".mjs\", \".cjs\"]`).\n */\n register(adapter: RuntimeAdapter, aliases: string[] = []): void {\n adapters.set(adapter.name, adapter);\n extensionMap.set(adapter.getFileExtension(), adapter);\n for (const ext of aliases) {\n extensionMap.set(ext, adapter);\n }\n },\n\n /**\n * Look up a runtime adapter by name.\n *\n * @param name - Runtime name (e.g. `\"python\"`).\n * @throws {Error} If no adapter is registered with that name.\n */\n get(name: string): RuntimeAdapter {\n const adapter = adapters.get(name);\n if (!adapter) {\n throw new Error(`Unknown runtime: \"${name}\". Available: ${[...adapters.keys()].join(\", \")}`);\n }\n return adapter;\n },\n\n /**\n * Auto-detect the runtime from a filename's extension.\n *\n * @param filename - Filename or path (e.g. `\"script.py\"`, `\"app.js\"`).\n * @throws {Error} If the extension doesn't match any registered adapter.\n */\n detect(filename: string): RuntimeAdapter {\n const ext = `.${filename.split(\".\").pop()}`;\n const adapter = extensionMap.get(ext);\n if (!adapter) {\n throw new Error(\n `Cannot detect runtime for \"${filename}\". Known extensions: ${[...extensionMap.keys()].join(\", \")}`\n );\n }\n return adapter;\n },\n\n /** Returns all registered runtime adapters. */\n list(): RuntimeAdapter[] {\n return [...adapters.values()];\n },\n};\n",
9
9
  "import type { RuntimeAdapter } from \"../adapter\";\n\nexport const bashAdapter: RuntimeAdapter = {\n name: \"bash\",\n image: \"isol8:bash\",\n getCommand(code: string, filePath?: string): string[] {\n if (filePath) {\n return [\"bash\", filePath];\n }\n return [\"bash\", \"-c\", code];\n },\n getFileExtension() {\n return \".sh\";\n },\n};\n",
10
10
  "/** Bun runtime adapter — uses `bun` from the `isol8:bun` image. Maps to `.ts` extension. */\nimport type { RuntimeAdapter } from \"../adapter\";\n\nexport const BunAdapter: RuntimeAdapter = {\n name: \"bun\",\n image: \"isol8:bun\",\n\n getCommand(code: string, filePath?: string): string[] {\n if (filePath) {\n return [\"bun\", \"run\", filePath];\n }\n return [\"bun\", \"-e\", code];\n },\n\n getFileExtension(): string {\n return \".ts\";\n },\n};\n",
11
11
  "/**\n * Deno runtime adapter — uses `deno` from the `isol8:deno` image.\n *\n * Uses `.mts` extension to avoid collision with Bun's `.ts`.\n * Permissions are scoped: read/write to /sandbox, env access, and\n * optionally net access (controlled by the engine's network mode).\n */\nimport type { RuntimeAdapter } from \"../adapter\";\n\nexport const DenoAdapter: RuntimeAdapter = {\n name: \"deno\",\n image: \"isol8:deno\",\n\n getCommand(_code: string, filePath?: string): string[] {\n if (!filePath) {\n throw new Error(\"Deno adapter requires a file path — inline code is not supported.\");\n }\n return [\n \"deno\",\n \"run\",\n \"--allow-read=/sandbox,/tmp\",\n \"--allow-write=/sandbox,/tmp\",\n \"--allow-env\",\n \"--allow-net\",\n filePath,\n ];\n },\n\n getFileExtension(): string {\n return \".mts\";\n },\n};\n",
12
- "/** Node.js runtime adapter — uses `node` from the `isol8:node` image. */\nimport type { RuntimeAdapter } from \"../adapter\";\n\nexport const NodeAdapter: RuntimeAdapter = {\n name: \"node\",\n image: \"isol8:node\",\n\n getCommand(code: string, filePath?: string): string[] {\n if (filePath) {\n return [\"node\", filePath];\n }\n return [\"node\", \"-e\", code];\n },\n\n getFileExtension(): string {\n return \".js\";\n },\n};\n",
12
+ "/** Node.js runtime adapter — uses `node` from the `isol8:node` image. */\nimport type { RuntimeAdapter } from \"../adapter\";\n\nexport const NodeAdapter: RuntimeAdapter = {\n name: \"node\",\n image: \"isol8:node\",\n\n getCommand(code: string, filePath?: string): string[] {\n if (filePath) {\n return [\"node\", filePath];\n }\n return [\"node\", \"-e\", code];\n },\n\n getFileExtension(): string {\n return \".mjs\";\n },\n};\n",
13
13
  "/** Python runtime adapter — uses `python3` from the `isol8:python` image. */\nimport type { RuntimeAdapter } from \"../adapter\";\n\nexport const PythonAdapter: RuntimeAdapter = {\n name: \"python\",\n image: \"isol8:python\",\n\n getCommand(code: string, filePath?: string): string[] {\n if (filePath) {\n return [\"python3\", filePath];\n }\n return [\"python3\", \"-c\", code];\n },\n\n getFileExtension(): string {\n return \".py\";\n },\n};\n",
14
- "/**\n * @module runtime\n *\n * Barrel module that registers all built-in runtime adapters and re-exports\n * the public API. Importing this module has the side effect of populating\n * the {@link RuntimeRegistry} with Python, Node, Bun, and Deno adapters.\n */\n\nimport { RuntimeRegistry } from \"./adapter\";\nimport { bashAdapter } from \"./adapters/bash\";\nimport { BunAdapter } from \"./adapters/bun\";\nimport { DenoAdapter } from \"./adapters/deno\";\nimport { NodeAdapter } from \"./adapters/node\";\nimport { PythonAdapter } from \"./adapters/python\";\n\n// Register all built-in adapters (order matters for extension collisions)\nRuntimeRegistry.register(PythonAdapter);\nRuntimeRegistry.register(NodeAdapter);\nRuntimeRegistry.register(BunAdapter); // Bun wins for .ts\nRuntimeRegistry.register(bashAdapter);\nRuntimeRegistry.register(DenoAdapter); // Deno uses .mts to avoid extension collision\n\nexport type { RuntimeAdapter } from \"./adapter\";\nexport { RuntimeRegistry } from \"./adapter\";\nexport { bashAdapter } from \"./adapters/bash\";\nexport { BunAdapter } from \"./adapters/bun\";\nexport { DenoAdapter } from \"./adapters/deno\";\nexport { NodeAdapter } from \"./adapters/node\";\nexport { PythonAdapter } from \"./adapters/python\";\n",
14
+ "/**\n * @module runtime\n *\n * Barrel module that registers all built-in runtime adapters and re-exports\n * the public API. Importing this module has the side effect of populating\n * the {@link RuntimeRegistry} with Python, Node, Bun, and Deno adapters.\n */\n\nimport { RuntimeRegistry } from \"./adapter\";\nimport { bashAdapter } from \"./adapters/bash\";\nimport { BunAdapter } from \"./adapters/bun\";\nimport { DenoAdapter } from \"./adapters/deno\";\nimport { NodeAdapter } from \"./adapters/node\";\nimport { PythonAdapter } from \"./adapters/python\";\n\n// Register all built-in adapters (order matters for extension collisions)\nRuntimeRegistry.register(PythonAdapter);\nRuntimeRegistry.register(NodeAdapter, [\".js\", \".cjs\"]);\nRuntimeRegistry.register(BunAdapter); // Bun wins for .ts\nRuntimeRegistry.register(bashAdapter);\nRuntimeRegistry.register(DenoAdapter); // Deno uses .mts to avoid extension collision\n\nexport type { RuntimeAdapter } from \"./adapter\";\nexport { RuntimeRegistry } from \"./adapter\";\nexport { bashAdapter } from \"./adapters/bash\";\nexport { BunAdapter } from \"./adapters/bun\";\nexport { DenoAdapter } from \"./adapters/deno\";\nexport { NodeAdapter } from \"./adapters/node\";\nexport { PythonAdapter } from \"./adapters/python\";\n",
15
15
  "/**\n * @module engine/concurrency\n *\n * Async semaphore for limiting the number of concurrent container executions.\n * Used by {@link DockerIsol8} to prevent resource exhaustion.\n */\n\n/**\n * A counting semaphore for limiting concurrent async operations.\n *\n * @example\n * ```typescript\n * const sem = new Semaphore(3); // allow 3 concurrent operations\n *\n * await sem.acquire();\n * try {\n * await doWork();\n * } finally {\n * sem.release();\n * }\n * ```\n */\nexport class Semaphore {\n private current = 0;\n private readonly queue: (() => void)[] = [];\n\n /**\n * @param max - Maximum number of concurrent acquisitions. Must be ≥ 1.\n * @throws {Error} If `max` is less than 1.\n */\n constructor(private readonly max: number) {\n if (max < 1) {\n throw new Error(\"Semaphore max must be >= 1\");\n }\n }\n\n /** The number of permits currently available. */\n get available(): number {\n return this.max - this.current;\n }\n\n /** The number of callers waiting to acquire a permit. */\n get pending(): number {\n return this.queue.length;\n }\n\n /**\n * Acquire a permit. Resolves immediately if one is available,\n * otherwise queues the caller until a permit is released.\n */\n async acquire(): Promise<void> {\n if (this.current < this.max) {\n this.current++;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n /**\n * Release a permit. If callers are queued, the next one is resolved.\n * Must be called exactly once for each successful `acquire()`.\n */\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.current--;\n }\n }\n}\n",
16
16
  "/**\n * @module engine/pool\n *\n * Warm container pool for fast ephemeral execution. Pre-creates and\n * starts containers so they're ready for immediate use, eliminating\n * the create+start overhead (~100-200ms per execution).\n *\n * After execution, containers are cleaned (sandbox wiped) and returned\n * to the pool for reuse rather than destroyed.\n */\n\nimport type Docker from \"dockerode\";\n\n/** Configuration for the container pool. */\nexport interface PoolOptions {\n /** Docker client instance. */\n docker: Docker;\n /** Max containers to keep warm per image. @default 2 */\n poolSize?: number;\n /** Container creation options (HostConfig, Env, etc). */\n createOptions: Omit<Docker.ContainerCreateOptions, \"Image\">;\n}\n\ninterface PoolEntry {\n container: Docker.Container;\n createdAt: number;\n}\n\n/**\n * A per-image warm container pool. Maintains pre-started containers\n * ready for immediate exec, recycling them after use.\n */\nexport class ContainerPool {\n private readonly docker: Docker;\n private readonly poolSize: number;\n private readonly createOptions: Omit<Docker.ContainerCreateOptions, \"Image\">;\n private readonly pools = new Map<string, PoolEntry[]>();\n private readonly replenishing = new Set<string>();\n private readonly pendingReplenishments = new Set<Promise<void>>();\n\n constructor(options: PoolOptions) {\n this.docker = options.docker;\n this.poolSize = options.poolSize ?? 2;\n this.createOptions = options.createOptions;\n }\n\n /**\n * Acquire a started container for the given image.\n * Returns a warm container from the pool if available,\n * otherwise creates and starts a new one.\n */\n async acquire(image: string): Promise<Docker.Container> {\n const pool = this.pools.get(image);\n\n if (pool && pool.length > 0) {\n const entry = pool.shift()!;\n // Fire-and-forget replenishment\n this.replenish(image);\n return entry.container;\n }\n\n // Cold path: create + start inline\n return this.createContainer(image);\n }\n\n /**\n * Return a container to the pool after use. The container's /sandbox\n * tmpfs is wiped clean so it's ready for the next execution.\n * If the pool is full, the container is destroyed instead.\n */\n async release(container: Docker.Container, image: string): Promise<void> {\n const pool = this.pools.get(image) ?? [];\n\n if (pool.length >= this.poolSize) {\n // Pool is full, just destroy\n await container.remove({ force: true }).catch(() => {});\n return;\n }\n\n try {\n // Wipe the sandbox for next use\n const cleanExec = await container.exec({\n Cmd: [\"sh\", \"-c\", \"rm -rf /sandbox/* /sandbox/.[!.]* 2>/dev/null; true\"],\n });\n await cleanExec.start({ Detach: true });\n\n // Wait for clean to finish (fast operation on tmpfs)\n let info = await cleanExec.inspect();\n while (info.Running) {\n await new Promise((r) => setTimeout(r, 5));\n info = await cleanExec.inspect();\n }\n\n pool.push({ container, createdAt: Date.now() });\n this.pools.set(image, pool);\n } catch {\n // Container died, just remove it\n await container.remove({ force: true }).catch(() => {});\n }\n }\n\n /**\n * Pre-warm the pool for a specific image.\n * Creates containers up to poolSize.\n */\n async warm(image: string): Promise<void> {\n const pool = this.pools.get(image) ?? [];\n this.pools.set(image, pool);\n\n const needed = this.poolSize - pool.length;\n const promises: Promise<void>[] = [];\n\n for (let i = 0; i < needed; i++) {\n promises.push(\n this.createContainer(image).then((container) => {\n pool.push({ container, createdAt: Date.now() });\n })\n );\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Destroy all pooled containers and clear the pool.\n */\n async drain(): Promise<void> {\n // First wait for any pending replenishments to finish\n await Promise.all(this.pendingReplenishments);\n\n const promises: Promise<void>[] = [];\n\n for (const [, pool] of this.pools) {\n for (const entry of pool) {\n promises.push(entry.container.remove({ force: true }).catch(() => {}));\n }\n }\n\n await Promise.all(promises);\n this.pools.clear();\n }\n\n private async createContainer(image: string): Promise<Docker.Container> {\n const container = await this.docker.createContainer({\n ...this.createOptions,\n Image: image,\n });\n // console.log(`[Pool] Container ${container.id} created for image: ${image}`);\n await container.start();\n // console.log(`[Pool] Container ${container.id} started.`);\n return container;\n }\n\n /** Replenish the pool in the background (non-blocking). */\n private replenish(image: string): void {\n if (this.replenishing.has(image)) {\n // console.log(`[Pool] Replenishment for ${image} already in progress.`);\n return;\n }\n this.replenishing.add(image);\n // console.log(`[Pool] Starting background replenishment for image: ${image}`);\n\n const promise = this.createContainer(image)\n .then((container) => {\n const pool = this.pools.get(image) ?? [];\n if (pool.length < this.poolSize) {\n pool.push({ container, createdAt: Date.now() });\n this.pools.set(image, pool);\n // console.log(\n // `[Pool] Replenished container ${container.id} added to pool for ${image}. Current pool size: ${pool.length}`\n // );\n } else {\n // console.log(\n // `[Pool] Replenished container ${container.id} not needed (pool for ${image} is full), destroying.`\n // );\n container.remove({ force: true }).catch((err) => {\n console.error(\n `[Pool] Error destroying unneeded replenished container ${container.id}:`,\n err\n );\n });\n }\n })\n .catch((err) => {\n console.error(`[Pool] Error during replenishment for ${image}:`, err);\n })\n .finally(() => {\n this.replenishing.delete(image);\n this.pendingReplenishments.delete(promise);\n });\n\n this.pendingReplenishments.add(promise);\n }\n}\n",
17
17
  "/**\n * @module engine/utils\n *\n * Low-level utility functions used by the Docker engine: memory parsing,\n * output truncation, secret masking, and POSIX tar archive creation/extraction.\n */\n\n/**\n * Parses a human-readable memory limit string into bytes.\n *\n * @param limit - Memory string (e.g. `\"512m\"`, `\"1g\"`, `\"256k\"`, `\"1024\"`).\n * @returns The limit in bytes.\n * @throws {Error} If the format is invalid.\n *\n * @example\n * ```typescript\n * parseMemoryLimit(\"512m\"); // 536870912\n * parseMemoryLimit(\"1g\"); // 1073741824\n * ```\n */\nexport function parseMemoryLimit(limit: string): number {\n const match = limit.match(/^(\\d+(?:\\.\\d+)?)\\s*([kmgt]?)b?$/i);\n if (!match) {\n throw new Error(`Invalid memory limit format: \"${limit}\". Use e.g. \"512m\", \"1g\".`);\n }\n const value = Number.parseFloat(match[1]!);\n const unit = (match[2] || \"b\").toLowerCase();\n\n const multipliers: Record<string, number> = {\n b: 1,\n k: 1024,\n m: 1024 ** 2,\n g: 1024 ** 3,\n t: 1024 ** 4,\n };\n\n return Math.floor(value * (multipliers[unit] ?? 1));\n}\n\n/**\n * Truncates output to a maximum byte length. If truncated, appends a\n * summary line indicating the original and limit sizes.\n *\n * @param output - The full output string.\n * @param maxBytes - Maximum allowed byte length.\n * @returns Object with the (possibly truncated) text and a truncation flag.\n */\nexport function truncateOutput(\n output: string,\n maxBytes: number\n): { text: string; truncated: boolean } {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(output);\n\n if (bytes.length <= maxBytes) {\n return { text: output, truncated: false };\n }\n\n // Truncate at byte boundary, decode back\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const truncated = decoder.decode(bytes.slice(0, maxBytes));\n return {\n text: `${truncated}\\n\\n--- OUTPUT TRUNCATED (${bytes.length} bytes, limit: ${maxBytes}) ---`,\n truncated: true,\n };\n}\n\n/**\n * Replaces all occurrences of secret values in a string with `***`.\n * Empty secret values are skipped.\n *\n * @param text - The text to sanitize.\n * @param secrets - Map of secret names to values.\n * @returns The sanitized text.\n */\nexport function maskSecrets(text: string, secrets: Record<string, string>): string {\n let result = text;\n for (const value of Object.values(secrets)) {\n if (value.length > 0) {\n result = result.replaceAll(value, \"***\");\n }\n }\n return result;\n}\n\n/**\n * Creates a POSIX tar archive buffer containing a single file.\n *\n * Uses a minimal tar header (512-byte blocks) followed by data blocks\n * and a 1024-byte end-of-archive marker.\n *\n * @param filePath - Path for the file inside the archive (leading `/` is stripped).\n * @param content - File contents as a string or Buffer.\n * @returns A Buffer containing the complete tar archive.\n */\nexport function createTarBuffer(filePath: string, content: Buffer | string): Buffer {\n const data = typeof content === \"string\" ? Buffer.from(content, \"utf-8\") : content;\n const headerSize = 512;\n const dataBlocks = Math.ceil(data.length / 512);\n const totalSize = headerSize + dataBlocks * 512 + 1024; // +1024 for end-of-archive\n const buf = Buffer.alloc(totalSize);\n\n // Filename (0..100)\n buf.write(filePath.replace(/^\\//, \"\"), 0, 100, \"utf-8\");\n // Mode (100..108)\n buf.write(\"0000644\\0\", 100, 8, \"utf-8\");\n // UID (108..116)\n buf.write(\"0000000\\0\", 108, 8, \"utf-8\");\n // GID (116..124)\n buf.write(\"0000000\\0\", 116, 8, \"utf-8\");\n // Size (124..136) - octal\n buf.write(`${data.length.toString(8).padStart(11, \"0\")}\\0`, 124, 12, \"utf-8\");\n // Mtime (136..148)\n buf.write(\n `${Math.floor(Date.now() / 1000)\n .toString(8)\n .padStart(11, \"0\")}\\0`,\n 136,\n 12,\n \"utf-8\"\n );\n // Type flag (156) - '0' = regular file\n buf.write(\"0\", 156, 1, \"utf-8\");\n // Magic (257..263)\n buf.write(\"ustar\\0\", 257, 6, \"utf-8\");\n // Version (263..265)\n buf.write(\"00\", 263, 2, \"utf-8\");\n\n // Compute checksum\n // First fill checksum field with spaces\n buf.write(\" \", 148, 8, \"utf-8\");\n let checksum = 0;\n for (let i = 0; i < headerSize; i++) {\n checksum += buf[i]!;\n }\n buf.write(`${checksum.toString(8).padStart(6, \"0\")}\\0 `, 148, 8, \"utf-8\");\n\n // Write data\n data.copy(buf, headerSize);\n\n return buf;\n}\n\n/**\n * Extracts a single file from a tar archive buffer.\n *\n * @param tarBuffer - The tar archive buffer.\n * @param targetPath - Path of the file to extract (leading `/` is stripped for matching).\n * @returns The extracted file contents as a Buffer.\n * @throws {Error} If the file is not found in the archive.\n */\nexport function extractFromTar(tarBuffer: Buffer, targetPath: string): Buffer {\n const normalizedTarget = targetPath.replace(/^\\//, \"\");\n const basename = targetPath.split(\"/\").pop() ?? targetPath;\n let offset = 0;\n\n while (offset < tarBuffer.length - 512) {\n // Read filename from header\n const nameEnd = tarBuffer.indexOf(0, offset);\n const name = tarBuffer.subarray(offset, Math.min(nameEnd, offset + 100)).toString(\"utf-8\");\n\n if (name.length === 0) {\n break;\n }\n\n // Read size\n const sizeStr = tarBuffer\n .subarray(offset + 124, offset + 136)\n .toString(\"utf-8\")\n .trim();\n const size = Number.parseInt(sizeStr, 8);\n\n if (Number.isNaN(size)) {\n break;\n }\n\n const dataStart = offset + 512;\n const dataBlocks = Math.ceil(size / 512);\n\n if (name === normalizedTarget || name.endsWith(`/${normalizedTarget}`) || name === basename) {\n return Buffer.from(tarBuffer.subarray(dataStart, dataStart + size));\n }\n\n offset = dataStart + dataBlocks * 512;\n }\n\n throw new Error(`File \"${targetPath}\" not found in tar archive`);\n}\n",
@@ -19,7 +19,7 @@
19
19
  "/**\n * @module server/auth\n *\n * Bearer token authentication middleware for the Hono server.\n * Skips auth for the `/health` endpoint.\n */\n\nimport type { Context, Next } from \"hono\";\n\n/**\n * Creates a Hono middleware that validates `Authorization: Bearer <token>` headers.\n * Returns 401 if the header is missing, 403 if the token is invalid.\n * The `/health` endpoint is excluded from auth checks.\n *\n * @param apiKey - The expected API key.\n */\nexport function authMiddleware(apiKey: string) {\n return async (c: Context, next: Next) => {\n // Skip auth for health check\n if (c.req.path === \"/health\") {\n return next();\n }\n\n const authHeader = c.req.header(\"Authorization\");\n if (!authHeader) {\n return c.json({ error: \"Missing Authorization header\" }, 401);\n }\n\n const token = authHeader.replace(/^Bearer\\s+/i, \"\");\n if (token !== apiKey) {\n return c.json({ error: \"Invalid API key\" }, 403);\n }\n\n return next();\n };\n}\n",
20
20
  "/**\n * @module version\n *\n * Exports the current version of isol8.\n */\n\nimport packageJson from \"../package.json\";\n\n/**\n * Current version of isol8.\n * @example\n * ```typescript\n * import { VERSION } from \"isol8\";\n * console.log(`Using isol8 v${VERSION}`);\n * ```\n */\nexport const VERSION = packageJson.version;\n"
21
21
  ],
22
- "mappings": "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",
23
- "debugId": "E29B0D9338BB963564756E2164756E21",
22
+ "mappings": "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",
23
+ "debugId": "E336C06AFE4446F964756E2164756E21",
24
24
  "names": []
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/engine/docker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEX,YAAY,EAGZ,WAAW,EACZ,MAAM,UAAU,CAAC;AA+OlB,2HAA2H;AAC3H,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,IAAI,CAA8B;IAE1C;;;OAGG;gBACS,OAAO,GAAE,kBAAuB,EAAE,aAAa,SAAK;IAkBhE;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,kFAAkF;IAC5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAW9D;;;;;;;OAOG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5C,6GAA6G;IAC7G,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED;;;OAGG;IACI,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAAC,WAAW,CAAC;YA+EzD,YAAY;YAcZ,gBAAgB;YAmGhB,iBAAiB;YA4FjB,aAAa;YAkBb,oBAAoB;YASpB,wBAAwB;IA2BtC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,QAAQ;YAmCD,gBAAgB;YA8EjB,iBAAiB;IA8D/B,OAAO,CAAC,iBAAiB;IAYzB;;;;;;;;;;;;;;;;;;;;OAoBG;WACU,OAAO,CAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CA2BlE"}
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/engine/docker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEX,YAAY,EAGZ,WAAW,EACZ,MAAM,UAAU,CAAC;AA+OlB,2HAA2H;AAC3H,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,IAAI,CAA8B;IAE1C;;;OAGG;gBACS,OAAO,GAAE,kBAAuB,EAAE,aAAa,SAAK;IAkBhE;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,kFAAkF;IAC5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAW9D;;;;;;;OAOG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5C,6GAA6G;IAC7G,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED;;;OAGG;IACI,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAAC,WAAW,CAAC;YAgFzD,YAAY;YAcZ,gBAAgB;YAoGhB,iBAAiB;YA6FjB,aAAa;YAkBb,oBAAoB;YASpB,wBAAwB;IA2BtC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,QAAQ;YAmCD,gBAAgB;YA8EjB,iBAAiB;IA8D/B,OAAO,CAAC,iBAAiB;IAYzB;;;;;;;;;;;;;;;;;;;;OAoBG;WACU,OAAO,CAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CA2BlE"}
@@ -38,8 +38,11 @@ export declare const RuntimeRegistry: {
38
38
  /**
39
39
  * Register a runtime adapter. Overwrites any existing adapter with the same
40
40
  * name or file extension.
41
+ *
42
+ * @param adapter - The adapter to register.
43
+ * @param aliases - Additional file extensions to map to this adapter (e.g. `[".mjs", ".cjs"]`).
41
44
  */
42
- register(adapter: RuntimeAdapter): void;
45
+ register(adapter: RuntimeAdapter, aliases?: string[]): void;
43
46
  /**
44
47
  * Look up a runtime adapter by name.
45
48
  *
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/runtime/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEtD,8DAA8D;IAC9D,gBAAgB,IAAI,MAAM,CAAC;CAC5B;AAMD;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B;;;OAGG;sBACe,cAAc,GAAG,IAAI;IAKvC;;;;;OAKG;cACO,MAAM,GAAG,cAAc;IAQjC;;;;;OAKG;qBACc,MAAM,GAAG,cAAc;IAWxC,+CAA+C;YACvC,cAAc,EAAE;CAGzB,CAAC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/runtime/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEtD,8DAA8D;IAC9D,gBAAgB,IAAI,MAAM,CAAC;CAC5B;AAMD;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;;;OAMG;sBACe,cAAc,YAAW,MAAM,EAAE,GAAQ,IAAI;IAQ/D;;;;;OAKG;cACO,MAAM,GAAG,cAAc;IAQjC;;;;;OAKG;qBACc,MAAM,GAAG,cAAc;IAWxC,+CAA+C;YACvC,cAAc,EAAE;CAGzB,CAAC"}
@@ -41,6 +41,11 @@ export interface ExecutionRequest {
41
41
  * Keys matching secret names will be masked in output.
42
42
  */
43
43
  env?: Record<string, string>;
44
+ /**
45
+ * Optional file extension to use for the script file (e.g. ".cjs", ".mjs").
46
+ * If not provided, defaults to the runtime adapter's default extension.
47
+ */
48
+ fileExtension?: string;
44
49
  /**
45
50
  * Data to pipe to the process via stdin.
46
51
  * Written to a temporary file and piped into the command.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "isol8",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "Secure code execution engine for AI agents",
5
5
  "author": "Illusion47586",
6
6
  "license": "MIT",