{"version":3,"sources":["../src/e2b-backend.ts","../src/sandbox.ts"],"names":["SandboxError","ErrorCodes","ConfigError"],"mappings":"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","file":"sandbox.cjs","sourcesContent":["import { ErrorCodes, SandboxError } from '@agentskit/core'\nimport type { SandboxBackend, ExecuteOptions, ExecuteResult } from './types'\n\nexport interface E2BConfig {\n  apiKey: string\n  timeout?: number\n}\n\ninterface E2BSandboxInstance {\n  runCode(code: string, opts?: { language?: string; onStdout?: (data: { line: string }) => void; onStderr?: (data: { line: string }) => void }): Promise<{ exitCode: number }>\n  kill(): Promise<void>\n}\n\nexport function createE2BBackend(config: E2BConfig): SandboxBackend {\n  let instance: E2BSandboxInstance | null = null\n  let instancePromise: Promise<E2BSandboxInstance> | null = null\n\n  const getInstance = (): Promise<E2BSandboxInstance> => {\n    if (instance) return Promise.resolve(instance)\n    if (instancePromise) return instancePromise\n\n    instancePromise = (async () => {\n      try {\n        const mod = await import('@e2b/code-interpreter')\n        const Sandbox = mod.Sandbox ?? (mod as unknown as { default: { Sandbox: unknown } }).default?.Sandbox\n        if (!Sandbox) {\n          throw new SandboxError({\n            code: ErrorCodes.AK_SANDBOX_BACKEND_FAILED,\n            message: 'Sandbox class not found in @e2b/code-interpreter',\n            hint: 'The installed @e2b/code-interpreter does not export Sandbox; check version compatibility.',\n          })\n        }\n\n        const sb = await (Sandbox as unknown as {\n          create(opts: { apiKey: string; timeout?: number }): Promise<E2BSandboxInstance>\n        }).create({\n          apiKey: config.apiKey,\n          timeout: config.timeout ?? 300_000,\n        })\n\n        instance = sb\n        return sb\n      } catch (err) {\n        instancePromise = null\n        const msg = err instanceof Error ? err.message : String(err)\n        if (msg.includes('Cannot find module') || msg.includes('@e2b')) {\n          throw new SandboxError({\n            code: ErrorCodes.AK_SANDBOX_PEER_MISSING,\n            message: 'Install @e2b/code-interpreter to use E2B sandbox: npm install @e2b/code-interpreter',\n            hint: 'E2B is the default backend; install the optional peer or pass a custom backend.',\n          })\n        }\n        throw err\n      }\n    })()\n\n    return instancePromise\n  }\n\n  return {\n    /**\n     * Execute code in the E2B sandbox. **Concurrency note:** the backend\n     * lazily creates a single shared `Sandbox` instance and serializes\n     * the SDK's `runCode` calls onto it; concurrent invocations share\n     * one VM. If you need isolation per call, create one backend per\n     * call rather than running parallel `execute()` on a single backend.\n     */\n    async execute(code: string, options: ExecuteOptions = {}): Promise<ExecuteResult> {\n      const sb = await getInstance()\n      const language = options.language ?? 'javascript'\n      const timeout = options.timeout ?? 30_000\n\n      let stdout = ''\n      let stderr = ''\n      const startTime = Date.now()\n\n      let timeoutHandle: ReturnType<typeof setTimeout> | null = null\n      const timeoutPromise = new Promise<never>((_, reject) => {\n        timeoutHandle = setTimeout(\n          () => reject(new Error(`Sandbox execution timed out after ${timeout}ms`)),\n          timeout,\n        )\n      })\n\n      try {\n        const resultPromise = sb.runCode(code, {\n          language: language === 'python' ? 'python' : 'javascript',\n          onStdout: (data) => { stdout += data.line + '\\n' },\n          onStderr: (data) => { stderr += data.line + '\\n' },\n        })\n\n        const result = await Promise.race([resultPromise, timeoutPromise])\n\n        return {\n          stdout: stdout.trimEnd(),\n          stderr: stderr.trimEnd(),\n          exitCode: result.exitCode,\n          durationMs: Date.now() - startTime,\n        }\n      } catch (err) {\n        return {\n          stdout: stdout.trimEnd(),\n          stderr: err instanceof Error ? err.message : String(err),\n          exitCode: 1,\n          durationMs: Date.now() - startTime,\n        }\n      } finally {\n        if (timeoutHandle) clearTimeout(timeoutHandle)\n      }\n    },\n\n    async dispose() {\n      if (instance) {\n        await instance.kill()\n        instance = null\n        instancePromise = null\n      }\n    },\n  }\n}\n","import { ConfigError, ErrorCodes } from '@agentskit/core'\nimport type { SandboxBackend, ExecuteOptions, ExecuteResult } from './types'\nimport type { E2BConfig } from './e2b-backend'\n\nexport interface SandboxConfig {\n  apiKey?: string\n  backend?: SandboxBackend\n  language?: 'javascript' | 'python'\n  timeout?: number\n  network?: boolean\n  memoryLimit?: string\n}\n\nexport interface Sandbox {\n  execute(code: string, options?: ExecuteOptions): Promise<ExecuteResult>\n  dispose(): Promise<void>\n}\n\nexport function createSandbox(config: SandboxConfig = {}): Sandbox {\n  const defaults: ExecuteOptions = {\n    language: config.language ?? 'javascript',\n    timeout: config.timeout ?? 30_000,\n    network: config.network ?? false,\n    memoryLimit: config.memoryLimit ?? '50MB',\n  }\n\n  let backend: SandboxBackend | null = config.backend ?? null\n\n  const getBackend = async (): Promise<SandboxBackend> => {\n    if (backend) return backend\n\n    if (!config.apiKey) {\n      throw new ConfigError({\n        code: ErrorCodes.AK_CONFIG_INVALID,\n        message:\n          'Sandbox requires either an apiKey (for E2B) or a custom backend. ' +\n          'Provide apiKey or pass a SandboxBackend via the backend option.',\n      })\n    }\n\n    const mod = await import(/* webpackIgnore: true */ /* turbopackIgnore: true */ /* @vite-ignore */ './e2b-backend')\n    backend = mod.createE2BBackend({\n      apiKey: config.apiKey,\n      timeout: defaults.timeout,\n    })\n\n    return backend\n  }\n\n  return {\n    async execute(code: string, options: ExecuteOptions = {}): Promise<ExecuteResult> {\n      const mergedOptions: ExecuteOptions = {\n        ...defaults,\n        ...options,\n      }\n\n      const b = await getBackend()\n      return await b.execute(code, mergedOptions)\n    },\n\n    async dispose(): Promise<void> {\n      await backend?.dispose?.()\n      backend = null\n    },\n  }\n}\n"]}