{"version":3,"sources":["../src/api/index.ts","../src/api/metadata.ts","../package.json","../src/utils.ts","../src/errors.ts","../src/logs.ts","../src/connectionConfig.ts","../src/sandbox/signature.ts","../src/sandbox/filesystem/index.ts","../src/envd/api.ts","../src/envd/rpc.ts","../src/envd/versions.ts","../src/envd/filesystem/filesystem_pb.ts","../src/sandbox/filesystem/watchHandle.ts","../src/sandbox/commands/commandHandle.ts","../src/sandbox/index.ts","../src/sandbox/commands/index.ts","../src/envd/process/process_pb.ts","../src/sandbox/commands/pty.ts","../src/sandbox/sandboxApi.ts","../src/template/logger.ts","../src/template/utils.ts","../src/template/consts.ts","../src/template/buildApi.ts","../src/template/dockerfileParser.ts","../src/template/readycmd.ts","../src/template/index.ts","../src/index.ts"],"sourcesContent":["import createClient, { FetchResponse } from 'openapi-fetch'\n\nimport type { components, paths } from './schema.gen'\nimport { defaultHeaders } from './metadata'\nimport { ConnectionConfig } from '../connectionConfig'\nimport { AuthenticationError, RateLimitError, SandboxError } from '../errors'\nimport { createApiLogger } from '../logs'\n\nexport function handleApiError(\n  response: FetchResponse<any, any, any>,\n  errorClass: new (\n    message: string,\n    stackTrace?: string\n  ) => Error = SandboxError,\n  stackTrace?: string\n): Error | undefined {\n  if (!response.error) {\n    return\n  }\n\n  if (response.response.status === 401) {\n    const message = 'Unauthorized, please check your credentials.'\n    const content = response.error?.message ?? response.error\n\n    if (content) {\n      return new AuthenticationError(`${message} - ${content}`)\n    }\n    return new AuthenticationError(message)\n  }\n\n  if (response.response.status === 429) {\n    const message = 'Rate limit exceeded, please try again later'\n    const content = response.error?.message ?? response.error\n\n    if (content) {\n      return new RateLimitError(`${message} - ${content}`)\n    }\n    return new RateLimitError(message)\n  }\n\n  const message = response.error?.message ?? response.error\n  return new errorClass(`${response.response.status}: ${message}`, stackTrace)\n}\n\n/**\n * Client for interacting with the E2B API.\n */\nclass ApiClient {\n  readonly api: ReturnType<typeof createClient<paths>>\n\n  constructor(\n    config: ConnectionConfig,\n    opts: {\n      requireAccessToken?: boolean\n      requireApiKey?: boolean\n    } = { requireAccessToken: false, requireApiKey: false }\n  ) {\n    if (opts?.requireApiKey && !config.apiKey) {\n      throw new AuthenticationError(\n        'API key is required, please visit the Team tab at https://e2b.dev/dashboard to get your API key. ' +\n          'You can either set the environment variable `E2B_API_KEY` ' +\n          \"or you can pass it directly to the sandbox like Sandbox.create({ apiKey: 'e2b_...' })\"\n      )\n    }\n\n    if (opts?.requireAccessToken && !config.accessToken) {\n      throw new AuthenticationError(\n        'Access token is required, please visit the Personal tab at https://e2b.dev/dashboard to get your access token. ' +\n          'You can set the environment variable `E2B_ACCESS_TOKEN` or pass the `accessToken` in options.'\n      )\n    }\n\n    this.api = createClient<paths>({\n      baseUrl: config.apiUrl,\n      // keepalive: true, // TODO: Return keepalive\n      headers: {\n        ...defaultHeaders,\n        ...(config.apiKey && { 'X-API-KEY': config.apiKey }),\n        ...(config.accessToken && {\n          Authorization: `Bearer ${config.accessToken}`,\n        }),\n        ...config.headers,\n      },\n      querySerializer: {\n        array: {\n          style: 'form',\n          explode: false,\n        },\n      },\n    })\n\n    if (config.logger) {\n      this.api.use(createApiLogger(config.logger))\n    }\n  }\n}\n\nexport type { components, paths }\nexport { ApiClient }\n","import platform from 'platform'\n\nimport { version } from '../../package.json'\nimport { runtime, runtimeVersion } from '../utils'\n\nexport { version }\n\nexport const defaultHeaders = {\n  browser: (typeof window !== 'undefined' && platform.name) || 'unknown',\n  lang: 'js',\n  lang_version: runtimeVersion,\n  package_version: version,\n  publisher: 'e2b',\n  sdk_runtime: runtime,\n  system: platform.os?.family || 'unknown',\n}\n\nexport function getEnvVar(name: string) {\n  if (runtime === 'deno') {\n    // @ts-ignore\n    return Deno.env.get(name)\n  }\n\n  if (typeof process === 'undefined') {\n    return ''\n  }\n\n  return process.env[name]\n}\n","{\n  \"name\": \"@e2b/sdk\",\n  \"version\": \"2.5.0\",\n  \"description\": \"E2B SDK that give agents cloud environments\",\n  \"homepage\": \"https://e2b.dev\",\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"FoundryLabs, Inc.\",\n    \"email\": \"hello@e2b.dev\",\n    \"url\": \"https://e2b.dev\"\n  },\n  \"bugs\": \"https://github.com/e2b-dev/e2b/issues\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/e2b-dev/e2b\",\n    \"directory\": \"packages/js-sdk\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"sideEffects\": false,\n  \"main\": \"dist/index.js\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"dist/index.d.ts\",\n  \"scripts\": {\n    \"prepublishOnly\": \"pnpm build\",\n    \"build\": \"tsc --noEmit && tsup\",\n    \"dev\": \"tsup --watch\",\n    \"example\": \"tsx example.mts\",\n    \"test\": \"vitest run\",\n    \"generate\": \"npm-run-all generate:* && pnpm run format\",\n    \"generate:api\": \"python ./../../spec/remove_extra_tags.py sandboxes templates auth && openapi-typescript ../../spec/openapi_generated.yml -x api_key --array-length --alphabetize --output src/api/schema.gen.ts\",\n    \"generate:envd\": \"cd ../../spec/envd && buf generate --template buf-js.gen.yaml\\n\",\n    \"generate:envd-api\": \"openapi-typescript ../../spec/envd/envd.yaml -x api_key --array-length --alphabetize --output src/envd/schema.gen.ts\",\n    \"generate:mcp\": \"json2ts -i ./../../spec/mcp-server.json -o src/sandbox/mcp.d.ts --unreachableDefinitions --style.singleQuote --no-style.semi\",\n    \"generate-ref\": \"./scripts/generate_sdk_ref.sh\",\n    \"check-deps\": \"knip\",\n    \"update-deps\": \"ncu -u && pnpm i\",\n    \"pretest\": \"npx playwright install --with-deps chromium\",\n    \"postPublish\": \"./scripts/post-publish.sh || true\",\n    \"test:bun\": \"bun test tests/runtimes/bun --env-file=.env\",\n    \"test:deno\": \"deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks\",\n    \"test:integration\": \"E2B_INTEGRATION_TEST=1 vitest run tests/integration/**\",\n    \"lint\": \"eslint src/ tests/\",\n    \"format\": \"prettier --write src/ tests/ example.mts\"\n  },\n  \"devDependencies\": {\n    \"@testing-library/react\": \"^16.2.0\",\n    \"@types/node\": \"^20.19.19\",\n    \"@types/platform\": \"^1.3.6\",\n    \"@types/react\": \"^18.3.11\",\n    \"@typescript-eslint/eslint-plugin\": \"^7.11.0\",\n    \"@typescript-eslint/parser\": \"^7.11.0\",\n    \"@vitejs/plugin-react\": \"^4.3.4\",\n    \"@vitest/browser\": \"^3.1.1\",\n    \"dotenv\": \"^16.4.5\",\n    \"eslint\": \"^8.57.1\",\n    \"json-schema-to-typescript\": \"^15.0.4\",\n    \"knip\": \"^5.43.6\",\n    \"npm-check-updates\": \"^16.14.20\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"openapi-typescript\": \"^7.9.1\",\n    \"playwright\": \"^1.48.0\",\n    \"react\": \"^18.3.1\",\n    \"tsup\": \"^8.4.0\",\n    \"typedoc\": \"0.26.8\",\n    \"typedoc-plugin-markdown\": \"4.2.7\",\n    \"typescript\": \"^5.4.5\",\n    \"vitest\": \"^3.1.1\",\n    \"vitest-browser-react\": \"^0.1.1\"\n  },\n  \"files\": [\n    \"dist\",\n    \"README.md\",\n    \"package.json\"\n  ],\n  \"keywords\": [\n    \"e2b\",\n    \"ai-agents\",\n    \"agents\",\n    \"ai\",\n    \"code-interpreter\",\n    \"sandbox\",\n    \"code\",\n    \"runtime\",\n    \"vm\",\n    \"nodejs\",\n    \"javascript\",\n    \"typescript\"\n  ],\n  \"dependencies\": {\n    \"@bufbuild/protobuf\": \"^2.6.2\",\n    \"@connectrpc/connect\": \"2.0.0-rc.3\",\n    \"@connectrpc/connect-web\": \"2.0.0-rc.3\",\n    \"chalk\": \"^5.3.0\",\n    \"compare-versions\": \"^6.1.0\",\n    \"dockerfile-ast\": \"^0.7.1\",\n    \"glob\": \"^11.0.3\",\n    \"openapi-fetch\": \"^0.14.1\",\n    \"platform\": \"^1.3.6\",\n    \"tar\": \"^7.4.3\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  },\n  \"browserslist\": [\n    \"defaults\"\n  ]\n}\n","import platform from 'platform'\n\ndeclare let window: any\n\ntype Runtime =\n  | 'node'\n  | 'browser'\n  | 'deno'\n  | 'bun'\n  | 'vercel-edge'\n  | 'cloudflare-worker'\n  | 'unknown'\n\nfunction getRuntime(): { runtime: Runtime; version: string } {\n  // @ts-ignore\n  if ((globalThis as any).Bun) {\n    // @ts-ignore\n    return { runtime: 'bun', version: globalThis.Bun.version }\n  }\n\n  // @ts-ignore\n  if ((globalThis as any).Deno) {\n    // @ts-ignore\n    return { runtime: 'deno', version: globalThis.Deno.version.deno }\n  }\n\n  if ((globalThis as any).process?.release?.name === 'node') {\n    return { runtime: 'node', version: platform.version || 'unknown' }\n  }\n\n  // @ts-ignore\n  if (typeof EdgeRuntime === 'string') {\n    return { runtime: 'vercel-edge', version: 'unknown' }\n  }\n\n  if ((globalThis as any).navigator?.userAgent === 'Cloudflare-Workers') {\n    return { runtime: 'cloudflare-worker', version: 'unknown' }\n  }\n\n  if (typeof window !== 'undefined') {\n    return { runtime: 'browser', version: platform.version || 'unknown' }\n  }\n\n  return { runtime: 'unknown', version: 'unknown' }\n}\n\nexport const { runtime, version: runtimeVersion } = getRuntime()\n\nexport async function sha256(data: string): Promise<string> {\n  // Use WebCrypto API if available\n  if (typeof crypto !== 'undefined') {\n    const encoder = new TextEncoder()\n    const dataBuffer = encoder.encode(data)\n    const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer)\n    const hashArray = new Uint8Array(hashBuffer)\n    return btoa(String.fromCharCode(...hashArray))\n  }\n\n  // Use Node.js crypto if WebCrypto is not available\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\n  const { createHash } = require('node:crypto')\n  const hash = createHash('sha256').update(data, 'utf8').digest()\n  return hash.toString('base64')\n}\n\nexport function timeoutToSeconds(timeout: number): number {\n  return Math.ceil(timeout / 1000)\n}\n\nexport async function dynamicGlob(): Promise<typeof import('glob')> {\n  if (runtime === 'browser') {\n    throw new Error('Browser runtime is not supported for glob')\n  }\n\n  // @ts-ignore\n  return await import('glob')\n}\n\nexport async function dynamicTar(): Promise<typeof import('tar')> {\n  if (runtime === 'browser') {\n    throw new Error('Browser runtime is not supported for tar')\n  }\n\n  // @ts-ignore\n  return await import('tar')\n}\n\n// Source: https://github.com/chalk/ansi-regex/blob/main/index.js\nfunction ansiRegex({ onlyFirst = false } = {}) {\n  // Valid string terminator sequences are BEL, ESC\\, and 0x9c\n  const ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)'\n  // OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n  const osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`\n  // CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n  const csi =\n    '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]'\n\n  const pattern = `${osc}|${csi}`\n\n  return new RegExp(pattern, onlyFirst ? undefined : 'g')\n}\n\nexport function stripAnsi(text: string): string {\n  return text.replace(ansiRegex(), '')\n}\n\nexport async function wait(ms: number) {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","// This is the message for the sandbox timeout error when the response code is 502/Unavailable\nexport function formatSandboxTimeoutError(message: string) {\n  return new TimeoutError(\n    `${message}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`\n  )\n}\n\n/**\n * Base class for all sandbox errors.\n *\n * Thrown when general sandbox errors occur.\n */\nexport class SandboxError extends Error {\n  constructor(message?: string, stackTrace?: string) {\n    super(message)\n    this.name = 'SandboxError'\n    if (stackTrace) {\n      this.stack = stackTrace\n    }\n  }\n}\n\n/**\n * Thrown when a timeout error occurs.\n *\n * The [unavailable] error type is caused by sandbox timeout.\n *\n * The [canceled] error type is caused by exceeding request timeout.\n *\n * The [deadline_exceeded] error type is caused by exceeding the timeout for command execution, watch, etc.\n *\n * The [unknown] error type is sometimes caused by the sandbox timeout when the request is not processed correctly.\n */\nexport class TimeoutError extends SandboxError {\n  constructor(message: string, stackTrace?: string) {\n    super(message, stackTrace)\n    this.name = 'TimeoutError'\n  }\n}\n\n/**\n * Thrown when an invalid argument is provided.\n */\nexport class InvalidArgumentError extends SandboxError {\n  constructor(message: string, stackTrace?: string) {\n    super(message, stackTrace)\n    this.name = 'InvalidArgumentError'\n  }\n}\n\n/**\n * Thrown when there is not enough disk space.\n */\nexport class NotEnoughSpaceError extends SandboxError {\n  constructor(message: string, stackTrace?: string) {\n    super(message, stackTrace)\n    this.name = 'NotEnoughSpaceError'\n  }\n}\n\n/**\n * Thrown when a resource is not found.\n */\nexport class NotFoundError extends SandboxError {\n  constructor(message: string, stackTrace?: string) {\n    super(message, stackTrace)\n    this.name = 'NotFoundError'\n  }\n}\n\n/**\n * Thrown when authentication fails.\n */\nexport class AuthenticationError extends Error {\n  constructor(message: string) {\n    super(message)\n    this.name = 'AuthenticationError'\n  }\n}\n\n/**\n * Thrown when the template uses old envd version. It isn't compatible with the new SDK.\n */\nexport class TemplateError extends SandboxError {\n  constructor(message: string, stackTrace?: string) {\n    super(message, stackTrace)\n    this.name = 'TemplateError'\n  }\n}\n\n/**\n * Thrown when the API rate limit is exceeded.\n */\nexport class RateLimitError extends SandboxError {\n  constructor(message: string) {\n    super(message)\n    this.name = 'RateLimitError'\n  }\n}\n\n/**\n * Thrown when the build fails.\n */\nexport class BuildError extends Error {\n  constructor(message: string, stackTrace?: string) {\n    super(message)\n    this.name = 'BuildError'\n    if (stackTrace) {\n      this.stack = stackTrace\n    }\n  }\n}\n\n/**\n * Thrown when the file upload fails.\n */\nexport class FileUploadError extends BuildError {\n  constructor(message: string, stackTrace?: string) {\n    super(message, stackTrace)\n    this.name = 'FileUploadError'\n  }\n}\n","import type { Interceptor } from '@connectrpc/connect'\nimport type { Middleware } from 'openapi-fetch'\n\n/**\n * Logger interface compatible with {@link console} used for logging Sandbox messages.\n */\nexport interface Logger {\n  /**\n   * Debug level logging method.\n   */\n  debug?: (...args: any[]) => void\n  /**\n   * Info level logging method.\n   */\n  info?: (...args: any[]) => void\n  /**\n   * Warn level logging method.\n   */\n  warn?: (...args: any[]) => void\n  /**\n   * Error level logging method.\n   */\n  error?: (...args: any[]) => void\n}\n\nfunction formatLog(log: any) {\n  return JSON.parse(JSON.stringify(log))\n}\n\nexport function createRpcLogger(logger: Logger): Interceptor {\n  async function* logEach(stream: AsyncIterable<any>) {\n    for await (const m of stream) {\n      logger.debug?.('Response stream:', formatLog(m))\n      yield m\n    }\n  }\n\n  return (next) => async (req) => {\n    logger.info?.(`Request: POST ${req.url}`)\n\n    const res = await next(req)\n    if (res.stream) {\n      return {\n        ...res,\n        message: logEach(res.message),\n      }\n    } else {\n      logger.info?.('Response:', formatLog(res.message))\n    }\n\n    return res\n  }\n}\n\nexport function createApiLogger(logger: Logger): Middleware {\n  return {\n    async onRequest({ request }) {\n      logger.info?.(`Request ${request.method} ${request.url}`)\n      return request\n    },\n    async onResponse({ response }) {\n      if (response.status >= 400) {\n        logger.error?.('Response:', response.status, response.statusText)\n      } else {\n        logger.info?.('Response:', response.status, response.statusText)\n      }\n\n      return response\n    },\n  }\n}\n","import { Logger } from './logs'\nimport { getEnvVar, version } from './api/metadata'\n\nexport const REQUEST_TIMEOUT_MS = 60_000 // 60 seconds\nexport const DEFAULT_SANDBOX_TIMEOUT_MS = 300_000 // 300 seconds\nexport const KEEPALIVE_PING_INTERVAL_SEC = 50 // 50 seconds\n\nexport const KEEPALIVE_PING_HEADER = 'Keepalive-Ping-Interval'\n\n/**\n * Connection options for requests to the API.\n */\nexport interface ConnectionOpts {\n  /**\n   * E2B API key to use for authentication.\n   *\n   * @default E2B_API_KEY // environment variable\n   */\n  apiKey?: string\n  /**\n   * E2B access token to use for authentication.\n   *\n   * @default E2B_ACCESS_TOKEN // environment variable\n   */\n  accessToken?: string\n  /**\n   * Domain to use for the API.\n   *\n   * @default E2B_DOMAIN // environment variable or `e2b.app`\n   */\n  domain?: string\n  /**\n   * API Url to use for the API.\n   * @internal\n   * @default E2B_API_URL // environment variable or `https://api.${domain}`\n   */\n  apiUrl?: string\n  /**\n   * If true the SDK starts in the debug mode and connects to the local envd API server.\n   * @internal\n   * @default E2B_DEBUG // environment variable or `false`\n   */\n  debug?: boolean\n  /**\n   * Timeout for requests to the API in **milliseconds**.\n   *\n   * @default 60_000 // 60 seconds\n   */\n  requestTimeoutMs?: number\n  /**\n   * Logger to use for logging messages. It can accept any object that implements `Logger` interface—for example, {@link console}.\n   */\n  logger?: Logger\n\n  /**\n   * Additional headers to send with the request.\n   */\n  headers?: Record<string, string>\n}\n\n/**\n * Configuration for connecting to the API.\n */\nexport class ConnectionConfig {\n  readonly debug: boolean\n  readonly domain: string\n  readonly apiUrl: string\n  readonly logger?: Logger\n\n  readonly requestTimeoutMs: number\n\n  readonly apiKey?: string\n  readonly accessToken?: string\n\n  readonly headers?: Record<string, string>\n\n  constructor(opts?: ConnectionOpts) {\n    this.apiKey = opts?.apiKey || ConnectionConfig.apiKey\n    this.debug = opts?.debug || ConnectionConfig.debug\n    this.domain = opts?.domain || ConnectionConfig.domain\n    this.accessToken = opts?.accessToken || ConnectionConfig.accessToken\n    this.requestTimeoutMs = opts?.requestTimeoutMs ?? REQUEST_TIMEOUT_MS\n    this.logger = opts?.logger\n    this.headers = opts?.headers || {}\n    this.headers['User-Agent'] = `e2b-js-sdk/${version}`\n\n    this.apiUrl =\n      opts?.apiUrl ||\n      ConnectionConfig.apiUrl ||\n      (this.debug ? 'http://localhost:3000' : `https://api.${this.domain}`)\n  }\n\n  private static get domain() {\n    return getEnvVar('E2B_DOMAIN') || 'e2b.app'\n  }\n\n  private static get apiUrl() {\n    return getEnvVar('E2B_API_URL')\n  }\n\n  private static get debug() {\n    return (getEnvVar('E2B_DEBUG') || 'false').toLowerCase() === 'true'\n  }\n\n  private static get apiKey() {\n    return getEnvVar('E2B_API_KEY')\n  }\n\n  private static get accessToken() {\n    return getEnvVar('E2B_ACCESS_TOKEN')\n  }\n\n  getSignal(requestTimeoutMs?: number) {\n    const timeout = requestTimeoutMs ?? this.requestTimeoutMs\n\n    return timeout ? AbortSignal.timeout(timeout) : undefined\n  }\n}\n\n/**\n * User used for the operation in the sandbox.\n */\n\nexport const defaultUsername: Username = 'user'\nexport type Username = string\n","import { sha256 } from '../utils'\n\n/**\n * Get the URL signature for the specified path, operation and user.\n *\n * @param path Path to the file in the sandbox.\n *\n * @param operation File system operation. Can be either `read` or `write`.\n *\n * @param user Sandbox user.\n *\n * @param expirationInSeconds Optional signature expiration time in seconds.\n */\n\ninterface SignatureOpts {\n  path: string\n  operation: 'read' | 'write'\n  user: string | undefined\n  expirationInSeconds?: number\n  envdAccessToken?: string\n}\n\nexport async function getSignature({\n  path,\n  operation,\n  user,\n  expirationInSeconds,\n  envdAccessToken,\n}: SignatureOpts): Promise<{ signature: string; expiration: number | null }> {\n  if (!envdAccessToken) {\n    throw new Error(\n      'Access token is not set and signature cannot be generated!'\n    )\n  }\n\n  // expiration is unix timestamp\n  const signatureExpiration = expirationInSeconds\n    ? Math.floor(Date.now() / 1000) + expirationInSeconds\n    : null\n  let signatureRaw: string\n\n  // if user is undefined, set it to empty string to handle default user\n  if (user == undefined) {\n    user = ''\n  }\n\n  if (signatureExpiration === null) {\n    signatureRaw = `${path}:${operation}:${user}:${envdAccessToken}`\n  } else {\n    signatureRaw = `${path}:${operation}:${user}:${envdAccessToken}:${signatureExpiration.toString()}`\n  }\n\n  const hashBase64 = await sha256(signatureRaw)\n  const signature = 'v1_' + hashBase64.replace(/=+$/, '')\n\n  return {\n    signature: signature,\n    expiration: signatureExpiration,\n  }\n}\n","import {\n  Client,\n  Code,\n  ConnectError,\n  createClient,\n  Transport,\n} from '@connectrpc/connect'\nimport {\n  ConnectionConfig,\n  ConnectionOpts,\n  defaultUsername,\n  KEEPALIVE_PING_HEADER,\n  KEEPALIVE_PING_INTERVAL_SEC,\n  Username,\n} from '../../connectionConfig'\n\nimport { handleEnvdApiError, handleWatchDirStartEvent } from '../../envd/api'\nimport { authenticationHeader, handleRpcError } from '../../envd/rpc'\n\nimport { EnvdApiClient } from '../../envd/api'\nimport {\n  Filesystem as FilesystemService,\n  FileType as FsFileType,\n} from '../../envd/filesystem/filesystem_pb'\n\nimport { FilesystemEvent, WatchHandle } from './watchHandle'\n\nimport type { Timestamp } from '@bufbuild/protobuf/wkt'\nimport { compareVersions } from 'compare-versions'\nimport {\n  ENVD_DEFAULT_USER,\n  ENVD_VERSION_RECURSIVE_WATCH,\n} from '../../envd/versions'\nimport { InvalidArgumentError, TemplateError } from '../../errors'\n\n/**\n * Sandbox filesystem object information.\n */\nexport interface WriteInfo {\n  /**\n   * Name of the filesystem object.\n   */\n  name: string\n  /**\n   * Type of the filesystem object.\n   */\n  type?: FileType\n  /**\n   * Path to the filesystem object.\n   */\n  path: string\n}\n\nexport interface EntryInfo extends WriteInfo {\n  /**\n   * Size of the filesystem object in bytes.\n   */\n  size: number\n\n  /**\n   * File mode and permission bits.\n   */\n  mode: number\n\n  /**\n   * String representation of file permissions (e.g. 'rwxr-xr-x').\n   */\n  permissions: string\n\n  /**\n   * Owner of the filesystem object.\n   */\n  owner: string\n\n  /**\n   * Group owner of the filesystem object.\n   */\n  group: string\n\n  /**\n   * Last modification time of the filesystem object.\n   */\n  modifiedTime?: Date\n\n  /**\n   * If the filesystem object is a symlink, this is the target of the symlink.\n   */\n  symlinkTarget?: string\n}\n\n/**\n * Sandbox filesystem object type.\n */\nexport enum FileType {\n  /**\n   * Filesystem object is a file.\n   */\n  FILE = 'file',\n  /**\n   * Filesystem object is a directory.\n   */\n  DIR = 'dir',\n}\n\nexport type WriteEntry = {\n  path: string\n  data: string | ArrayBuffer | Blob | ReadableStream\n}\n\nfunction mapFileType(fileType: FsFileType) {\n  switch (fileType) {\n    case FsFileType.DIRECTORY:\n      return FileType.DIR\n    case FsFileType.FILE:\n      return FileType.FILE\n  }\n}\n\nfunction mapModifiedTime(modifiedTime: Timestamp | undefined) {\n  if (!modifiedTime) return undefined\n\n  return new Date(\n    Number(modifiedTime.seconds) * 1000 +\n      Math.floor(modifiedTime.nanos / 1_000_000)\n  )\n}\n\n/**\n * Options for the sandbox filesystem operations.\n */\nexport interface FilesystemRequestOpts\n  extends Partial<Pick<ConnectionOpts, 'requestTimeoutMs'>> {\n  /**\n   * User to use for the operation in the sandbox.\n   * This affects the resolution of relative paths and ownership of the created filesystem objects.\n   */\n  user?: Username\n}\n\nexport interface FilesystemListOpts extends FilesystemRequestOpts {\n  /**\n   * Depth of the directory to list.\n   */\n  depth?: number\n}\n\n/**\n * Options for watching a directory.\n */\nexport interface WatchOpts extends FilesystemRequestOpts {\n  /**\n   * Timeout for the watch operation in **milliseconds**.\n   * You can pass `0` to disable the timeout.\n   *\n   * @default 60_000 // 60 seconds\n   */\n  timeoutMs?: number\n  /**\n   * Callback to call when the watch operation stops.\n   */\n  onExit?: (err?: Error) => void | Promise<void>\n  /**\n   * Watch the directory recursively\n   */\n  recursive?: boolean\n}\n\n/**\n * Module for interacting with the sandbox filesystem.\n */\nexport class Filesystem {\n  private readonly rpc: Client<typeof FilesystemService>\n\n  private readonly defaultWatchTimeout = 60_000 // 60 seconds\n  private readonly defaultWatchRecursive = false\n\n  constructor(\n    transport: Transport,\n    private readonly envdApi: EnvdApiClient,\n    private readonly connectionConfig: ConnectionConfig\n  ) {\n    this.rpc = createClient(FilesystemService, transport)\n  }\n\n  /**\n   * Read file content as a `string`.\n   *\n   * You can pass `text`, `bytes`, `blob`, or `stream` to `opts.format` to change the return type.\n   *\n   * @param path path to the file.\n   * @param opts connection options.\n   * @param [opts.format] format of the file content—`text` by default.\n   *\n   * @returns file content as string\n   */\n  async read(\n    path: string,\n    opts?: FilesystemRequestOpts & { format?: 'text' }\n  ): Promise<string>\n  /**\n   * Read file content as a `Uint8Array`.\n   *\n   * You can pass `text`, `bytes`, `blob`, or `stream` to `opts.format` to change the return type.\n   *\n   * @param path path to the file.\n   * @param opts connection options.\n   * @param [opts.format] format of the file content—`bytes`.\n   *\n   * @returns file content as `Uint8Array`\n   */\n  async read(\n    path: string,\n    opts?: FilesystemRequestOpts & { format: 'bytes' }\n  ): Promise<Uint8Array>\n  /**\n   * Read file content as a `Blob`.\n   *\n   * You can pass `text`, `bytes`, `blob`, or `stream` to `opts.format` to change the return type.\n   *\n   * @param path path to the file.\n   * @param opts connection options.\n   * @param [opts.format] format of the file content—`blob`.\n   *\n   * @returns file content as `Blob`\n   */\n  async read(\n    path: string,\n    opts?: FilesystemRequestOpts & { format: 'blob' }\n  ): Promise<Blob>\n  /**\n   * Read file content as a `ReadableStream`.\n   *\n   * You can pass `text`, `bytes`, `blob`, or `stream` to `opts.format` to change the return type.\n   *\n   * @param path path to the file.\n   * @param opts connection options.\n   * @param [opts.format] format of the file content—`stream`.\n   *\n   * @returns file content as `ReadableStream`\n   */\n  async read(\n    path: string,\n    opts?: FilesystemRequestOpts & { format: 'stream' }\n  ): Promise<ReadableStream<Uint8Array>>\n  async read(\n    path: string,\n    opts?: FilesystemRequestOpts & {\n      format?: 'text' | 'stream' | 'bytes' | 'blob'\n    }\n  ): Promise<unknown> {\n    const format = opts?.format ?? 'text'\n\n    let user = opts?.user\n    if (\n      user == undefined &&\n      compareVersions(this.envdApi.version, ENVD_DEFAULT_USER) < 0\n    ) {\n      user = defaultUsername\n    }\n\n    const res = await this.envdApi.api.GET('/files', {\n      params: {\n        query: {\n          path,\n          username: user,\n        },\n      },\n      parseAs: format === 'bytes' ? 'arrayBuffer' : format,\n      signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n    })\n\n    const err = await handleEnvdApiError(res)\n    if (err) {\n      throw err\n    }\n\n    if (format === 'bytes') {\n      return new Uint8Array(res.data as ArrayBuffer)\n    }\n\n    // When the file is empty, res.data is parsed as `{}`. This is a workaround to return an empty string.\n    if (res.response.headers.get('content-length') === '0') {\n      return ''\n    }\n\n    return res.data\n  }\n\n  /**\n   * Write content to a file.\n   *\n   *\n   * Writing to a file that doesn't exist creates the file.\n   *\n   * Writing to a file that already exists overwrites the file.\n   *\n   * Writing to a file at path that doesn't exist creates the necessary directories.\n   *\n   * @param path path to file.\n   * @param data data to write to the file. Data can be a string, `ArrayBuffer`, `Blob`, or `ReadableStream`.\n   * @param opts connection options.\n   *\n   * @returns information about the written file\n   */\n  async write(\n    path: string,\n    data: string | ArrayBuffer | Blob | ReadableStream,\n    opts?: FilesystemRequestOpts\n  ): Promise<WriteInfo>\n  async write(\n    files: WriteEntry[],\n    opts?: FilesystemRequestOpts\n  ): Promise<WriteInfo[]>\n  async write(\n    pathOrFiles: string | WriteEntry[],\n    dataOrOpts?:\n      | string\n      | ArrayBuffer\n      | Blob\n      | ReadableStream\n      | FilesystemRequestOpts,\n    opts?: FilesystemRequestOpts\n  ): Promise<WriteInfo | WriteInfo[]> {\n    if (typeof pathOrFiles !== 'string' && !Array.isArray(pathOrFiles)) {\n      throw new Error('Path or files are required')\n    }\n\n    if (typeof pathOrFiles === 'string' && Array.isArray(dataOrOpts)) {\n      throw new Error(\n        'Cannot specify both path and array of files. You have to specify either path and data for a single file or an array for multiple files.'\n      )\n    }\n\n    const { path, writeOpts, writeFiles } =\n      typeof pathOrFiles === 'string'\n        ? {\n            path: pathOrFiles,\n            writeOpts: opts as FilesystemRequestOpts,\n            writeFiles: [\n              {\n                data: dataOrOpts as\n                  | string\n                  | ArrayBuffer\n                  | Blob\n                  | ReadableStream,\n              },\n            ],\n          }\n        : {\n            path: undefined,\n            writeOpts: dataOrOpts as FilesystemRequestOpts,\n            writeFiles: pathOrFiles as WriteEntry[],\n          }\n\n    if (writeFiles.length === 0) return [] as WriteInfo[]\n\n    const blobs = await Promise.all(\n      writeFiles.map((f) => new Response(f.data).blob())\n    )\n\n    let user = writeOpts?.user\n    if (\n      user == undefined &&\n      compareVersions(this.envdApi.version, ENVD_DEFAULT_USER) < 0\n    ) {\n      user = defaultUsername\n    }\n\n    const res = await this.envdApi.api.POST('/files', {\n      params: {\n        query: {\n          path,\n          username: user,\n        },\n      },\n      bodySerializer() {\n        return blobs.reduce((fd, blob, i) => {\n          // Important: RFC 7578, Section 4.2 requires that if a filename is provided,\n          // the directory path information must not be used.\n          // BUT in our case we need to use the directory path information with a custom\n          // multipart part name getter in envd.\n          fd.append('file', blob, writeFiles[i].path)\n\n          return fd\n        }, new FormData())\n      },\n      body: {},\n    })\n\n    const err = await handleEnvdApiError(res)\n    if (err) {\n      throw err\n    }\n\n    const files = res.data as WriteInfo[]\n    if (!files) {\n      throw new Error('Expected to receive information about written file')\n    }\n\n    return files.length === 1 && path ? files[0] : files\n  }\n\n  /**\n   * List entries in a directory.\n   *\n   * @param path path to the directory.\n   * @param opts connection options.\n   *\n   * @returns list of entries in the sandbox filesystem directory.\n   */\n  async list(path: string, opts?: FilesystemListOpts): Promise<EntryInfo[]> {\n    if (typeof opts?.depth === 'number' && opts.depth < 1) {\n      throw new InvalidArgumentError('depth should be at least one')\n    }\n\n    try {\n      const res = await this.rpc.listDir(\n        {\n          path,\n          depth: opts?.depth ?? 1,\n        },\n        {\n          headers: authenticationHeader(this.envdApi.version, opts?.user),\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      const entries: EntryInfo[] = []\n\n      for (const e of res.entries) {\n        const type = mapFileType(e.type)\n\n        if (type) {\n          entries.push({\n            name: e.name,\n            type,\n            path: e.path,\n            size: Number(e.size),\n            mode: e.mode,\n            permissions: e.permissions,\n            owner: e.owner,\n            group: e.group,\n            modifiedTime: mapModifiedTime(e.modifiedTime),\n            symlinkTarget: e.symlinkTarget,\n          })\n        }\n      }\n\n      return entries\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Create a new directory and all directories along the way if needed on the specified path.\n   *\n   * @param path path to a new directory. For example '/dirA/dirB' when creating 'dirB'.\n   * @param opts connection options.\n   *\n   * @returns `true` if the directory was created, `false` if it already exists.\n   */\n  async makeDir(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n    try {\n      await this.rpc.makeDir(\n        { path },\n        {\n          headers: authenticationHeader(this.envdApi.version, opts?.user),\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      return true\n    } catch (err) {\n      if (err instanceof ConnectError) {\n        if (err.code === Code.AlreadyExists) {\n          return false\n        }\n      }\n\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Rename a file or directory.\n   *\n   * @param oldPath path to the file or directory to rename.\n   * @param newPath new path for the file or directory.\n   * @param opts connection options.\n   *\n   * @returns information about renamed file or directory.\n   */\n  async rename(\n    oldPath: string,\n    newPath: string,\n    opts?: FilesystemRequestOpts\n  ): Promise<EntryInfo> {\n    try {\n      const res = await this.rpc.move(\n        {\n          source: oldPath,\n          destination: newPath,\n        },\n        {\n          headers: authenticationHeader(this.envdApi.version, opts?.user),\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      const entry = res.entry\n      if (!entry) {\n        throw new Error('Expected to receive information about moved object')\n      }\n\n      return {\n        name: entry.name,\n        type: mapFileType(entry.type),\n        path: entry.path,\n        size: Number(entry.size),\n        mode: entry.mode,\n        permissions: entry.permissions,\n        owner: entry.owner,\n        group: entry.group,\n        modifiedTime: mapModifiedTime(entry.modifiedTime),\n        symlinkTarget: entry.symlinkTarget,\n      }\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Remove a file or directory.\n   *\n   * @param path path to a file or directory.\n   * @param opts connection options.\n   */\n  async remove(path: string, opts?: FilesystemRequestOpts): Promise<void> {\n    try {\n      await this.rpc.remove(\n        { path },\n        {\n          headers: authenticationHeader(this.envdApi.version, opts?.user),\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Check if a file or a directory exists.\n   *\n   * @param path path to a file or a directory\n   * @param opts connection options.\n   *\n   * @returns `true` if the file or directory exists, `false` otherwise\n   */\n  async exists(path: string, opts?: FilesystemRequestOpts): Promise<boolean> {\n    try {\n      await this.rpc.stat(\n        { path },\n        {\n          headers: authenticationHeader(this.envdApi.version, opts?.user),\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      return true\n    } catch (err) {\n      if (err instanceof ConnectError) {\n        if (err.code === Code.NotFound) {\n          return false\n        }\n      }\n\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Get information about a file or directory.\n   *\n   * @param path path to a file or directory.\n   * @param opts connection options.\n   *\n   * @returns information about the file or directory like name, type, and path.\n   */\n  async getInfo(\n    path: string,\n    opts?: FilesystemRequestOpts\n  ): Promise<EntryInfo> {\n    try {\n      const res = await this.rpc.stat(\n        { path },\n        { headers: authenticationHeader(this.envdApi.version, opts?.user) }\n      )\n\n      if (!res.entry) {\n        throw new Error(\n          'Expected to receive information about the file or directory'\n        )\n      }\n\n      return {\n        name: res.entry.name,\n        type: mapFileType(res.entry.type),\n        path: res.entry.path,\n        size: Number(res.entry.size),\n        mode: res.entry.mode,\n        permissions: res.entry.permissions,\n        owner: res.entry.owner,\n        group: res.entry.group,\n        modifiedTime: mapModifiedTime(res.entry.modifiedTime),\n        symlinkTarget: res.entry.symlinkTarget,\n      }\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Start watching a directory for filesystem events.\n   *\n   * @param path path to directory to watch.\n   * @param onEvent callback to call when an event in the directory occurs.\n   * @param opts connection options.\n   *\n   * @returns `WatchHandle` object for stopping watching directory.\n   */\n  async watchDir(\n    path: string,\n    onEvent: (event: FilesystemEvent) => void | Promise<void>,\n    opts?: WatchOpts & {\n      onExit?: (err?: Error) => void | Promise<void>\n    }\n  ): Promise<WatchHandle> {\n    if (\n      opts?.recursive &&\n      this.envdApi.version &&\n      compareVersions(this.envdApi.version, ENVD_VERSION_RECURSIVE_WATCH) < 0\n    ) {\n      throw new TemplateError(\n        'You need to update the template to use recursive watching. ' +\n          'You can do this by running `e2b template build` in the directory with the template.'\n      )\n    }\n\n    const requestTimeoutMs =\n      opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n    const controller = new AbortController()\n\n    const reqTimeout = requestTimeoutMs\n      ? setTimeout(() => {\n          controller.abort()\n        }, requestTimeoutMs)\n      : undefined\n\n    const events = this.rpc.watchDir(\n      {\n        path,\n        recursive: opts?.recursive ?? this.defaultWatchRecursive,\n      },\n      {\n        headers: {\n          ...authenticationHeader(this.envdApi.version, opts?.user),\n          [KEEPALIVE_PING_HEADER]: KEEPALIVE_PING_INTERVAL_SEC.toString(),\n        },\n        signal: controller.signal,\n        timeoutMs: opts?.timeoutMs ?? this.defaultWatchTimeout,\n      }\n    )\n\n    try {\n      await handleWatchDirStartEvent(events)\n\n      clearTimeout(reqTimeout)\n\n      return new WatchHandle(\n        () => controller.abort(),\n        events,\n        onEvent,\n        opts?.onExit\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n}\n","import createClient from 'openapi-fetch'\n\nimport type { components, paths } from './schema.gen'\nimport { ConnectionConfig } from '../connectionConfig'\nimport { createApiLogger } from '../logs'\nimport {\n  SandboxError,\n  InvalidArgumentError,\n  NotFoundError,\n  NotEnoughSpaceError,\n  formatSandboxTimeoutError,\n  AuthenticationError,\n} from '../errors'\nimport { StartResponse, ConnectResponse } from './process/process_pb'\nimport { Code, ConnectError } from '@connectrpc/connect'\nimport { WatchDirResponse } from './filesystem/filesystem_pb'\n\ntype ApiError = { message?: string } | string\n\nexport async function handleEnvdApiError(res: {\n  error?: ApiError\n  response: Response\n}) {\n  if (!res.error) {\n    return\n  }\n\n  const message: string =\n    typeof res.error == 'string'\n      ? res.error\n      : res.error?.message || (await res.response.text())\n\n  switch (res.response.status) {\n    case 400:\n      return new InvalidArgumentError(message)\n    case 401:\n      return new AuthenticationError(message)\n    case 404:\n      return new NotFoundError(message)\n    case 429:\n      return new SandboxError(\n        `${res.response.status}: ${message}: The requests are being rate limited.`\n      )\n    case 502:\n      return formatSandboxTimeoutError(message)\n    case 507:\n      return new NotEnoughSpaceError(message)\n    default:\n      return new SandboxError(`${res.response.status}: ${message}`)\n  }\n}\n\nexport async function handleProcessStartEvent(\n  events: AsyncIterable<StartResponse | ConnectResponse>\n) {\n  let startEvent: StartResponse | ConnectResponse\n\n  try {\n    startEvent = (await events[Symbol.asyncIterator]().next()).value\n  } catch (err) {\n    if (err instanceof ConnectError) {\n      if (err.code === Code.Unavailable) {\n        throw new NotFoundError('Sandbox is probably not running anymore')\n      }\n    }\n\n    throw err\n  }\n  if (startEvent.event?.event.case !== 'start') {\n    throw new Error('Expected start event')\n  }\n\n  return startEvent.event.event.value.pid\n}\n\nexport async function handleWatchDirStartEvent(\n  events: AsyncIterable<WatchDirResponse>\n) {\n  let startEvent: WatchDirResponse\n\n  try {\n    startEvent = (await events[Symbol.asyncIterator]().next()).value\n  } catch (err) {\n    if (err instanceof ConnectError) {\n      if (err.code === Code.Unavailable) {\n        throw new NotFoundError('Sandbox is probably not running anymore')\n      }\n    }\n\n    throw err\n  }\n  if (startEvent.event?.case !== 'start') {\n    throw new Error('Expected start event')\n  }\n\n  return startEvent.event.value\n}\n\nclass EnvdApiClient {\n  readonly api: ReturnType<typeof createClient<paths>>\n  readonly version: string\n\n  constructor(\n    config: Pick<ConnectionConfig, 'apiUrl' | 'logger' | 'accessToken'> & {\n      fetch?: (request: Request) => ReturnType<typeof fetch>\n      headers?: Record<string, string>\n    },\n    metadata: {\n      version: string\n    }\n  ) {\n    this.api = createClient({\n      baseUrl: config.apiUrl,\n      fetch: config?.fetch,\n      headers: config?.headers,\n      // keepalive: true, // TODO: Return keepalive\n    })\n    this.version = metadata.version\n\n    if (config.logger) {\n      this.api.use(createApiLogger(config.logger))\n    }\n  }\n}\n\nexport type { components, paths }\nexport { EnvdApiClient }\n","import { Code, ConnectError } from '@connectrpc/connect'\nimport { runtime } from '../utils'\n\nimport { compareVersions } from 'compare-versions'\nimport { defaultUsername } from '../connectionConfig'\nimport {\n  AuthenticationError,\n  formatSandboxTimeoutError,\n  InvalidArgumentError,\n  NotFoundError,\n  SandboxError,\n  TimeoutError,\n} from '../errors'\nimport { ENVD_DEFAULT_USER } from './versions'\n\nexport function handleRpcError(err: unknown): Error {\n  if (err instanceof ConnectError) {\n    switch (err.code) {\n      case Code.InvalidArgument:\n        return new InvalidArgumentError(err.message)\n      case Code.Unauthenticated:\n        return new AuthenticationError(err.message)\n      case Code.NotFound:\n        return new NotFoundError(err.message)\n      case Code.Unavailable:\n        return formatSandboxTimeoutError(err.message)\n      case Code.Canceled:\n        return new TimeoutError(\n          `${err.message}: This error is likely due to exceeding 'requestTimeoutMs'. You can pass the request timeout value as an option when making the request.`\n        )\n      case Code.DeadlineExceeded:\n        return new TimeoutError(\n          `${err.message}: This error is likely due to exceeding 'timeoutMs' — the total time a long running request (like command execution or directory watch) can be active. It can be modified by passing 'timeoutMs' when making the request. Use '0' to disable the timeout.`\n        )\n      default:\n        return new SandboxError(`${err.code}: ${err.message}`)\n    }\n  }\n\n  return err as Error\n}\n\nfunction encode64(value: string): string {\n  switch (runtime) {\n    case 'deno':\n      return btoa(value)\n    case 'node':\n      return Buffer.from(value).toString('base64')\n    case 'bun':\n      return Buffer.from(value).toString('base64')\n    default:\n      return btoa(value)\n  }\n}\n\nexport function authenticationHeader(\n  envdVersion: string,\n  username: string | undefined\n): Record<string, string> {\n  if (\n    username == undefined &&\n    compareVersions(envdVersion, ENVD_DEFAULT_USER) < 0\n  ) {\n    username = defaultUsername\n  }\n\n  if (!username) {\n    return {}\n  }\n\n  const value = `${username}:`\n\n  const encoded = encode64(value)\n\n  return { Authorization: `Basic ${encoded}` }\n}\n","export const ENVD_VERSION_RECURSIVE_WATCH = '0.1.4'\nexport const ENVD_DEBUG_FALLBACK = '99.99.99'\nexport const ENVD_COMMANDS_STDIN = '0.3.0'\nexport const ENVD_DEFAULT_USER = '0.4.0'\n","// @generated by protoc-gen-es v2.6.2 with parameter \"target=ts\"\n// @generated from file filesystem/filesystem.proto (package filesystem, syntax proto3)\n/* eslint-disable */\n\nimport type {\n  GenEnum,\n  GenFile,\n  GenMessage,\n  GenService,\n} from '@bufbuild/protobuf/codegenv2'\nimport {\n  enumDesc,\n  fileDesc,\n  messageDesc,\n  serviceDesc,\n} from '@bufbuild/protobuf/codegenv2'\nimport type { Timestamp } from '@bufbuild/protobuf/wkt'\nimport { file_google_protobuf_timestamp } from '@bufbuild/protobuf/wkt'\nimport type { Message } from '@bufbuild/protobuf'\n\n/**\n * Describes the file filesystem/filesystem.proto.\n */\nexport const file_filesystem_filesystem: GenFile =\n  /*@__PURE__*/\n  fileDesc(\n    'ChtmaWxlc3lzdGVtL2ZpbGVzeXN0ZW0ucHJvdG8SCmZpbGVzeXN0ZW0iMgoLTW92ZVJlcXVlc3QSDgoGc291cmNlGAEgASgJEhMKC2Rlc3RpbmF0aW9uGAIgASgJIjQKDE1vdmVSZXNwb25zZRIkCgVlbnRyeRgBIAEoCzIVLmZpbGVzeXN0ZW0uRW50cnlJbmZvIh4KDk1ha2VEaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkiNwoPTWFrZURpclJlc3BvbnNlEiQKBWVudHJ5GAEgASgLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8iHQoNUmVtb3ZlUmVxdWVzdBIMCgRwYXRoGAEgASgJIhAKDlJlbW92ZVJlc3BvbnNlIhsKC1N0YXRSZXF1ZXN0EgwKBHBhdGgYASABKAkiNAoMU3RhdFJlc3BvbnNlEiQKBWVudHJ5GAEgASgLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8i/QEKCUVudHJ5SW5mbxIMCgRuYW1lGAEgASgJEiIKBHR5cGUYAiABKA4yFC5maWxlc3lzdGVtLkZpbGVUeXBlEgwKBHBhdGgYAyABKAkSDAoEc2l6ZRgEIAEoAxIMCgRtb2RlGAUgASgNEhMKC3Blcm1pc3Npb25zGAYgASgJEg0KBW93bmVyGAcgASgJEg0KBWdyb3VwGAggASgJEjEKDW1vZGlmaWVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKDnN5bWxpbmtfdGFyZ2V0GAogASgJSACIAQFCEQoPX3N5bWxpbmtfdGFyZ2V0Ii0KDkxpc3REaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkSDQoFZGVwdGgYAiABKA0iOQoPTGlzdERpclJlc3BvbnNlEiYKB2VudHJpZXMYASADKAsyFS5maWxlc3lzdGVtLkVudHJ5SW5mbyIyCg9XYXRjaERpclJlcXVlc3QSDAoEcGF0aBgBIAEoCRIRCglyZWN1cnNpdmUYAiABKAgiRAoPRmlsZXN5c3RlbUV2ZW50EgwKBG5hbWUYASABKAkSIwoEdHlwZRgCIAEoDjIVLmZpbGVzeXN0ZW0uRXZlbnRUeXBlIuABChBXYXRjaERpclJlc3BvbnNlEjgKBXN0YXJ0GAEgASgLMicuZmlsZXN5c3RlbS5XYXRjaERpclJlc3BvbnNlLlN0YXJ0RXZlbnRIABIxCgpmaWxlc3lzdGVtGAIgASgLMhsuZmlsZXN5c3RlbS5GaWxlc3lzdGVtRXZlbnRIABI7CglrZWVwYWxpdmUYAyABKAsyJi5maWxlc3lzdGVtLldhdGNoRGlyUmVzcG9uc2UuS2VlcEFsaXZlSAAaDAoKU3RhcnRFdmVudBoLCglLZWVwQWxpdmVCBwoFZXZlbnQiNwoUQ3JlYXRlV2F0Y2hlclJlcXVlc3QSDAoEcGF0aBgBIAEoCRIRCglyZWN1cnNpdmUYAiABKAgiKwoVQ3JlYXRlV2F0Y2hlclJlc3BvbnNlEhIKCndhdGNoZXJfaWQYASABKAkiLQoXR2V0V2F0Y2hlckV2ZW50c1JlcXVlc3QSEgoKd2F0Y2hlcl9pZBgBIAEoCSJHChhHZXRXYXRjaGVyRXZlbnRzUmVzcG9uc2USKwoGZXZlbnRzGAEgAygLMhsuZmlsZXN5c3RlbS5GaWxlc3lzdGVtRXZlbnQiKgoUUmVtb3ZlV2F0Y2hlclJlcXVlc3QSEgoKd2F0Y2hlcl9pZBgBIAEoCSIXChVSZW1vdmVXYXRjaGVyUmVzcG9uc2UqUgoIRmlsZVR5cGUSGQoVRklMRV9UWVBFX1VOU1BFQ0lGSUVEEAASEgoORklMRV9UWVBFX0ZJTEUQARIXChNGSUxFX1RZUEVfRElSRUNUT1JZEAIqmAEKCUV2ZW50VHlwZRIaChZFVkVOVF9UWVBFX1VOU1BFQ0lGSUVEEAASFQoRRVZFTlRfVFlQRV9DUkVBVEUQARIUChBFVkVOVF9UWVBFX1dSSVRFEAISFQoRRVZFTlRfVFlQRV9SRU1PVkUQAxIVChFFVkVOVF9UWVBFX1JFTkFNRRAEEhQKEEVWRU5UX1RZUEVfQ0hNT0QQBTKfBQoKRmlsZXN5c3RlbRI5CgRTdGF0EhcuZmlsZXN5c3RlbS5TdGF0UmVxdWVzdBoYLmZpbGVzeXN0ZW0uU3RhdFJlc3BvbnNlEkIKB01ha2VEaXISGi5maWxlc3lzdGVtLk1ha2VEaXJSZXF1ZXN0GhsuZmlsZXN5c3RlbS5NYWtlRGlyUmVzcG9uc2USOQoETW92ZRIXLmZpbGVzeXN0ZW0uTW92ZVJlcXVlc3QaGC5maWxlc3lzdGVtLk1vdmVSZXNwb25zZRJCCgdMaXN0RGlyEhouZmlsZXN5c3RlbS5MaXN0RGlyUmVxdWVzdBobLmZpbGVzeXN0ZW0uTGlzdERpclJlc3BvbnNlEj8KBlJlbW92ZRIZLmZpbGVzeXN0ZW0uUmVtb3ZlUmVxdWVzdBoaLmZpbGVzeXN0ZW0uUmVtb3ZlUmVzcG9uc2USRwoIV2F0Y2hEaXISGy5maWxlc3lzdGVtLldhdGNoRGlyUmVxdWVzdBocLmZpbGVzeXN0ZW0uV2F0Y2hEaXJSZXNwb25zZTABElQKDUNyZWF0ZVdhdGNoZXISIC5maWxlc3lzdGVtLkNyZWF0ZVdhdGNoZXJSZXF1ZXN0GiEuZmlsZXN5c3RlbS5DcmVhdGVXYXRjaGVyUmVzcG9uc2USXQoQR2V0V2F0Y2hlckV2ZW50cxIjLmZpbGVzeXN0ZW0uR2V0V2F0Y2hlckV2ZW50c1JlcXVlc3QaJC5maWxlc3lzdGVtLkdldFdhdGNoZXJFdmVudHNSZXNwb25zZRJUCg1SZW1vdmVXYXRjaGVyEiAuZmlsZXN5c3RlbS5SZW1vdmVXYXRjaGVyUmVxdWVzdBohLmZpbGVzeXN0ZW0uUmVtb3ZlV2F0Y2hlclJlc3BvbnNlQmkKDmNvbS5maWxlc3lzdGVtQg9GaWxlc3lzdGVtUHJvdG9QAaICA0ZYWKoCCkZpbGVzeXN0ZW3KAgpGaWxlc3lzdGVt4gIWRmlsZXN5c3RlbVxHUEJNZXRhZGF0YeoCCkZpbGVzeXN0ZW1iBnByb3RvMw',\n    [file_google_protobuf_timestamp]\n  )\n\n/**\n * @generated from message filesystem.MoveRequest\n */\nexport type MoveRequest = Message<'filesystem.MoveRequest'> & {\n  /**\n   * @generated from field: string source = 1;\n   */\n  source: string\n\n  /**\n   * @generated from field: string destination = 2;\n   */\n  destination: string\n}\n\n/**\n * Describes the message filesystem.MoveRequest.\n * Use `create(MoveRequestSchema)` to create a new message.\n */\nexport const MoveRequestSchema: GenMessage<MoveRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 0)\n\n/**\n * @generated from message filesystem.MoveResponse\n */\nexport type MoveResponse = Message<'filesystem.MoveResponse'> & {\n  /**\n   * @generated from field: filesystem.EntryInfo entry = 1;\n   */\n  entry?: EntryInfo\n}\n\n/**\n * Describes the message filesystem.MoveResponse.\n * Use `create(MoveResponseSchema)` to create a new message.\n */\nexport const MoveResponseSchema: GenMessage<MoveResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 1)\n\n/**\n * @generated from message filesystem.MakeDirRequest\n */\nexport type MakeDirRequest = Message<'filesystem.MakeDirRequest'> & {\n  /**\n   * @generated from field: string path = 1;\n   */\n  path: string\n}\n\n/**\n * Describes the message filesystem.MakeDirRequest.\n * Use `create(MakeDirRequestSchema)` to create a new message.\n */\nexport const MakeDirRequestSchema: GenMessage<MakeDirRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 2)\n\n/**\n * @generated from message filesystem.MakeDirResponse\n */\nexport type MakeDirResponse = Message<'filesystem.MakeDirResponse'> & {\n  /**\n   * @generated from field: filesystem.EntryInfo entry = 1;\n   */\n  entry?: EntryInfo\n}\n\n/**\n * Describes the message filesystem.MakeDirResponse.\n * Use `create(MakeDirResponseSchema)` to create a new message.\n */\nexport const MakeDirResponseSchema: GenMessage<MakeDirResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 3)\n\n/**\n * @generated from message filesystem.RemoveRequest\n */\nexport type RemoveRequest = Message<'filesystem.RemoveRequest'> & {\n  /**\n   * @generated from field: string path = 1;\n   */\n  path: string\n}\n\n/**\n * Describes the message filesystem.RemoveRequest.\n * Use `create(RemoveRequestSchema)` to create a new message.\n */\nexport const RemoveRequestSchema: GenMessage<RemoveRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 4)\n\n/**\n * @generated from message filesystem.RemoveResponse\n */\nexport type RemoveResponse = Message<'filesystem.RemoveResponse'> & {}\n\n/**\n * Describes the message filesystem.RemoveResponse.\n * Use `create(RemoveResponseSchema)` to create a new message.\n */\nexport const RemoveResponseSchema: GenMessage<RemoveResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 5)\n\n/**\n * @generated from message filesystem.StatRequest\n */\nexport type StatRequest = Message<'filesystem.StatRequest'> & {\n  /**\n   * @generated from field: string path = 1;\n   */\n  path: string\n}\n\n/**\n * Describes the message filesystem.StatRequest.\n * Use `create(StatRequestSchema)` to create a new message.\n */\nexport const StatRequestSchema: GenMessage<StatRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 6)\n\n/**\n * @generated from message filesystem.StatResponse\n */\nexport type StatResponse = Message<'filesystem.StatResponse'> & {\n  /**\n   * @generated from field: filesystem.EntryInfo entry = 1;\n   */\n  entry?: EntryInfo\n}\n\n/**\n * Describes the message filesystem.StatResponse.\n * Use `create(StatResponseSchema)` to create a new message.\n */\nexport const StatResponseSchema: GenMessage<StatResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 7)\n\n/**\n * @generated from message filesystem.EntryInfo\n */\nexport type EntryInfo = Message<'filesystem.EntryInfo'> & {\n  /**\n   * @generated from field: string name = 1;\n   */\n  name: string\n\n  /**\n   * @generated from field: filesystem.FileType type = 2;\n   */\n  type: FileType\n\n  /**\n   * @generated from field: string path = 3;\n   */\n  path: string\n\n  /**\n   * @generated from field: int64 size = 4;\n   */\n  size: bigint\n\n  /**\n   * @generated from field: uint32 mode = 5;\n   */\n  mode: number\n\n  /**\n   * @generated from field: string permissions = 6;\n   */\n  permissions: string\n\n  /**\n   * @generated from field: string owner = 7;\n   */\n  owner: string\n\n  /**\n   * @generated from field: string group = 8;\n   */\n  group: string\n\n  /**\n   * @generated from field: google.protobuf.Timestamp modified_time = 9;\n   */\n  modifiedTime?: Timestamp\n\n  /**\n   * If the entry is a symlink, this field contains the target of the symlink.\n   *\n   * @generated from field: optional string symlink_target = 10;\n   */\n  symlinkTarget?: string\n}\n\n/**\n * Describes the message filesystem.EntryInfo.\n * Use `create(EntryInfoSchema)` to create a new message.\n */\nexport const EntryInfoSchema: GenMessage<EntryInfo> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 8)\n\n/**\n * @generated from message filesystem.ListDirRequest\n */\nexport type ListDirRequest = Message<'filesystem.ListDirRequest'> & {\n  /**\n   * @generated from field: string path = 1;\n   */\n  path: string\n\n  /**\n   * @generated from field: uint32 depth = 2;\n   */\n  depth: number\n}\n\n/**\n * Describes the message filesystem.ListDirRequest.\n * Use `create(ListDirRequestSchema)` to create a new message.\n */\nexport const ListDirRequestSchema: GenMessage<ListDirRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 9)\n\n/**\n * @generated from message filesystem.ListDirResponse\n */\nexport type ListDirResponse = Message<'filesystem.ListDirResponse'> & {\n  /**\n   * @generated from field: repeated filesystem.EntryInfo entries = 1;\n   */\n  entries: EntryInfo[]\n}\n\n/**\n * Describes the message filesystem.ListDirResponse.\n * Use `create(ListDirResponseSchema)` to create a new message.\n */\nexport const ListDirResponseSchema: GenMessage<ListDirResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 10)\n\n/**\n * @generated from message filesystem.WatchDirRequest\n */\nexport type WatchDirRequest = Message<'filesystem.WatchDirRequest'> & {\n  /**\n   * @generated from field: string path = 1;\n   */\n  path: string\n\n  /**\n   * @generated from field: bool recursive = 2;\n   */\n  recursive: boolean\n}\n\n/**\n * Describes the message filesystem.WatchDirRequest.\n * Use `create(WatchDirRequestSchema)` to create a new message.\n */\nexport const WatchDirRequestSchema: GenMessage<WatchDirRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 11)\n\n/**\n * @generated from message filesystem.FilesystemEvent\n */\nexport type FilesystemEvent = Message<'filesystem.FilesystemEvent'> & {\n  /**\n   * @generated from field: string name = 1;\n   */\n  name: string\n\n  /**\n   * @generated from field: filesystem.EventType type = 2;\n   */\n  type: EventType\n}\n\n/**\n * Describes the message filesystem.FilesystemEvent.\n * Use `create(FilesystemEventSchema)` to create a new message.\n */\nexport const FilesystemEventSchema: GenMessage<FilesystemEvent> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 12)\n\n/**\n * @generated from message filesystem.WatchDirResponse\n */\nexport type WatchDirResponse = Message<'filesystem.WatchDirResponse'> & {\n  /**\n   * @generated from oneof filesystem.WatchDirResponse.event\n   */\n  event:\n    | {\n        /**\n         * @generated from field: filesystem.WatchDirResponse.StartEvent start = 1;\n         */\n        value: WatchDirResponse_StartEvent\n        case: 'start'\n      }\n    | {\n        /**\n         * @generated from field: filesystem.FilesystemEvent filesystem = 2;\n         */\n        value: FilesystemEvent\n        case: 'filesystem'\n      }\n    | {\n        /**\n         * @generated from field: filesystem.WatchDirResponse.KeepAlive keepalive = 3;\n         */\n        value: WatchDirResponse_KeepAlive\n        case: 'keepalive'\n      }\n    | { case: undefined; value?: undefined }\n}\n\n/**\n * Describes the message filesystem.WatchDirResponse.\n * Use `create(WatchDirResponseSchema)` to create a new message.\n */\nexport const WatchDirResponseSchema: GenMessage<WatchDirResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 13)\n\n/**\n * @generated from message filesystem.WatchDirResponse.StartEvent\n */\nexport type WatchDirResponse_StartEvent =\n  Message<'filesystem.WatchDirResponse.StartEvent'> & {}\n\n/**\n * Describes the message filesystem.WatchDirResponse.StartEvent.\n * Use `create(WatchDirResponse_StartEventSchema)` to create a new message.\n */\nexport const WatchDirResponse_StartEventSchema: GenMessage<WatchDirResponse_StartEvent> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 13, 0)\n\n/**\n * @generated from message filesystem.WatchDirResponse.KeepAlive\n */\nexport type WatchDirResponse_KeepAlive =\n  Message<'filesystem.WatchDirResponse.KeepAlive'> & {}\n\n/**\n * Describes the message filesystem.WatchDirResponse.KeepAlive.\n * Use `create(WatchDirResponse_KeepAliveSchema)` to create a new message.\n */\nexport const WatchDirResponse_KeepAliveSchema: GenMessage<WatchDirResponse_KeepAlive> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 13, 1)\n\n/**\n * @generated from message filesystem.CreateWatcherRequest\n */\nexport type CreateWatcherRequest =\n  Message<'filesystem.CreateWatcherRequest'> & {\n    /**\n     * @generated from field: string path = 1;\n     */\n    path: string\n\n    /**\n     * @generated from field: bool recursive = 2;\n     */\n    recursive: boolean\n  }\n\n/**\n * Describes the message filesystem.CreateWatcherRequest.\n * Use `create(CreateWatcherRequestSchema)` to create a new message.\n */\nexport const CreateWatcherRequestSchema: GenMessage<CreateWatcherRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 14)\n\n/**\n * @generated from message filesystem.CreateWatcherResponse\n */\nexport type CreateWatcherResponse =\n  Message<'filesystem.CreateWatcherResponse'> & {\n    /**\n     * @generated from field: string watcher_id = 1;\n     */\n    watcherId: string\n  }\n\n/**\n * Describes the message filesystem.CreateWatcherResponse.\n * Use `create(CreateWatcherResponseSchema)` to create a new message.\n */\nexport const CreateWatcherResponseSchema: GenMessage<CreateWatcherResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 15)\n\n/**\n * @generated from message filesystem.GetWatcherEventsRequest\n */\nexport type GetWatcherEventsRequest =\n  Message<'filesystem.GetWatcherEventsRequest'> & {\n    /**\n     * @generated from field: string watcher_id = 1;\n     */\n    watcherId: string\n  }\n\n/**\n * Describes the message filesystem.GetWatcherEventsRequest.\n * Use `create(GetWatcherEventsRequestSchema)` to create a new message.\n */\nexport const GetWatcherEventsRequestSchema: GenMessage<GetWatcherEventsRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 16)\n\n/**\n * @generated from message filesystem.GetWatcherEventsResponse\n */\nexport type GetWatcherEventsResponse =\n  Message<'filesystem.GetWatcherEventsResponse'> & {\n    /**\n     * @generated from field: repeated filesystem.FilesystemEvent events = 1;\n     */\n    events: FilesystemEvent[]\n  }\n\n/**\n * Describes the message filesystem.GetWatcherEventsResponse.\n * Use `create(GetWatcherEventsResponseSchema)` to create a new message.\n */\nexport const GetWatcherEventsResponseSchema: GenMessage<GetWatcherEventsResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 17)\n\n/**\n * @generated from message filesystem.RemoveWatcherRequest\n */\nexport type RemoveWatcherRequest =\n  Message<'filesystem.RemoveWatcherRequest'> & {\n    /**\n     * @generated from field: string watcher_id = 1;\n     */\n    watcherId: string\n  }\n\n/**\n * Describes the message filesystem.RemoveWatcherRequest.\n * Use `create(RemoveWatcherRequestSchema)` to create a new message.\n */\nexport const RemoveWatcherRequestSchema: GenMessage<RemoveWatcherRequest> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 18)\n\n/**\n * @generated from message filesystem.RemoveWatcherResponse\n */\nexport type RemoveWatcherResponse =\n  Message<'filesystem.RemoveWatcherResponse'> & {}\n\n/**\n * Describes the message filesystem.RemoveWatcherResponse.\n * Use `create(RemoveWatcherResponseSchema)` to create a new message.\n */\nexport const RemoveWatcherResponseSchema: GenMessage<RemoveWatcherResponse> =\n  /*@__PURE__*/\n  messageDesc(file_filesystem_filesystem, 19)\n\n/**\n * @generated from enum filesystem.FileType\n */\nexport enum FileType {\n  /**\n   * @generated from enum value: FILE_TYPE_UNSPECIFIED = 0;\n   */\n  UNSPECIFIED = 0,\n\n  /**\n   * @generated from enum value: FILE_TYPE_FILE = 1;\n   */\n  FILE = 1,\n\n  /**\n   * @generated from enum value: FILE_TYPE_DIRECTORY = 2;\n   */\n  DIRECTORY = 2,\n}\n\n/**\n * Describes the enum filesystem.FileType.\n */\nexport const FileTypeSchema: GenEnum<FileType> =\n  /*@__PURE__*/\n  enumDesc(file_filesystem_filesystem, 0)\n\n/**\n * @generated from enum filesystem.EventType\n */\nexport enum EventType {\n  /**\n   * @generated from enum value: EVENT_TYPE_UNSPECIFIED = 0;\n   */\n  UNSPECIFIED = 0,\n\n  /**\n   * @generated from enum value: EVENT_TYPE_CREATE = 1;\n   */\n  CREATE = 1,\n\n  /**\n   * @generated from enum value: EVENT_TYPE_WRITE = 2;\n   */\n  WRITE = 2,\n\n  /**\n   * @generated from enum value: EVENT_TYPE_REMOVE = 3;\n   */\n  REMOVE = 3,\n\n  /**\n   * @generated from enum value: EVENT_TYPE_RENAME = 4;\n   */\n  RENAME = 4,\n\n  /**\n   * @generated from enum value: EVENT_TYPE_CHMOD = 5;\n   */\n  CHMOD = 5,\n}\n\n/**\n * Describes the enum filesystem.EventType.\n */\nexport const EventTypeSchema: GenEnum<EventType> =\n  /*@__PURE__*/\n  enumDesc(file_filesystem_filesystem, 1)\n\n/**\n * @generated from service filesystem.Filesystem\n */\nexport const Filesystem: GenService<{\n  /**\n   * @generated from rpc filesystem.Filesystem.Stat\n   */\n  stat: {\n    methodKind: 'unary'\n    input: typeof StatRequestSchema\n    output: typeof StatResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.MakeDir\n   */\n  makeDir: {\n    methodKind: 'unary'\n    input: typeof MakeDirRequestSchema\n    output: typeof MakeDirResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.Move\n   */\n  move: {\n    methodKind: 'unary'\n    input: typeof MoveRequestSchema\n    output: typeof MoveResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.ListDir\n   */\n  listDir: {\n    methodKind: 'unary'\n    input: typeof ListDirRequestSchema\n    output: typeof ListDirResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.Remove\n   */\n  remove: {\n    methodKind: 'unary'\n    input: typeof RemoveRequestSchema\n    output: typeof RemoveResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.WatchDir\n   */\n  watchDir: {\n    methodKind: 'server_streaming'\n    input: typeof WatchDirRequestSchema\n    output: typeof WatchDirResponseSchema\n  }\n  /**\n   * Non-streaming versions of WatchDir\n   *\n   * @generated from rpc filesystem.Filesystem.CreateWatcher\n   */\n  createWatcher: {\n    methodKind: 'unary'\n    input: typeof CreateWatcherRequestSchema\n    output: typeof CreateWatcherResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.GetWatcherEvents\n   */\n  getWatcherEvents: {\n    methodKind: 'unary'\n    input: typeof GetWatcherEventsRequestSchema\n    output: typeof GetWatcherEventsResponseSchema\n  }\n  /**\n   * @generated from rpc filesystem.Filesystem.RemoveWatcher\n   */\n  removeWatcher: {\n    methodKind: 'unary'\n    input: typeof RemoveWatcherRequestSchema\n    output: typeof RemoveWatcherResponseSchema\n  }\n}> = /*@__PURE__*/ serviceDesc(file_filesystem_filesystem, 0)\n","import { handleRpcError } from '../../envd/rpc'\nimport {\n  EventType,\n  WatchDirResponse,\n} from '../../envd/filesystem/filesystem_pb'\n\n/**\n * Sandbox filesystem event types.\n */\nexport enum FilesystemEventType {\n  /**\n   * Filesystem object permissions were changed.\n   */\n  CHMOD = 'chmod',\n  /**\n   * Filesystem object was created.\n   */\n  CREATE = 'create',\n  /**\n   * Filesystem object was removed.\n   */\n  REMOVE = 'remove',\n  /**\n   * Filesystem object was renamed.\n   */\n  RENAME = 'rename',\n  /**\n   * Filesystem object was written to.\n   */\n  WRITE = 'write',\n}\n\nfunction mapEventType(type: EventType) {\n  switch (type) {\n    case EventType.CHMOD:\n      return FilesystemEventType.CHMOD\n    case EventType.CREATE:\n      return FilesystemEventType.CREATE\n    case EventType.REMOVE:\n      return FilesystemEventType.REMOVE\n    case EventType.RENAME:\n      return FilesystemEventType.RENAME\n    case EventType.WRITE:\n      return FilesystemEventType.WRITE\n  }\n}\n\n/**\n * Information about a filesystem event.\n */\nexport interface FilesystemEvent {\n  /**\n   * Relative path to the filesystem object.\n   */\n  name: string\n  /**\n   * Filesystem operation event type.\n   */\n  type: FilesystemEventType\n}\n\n/**\n * Handle for watching a directory in the sandbox filesystem.\n *\n * Use {@link WatchHandle.stop} to stop watching the directory.\n */\nexport class WatchHandle {\n  constructor(\n    private readonly handleStop: () => void,\n    private readonly events: AsyncIterable<WatchDirResponse>,\n    private readonly onEvent?: (event: FilesystemEvent) => void | Promise<void>,\n    private readonly onExit?: (err?: Error) => void | Promise<void>\n  ) {\n    this.handleEvents()\n  }\n\n  /**\n   * Stop watching the directory.\n   */\n  async stop() {\n    this.handleStop()\n  }\n\n  private async *iterateEvents() {\n    try {\n      for await (const event of this.events) {\n        switch (event.event.case) {\n          case 'filesystem':\n            yield event.event\n            break\n        }\n      }\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  private async handleEvents() {\n    try {\n      for await (const event of this.iterateEvents()) {\n        const eventType = mapEventType(event.value.type)\n        if (eventType === undefined) {\n          continue\n        }\n\n        this.onEvent?.({\n          name: event.value.name,\n          type: eventType,\n        })\n      }\n      this.onExit?.()\n    } catch (err) {\n      this.onExit?.(err as Error)\n    }\n  }\n}\n","import { handleRpcError } from '../../envd/rpc'\nimport { SandboxError } from '../../errors'\nimport { ConnectResponse, StartResponse } from '../../envd/process/process_pb'\n\ndeclare const __brand: unique symbol\ntype Brand<B> = { [__brand]: B }\nexport type Branded<T, B> = T & Brand<B>\n\nexport type Stdout = Branded<string, 'stdout'>\nexport type Stderr = Branded<string, 'stderr'>\nexport type PtyOutput = Branded<Uint8Array, 'pty'>\n\n/**\n * Command execution result.\n */\nexport interface CommandResult {\n  /**\n   * Command execution exit code.\n   * `0` if the command finished successfully.\n   */\n  exitCode: number\n  /**\n   * Error message from command execution if it failed.\n   */\n  error?: string\n  /**\n   * Command stdout output.\n   */\n  stdout: string\n  /**\n   * Command stderr output.\n   */\n  stderr: string\n}\n\n/**\n * Error thrown when a command exits with a non-zero exit code.\n */\nexport class CommandExitError extends SandboxError implements CommandResult {\n  constructor(private readonly result: CommandResult) {\n    super(result.error)\n    this.name = 'CommandExitError'\n  }\n\n  /**\n   * Command execution exit code.\n   * `0` if the command finished successfully.\n   */\n  get exitCode() {\n    return this.result.exitCode\n  }\n\n  /**\n   * Error message from command execution.\n   */\n  get error() {\n    return this.result.error\n  }\n\n  /**\n   * Command execution stdout output.\n   */\n  get stdout() {\n    return this.result.stdout\n  }\n\n  /**\n   * Command execution stderr output.\n   */\n  get stderr() {\n    return this.result.stderr\n  }\n}\n\n/**\n * Command execution handle.\n *\n * It provides methods for waiting for the command to finish, retrieving stdout/stderr, and killing the command.\n *\n * @property {number} pid process ID of the command.\n */\nexport class CommandHandle\n  implements\n    Omit<CommandResult, 'exitCode' | 'error'>,\n    Partial<Pick<CommandResult, 'exitCode' | 'error'>>\n{\n  private _stdout = ''\n  private _stderr = ''\n\n  private result?: CommandResult\n  private iterationError?: Error\n\n  private readonly _wait: Promise<void>\n\n  /**\n   * @hidden\n   * @internal\n   * @access protected\n   */\n  constructor(\n    readonly pid: number,\n    private readonly handleDisconnect: () => void,\n    private readonly handleKill: () => Promise<boolean>,\n    private readonly events: AsyncIterable<ConnectResponse | StartResponse>,\n    private readonly onStdout?: (stdout: string) => void | Promise<void>,\n    private readonly onStderr?: (stderr: string) => void | Promise<void>,\n    private readonly onPty?: (pty: Uint8Array) => void | Promise<void>\n  ) {\n    this._wait = this.handleEvents()\n  }\n\n  /**\n   * Command execution exit code.\n   * `0` if the command finished successfully.\n   *\n   * It is `undefined` if the command is still running.\n   */\n  get exitCode() {\n    return this.result?.exitCode\n  }\n\n  /**\n   * Error message from command execution.\n   */\n  get error() {\n    return this.result?.error\n  }\n\n  /**\n   * Command execution stderr output.\n   */\n  get stderr() {\n    return this._stderr\n  }\n\n  /**\n   * Command execution stdout output.\n   */\n  get stdout() {\n    return this._stdout\n  }\n\n  /**\n   * Wait for the command to finish and return the result.\n   * If the command exits with a non-zero exit code, it throws a `CommandExitError`.\n   *\n   * @returns `CommandResult` result of command execution.\n   */\n  async wait() {\n    await this._wait\n\n    if (this.iterationError) {\n      throw this.iterationError\n    }\n\n    if (!this.result) {\n      throw new SandboxError('Process exited without a result')\n    }\n\n    if (this.result.exitCode !== 0) {\n      throw new CommandExitError(this.result)\n    }\n\n    return this.result\n  }\n\n  /**\n   * Disconnect from the command.\n   *\n   * The command is not killed, but SDK stops receiving events from the command.\n   * You can reconnect to the command using {@link Commands.connect}.\n   */\n  async disconnect() {\n    this.handleDisconnect()\n  }\n\n  /**\n   * Kill the command.\n   * It uses `SIGKILL` signal to kill the command.\n   *\n   * @returns `true` if the command was killed successfully, `false` if the command was not found.\n   */\n  async kill() {\n    return await this.handleKill()\n  }\n\n  private async *iterateEvents(): AsyncGenerator<\n    [Stdout, null, null] | [null, Stderr, null] | [null, null, PtyOutput]\n  > {\n    for await (const event of this.events) {\n      const e = event?.event?.event\n      let out: string | undefined\n\n      switch (e?.case) {\n        case 'data':\n          switch (e.value.output.case) {\n            case 'stdout':\n              out = new TextDecoder().decode(e.value.output.value)\n              this._stdout += out\n              yield [out as Stdout, null, null]\n              break\n            case 'stderr':\n              out = new TextDecoder().decode(e.value.output.value)\n              this._stderr += out\n              yield [null, out as Stderr, null]\n              break\n            case 'pty':\n              yield [null, null, e.value.output.value as PtyOutput]\n              break\n          }\n          break\n        case 'end':\n          this.result = {\n            exitCode: e.value.exitCode,\n            error: e.value.error,\n            stdout: this.stdout,\n            stderr: this.stderr,\n          }\n          break\n      }\n      // TODO: Handle empty events like in python SDK\n    }\n  }\n\n  private async handleEvents() {\n    try {\n      for await (const [stdout, stderr, pty] of this.iterateEvents()) {\n        if (stdout !== null) {\n          this.onStdout?.(stdout)\n        } else if (stderr !== null) {\n          this.onStderr?.(stderr)\n        } else if (pty) {\n          this.onPty?.(pty)\n        }\n      }\n    } catch (e) {\n      this.iterationError = handleRpcError(e)\n    }\n  }\n}\n","import { createConnectTransport } from '@connectrpc/connect-web'\n\nimport {\n  ConnectionConfig,\n  ConnectionOpts,\n  DEFAULT_SANDBOX_TIMEOUT_MS,\n  defaultUsername,\n  Username,\n} from '../connectionConfig'\nimport { EnvdApiClient, handleEnvdApiError } from '../envd/api'\nimport { createRpcLogger } from '../logs'\nimport { Commands, Pty } from './commands'\nimport { Filesystem } from './filesystem'\nimport {\n  SandboxOpts,\n  SandboxConnectOpts,\n  SandboxMetricsOpts,\n  SandboxApi,\n  SandboxListOpts,\n  SandboxPaginator,\n  SandboxBetaCreateOpts,\n} from './sandboxApi'\nimport { getSignature } from './signature'\nimport { compareVersions } from 'compare-versions'\nimport { SandboxError } from '../errors'\nimport { ENVD_DEBUG_FALLBACK, ENVD_DEFAULT_USER } from '../envd/versions'\n\n/**\n * Options for sandbox upload/download URL generation.\n */\nexport interface SandboxUrlOpts {\n  /**\n   * Use signature expiration for the URL.\n   * Optional parameter to set the expiration time for the signature in seconds.\n   */\n  useSignatureExpiration?: number\n\n  /**\n   * User that will be used to access the file.\n   */\n  user?: Username\n}\n\n/**\n * E2B cloud sandbox is a secure and isolated cloud environment.\n *\n * The sandbox allows you to:\n * - Access Linux OS\n * - Create, list, and delete files and directories\n * - Run commands\n * - Run isolated code\n * - Access the internet\n *\n * Check docs [here](https://e2b.dev/docs).\n *\n * Use {@link Sandbox.create} to create a new sandbox.\n *\n * @example\n * ```ts\n * import { Sandbox } from 'e2b'\n *\n * const sandbox = await Sandbox.create()\n * ```\n */\nexport class Sandbox extends SandboxApi {\n  protected static readonly defaultTemplate: string = 'base'\n  protected static readonly defaultMcpTemplate: string = 'mcp-gateway'\n  protected static readonly defaultSandboxTimeoutMs = DEFAULT_SANDBOX_TIMEOUT_MS\n\n  /**\n   * Module for interacting with the sandbox filesystem\n   */\n  readonly files: Filesystem\n  /**\n   * Module for running commands in the sandbox\n   */\n  readonly commands: Commands\n  /**\n   * Module for interacting with the sandbox pseudo-terminals\n   */\n  readonly pty: Pty\n\n  /**\n   * Unique identifier of the sandbox.\n   */\n  readonly sandboxId: string\n\n  /**\n   * Domain where the sandbox is hosted.\n   */\n  readonly sandboxDomain: string\n\n  protected readonly envdPort = 49983\n  protected readonly mcpPort = 50005\n\n  protected readonly connectionConfig: ConnectionConfig\n  protected readonly envdAccessToken?: string\n  private readonly envdApiUrl: string\n  private readonly envdApi: EnvdApiClient\n  private mcpToken?: string\n\n  /**\n   * Use {@link Sandbox.create} to create a new Sandbox instead.\n   *\n   * @hidden\n   * @hide\n   * @internal\n   * @access protected\n   */\n  constructor(\n    opts: SandboxConnectOpts & {\n      sandboxId: string\n      sandboxDomain?: string\n      envdVersion: string\n      envdAccessToken?: string\n    }\n  ) {\n    super()\n\n    this.connectionConfig = new ConnectionConfig(opts)\n\n    this.sandboxId = opts.sandboxId\n    this.sandboxDomain = opts.sandboxDomain ?? this.connectionConfig.domain\n\n    this.envdAccessToken = opts.envdAccessToken\n    this.envdApiUrl = `${\n      this.connectionConfig.debug ? 'http' : 'https'\n    }://${this.getHost(this.envdPort)}`\n\n    const rpcTransport = createConnectTransport({\n      baseUrl: this.envdApiUrl,\n      useBinaryFormat: false,\n      interceptors: opts?.logger ? [createRpcLogger(opts.logger)] : undefined,\n      fetch: (url, options) => {\n        // Patch fetch to always use redirect: \"follow\"\n        // connect-web doesn't allow to configure redirect option - https://github.com/connectrpc/connect-es/pull/1082\n        // connect-web package uses redirect: \"error\" which is not supported in edge runtimes\n        // E2B endpoints should be safe to use with redirect: \"follow\" https://github.com/e2b-dev/E2B/issues/531#issuecomment-2779492867\n\n        const headers = new Headers(this.connectionConfig.headers)\n        new Headers(options?.headers).forEach((value, key) =>\n          headers.append(key, value)\n        )\n\n        if (this.envdAccessToken) {\n          headers.append('X-Access-Token', this.envdAccessToken)\n        }\n\n        options = {\n          ...(options ?? {}),\n          headers: headers,\n          redirect: 'follow',\n        }\n\n        return fetch(url, options)\n      },\n    })\n\n    this.envdApi = new EnvdApiClient(\n      {\n        apiUrl: this.envdApiUrl,\n        logger: opts?.logger,\n        accessToken: this.envdAccessToken,\n        headers: this.envdAccessToken\n          ? { 'X-Access-Token': this.envdAccessToken }\n          : {},\n      },\n      {\n        version: opts.envdVersion,\n      }\n    )\n    this.files = new Filesystem(\n      rpcTransport,\n      this.envdApi,\n      this.connectionConfig\n    )\n    this.commands = new Commands(rpcTransport, this.connectionConfig, {\n      version: opts.envdVersion,\n    })\n    this.pty = new Pty(rpcTransport, this.connectionConfig, {\n      version: opts.envdVersion,\n    })\n  }\n\n  /**\n   * List all sandboxes.\n   *\n   * @param opts connection options.\n   *\n   * @returns paginator for listing sandboxes.\n   */\n  static list(opts?: SandboxListOpts): SandboxPaginator {\n    return new SandboxPaginator(opts)\n  }\n\n  /**\n   * Create a new sandbox from the default `base` sandbox template.\n   *\n   * @param opts connection options.\n   *\n   * @returns sandbox instance for the new sandbox.\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.create()\n   * ```\n   * @constructs {@link Sandbox}\n   */\n  static async create<S extends typeof Sandbox>(\n    this: S,\n    opts?: SandboxOpts\n  ): Promise<InstanceType<S>>\n\n  /**\n   * Create a new sandbox from the specified sandbox template.\n   *\n   * @param template sandbox template name or ID.\n   * @param opts connection options.\n   *\n   * @returns sandbox instance for the new sandbox.\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.create('<template-name-or-id>')\n   * ```\n   * @constructs {@link Sandbox}\n   */\n  static async create<S extends typeof Sandbox>(\n    this: S,\n    template: string,\n    opts?: SandboxOpts\n  ): Promise<InstanceType<S>>\n  static async create<S extends typeof Sandbox>(\n    this: S,\n    templateOrOpts?: SandboxOpts | string,\n    opts?: SandboxOpts\n  ): Promise<InstanceType<S>> {\n    const { template, sandboxOpts } =\n      typeof templateOrOpts === 'string'\n        ? {\n            template: templateOrOpts,\n            sandboxOpts: opts,\n          }\n        : {\n            template: templateOrOpts?.mcp\n              ? this.defaultMcpTemplate\n              : this.defaultTemplate,\n            sandboxOpts: templateOrOpts,\n          }\n\n    const config = new ConnectionConfig(sandboxOpts)\n    if (config.debug) {\n      return new this({\n        sandboxId: 'debug_sandbox_id',\n        envdVersion: ENVD_DEBUG_FALLBACK,\n        ...config,\n      }) as InstanceType<S>\n    }\n\n    const sandboxInfo = await SandboxApi.createSandbox(\n      template,\n      sandboxOpts?.timeoutMs ?? this.defaultSandboxTimeoutMs,\n      sandboxOpts\n    )\n\n    const sandbox = new this({ ...sandboxInfo, ...config }) as InstanceType<S>\n\n    if (sandboxOpts?.mcp) {\n      sandbox.mcpToken = crypto.randomUUID()\n      const res = await sandbox.commands.run(\n        `mcp-gateway --config '${JSON.stringify(sandboxOpts?.mcp)}'`,\n        {\n          user: 'root',\n          envs: {\n            GATEWAY_ACCESS_TOKEN: sandbox.mcpToken ?? '',\n          },\n        }\n      )\n      if (res.exitCode !== 0) {\n        throw new Error(`Failed to start MCP gateway: ${res.stderr}`)\n      }\n    }\n\n    return sandbox\n  }\n\n  /**\n   * @beta This feature is in beta and may change in the future.\n   *\n   * Create a new sandbox from the default `base` sandbox template.\n   *\n   * @param opts connection options.\n   *\n   * @returns sandbox instance for the new sandbox.\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.betaCreate()\n   * ```\n   * @constructs {@link Sandbox}\n   */\n  static async betaCreate<S extends typeof Sandbox>(\n    this: S,\n    opts?: SandboxBetaCreateOpts\n  ): Promise<InstanceType<S>>\n\n  /**\n   * @beta This feature is in beta and may change in the future.\n   *\n   * Create a new sandbox from the specified sandbox template.\n   *\n   * @param template sandbox template name or ID.\n   * @param opts connection options.\n   *\n   * @returns sandbox instance for the new sandbox.\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.betaCreate('<template-name-or-id>')\n   * ```\n   * @constructs {@link Sandbox}\n   */\n  static async betaCreate<S extends typeof Sandbox>(\n    this: S,\n    template: string,\n    opts?: SandboxBetaCreateOpts\n  ): Promise<InstanceType<S>>\n  static async betaCreate<S extends typeof Sandbox>(\n    this: S,\n    templateOrOpts?: SandboxBetaCreateOpts | string,\n    opts?: SandboxBetaCreateOpts\n  ): Promise<InstanceType<S>> {\n    const { template, sandboxOpts } =\n      typeof templateOrOpts === 'string'\n        ? {\n            template: templateOrOpts,\n            sandboxOpts: opts,\n          }\n        : {\n            template: templateOrOpts?.mcp\n              ? this.defaultMcpTemplate\n              : this.defaultTemplate,\n            sandboxOpts: templateOrOpts,\n          }\n\n    const config = new ConnectionConfig(sandboxOpts)\n    if (config.debug) {\n      return new this({\n        sandboxId: 'debug_sandbox_id',\n        envdVersion: ENVD_DEBUG_FALLBACK,\n        ...config,\n      }) as InstanceType<S>\n    }\n\n    const sandboxInfo = await SandboxApi.createSandbox(\n      template,\n      sandboxOpts?.timeoutMs ?? this.defaultSandboxTimeoutMs,\n      sandboxOpts\n    )\n\n    const sandbox = new this({ ...sandboxInfo, ...config }) as InstanceType<S>\n\n    if (sandboxOpts?.mcp) {\n      sandbox.mcpToken = crypto.randomUUID()\n      const res = await sandbox.commands.run(\n        `mcp-gateway --config '${JSON.stringify(sandboxOpts?.mcp)}'`,\n        {\n          user: 'root',\n          envs: {\n            GATEWAY_ACCESS_TOKEN: sandbox.mcpToken ?? '',\n          },\n        }\n      )\n      if (res.exitCode !== 0) {\n        throw new Error(`Failed to start MCP gateway: ${res.stderr}`)\n      }\n    }\n\n    return sandbox\n  }\n\n  /**\n   * Connect to a sandbox. If the sandbox is paused, it will be automatically resumed.\n   * Sandbox must be either running or be paused.\n   *\n   * With sandbox ID you can connect to the same sandbox from different places or environments (serverless functions, etc).\n   *\n   * @param sandboxId sandbox ID.\n   * @param opts connection options.\n   *\n   * @returns A running sandbox instance\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.create()\n   * const sandboxId = sandbox.sandboxId\n   *\n   * // Connect to the same sandbox.\n   * const sameSandbox = await Sandbox.connect(sandboxId)\n   * ```\n   */\n  static async connect<S extends typeof Sandbox>(\n    this: S,\n    sandboxId: string,\n    opts?: SandboxConnectOpts\n  ): Promise<InstanceType<S>> {\n    try {\n      await SandboxApi.setTimeout(\n        sandboxId,\n        opts?.timeoutMs || DEFAULT_SANDBOX_TIMEOUT_MS,\n        opts\n      )\n    } catch (e) {\n      if (e instanceof SandboxError) {\n        await SandboxApi.resumeSandbox(sandboxId, opts)\n      } else {\n        throw e\n      }\n    }\n\n    const info = await SandboxApi.getFullInfo(sandboxId, opts)\n\n    const config = new ConnectionConfig(opts)\n\n    return new this({\n      sandboxId,\n      sandboxDomain: info.sandboxDomain,\n      envdAccessToken: info.envdAccessToken,\n      envdVersion: info.envdVersion,\n      ...config,\n    }) as InstanceType<S>\n  }\n\n  /**\n   * Connect to a sandbox. If the sandbox is paused, it will be automatically resumed.\n   * Sandbox must be either running or be paused.\n   *\n   * With sandbox ID you can connect to the same sandbox from different places or environments (serverless functions, etc).\n   *\n   * @param opts connection options.\n   *\n   * @returns A running sandbox instance\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.create()\n   * await sandbox.betaPause()\n   *\n   * // Connect to the same sandbox.\n   * const sameSandbox = await sandbox.connect()\n   * ```\n   */\n  async connect(opts?: SandboxBetaCreateOpts): Promise<this> {\n    try {\n      await SandboxApi.setTimeout(\n        this.sandboxId,\n        opts?.timeoutMs || DEFAULT_SANDBOX_TIMEOUT_MS,\n        opts\n      )\n    } catch (e) {\n      await SandboxApi.resumeSandbox(this.sandboxId, opts)\n    }\n\n    return this\n  }\n\n  /**\n   * Get the host address for the specified sandbox port.\n   * You can then use this address to connect to the sandbox port from outside the sandbox via HTTP or WebSocket.\n   *\n   * @param port number of the port in the sandbox.\n   *\n   * @returns host address of the sandbox port.\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.create()\n   * // Start an HTTP server\n   * await sandbox.commands.exec('python3 -m http.server 3000')\n   * // Get the hostname of the HTTP server\n   * const serverURL = sandbox.getHost(3000)\n   * ```\n   */\n  getHost(port: number) {\n    if (this.connectionConfig.debug) {\n      return `localhost:${port}`\n    }\n\n    return `${port}-${this.sandboxId}.${this.sandboxDomain}`\n  }\n\n  /**\n   * Check if the sandbox is running.\n   *\n   * @returns `true` if the sandbox is running, `false` otherwise.\n   *\n   * @example\n   * ```ts\n   * const sandbox = await Sandbox.create()\n   * await sandbox.isRunning() // Returns true\n   *\n   * await sandbox.kill()\n   * await sandbox.isRunning() // Returns false\n   * ```\n   */\n  async isRunning(\n    opts?: Pick<ConnectionOpts, 'requestTimeoutMs'>\n  ): Promise<boolean> {\n    const signal = this.connectionConfig.getSignal(opts?.requestTimeoutMs)\n\n    const res = await this.envdApi.api.GET('/health', {\n      signal,\n    })\n\n    if (res.response.status == 502) {\n      return false\n    }\n\n    const err = await handleEnvdApiError(res)\n    if (err) {\n      throw err\n    }\n\n    return true\n  }\n\n  /**\n   * Set the timeout of the sandbox.\n   * After the timeout expires the sandbox will be automatically killed.\n   *\n   * This method can extend or reduce the sandbox timeout set when creating the sandbox or from the last call to `.setTimeout`.\n   * Maximum time a sandbox can be kept alive is 24 hours (86_400_000 milliseconds) for Pro users and 1 hour (3_600_000 milliseconds) for Hobby users.\n   *\n   * @param timeoutMs timeout in **milliseconds**.\n   * @param opts connection options.\n   */\n  async setTimeout(\n    timeoutMs: number,\n    opts?: Pick<SandboxOpts, 'requestTimeoutMs'>\n  ) {\n    if (this.connectionConfig.debug) {\n      // Skip timeout in debug mode\n      return\n    }\n\n    await SandboxApi.setTimeout(this.sandboxId, timeoutMs, {\n      ...this.connectionConfig,\n      ...opts,\n    })\n  }\n\n  /**\n   * Kill the sandbox.\n   *\n   * @param opts connection options.\n   */\n  async kill(opts?: Pick<SandboxOpts, 'requestTimeoutMs'>) {\n    if (this.connectionConfig.debug) {\n      // Skip killing in debug mode\n      return\n    }\n\n    await SandboxApi.kill(this.sandboxId, { ...this.connectionConfig, ...opts })\n  }\n\n  /**\n   * @beta This feature is in beta and may change in the future.\n   *\n   * Pause a sandbox by its ID.\n   *\n   * @param opts connection options.\n   *\n   * @returns sandbox ID that can be used to resume the sandbox.\n   */\n  async betaPause(opts?: ConnectionOpts): Promise<boolean> {\n    return await SandboxApi.betaPause(this.sandboxId, opts)\n  }\n\n  /**\n   *\n   * Get the MCP URL for the sandbox.\n   *\n   * @returns MCP URL for the sandbox.\n   */\n  getMcpUrl(): string {\n    return `https://${this.getHost(this.mcpPort)}/mcp`\n  }\n\n  /**\n   * Get the MCP token for the sandbox.\n   *\n   * @returns MCP token for the sandbox, or undefined if MCP is not enabled.\n   */\n  async getMcpToken(): Promise<string | undefined> {\n    if (!this.mcpToken) {\n      this.mcpToken = await this.files.read('/etc/mcp-gateway/.token', {\n        user: 'root',\n      })\n    }\n\n    return this.mcpToken\n  }\n\n  /**\n   * Get the URL to upload a file to the sandbox.\n   *\n   * You have to send a POST request to this URL with the file as multipart/form-data.\n   *\n   * @param path path to the file in the sandbox.\n   *\n   * @param opts download url options.\n   *\n   * @returns URL for uploading file.\n   */\n  async uploadUrl(path?: string, opts?: SandboxUrlOpts) {\n    opts = opts ?? {}\n\n    const useSignature = !!this.envdAccessToken\n\n    if (!useSignature && opts.useSignatureExpiration != undefined) {\n      throw new Error(\n        'Signature expiration can be used only when sandbox is created as secured.'\n      )\n    }\n\n    let username = opts.user\n    if (\n      username == undefined &&\n      compareVersions(this.envdApi.version, ENVD_DEFAULT_USER) < 0\n    ) {\n      username = defaultUsername\n    }\n\n    const filePath = path ?? ''\n    const fileUrl = this.fileUrl(filePath, username)\n\n    if (useSignature) {\n      const url = new URL(fileUrl)\n      const sig = await getSignature({\n        path: filePath,\n        operation: 'write',\n        user: username,\n        expirationInSeconds: opts.useSignatureExpiration,\n        envdAccessToken: this.envdAccessToken,\n      })\n\n      url.searchParams.set('signature', sig.signature)\n      if (sig.expiration) {\n        url.searchParams.set('signature_expiration', sig.expiration.toString())\n      }\n\n      return url.toString()\n    }\n\n    return fileUrl\n  }\n\n  /**\n   * Get the URL to download a file from the sandbox.\n   *\n   * @param path path to the file in the sandbox.\n   *\n   * @param opts download url options.\n   *\n   * @returns URL for downloading file.\n   */\n  async downloadUrl(path: string, opts?: SandboxUrlOpts) {\n    opts = opts ?? {}\n\n    const useSignature = !!this.envdAccessToken\n\n    if (!useSignature && opts.useSignatureExpiration != undefined) {\n      throw new Error(\n        'Signature expiration can be used only when sandbox is created as secured.'\n      )\n    }\n\n    let username = opts.user\n    if (\n      username == undefined &&\n      compareVersions(this.envdApi.version, ENVD_DEFAULT_USER) < 0\n    ) {\n      username = defaultUsername\n    }\n\n    const fileUrl = this.fileUrl(path, username)\n\n    if (useSignature) {\n      const url = new URL(fileUrl)\n      const sig = await getSignature({\n        path,\n        operation: 'read',\n        user: username,\n        expirationInSeconds: opts.useSignatureExpiration,\n        envdAccessToken: this.envdAccessToken,\n      })\n\n      url.searchParams.set('signature', sig.signature)\n      if (sig.expiration) {\n        url.searchParams.set('signature_expiration', sig.expiration.toString())\n      }\n\n      return url.toString()\n    }\n\n    return fileUrl\n  }\n\n  /**\n   * Get sandbox information like sandbox ID, template, metadata, started at/end at date.\n   *\n   * @param opts connection options.\n   *\n   * @returns information about the sandbox\n   */\n  async getInfo(opts?: Pick<SandboxOpts, 'requestTimeoutMs'>) {\n    return await SandboxApi.getInfo(this.sandboxId, {\n      ...this.connectionConfig,\n      ...opts,\n    })\n  }\n\n  /**\n   * Get the metrics of the sandbox.\n   *\n   * @param opts connection options.\n   *\n   * @returns  List of sandbox metrics containing CPU, memory and disk usage information.\n   */\n  async getMetrics(opts?: SandboxMetricsOpts) {\n    if (this.envdApi.version) {\n      if (compareVersions(this.envdApi.version, '0.1.5') < 0) {\n        throw new SandboxError(\n          'You need to update the template to use the new SDK. ' +\n            'You can do this by running `e2b template build` in the directory with the template.'\n        )\n      }\n\n      if (compareVersions(this.envdApi.version, '0.2.4') < 0) {\n        this.connectionConfig.logger?.warn?.(\n          'Disk metrics are not supported in this version of the sandbox, please rebuild the template to get disk metrics.'\n        )\n      }\n    }\n\n    return await SandboxApi.getMetrics(this.sandboxId, {\n      ...this.connectionConfig,\n      ...opts,\n    })\n  }\n\n  private fileUrl(path: string | undefined, username: string | undefined) {\n    const url = new URL('/files', this.envdApiUrl)\n\n    if (username) {\n      url.searchParams.set('username', username)\n    }\n    if (path) {\n      url.searchParams.set('path', path)\n    }\n\n    return url.toString()\n  }\n}\n","import {\n  Client,\n  Code,\n  ConnectError,\n  Transport,\n  createClient,\n} from '@connectrpc/connect'\n\nimport { compareVersions } from 'compare-versions'\nimport {\n  ConnectionConfig,\n  ConnectionOpts,\n  KEEPALIVE_PING_HEADER,\n  KEEPALIVE_PING_INTERVAL_SEC,\n  Username,\n} from '../../connectionConfig'\nimport { handleProcessStartEvent } from '../../envd/api'\nimport {\n  Process as ProcessService,\n  Signal,\n} from '../../envd/process/process_pb'\nimport { authenticationHeader, handleRpcError } from '../../envd/rpc'\nimport { ENVD_COMMANDS_STDIN } from '../../envd/versions'\nimport { SandboxError } from '../../errors'\nimport { CommandHandle, CommandResult } from './commandHandle'\nexport { Pty } from './pty'\n\n/**\n * Options for sending a command request.\n */\nexport interface CommandRequestOpts\n  extends Partial<Pick<ConnectionOpts, 'requestTimeoutMs'>> {}\n\n/**\n * Options for starting a new command.\n */\nexport interface CommandStartOpts extends CommandRequestOpts {\n  /**\n   * If true, starts command in the background and the method returns immediately.\n   * You can use {@link CommandHandle.wait} to wait for the command to finish.\n   */\n  background?: boolean\n  /**\n   * Working directory for the command.\n   *\n   * @default // home directory of the user used to start the command\n   */\n  cwd?: string\n  /**\n   * User to run the command as.\n   *\n   * @default `default Sandbox user (as specified in the template)`\n   */\n  user?: Username\n  /**\n   * Environment variables used for the command.\n   *\n   * This overrides the default environment variables from `Sandbox` constructor.\n   *\n   * @default `{}`\n   */\n  envs?: Record<string, string>\n  /**\n   * Callback for command stdout output.\n   */\n  onStdout?: (data: string) => void | Promise<void>\n  /**\n   * Callback for command stderr output.\n   */\n  onStderr?: (data: string) => void | Promise<void>\n  /**\n   * If true, command stdin is kept open and you can send data to it using {@link Commands.sendStdin} or {@link CommandHandle.sendStdin}.\n   * @default false\n   */\n  stdin?: boolean\n  /**\n   * Timeout for the command in **milliseconds**.\n   *\n   * @default 60_000 // 60 seconds\n   */\n  timeoutMs?: number\n}\n\n/**\n * Options for connecting to a command.\n */\nexport type CommandConnectOpts = Pick<\n  CommandStartOpts,\n  'onStderr' | 'onStdout' | 'timeoutMs'\n> &\n  CommandRequestOpts\n\n/**\n * Information about a command, PTY session or start command running in the sandbox as process.\n */\nexport interface ProcessInfo {\n  /**\n   * Process ID.\n   */\n  pid: number\n  /**\n   * Custom tag used for identifying special commands like start command in the custom template.\n   */\n  tag?: string\n  /**\n   * Command that was executed.\n   */\n  cmd: string\n  /**\n   * Command arguments.\n   */\n  args: string[]\n  /**\n   * Environment variables used for the command.\n   */\n  envs: Record<string, string>\n  /**\n   * Executed command working directory.\n   */\n  cwd?: string\n}\n\n/**\n * Module for starting and interacting with commands in the sandbox.\n */\nexport class Commands {\n  protected readonly rpc: Client<typeof ProcessService>\n\n  private readonly defaultProcessConnectionTimeout = 60_000 // 60 seconds\n  private readonly envdVersion: string\n\n  constructor(\n    transport: Transport,\n    private readonly connectionConfig: ConnectionConfig,\n    metadata: {\n      version: string\n    }\n  ) {\n    this.rpc = createClient(ProcessService, transport)\n    this.envdVersion = metadata.version\n  }\n\n  /**\n   * List all running commands and PTY sessions.\n   *\n   * @param opts connection options.\n   *\n   * @returns list of running commands and PTY sessions.\n   */\n  async list(opts?: CommandRequestOpts): Promise<ProcessInfo[]> {\n    try {\n      const res = await this.rpc.list(\n        {},\n        {\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      return res.processes.map((p) => ({\n        pid: p.pid,\n        ...(p.tag && { tag: p.tag }),\n        args: p.config!.args,\n        envs: p.config!.envs,\n        cmd: p.config!.cmd,\n        ...(p.config!.cwd && { cwd: p.config!.cwd }),\n      }))\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Send data to command stdin.\n   *\n   * @param pid process ID of the command. You can get the list of running commands using {@link Commands.list}.\n   * @param data data to send to the command.\n   * @param opts connection options.\n   */\n  async sendStdin(\n    pid: number,\n    data: string,\n    opts?: CommandRequestOpts\n  ): Promise<void> {\n    try {\n      await this.rpc.sendInput(\n        {\n          process: {\n            selector: {\n              case: 'pid',\n              value: pid,\n            },\n          },\n          input: {\n            input: {\n              case: 'stdin',\n              value: new TextEncoder().encode(data),\n            },\n          },\n        },\n        {\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Kill a running command specified by its process ID.\n   * It uses `SIGKILL` signal to kill the command.\n   *\n   * @param pid process ID of the command. You can get the list of running commands using {@link Commands.list}.\n   * @param opts connection options.\n   *\n   * @returns `true` if the command was killed, `false` if the command was not found.\n   */\n  async kill(pid: number, opts?: CommandRequestOpts): Promise<boolean> {\n    try {\n      await this.rpc.sendSignal(\n        {\n          process: {\n            selector: {\n              case: 'pid',\n              value: pid,\n            },\n          },\n          signal: Signal.SIGKILL,\n        },\n        {\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      return true\n    } catch (err) {\n      if (err instanceof ConnectError) {\n        if (err.code === Code.NotFound) {\n          return false\n        }\n      }\n\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Connect to a running command.\n   * You can use {@link CommandHandle.wait} to wait for the command to finish and get execution results.\n   *\n   * @param pid process ID of the command to connect to. You can get the list of running commands using {@link Commands.list}.\n   * @param opts connection options.\n   *\n   * @returns `CommandHandle` handle to interact with the running command.\n   */\n  async connect(\n    pid: number,\n    opts?: CommandConnectOpts\n  ): Promise<CommandHandle> {\n    const requestTimeoutMs =\n      opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n    const controller = new AbortController()\n\n    const reqTimeout = requestTimeoutMs\n      ? setTimeout(() => {\n          controller.abort()\n        }, requestTimeoutMs)\n      : undefined\n\n    const events = this.rpc.connect(\n      {\n        process: {\n          selector: {\n            case: 'pid',\n            value: pid,\n          },\n        },\n      },\n      {\n        signal: controller.signal,\n        headers: {\n          [KEEPALIVE_PING_HEADER]: KEEPALIVE_PING_INTERVAL_SEC.toString(),\n        },\n        timeoutMs: opts?.timeoutMs ?? this.defaultProcessConnectionTimeout,\n      }\n    )\n\n    try {\n      const pid = await handleProcessStartEvent(events)\n\n      clearTimeout(reqTimeout)\n\n      return new CommandHandle(\n        pid,\n        () => controller.abort(),\n        () => this.kill(pid),\n        events,\n        opts?.onStdout,\n        opts?.onStderr,\n        undefined\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Start a new command and wait until it finishes executing.\n   *\n   * @param cmd command to execute.\n   * @param opts options for starting the command.\n   *\n   * @returns `CommandResult` result of the command execution.\n   */\n  async run(\n    cmd: string,\n    opts?: CommandStartOpts & { background?: false }\n  ): Promise<CommandResult>\n\n  /**\n   * Start a new command in the background.\n   * You can use {@link CommandHandle.wait} to wait for the command to finish and get its result.\n   *\n   * @param cmd command to execute.\n   * @param opts options for starting the command\n   *\n   * @returns `CommandHandle` handle to interact with the running command.\n   */\n  async run(\n    cmd: string,\n    opts: CommandStartOpts & { background: true }\n  ): Promise<CommandHandle>\n\n  // NOTE - The following overload seems redundant, but it's required to make the type inference work correctly.\n\n  /**\n   * Start a new command.\n   *\n   * @param cmd command to execute.\n   * @param opts options for starting the command.\n   *   - `opts.background: true` - runs in background, returns `CommandHandle`\n   *   - `opts.background: false | undefined` - waits for completion, returns `CommandResult`\n   *\n   * @returns Either a `CommandHandle` or a `CommandResult` (depending on `opts.background`).\n   */\n  async run(\n    cmd: string,\n    opts?: CommandStartOpts & { background?: boolean }\n  ): Promise<CommandHandle | CommandResult>\n  async run(\n    cmd: string,\n    opts?: CommandStartOpts & { background?: boolean }\n  ): Promise<CommandHandle | CommandResult> {\n    const proc = await this.start(cmd, opts)\n\n    return opts?.background ? proc : proc.wait()\n  }\n\n  private async start(\n    cmd: string,\n    opts?: CommandStartOpts\n  ): Promise<CommandHandle> {\n    const requestTimeoutMs =\n      opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n    const controller = new AbortController()\n\n    const reqTimeout = requestTimeoutMs\n      ? setTimeout(() => {\n          controller.abort()\n        }, requestTimeoutMs)\n      : undefined\n\n    if (\n      opts?.stdin === false &&\n      compareVersions(this.envdVersion, ENVD_COMMANDS_STDIN) < 0\n    ) {\n      throw new SandboxError(\n        `Sandbox envd version ${this.envdVersion} can't specify stdin, it's always turned on. Please rebuild your template if you need this feature.`\n      )\n    }\n\n    const events = this.rpc.start(\n      {\n        process: {\n          cmd: '/bin/bash',\n          cwd: opts?.cwd,\n          envs: opts?.envs,\n          args: ['-l', '-c', cmd],\n        },\n        stdin: opts?.stdin || false,\n      },\n      {\n        headers: {\n          ...authenticationHeader(this.envdVersion, opts?.user),\n          [KEEPALIVE_PING_HEADER]: KEEPALIVE_PING_INTERVAL_SEC.toString(),\n        },\n        signal: controller.signal,\n        timeoutMs: opts?.timeoutMs ?? this.defaultProcessConnectionTimeout,\n      }\n    )\n\n    try {\n      const pid = await handleProcessStartEvent(events)\n\n      clearTimeout(reqTimeout)\n\n      return new CommandHandle(\n        pid,\n        () => controller.abort(),\n        () => this.kill(pid),\n        events,\n        opts?.onStdout,\n        opts?.onStderr,\n        undefined\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n}\n","// @generated by protoc-gen-es v2.6.2 with parameter \"target=ts\"\n// @generated from file process/process.proto (package process, syntax proto3)\n/* eslint-disable */\n\nimport type {\n  GenEnum,\n  GenFile,\n  GenMessage,\n  GenService,\n} from '@bufbuild/protobuf/codegenv2'\nimport {\n  enumDesc,\n  fileDesc,\n  messageDesc,\n  serviceDesc,\n} from '@bufbuild/protobuf/codegenv2'\nimport type { Message } from '@bufbuild/protobuf'\n\n/**\n * Describes the file process/process.proto.\n */\nexport const file_process_process: GenFile =\n  /*@__PURE__*/\n  fileDesc(\n    'ChVwcm9jZXNzL3Byb2Nlc3MucHJvdG8SB3Byb2Nlc3MiSgoDUFRZEh8KBHNpemUYASABKAsyES5wcm9jZXNzLlBUWS5TaXplGiIKBFNpemUSDAoEY29scxgBIAEoDRIMCgRyb3dzGAIgASgNIqEBCg1Qcm9jZXNzQ29uZmlnEgsKA2NtZBgBIAEoCRIMCgRhcmdzGAIgAygJEi4KBGVudnMYAyADKAsyIC5wcm9jZXNzLlByb2Nlc3NDb25maWcuRW52c0VudHJ5EhAKA2N3ZBgEIAEoCUgAiAEBGisKCUVudnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBQgYKBF9jd2QiDQoLTGlzdFJlcXVlc3QiXAoLUHJvY2Vzc0luZm8SJgoGY29uZmlnGAEgASgLMhYucHJvY2Vzcy5Qcm9jZXNzQ29uZmlnEgsKA3BpZBgCIAEoDRIQCgN0YWcYAyABKAlIAIgBAUIGCgRfdGFnIjcKDExpc3RSZXNwb25zZRInCglwcm9jZXNzZXMYASADKAsyFC5wcm9jZXNzLlByb2Nlc3NJbmZvIpcBCgxTdGFydFJlcXVlc3QSJwoHcHJvY2VzcxgBIAEoCzIWLnByb2Nlc3MuUHJvY2Vzc0NvbmZpZxIeCgNwdHkYAiABKAsyDC5wcm9jZXNzLlBUWUgAiAEBEhAKA3RhZxgDIAEoCUgBiAEBEhIKBXN0ZGluGAQgASgISAKIAQFCBgoEX3B0eUIGCgRfdGFnQggKBl9zdGRpbiJiCg1VcGRhdGVSZXF1ZXN0EikKB3Byb2Nlc3MYASABKAsyGC5wcm9jZXNzLlByb2Nlc3NTZWxlY3RvchIeCgNwdHkYAiABKAsyDC5wcm9jZXNzLlBUWUgAiAEBQgYKBF9wdHkiEAoOVXBkYXRlUmVzcG9uc2UirwMKDFByb2Nlc3NFdmVudBIxCgVzdGFydBgBIAEoCzIgLnByb2Nlc3MuUHJvY2Vzc0V2ZW50LlN0YXJ0RXZlbnRIABIvCgRkYXRhGAIgASgLMh8ucHJvY2Vzcy5Qcm9jZXNzRXZlbnQuRGF0YUV2ZW50SAASLQoDZW5kGAMgASgLMh4ucHJvY2Vzcy5Qcm9jZXNzRXZlbnQuRW5kRXZlbnRIABI0CglrZWVwYWxpdmUYBCABKAsyHy5wcm9jZXNzLlByb2Nlc3NFdmVudC5LZWVwQWxpdmVIABoZCgpTdGFydEV2ZW50EgsKA3BpZBgBIAEoDRpICglEYXRhRXZlbnQSEAoGc3Rkb3V0GAEgASgMSAASEAoGc3RkZXJyGAIgASgMSAASDQoDcHR5GAMgASgMSABCCAoGb3V0cHV0GlsKCEVuZEV2ZW50EhEKCWV4aXRfY29kZRgBIAEoERIOCgZleGl0ZWQYAiABKAgSDgoGc3RhdHVzGAMgASgJEhIKBWVycm9yGAQgASgJSACIAQFCCAoGX2Vycm9yGgsKCUtlZXBBbGl2ZUIHCgVldmVudCI1Cg1TdGFydFJlc3BvbnNlEiQKBWV2ZW50GAEgASgLMhUucHJvY2Vzcy5Qcm9jZXNzRXZlbnQiNwoPQ29ubmVjdFJlc3BvbnNlEiQKBWV2ZW50GAEgASgLMhUucHJvY2Vzcy5Qcm9jZXNzRXZlbnQiYwoQU2VuZElucHV0UmVxdWVzdBIpCgdwcm9jZXNzGAEgASgLMhgucHJvY2Vzcy5Qcm9jZXNzU2VsZWN0b3ISJAoFaW5wdXQYAiABKAsyFS5wcm9jZXNzLlByb2Nlc3NJbnB1dCITChFTZW5kSW5wdXRSZXNwb25zZSI3CgxQcm9jZXNzSW5wdXQSDwoFc3RkaW4YASABKAxIABINCgNwdHkYAiABKAxIAEIHCgVpbnB1dCLCAgoSU3RyZWFtSW5wdXRSZXF1ZXN0EjcKBXN0YXJ0GAEgASgLMiYucHJvY2Vzcy5TdHJlYW1JbnB1dFJlcXVlc3QuU3RhcnRFdmVudEgAEjUKBGRhdGEYAiABKAsyJS5wcm9jZXNzLlN0cmVhbUlucHV0UmVxdWVzdC5EYXRhRXZlbnRIABI6CglrZWVwYWxpdmUYAyABKAsyJS5wcm9jZXNzLlN0cmVhbUlucHV0UmVxdWVzdC5LZWVwQWxpdmVIABo3CgpTdGFydEV2ZW50EikKB3Byb2Nlc3MYASABKAsyGC5wcm9jZXNzLlByb2Nlc3NTZWxlY3RvchoxCglEYXRhRXZlbnQSJAoFaW5wdXQYAiABKAsyFS5wcm9jZXNzLlByb2Nlc3NJbnB1dBoLCglLZWVwQWxpdmVCBwoFZXZlbnQiFQoTU3RyZWFtSW5wdXRSZXNwb25zZSJfChFTZW5kU2lnbmFsUmVxdWVzdBIpCgdwcm9jZXNzGAEgASgLMhgucHJvY2Vzcy5Qcm9jZXNzU2VsZWN0b3ISHwoGc2lnbmFsGAIgASgOMg8ucHJvY2Vzcy5TaWduYWwiFAoSU2VuZFNpZ25hbFJlc3BvbnNlIjsKDkNvbm5lY3RSZXF1ZXN0EikKB3Byb2Nlc3MYASABKAsyGC5wcm9jZXNzLlByb2Nlc3NTZWxlY3RvciI7Cg9Qcm9jZXNzU2VsZWN0b3ISDQoDcGlkGAEgASgNSAASDQoDdGFnGAIgASgJSABCCgoIc2VsZWN0b3IqSAoGU2lnbmFsEhYKElNJR05BTF9VTlNQRUNJRklFRBAAEhIKDlNJR05BTF9TSUdURVJNEA8SEgoOU0lHTkFMX1NJR0tJTEwQCTLKAwoHUHJvY2VzcxIzCgRMaXN0EhQucHJvY2Vzcy5MaXN0UmVxdWVzdBoVLnByb2Nlc3MuTGlzdFJlc3BvbnNlEj4KB0Nvbm5lY3QSFy5wcm9jZXNzLkNvbm5lY3RSZXF1ZXN0GhgucHJvY2Vzcy5Db25uZWN0UmVzcG9uc2UwARI4CgVTdGFydBIVLnByb2Nlc3MuU3RhcnRSZXF1ZXN0GhYucHJvY2Vzcy5TdGFydFJlc3BvbnNlMAESOQoGVXBkYXRlEhYucHJvY2Vzcy5VcGRhdGVSZXF1ZXN0GhcucHJvY2Vzcy5VcGRhdGVSZXNwb25zZRJKCgtTdHJlYW1JbnB1dBIbLnByb2Nlc3MuU3RyZWFtSW5wdXRSZXF1ZXN0GhwucHJvY2Vzcy5TdHJlYW1JbnB1dFJlc3BvbnNlKAESQgoJU2VuZElucHV0EhkucHJvY2Vzcy5TZW5kSW5wdXRSZXF1ZXN0GhoucHJvY2Vzcy5TZW5kSW5wdXRSZXNwb25zZRJFCgpTZW5kU2lnbmFsEhoucHJvY2Vzcy5TZW5kU2lnbmFsUmVxdWVzdBobLnByb2Nlc3MuU2VuZFNpZ25hbFJlc3BvbnNlQlcKC2NvbS5wcm9jZXNzQgxQcm9jZXNzUHJvdG9QAaICA1BYWKoCB1Byb2Nlc3PKAgdQcm9jZXNz4gITUHJvY2Vzc1xHUEJNZXRhZGF0YeoCB1Byb2Nlc3NiBnByb3RvMw'\n  )\n\n/**\n * @generated from message process.PTY\n */\nexport type PTY = Message<'process.PTY'> & {\n  /**\n   * @generated from field: process.PTY.Size size = 1;\n   */\n  size?: PTY_Size\n}\n\n/**\n * Describes the message process.PTY.\n * Use `create(PTYSchema)` to create a new message.\n */\nexport const PTYSchema: GenMessage<PTY> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 0)\n\n/**\n * @generated from message process.PTY.Size\n */\nexport type PTY_Size = Message<'process.PTY.Size'> & {\n  /**\n   * @generated from field: uint32 cols = 1;\n   */\n  cols: number\n\n  /**\n   * @generated from field: uint32 rows = 2;\n   */\n  rows: number\n}\n\n/**\n * Describes the message process.PTY.Size.\n * Use `create(PTY_SizeSchema)` to create a new message.\n */\nexport const PTY_SizeSchema: GenMessage<PTY_Size> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 0, 0)\n\n/**\n * @generated from message process.ProcessConfig\n */\nexport type ProcessConfig = Message<'process.ProcessConfig'> & {\n  /**\n   * @generated from field: string cmd = 1;\n   */\n  cmd: string\n\n  /**\n   * @generated from field: repeated string args = 2;\n   */\n  args: string[]\n\n  /**\n   * @generated from field: map<string, string> envs = 3;\n   */\n  envs: { [key: string]: string }\n\n  /**\n   * @generated from field: optional string cwd = 4;\n   */\n  cwd?: string\n}\n\n/**\n * Describes the message process.ProcessConfig.\n * Use `create(ProcessConfigSchema)` to create a new message.\n */\nexport const ProcessConfigSchema: GenMessage<ProcessConfig> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 1)\n\n/**\n * @generated from message process.ListRequest\n */\nexport type ListRequest = Message<'process.ListRequest'> & {}\n\n/**\n * Describes the message process.ListRequest.\n * Use `create(ListRequestSchema)` to create a new message.\n */\nexport const ListRequestSchema: GenMessage<ListRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 2)\n\n/**\n * @generated from message process.ProcessInfo\n */\nexport type ProcessInfo = Message<'process.ProcessInfo'> & {\n  /**\n   * @generated from field: process.ProcessConfig config = 1;\n   */\n  config?: ProcessConfig\n\n  /**\n   * @generated from field: uint32 pid = 2;\n   */\n  pid: number\n\n  /**\n   * @generated from field: optional string tag = 3;\n   */\n  tag?: string\n}\n\n/**\n * Describes the message process.ProcessInfo.\n * Use `create(ProcessInfoSchema)` to create a new message.\n */\nexport const ProcessInfoSchema: GenMessage<ProcessInfo> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 3)\n\n/**\n * @generated from message process.ListResponse\n */\nexport type ListResponse = Message<'process.ListResponse'> & {\n  /**\n   * @generated from field: repeated process.ProcessInfo processes = 1;\n   */\n  processes: ProcessInfo[]\n}\n\n/**\n * Describes the message process.ListResponse.\n * Use `create(ListResponseSchema)` to create a new message.\n */\nexport const ListResponseSchema: GenMessage<ListResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 4)\n\n/**\n * @generated from message process.StartRequest\n */\nexport type StartRequest = Message<'process.StartRequest'> & {\n  /**\n   * @generated from field: process.ProcessConfig process = 1;\n   */\n  process?: ProcessConfig\n\n  /**\n   * @generated from field: optional process.PTY pty = 2;\n   */\n  pty?: PTY\n\n  /**\n   * @generated from field: optional string tag = 3;\n   */\n  tag?: string\n\n  /**\n   * @generated from field: optional bool stdin = 4;\n   */\n  stdin?: boolean\n}\n\n/**\n * Describes the message process.StartRequest.\n * Use `create(StartRequestSchema)` to create a new message.\n */\nexport const StartRequestSchema: GenMessage<StartRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 5)\n\n/**\n * @generated from message process.UpdateRequest\n */\nexport type UpdateRequest = Message<'process.UpdateRequest'> & {\n  /**\n   * @generated from field: process.ProcessSelector process = 1;\n   */\n  process?: ProcessSelector\n\n  /**\n   * @generated from field: optional process.PTY pty = 2;\n   */\n  pty?: PTY\n}\n\n/**\n * Describes the message process.UpdateRequest.\n * Use `create(UpdateRequestSchema)` to create a new message.\n */\nexport const UpdateRequestSchema: GenMessage<UpdateRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 6)\n\n/**\n * @generated from message process.UpdateResponse\n */\nexport type UpdateResponse = Message<'process.UpdateResponse'> & {}\n\n/**\n * Describes the message process.UpdateResponse.\n * Use `create(UpdateResponseSchema)` to create a new message.\n */\nexport const UpdateResponseSchema: GenMessage<UpdateResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 7)\n\n/**\n * @generated from message process.ProcessEvent\n */\nexport type ProcessEvent = Message<'process.ProcessEvent'> & {\n  /**\n   * @generated from oneof process.ProcessEvent.event\n   */\n  event:\n    | {\n        /**\n         * @generated from field: process.ProcessEvent.StartEvent start = 1;\n         */\n        value: ProcessEvent_StartEvent\n        case: 'start'\n      }\n    | {\n        /**\n         * @generated from field: process.ProcessEvent.DataEvent data = 2;\n         */\n        value: ProcessEvent_DataEvent\n        case: 'data'\n      }\n    | {\n        /**\n         * @generated from field: process.ProcessEvent.EndEvent end = 3;\n         */\n        value: ProcessEvent_EndEvent\n        case: 'end'\n      }\n    | {\n        /**\n         * @generated from field: process.ProcessEvent.KeepAlive keepalive = 4;\n         */\n        value: ProcessEvent_KeepAlive\n        case: 'keepalive'\n      }\n    | { case: undefined; value?: undefined }\n}\n\n/**\n * Describes the message process.ProcessEvent.\n * Use `create(ProcessEventSchema)` to create a new message.\n */\nexport const ProcessEventSchema: GenMessage<ProcessEvent> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 8)\n\n/**\n * @generated from message process.ProcessEvent.StartEvent\n */\nexport type ProcessEvent_StartEvent =\n  Message<'process.ProcessEvent.StartEvent'> & {\n    /**\n     * @generated from field: uint32 pid = 1;\n     */\n    pid: number\n  }\n\n/**\n * Describes the message process.ProcessEvent.StartEvent.\n * Use `create(ProcessEvent_StartEventSchema)` to create a new message.\n */\nexport const ProcessEvent_StartEventSchema: GenMessage<ProcessEvent_StartEvent> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 8, 0)\n\n/**\n * @generated from message process.ProcessEvent.DataEvent\n */\nexport type ProcessEvent_DataEvent =\n  Message<'process.ProcessEvent.DataEvent'> & {\n    /**\n     * @generated from oneof process.ProcessEvent.DataEvent.output\n     */\n    output:\n      | {\n          /**\n           * @generated from field: bytes stdout = 1;\n           */\n          value: Uint8Array\n          case: 'stdout'\n        }\n      | {\n          /**\n           * @generated from field: bytes stderr = 2;\n           */\n          value: Uint8Array\n          case: 'stderr'\n        }\n      | {\n          /**\n           * @generated from field: bytes pty = 3;\n           */\n          value: Uint8Array\n          case: 'pty'\n        }\n      | { case: undefined; value?: undefined }\n  }\n\n/**\n * Describes the message process.ProcessEvent.DataEvent.\n * Use `create(ProcessEvent_DataEventSchema)` to create a new message.\n */\nexport const ProcessEvent_DataEventSchema: GenMessage<ProcessEvent_DataEvent> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 8, 1)\n\n/**\n * @generated from message process.ProcessEvent.EndEvent\n */\nexport type ProcessEvent_EndEvent = Message<'process.ProcessEvent.EndEvent'> & {\n  /**\n   * @generated from field: sint32 exit_code = 1;\n   */\n  exitCode: number\n\n  /**\n   * @generated from field: bool exited = 2;\n   */\n  exited: boolean\n\n  /**\n   * @generated from field: string status = 3;\n   */\n  status: string\n\n  /**\n   * @generated from field: optional string error = 4;\n   */\n  error?: string\n}\n\n/**\n * Describes the message process.ProcessEvent.EndEvent.\n * Use `create(ProcessEvent_EndEventSchema)` to create a new message.\n */\nexport const ProcessEvent_EndEventSchema: GenMessage<ProcessEvent_EndEvent> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 8, 2)\n\n/**\n * @generated from message process.ProcessEvent.KeepAlive\n */\nexport type ProcessEvent_KeepAlive =\n  Message<'process.ProcessEvent.KeepAlive'> & {}\n\n/**\n * Describes the message process.ProcessEvent.KeepAlive.\n * Use `create(ProcessEvent_KeepAliveSchema)` to create a new message.\n */\nexport const ProcessEvent_KeepAliveSchema: GenMessage<ProcessEvent_KeepAlive> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 8, 3)\n\n/**\n * @generated from message process.StartResponse\n */\nexport type StartResponse = Message<'process.StartResponse'> & {\n  /**\n   * @generated from field: process.ProcessEvent event = 1;\n   */\n  event?: ProcessEvent\n}\n\n/**\n * Describes the message process.StartResponse.\n * Use `create(StartResponseSchema)` to create a new message.\n */\nexport const StartResponseSchema: GenMessage<StartResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 9)\n\n/**\n * @generated from message process.ConnectResponse\n */\nexport type ConnectResponse = Message<'process.ConnectResponse'> & {\n  /**\n   * @generated from field: process.ProcessEvent event = 1;\n   */\n  event?: ProcessEvent\n}\n\n/**\n * Describes the message process.ConnectResponse.\n * Use `create(ConnectResponseSchema)` to create a new message.\n */\nexport const ConnectResponseSchema: GenMessage<ConnectResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 10)\n\n/**\n * @generated from message process.SendInputRequest\n */\nexport type SendInputRequest = Message<'process.SendInputRequest'> & {\n  /**\n   * @generated from field: process.ProcessSelector process = 1;\n   */\n  process?: ProcessSelector\n\n  /**\n   * @generated from field: process.ProcessInput input = 2;\n   */\n  input?: ProcessInput\n}\n\n/**\n * Describes the message process.SendInputRequest.\n * Use `create(SendInputRequestSchema)` to create a new message.\n */\nexport const SendInputRequestSchema: GenMessage<SendInputRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 11)\n\n/**\n * @generated from message process.SendInputResponse\n */\nexport type SendInputResponse = Message<'process.SendInputResponse'> & {}\n\n/**\n * Describes the message process.SendInputResponse.\n * Use `create(SendInputResponseSchema)` to create a new message.\n */\nexport const SendInputResponseSchema: GenMessage<SendInputResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 12)\n\n/**\n * @generated from message process.ProcessInput\n */\nexport type ProcessInput = Message<'process.ProcessInput'> & {\n  /**\n   * @generated from oneof process.ProcessInput.input\n   */\n  input:\n    | {\n        /**\n         * @generated from field: bytes stdin = 1;\n         */\n        value: Uint8Array\n        case: 'stdin'\n      }\n    | {\n        /**\n         * @generated from field: bytes pty = 2;\n         */\n        value: Uint8Array\n        case: 'pty'\n      }\n    | { case: undefined; value?: undefined }\n}\n\n/**\n * Describes the message process.ProcessInput.\n * Use `create(ProcessInputSchema)` to create a new message.\n */\nexport const ProcessInputSchema: GenMessage<ProcessInput> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 13)\n\n/**\n * @generated from message process.StreamInputRequest\n */\nexport type StreamInputRequest = Message<'process.StreamInputRequest'> & {\n  /**\n   * @generated from oneof process.StreamInputRequest.event\n   */\n  event:\n    | {\n        /**\n         * @generated from field: process.StreamInputRequest.StartEvent start = 1;\n         */\n        value: StreamInputRequest_StartEvent\n        case: 'start'\n      }\n    | {\n        /**\n         * @generated from field: process.StreamInputRequest.DataEvent data = 2;\n         */\n        value: StreamInputRequest_DataEvent\n        case: 'data'\n      }\n    | {\n        /**\n         * @generated from field: process.StreamInputRequest.KeepAlive keepalive = 3;\n         */\n        value: StreamInputRequest_KeepAlive\n        case: 'keepalive'\n      }\n    | { case: undefined; value?: undefined }\n}\n\n/**\n * Describes the message process.StreamInputRequest.\n * Use `create(StreamInputRequestSchema)` to create a new message.\n */\nexport const StreamInputRequestSchema: GenMessage<StreamInputRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 14)\n\n/**\n * @generated from message process.StreamInputRequest.StartEvent\n */\nexport type StreamInputRequest_StartEvent =\n  Message<'process.StreamInputRequest.StartEvent'> & {\n    /**\n     * @generated from field: process.ProcessSelector process = 1;\n     */\n    process?: ProcessSelector\n  }\n\n/**\n * Describes the message process.StreamInputRequest.StartEvent.\n * Use `create(StreamInputRequest_StartEventSchema)` to create a new message.\n */\nexport const StreamInputRequest_StartEventSchema: GenMessage<StreamInputRequest_StartEvent> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 14, 0)\n\n/**\n * @generated from message process.StreamInputRequest.DataEvent\n */\nexport type StreamInputRequest_DataEvent =\n  Message<'process.StreamInputRequest.DataEvent'> & {\n    /**\n     * @generated from field: process.ProcessInput input = 2;\n     */\n    input?: ProcessInput\n  }\n\n/**\n * Describes the message process.StreamInputRequest.DataEvent.\n * Use `create(StreamInputRequest_DataEventSchema)` to create a new message.\n */\nexport const StreamInputRequest_DataEventSchema: GenMessage<StreamInputRequest_DataEvent> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 14, 1)\n\n/**\n * @generated from message process.StreamInputRequest.KeepAlive\n */\nexport type StreamInputRequest_KeepAlive =\n  Message<'process.StreamInputRequest.KeepAlive'> & {}\n\n/**\n * Describes the message process.StreamInputRequest.KeepAlive.\n * Use `create(StreamInputRequest_KeepAliveSchema)` to create a new message.\n */\nexport const StreamInputRequest_KeepAliveSchema: GenMessage<StreamInputRequest_KeepAlive> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 14, 2)\n\n/**\n * @generated from message process.StreamInputResponse\n */\nexport type StreamInputResponse = Message<'process.StreamInputResponse'> & {}\n\n/**\n * Describes the message process.StreamInputResponse.\n * Use `create(StreamInputResponseSchema)` to create a new message.\n */\nexport const StreamInputResponseSchema: GenMessage<StreamInputResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 15)\n\n/**\n * @generated from message process.SendSignalRequest\n */\nexport type SendSignalRequest = Message<'process.SendSignalRequest'> & {\n  /**\n   * @generated from field: process.ProcessSelector process = 1;\n   */\n  process?: ProcessSelector\n\n  /**\n   * @generated from field: process.Signal signal = 2;\n   */\n  signal: Signal\n}\n\n/**\n * Describes the message process.SendSignalRequest.\n * Use `create(SendSignalRequestSchema)` to create a new message.\n */\nexport const SendSignalRequestSchema: GenMessage<SendSignalRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 16)\n\n/**\n * @generated from message process.SendSignalResponse\n */\nexport type SendSignalResponse = Message<'process.SendSignalResponse'> & {}\n\n/**\n * Describes the message process.SendSignalResponse.\n * Use `create(SendSignalResponseSchema)` to create a new message.\n */\nexport const SendSignalResponseSchema: GenMessage<SendSignalResponse> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 17)\n\n/**\n * @generated from message process.ConnectRequest\n */\nexport type ConnectRequest = Message<'process.ConnectRequest'> & {\n  /**\n   * @generated from field: process.ProcessSelector process = 1;\n   */\n  process?: ProcessSelector\n}\n\n/**\n * Describes the message process.ConnectRequest.\n * Use `create(ConnectRequestSchema)` to create a new message.\n */\nexport const ConnectRequestSchema: GenMessage<ConnectRequest> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 18)\n\n/**\n * @generated from message process.ProcessSelector\n */\nexport type ProcessSelector = Message<'process.ProcessSelector'> & {\n  /**\n   * @generated from oneof process.ProcessSelector.selector\n   */\n  selector:\n    | {\n        /**\n         * @generated from field: uint32 pid = 1;\n         */\n        value: number\n        case: 'pid'\n      }\n    | {\n        /**\n         * @generated from field: string tag = 2;\n         */\n        value: string\n        case: 'tag'\n      }\n    | { case: undefined; value?: undefined }\n}\n\n/**\n * Describes the message process.ProcessSelector.\n * Use `create(ProcessSelectorSchema)` to create a new message.\n */\nexport const ProcessSelectorSchema: GenMessage<ProcessSelector> =\n  /*@__PURE__*/\n  messageDesc(file_process_process, 19)\n\n/**\n * @generated from enum process.Signal\n */\nexport enum Signal {\n  /**\n   * @generated from enum value: SIGNAL_UNSPECIFIED = 0;\n   */\n  UNSPECIFIED = 0,\n\n  /**\n   * @generated from enum value: SIGNAL_SIGTERM = 15;\n   */\n  SIGTERM = 15,\n\n  /**\n   * @generated from enum value: SIGNAL_SIGKILL = 9;\n   */\n  SIGKILL = 9,\n}\n\n/**\n * Describes the enum process.Signal.\n */\nexport const SignalSchema: GenEnum<Signal> =\n  /*@__PURE__*/\n  enumDesc(file_process_process, 0)\n\n/**\n * @generated from service process.Process\n */\nexport const Process: GenService<{\n  /**\n   * @generated from rpc process.Process.List\n   */\n  list: {\n    methodKind: 'unary'\n    input: typeof ListRequestSchema\n    output: typeof ListResponseSchema\n  }\n  /**\n   * @generated from rpc process.Process.Connect\n   */\n  connect: {\n    methodKind: 'server_streaming'\n    input: typeof ConnectRequestSchema\n    output: typeof ConnectResponseSchema\n  }\n  /**\n   * @generated from rpc process.Process.Start\n   */\n  start: {\n    methodKind: 'server_streaming'\n    input: typeof StartRequestSchema\n    output: typeof StartResponseSchema\n  }\n  /**\n   * @generated from rpc process.Process.Update\n   */\n  update: {\n    methodKind: 'unary'\n    input: typeof UpdateRequestSchema\n    output: typeof UpdateResponseSchema\n  }\n  /**\n   * Client input stream ensures ordering of messages\n   *\n   * @generated from rpc process.Process.StreamInput\n   */\n  streamInput: {\n    methodKind: 'client_streaming'\n    input: typeof StreamInputRequestSchema\n    output: typeof StreamInputResponseSchema\n  }\n  /**\n   * @generated from rpc process.Process.SendInput\n   */\n  sendInput: {\n    methodKind: 'unary'\n    input: typeof SendInputRequestSchema\n    output: typeof SendInputResponseSchema\n  }\n  /**\n   * @generated from rpc process.Process.SendSignal\n   */\n  sendSignal: {\n    methodKind: 'unary'\n    input: typeof SendSignalRequestSchema\n    output: typeof SendSignalResponseSchema\n  }\n}> = /*@__PURE__*/ serviceDesc(file_process_process, 0)\n","import {\n  Code,\n  ConnectError,\n  createClient,\n  Client,\n  Transport,\n} from '@connectrpc/connect'\n\nimport {\n  Signal,\n  Process as ProcessService,\n} from '../../envd/process/process_pb'\nimport {\n  ConnectionConfig,\n  ConnectionOpts,\n  Username,\n  KEEPALIVE_PING_HEADER,\n  KEEPALIVE_PING_INTERVAL_SEC,\n} from '../../connectionConfig'\nimport { CommandHandle } from './commandHandle'\nimport { authenticationHeader, handleRpcError } from '../../envd/rpc'\nimport { handleProcessStartEvent } from '../../envd/api'\n\nexport interface PtyCreateOpts\n  extends Pick<ConnectionOpts, 'requestTimeoutMs'> {\n  /**\n   * Number of columns for the PTY.\n   */\n  cols: number\n  /**\n   * Number of rows for the PTY.\n   */\n  rows: number\n  /**\n   * Callback to handle PTY data.\n   */\n  onData: (data: Uint8Array) => void | Promise<void>\n  /**\n   * Timeout for the PTY in **milliseconds**.\n   *\n   * @default 60_000 // 60 seconds\n   */\n  timeoutMs?: number\n  /**\n   * User to use for the PTY.\n   *\n   * @default `default Sandbox user (as specified in the template)`\n   */\n  user?: Username\n  /**\n   * Environment variables for the PTY.\n   *\n   * @default {}\n   */\n  envs?: Record<string, string>\n  /**\n   * Working directory for the PTY.\n   *\n   * @default // home directory of the user used to start the PTY\n   */\n  cwd?: string\n}\n\n/**\n * Module for interacting with PTYs (pseudo-terminals) in the sandbox.\n */\nexport class Pty {\n  private readonly rpc: Client<typeof ProcessService>\n  private readonly envdVersion: string\n\n  constructor(\n    private readonly transport: Transport,\n    private readonly connectionConfig: ConnectionConfig,\n    metadata: {\n      version: string\n    }\n  ) {\n    this.rpc = createClient(ProcessService, this.transport)\n    this.envdVersion = metadata.version\n  }\n\n  /**\n   * Create a new PTY (pseudo-terminal).\n   *\n   * @param opts options for creating the PTY.\n   *\n   * @returns handle to interact with the PTY.\n   */\n  async create(opts: PtyCreateOpts) {\n    const requestTimeoutMs =\n      opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n    const envs = opts?.envs ?? {}\n    envs.TERM = 'xterm-256color'\n    const controller = new AbortController()\n\n    const reqTimeout = setTimeout(() => {\n      controller.abort()\n    }, requestTimeoutMs)\n\n    const events = this.rpc.start(\n      {\n        process: {\n          cmd: '/bin/bash',\n          args: ['-i', '-l'],\n          envs: envs,\n          cwd: opts?.cwd,\n        },\n        pty: {\n          size: {\n            cols: opts.cols,\n            rows: opts.rows,\n          },\n        },\n      },\n      {\n        headers: {\n          ...authenticationHeader(this.envdVersion, opts?.user),\n          [KEEPALIVE_PING_HEADER]: KEEPALIVE_PING_INTERVAL_SEC.toString(),\n        },\n        signal: controller.signal,\n        timeoutMs: opts?.timeoutMs ?? 60_000,\n      }\n    )\n\n    try {\n      const pid = await handleProcessStartEvent(events)\n\n      clearTimeout(reqTimeout)\n\n      return new CommandHandle(\n        pid,\n        () => controller.abort(),\n        () => this.kill(pid),\n        events,\n        undefined,\n        undefined,\n        opts.onData\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Send input to a PTY.\n   *\n   * @param pid process ID of the PTY.\n   * @param data input data to send to the PTY.\n   * @param opts connection options.\n   */\n  async sendInput(\n    pid: number,\n    data: Uint8Array,\n    opts?: Pick<ConnectionOpts, 'requestTimeoutMs'>\n  ): Promise<void> {\n    try {\n      await this.rpc.sendInput(\n        {\n          input: {\n            input: {\n              case: 'pty',\n              value: data,\n            },\n          },\n          process: {\n            selector: {\n              case: 'pid',\n              value: pid,\n            },\n          },\n        },\n        {\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Resize PTY.\n   * Call this when the terminal window is resized and the number of columns and rows has changed.\n   *\n   * @param pid process ID of the PTY.\n   * @param size new size of the PTY.\n   * @param opts connection options.\n   */\n  async resize(\n    pid: number,\n    size: {\n      cols: number\n      rows: number\n    },\n    opts?: Pick<ConnectionOpts, 'requestTimeoutMs'>\n  ): Promise<void> {\n    try {\n      await this.rpc.update(\n        {\n          process: {\n            selector: {\n              case: 'pid',\n              value: pid,\n            },\n          },\n          pty: {\n            size,\n          },\n        },\n        {\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n    } catch (err) {\n      throw handleRpcError(err)\n    }\n  }\n\n  /**\n   * Kill a running PTY specified by process ID.\n   * It uses `SIGKILL` signal to kill the PTY.\n   *\n   * @param pid process ID of the PTY.\n   * @param opts connection options.\n   *\n   * @returns `true` if the PTY was killed, `false` if the PTY was not found.\n   */\n  async kill(\n    pid: number,\n    opts?: Pick<ConnectionOpts, 'requestTimeoutMs'>\n  ): Promise<boolean> {\n    try {\n      await this.rpc.sendSignal(\n        {\n          process: {\n            selector: {\n              case: 'pid',\n              value: pid,\n            },\n          },\n          signal: Signal.SIGKILL,\n        },\n        {\n          signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n        }\n      )\n\n      return true\n    } catch (err) {\n      if (err instanceof ConnectError) {\n        if (err.code === Code.NotFound) {\n          return false\n        }\n      }\n\n      throw handleRpcError(err)\n    }\n  }\n}\n","import { ApiClient, components, handleApiError } from '../api'\nimport {\n  ConnectionConfig,\n  ConnectionOpts,\n  DEFAULT_SANDBOX_TIMEOUT_MS,\n} from '../connectionConfig'\nimport { compareVersions } from 'compare-versions'\nimport { NotFoundError, TemplateError } from '../errors'\nimport { timeoutToSeconds } from '../utils'\nimport type { McpServer as BaseMcpServer } from './mcp'\n\n/**\n * Extended MCP server configuration that includes base servers\n * and allows dynamic GitHub-based MCP servers with custom run and install commands.\n */\nexport type McpServer = BaseMcpServer | GitHubMcpServer\n\nexport type GitHubMcpServer = {\n  [key: `github/${string}`]: {\n    /**\n     * Command to run the MCP server. Must start a stdio-compatible server.\n     */\n    runCmd: string\n    /**\n     * Command to install dependencies for the MCP server. Working directory is the root of the github repository.\n     */\n    installCmd?: string\n    /**\n     * Environment variables to set in the MCP process.\n     */\n    envs?: Record<string, string>\n  }\n}\n/**\n * Options for request to the Sandbox API.\n */\nexport interface SandboxApiOpts\n  extends Partial<\n    Pick<\n      ConnectionOpts,\n      'apiKey' | 'headers' | 'debug' | 'domain' | 'requestTimeoutMs'\n    >\n  > {}\n\n/**\n * Options for creating a new Sandbox.\n */\nexport interface SandboxOpts extends ConnectionOpts {\n  /**\n   * Custom metadata for the sandbox.\n   *\n   * @default {}\n   */\n  metadata?: Record<string, string>\n\n  /**\n   * Custom environment variables for the sandbox.\n   *\n   * Used when executing commands and code in the sandbox.\n   * Can be overridden with the `envs` argument when executing commands or code.\n   *\n   * @default {}\n   */\n  envs?: Record<string, string>\n\n  /**\n   * Timeout for the sandbox in **milliseconds**.\n   * Maximum time a sandbox can be kept alive is 24 hours (86_400_000 milliseconds) for Pro users and 1 hour (3_600_000 milliseconds) for Hobby users.\n   *\n   * @default 300_000 // 5 minutes\n   */\n  timeoutMs?: number\n\n  /**\n   * Secure all traffic coming to the sandbox controller with auth token\n   *\n   * @default true\n   */\n  secure?: boolean\n\n  /**\n   * Allow sandbox to access the internet\n   *\n   * @default true\n   */\n  allowInternetAccess?: boolean\n\n  /**\n   * MCP server to enable in the sandbox\n   * @default undefined\n   */\n  mcp?: McpServer\n}\n\nexport type SandboxBetaCreateOpts = SandboxOpts & {\n  /**\n   * Automatically pause the sandbox after the timeout expires.\n   * @default false\n   */\n  autoPause?: boolean\n}\n\n/**\n * Options for connecting to a Sandbox.\n */\nexport type SandboxConnectOpts = Omit<SandboxOpts, 'metadata' | 'envs'>\n\n/**\n * State of the sandbox.\n */\nexport type SandboxState = 'running' | 'paused'\n\nexport interface SandboxListOpts extends SandboxApiOpts {\n  /**\n   * Filter the list of sandboxes, e.g. by metadata `metadata:{\"key\": \"value\"}`, if there are multiple filters they are combined with AND.\n   *\n   */\n  query?: {\n    metadata?: Record<string, string>\n    /**\n     * Filter the list of sandboxes by state.\n     * @default ['running', 'paused']\n     */\n    state?: Array<SandboxState>\n  }\n\n  /**\n   * Number of sandboxes to return per page.\n   *\n   * @default 100\n   */\n  limit?: number\n\n  /**\n   * Token to the next page.\n   */\n  nextToken?: string\n}\n\nexport interface SandboxMetricsOpts extends SandboxApiOpts {\n  /**\n   * Start time for the metrics, defaults to the start of the sandbox\n   */\n  start?: string | Date\n  /**\n   * End time for the metrics, defaults to the current time\n   */\n  end?: string | Date\n}\n\n/**\n * Information about a sandbox.\n */\nexport interface SandboxInfo {\n  /**\n   * Sandbox ID.\n   */\n  sandboxId: string\n\n  /**\n   * Template ID.\n   */\n  templateId: string\n\n  /**\n   * Template name.\n   */\n  name?: string\n\n  /**\n   * Saved sandbox metadata.\n   */\n  metadata: Record<string, string>\n\n  /**\n   * Sandbox start time.\n   */\n  startedAt: Date\n\n  /**\n   * Sandbox expiration date.\n   */\n  endAt: Date\n\n  /**\n   * Sandbox state.\n   *\n   * @string can be `running` or `paused`\n   */\n  state: SandboxState\n\n  /**\n   * Sandbox CPU count.\n   */\n  cpuCount: number\n\n  /**\n   * Sandbox Memory size in MiB.\n   */\n  memoryMB: number\n\n  /**\n   * Envd version.\n   */\n  envdVersion: string\n}\n\n/**\n * Sandbox resource usage metrics.\n */\nexport interface SandboxMetrics {\n  /**\n   * Timestamp of the metrics.\n   */\n  timestamp: Date\n\n  /**\n   * CPU usage in percentage.\n   */\n  cpuUsedPct: number\n\n  /**\n   * Number of CPU cores.\n   */\n  cpuCount: number\n\n  /**\n   * Memory usage in bytes.\n   */\n  memUsed: number\n\n  /**\n   * Total memory available in bytes.\n   */\n  memTotal: number\n\n  /**\n   * Used disk space in bytes.\n   */\n  diskUsed: number\n\n  /**\n   * Total disk space available in bytes.\n   */\n  diskTotal: number\n}\n\nexport class SandboxApi {\n  protected constructor() {}\n\n  /**\n   * Kill the sandbox specified by sandbox ID.\n   *\n   * @param sandboxId sandbox ID.\n   * @param opts connection options.\n   *\n   * @returns `true` if the sandbox was found and killed, `false` otherwise.\n   */\n  static async kill(\n    sandboxId: string,\n    opts?: SandboxApiOpts\n  ): Promise<boolean> {\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.DELETE('/sandboxes/{sandboxID}', {\n      params: {\n        path: {\n          sandboxID: sandboxId,\n        },\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    if (res.error?.code === 404) {\n      return false\n    }\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    return true\n  }\n\n  /**\n   * Get sandbox information like sandbox ID, template, metadata, started at/end at date.\n   *\n   * @param sandboxId sandbox ID.\n   * @param opts connection options.\n   *\n   * @returns sandbox information.\n   */\n  static async getInfo(\n    sandboxId: string,\n    opts?: SandboxApiOpts\n  ): Promise<SandboxInfo> {\n    const fullInfo = await this.getFullInfo(sandboxId, opts)\n    delete fullInfo.envdAccessToken\n    delete fullInfo.sandboxDomain\n\n    return fullInfo\n  }\n\n  /**\n   * Get the metrics of the sandbox.\n   *\n   * @param sandboxId sandbox ID.\n   * @param opts sandbox metrics options.\n   *\n   * @returns  List of sandbox metrics containing CPU, memory and disk usage information.\n   */\n  static async getMetrics(\n    sandboxId: string,\n    opts?: SandboxMetricsOpts\n  ): Promise<SandboxMetrics[]> {\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.GET('/sandboxes/{sandboxID}/metrics', {\n      params: {\n        path: {\n          sandboxID: sandboxId,\n          start: opts?.start,\n          end: opts?.end,\n        },\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    return (\n      res.data?.map((metric: components['schemas']['SandboxMetric']) => ({\n        timestamp: new Date(metric.timestamp),\n        cpuUsedPct: metric.cpuUsedPct,\n        cpuCount: metric.cpuCount,\n        memUsed: metric.memUsed,\n        memTotal: metric.memTotal,\n        diskUsed: metric.diskUsed,\n        diskTotal: metric.diskTotal,\n      })) ?? []\n    )\n  }\n\n  /**\n   * Set the timeout of the specified sandbox.\n   * After the timeout expires the sandbox will be automatically killed.\n   *\n   * This method can extend or reduce the sandbox timeout set when creating the sandbox or from the last call to {@link Sandbox.setTimeout}.\n   *\n   * Maximum time a sandbox can be kept alive is 24 hours (86_400_000 milliseconds) for Pro users and 1 hour (3_600_000 milliseconds) for Hobby users.\n   *\n   * @param sandboxId sandbox ID.\n   * @param timeoutMs timeout in **milliseconds**.\n   * @param opts connection options.\n   */\n  static async setTimeout(\n    sandboxId: string,\n    timeoutMs: number,\n    opts?: SandboxApiOpts\n  ): Promise<void> {\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.POST('/sandboxes/{sandboxID}/timeout', {\n      params: {\n        path: {\n          sandboxID: sandboxId,\n        },\n      },\n      body: {\n        timeout: timeoutToSeconds(timeoutMs),\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n  }\n\n  static async getFullInfo(sandboxId: string, opts?: SandboxApiOpts) {\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.GET('/sandboxes/{sandboxID}', {\n      params: {\n        path: {\n          sandboxID: sandboxId,\n        },\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    if (!res.data) {\n      throw new Error('Sandbox not found')\n    }\n\n    return {\n      sandboxId: res.data.sandboxID,\n      templateId: res.data.templateID,\n      ...(res.data.alias && { name: res.data.alias }),\n      metadata: res.data.metadata ?? {},\n      envdVersion: res.data.envdVersion,\n      envdAccessToken: res.data.envdAccessToken,\n      startedAt: new Date(res.data.startedAt),\n      endAt: new Date(res.data.endAt),\n      state: res.data.state,\n      cpuCount: res.data.cpuCount,\n      memoryMB: res.data.memoryMB,\n      sandboxDomain: res.data.domain || undefined,\n    }\n  }\n\n  /**\n   * Pause the sandbox specified by sandbox ID.\n   *\n   * @param sandboxId sandbox ID.\n   * @param opts connection options.\n   *\n   * @returns `true` if the sandbox got paused, `false` if the sandbox was already paused.\n   */\n  static async betaPause(\n    sandboxId: string,\n    opts?: SandboxApiOpts\n  ): Promise<boolean> {\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.POST('/sandboxes/{sandboxID}/pause', {\n      params: {\n        path: {\n          sandboxID: sandboxId,\n        },\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    if (res.error?.code === 404) {\n      throw new NotFoundError(`Sandbox ${sandboxId} not found`)\n    }\n\n    if (res.error?.code === 409) {\n      // Sandbox is already paused\n      return false\n    }\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    return true\n  }\n\n  protected static async createSandbox(\n    template: string,\n    timeoutMs: number,\n    opts?: SandboxBetaCreateOpts\n  ): Promise<{\n    sandboxId: string\n    sandboxDomain?: string\n    envdVersion: string\n    envdAccessToken?: string\n  }> {\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.POST('/sandboxes', {\n      body: {\n        autoPause: opts?.autoPause ?? false,\n        templateID: template,\n        metadata: opts?.metadata,\n        mcp: opts?.mcp as Record<string, unknown> | undefined,\n        envVars: opts?.envs,\n        timeout: timeoutToSeconds(timeoutMs),\n        secure: opts?.secure ?? true,\n        allow_internet_access: opts?.allowInternetAccess ?? true,\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    if (compareVersions(res.data!.envdVersion, '0.1.0') < 0) {\n      await this.kill(res.data!.sandboxID, opts)\n      throw new TemplateError(\n        'You need to update the template to use the new SDK. ' +\n          'You can do this by running `e2b template build` in the directory with the template.'\n      )\n    }\n\n    return {\n      sandboxId: res.data!.sandboxID,\n      sandboxDomain: res.data!.domain || undefined,\n      envdVersion: res.data!.envdVersion,\n      envdAccessToken: res.data!.envdAccessToken,\n    }\n  }\n\n  protected static async resumeSandbox(\n    sandboxId: string,\n    opts?: SandboxConnectOpts\n  ): Promise<boolean> {\n    const timeoutMs = opts?.timeoutMs ?? DEFAULT_SANDBOX_TIMEOUT_MS\n\n    const config = new ConnectionConfig(opts)\n    const client = new ApiClient(config)\n\n    const res = await client.api.POST('/sandboxes/{sandboxID}/resume', {\n      params: {\n        path: {\n          sandboxID: sandboxId,\n        },\n      },\n      body: {\n        timeout: timeoutToSeconds(timeoutMs),\n      },\n      signal: config.getSignal(opts?.requestTimeoutMs),\n    })\n\n    if (res.error?.code === 404) {\n      throw new NotFoundError(`Paused sandbox ${sandboxId} not found`)\n    }\n\n    if (res.error?.code === 409) {\n      // Sandbox is already running\n      return false\n    }\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    return true\n  }\n}\n\n/**\n * Paginator for listing sandboxes.\n *\n * @example\n * ```ts\n * const paginator = Sandbox.list()\n *\n * while (paginator.hasNext) {\n *   const sandboxes = await paginator.nextItems()\n *   console.log(sandboxes)\n * }\n * ```\n */\nexport class SandboxPaginator {\n  private _hasNext: boolean\n  private _nextToken?: string\n\n  private readonly config: ConnectionConfig\n  private client: ApiClient\n\n  private query: SandboxListOpts['query']\n  private readonly limit?: number\n\n  constructor(opts?: SandboxListOpts) {\n    this.config = new ConnectionConfig(opts)\n    this.client = new ApiClient(this.config)\n\n    this._hasNext = true\n    this._nextToken = opts?.nextToken\n\n    this.query = opts?.query\n    this.limit = opts?.limit\n  }\n\n  /**\n   * Returns True if there are more items to fetch.\n   */\n  get hasNext(): boolean {\n    return this._hasNext\n  }\n\n  /**\n   * Returns the next token to use for pagination.\n   */\n  get nextToken(): string | undefined {\n    return this._nextToken\n  }\n\n  /**\n   * Get the next page of sandboxes.\n   *\n   * @throws Error if there are no more items to fetch. Call this method only if `hasNext` is `true`.\n   *\n   * @returns List of sandboxes\n   */\n  async nextItems(): Promise<SandboxInfo[]> {\n    if (!this.hasNext) {\n      throw new Error('No more items to fetch')\n    }\n\n    let metadata = undefined\n    if (this.query?.metadata) {\n      const encodedPairs: Record<string, string> = Object.fromEntries(\n        Object.entries(this.query.metadata).map(([key, value]) => [\n          encodeURIComponent(key),\n          encodeURIComponent(value),\n        ])\n      )\n\n      metadata = new URLSearchParams(encodedPairs).toString()\n    }\n\n    const res = await this.client.api.GET('/v2/sandboxes', {\n      params: {\n        query: {\n          metadata,\n          state: this.query?.state,\n          limit: this.limit,\n          nextToken: this.nextToken,\n        },\n      },\n      // requestTimeoutMs is already passed here via the connectionConfig.\n      signal: this.config.getSignal(),\n    })\n\n    const err = handleApiError(res)\n    if (err) {\n      throw err\n    }\n\n    this._nextToken = res.response.headers.get('x-next-token') || undefined\n    this._hasNext = !!this._nextToken\n\n    return (res.data ?? []).map(\n      (sandbox: components['schemas']['ListedSandbox']) => ({\n        sandboxId: sandbox.sandboxID,\n        templateId: sandbox.templateID,\n        ...(sandbox.alias && { name: sandbox.alias }),\n        metadata: sandbox.metadata ?? {},\n        startedAt: new Date(sandbox.startedAt),\n        endAt: new Date(sandbox.endAt),\n        state: sandbox.state,\n        cpuCount: sandbox.cpuCount,\n        memoryMB: sandbox.memoryMB,\n        envdVersion: sandbox.envdVersion,\n      })\n    )\n  }\n}\n","import chalk from 'chalk'\nimport { stripAnsi } from '../utils'\n\n/**\n * Log entry severity levels.\n */\nexport type LogEntryLevel = 'debug' | 'info' | 'warn' | 'error'\n\n/**\n * Represents a single log entry from the template build process.\n */\nexport class LogEntry {\n  constructor(\n    public readonly timestamp: Date,\n    public readonly level: LogEntryLevel,\n    public readonly message: string\n  ) {}\n\n  toString() {\n    return `[${this.timestamp.toISOString()}] [${this.level}] ${stripAnsi(\n      this.message\n    )}`\n  }\n}\n\n/**\n * Special log entry indicating the start of a build process.\n */\nexport class LogEntryStart extends LogEntry {\n  constructor(timestamp: Date, message: string) {\n    super(timestamp, 'debug', message)\n  }\n}\n\n/**\n * Special log entry indicating the end of a build process.\n */\nexport class LogEntryEnd extends LogEntry {\n  constructor(timestamp: Date, message: string) {\n    super(timestamp, 'debug', message)\n  }\n}\n\n/**\n * Interval in milliseconds for updating the build timer display.\n * @internal\n */\nconst TIMER_UPDATE_INTERVAL_MS = 150\n\n/**\n * Default minimum log level to display.\n * @internal\n */\nconst DEFAULT_LEVEL: LogEntryLevel = 'info'\n\n/**\n * Colored labels for each log level.\n * @internal\n */\nconst levels: Record<LogEntryLevel, string> = {\n  error: chalk.red('ERROR'),\n  warn: chalk.hex('#FF4400')('WARN '),\n  info: chalk.hex('#FF8800')('INFO '),\n  debug: chalk.gray('DEBUG'),\n}\n\n/**\n * Numeric ordering of log levels for comparison (lower = less severe).\n * @internal\n */\nconst level_order: Record<LogEntryLevel, number> = {\n  debug: 0,\n  info: 1,\n  warn: 2,\n  error: 3,\n}\n\ninterface DefaultBuildLoggerState {\n  startTime: number\n  animationFrame: number\n  timerInterval: NodeJS.Timeout | undefined\n}\n\nclass DefaultBuildLogger {\n  private minLevel: LogEntryLevel\n  private state: DefaultBuildLoggerState\n\n  constructor(minLevel?: LogEntryLevel) {\n    this.minLevel = minLevel ?? DEFAULT_LEVEL\n    this.state = this.getInitialState()\n  }\n\n  logger(logEntry: LogEntry) {\n    if (logEntry instanceof LogEntryStart) {\n      this.startTimer()\n      return\n    }\n\n    if (logEntry instanceof LogEntryEnd) {\n      clearInterval(this.state.timerInterval)\n      return\n    }\n\n    // Filter by minimum level\n    if (level_order[logEntry.level] < level_order[this.minLevel]) {\n      return\n    }\n\n    const formattedLine = this.formatLogLine(logEntry)\n    process.stdout.write(`${formattedLine}\\n`)\n\n    // Redraw the timer line\n    this.updateTimer()\n  }\n\n  private getInitialState(\n    timerInterval?: NodeJS.Timeout\n  ): DefaultBuildLoggerState {\n    return {\n      startTime: Date.now(),\n      animationFrame: 0,\n      timerInterval: timerInterval,\n    }\n  }\n\n  private formatTimerLine() {\n    const elapsedSeconds = ((Date.now() - this.state.startTime) / 1000).toFixed(\n      1\n    )\n    return `${elapsedSeconds}s`\n  }\n\n  private animateStatus() {\n    const frames = ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷']\n    const idx = this.state.animationFrame % frames.length\n    return `${frames[idx]}`\n  }\n\n  private formatLogLine(line: LogEntry) {\n    const timer = this.formatTimerLine().padEnd(5)\n\n    const timestamp = chalk.dim(\n      line.timestamp.toLocaleTimeString(undefined, {\n        hour: '2-digit',\n        minute: '2-digit',\n        second: '2-digit',\n      })\n    )\n\n    const level = levels[line.level] || levels[DEFAULT_LEVEL]\n\n    const msg = line.message\n\n    return `${timer} | ${timestamp} ${level} ${msg}`\n  }\n\n  private startTimer() {\n    if (!process.stdout.isTTY) {\n      return\n    }\n\n    // Start the timer interval\n    const timerInterval = setInterval(\n      this.updateTimer.bind(this),\n      TIMER_UPDATE_INTERVAL_MS\n    )\n\n    this.state = this.getInitialState(timerInterval)\n\n    // Initial timer display\n    this.updateTimer()\n  }\n\n  private updateTimer() {\n    if (!process.stdout.isTTY) {\n      return\n    }\n\n    this.state.animationFrame++\n    const jumpingSquares = this.animateStatus()\n    process.stdout.write(\n      `${jumpingSquares} Building ${this.formatTimerLine()}\\r`\n    )\n  }\n}\n\n/**\n * Create a default build logger with animated timer display.\n *\n * @param options Logger configuration options\n * @param options.minLevel Minimum log level to display (default: 'info')\n * @returns Logger function that accepts LogEntry instances\n *\n * @example\n * ```ts\n * import { Template, defaultBuildLogger } from 'e2b'\n *\n * const template = Template().fromPythonImage()\n *\n * await Template.build(template, {\n *   alias: 'my-template',\n *   onBuildLogs: defaultBuildLogger({ minLevel: 'debug' })\n * })\n * ```\n */\nexport function defaultBuildLogger(options?: {\n  minLevel?: LogEntryLevel\n}): (logEntry: LogEntry) => void {\n  const buildLogger = new DefaultBuildLogger(options?.minLevel)\n\n  return buildLogger.logger.bind(buildLogger)\n}\n","import crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { dynamicGlob, dynamicTar } from '../utils'\nimport { BASE_STEP_NAME, FINALIZE_STEP_NAME } from './consts'\n\n/**\n * Read and parse a .dockerignore file.\n *\n * @param contextPath Directory path containing the .dockerignore file\n * @returns Array of ignore patterns (empty lines and comments are filtered out)\n */\nexport function readDockerignore(contextPath: string): string[] {\n  const dockerignorePath = path.join(contextPath, '.dockerignore')\n  if (!fs.existsSync(dockerignorePath)) {\n    return []\n  }\n\n  const content = fs.readFileSync(dockerignorePath, 'utf-8')\n  return content\n    .split('\\n')\n    .map((line) => line.trim())\n    .filter((line) => line && !line.startsWith('#'))\n}\n\n/**\n * Calculate a hash of files being copied to detect changes for cache invalidation.\n * The hash includes file content, metadata (mode, uid, gid, size, mtime), and relative paths.\n *\n * @param src Source path pattern for files to copy\n * @param dest Destination path where files will be copied\n * @param contextPath Base directory for resolving relative paths\n * @param ignorePatterns Glob patterns to ignore\n * @param resolveSymlinks Whether to resolve symbolic links when hashing\n * @param stackTrace Optional stack trace for error reporting\n * @returns Hex string hash of all files\n * @throws Error if no files match the source pattern\n */\nexport async function calculateFilesHash(\n  src: string,\n  dest: string,\n  contextPath: string,\n  ignorePatterns: string[],\n  resolveSymlinks: boolean,\n  stackTrace: string | undefined\n): Promise<string> {\n  const { glob } = await dynamicGlob()\n  const srcPath = path.join(contextPath, src)\n  const hash = crypto.createHash('sha256')\n  const content = `COPY ${src} ${dest}`\n\n  hash.update(content)\n\n  const files = await glob(srcPath, {\n    ignore: ignorePatterns,\n    withFileTypes: true,\n  })\n\n  if (files.length === 0) {\n    const error = new Error(`No files found in ${srcPath}`)\n    if (stackTrace) {\n      error.stack = stackTrace\n    }\n    throw error\n  }\n\n  // Hash stats\n  const hashStats = (stats: fs.Stats) => {\n    hash.update(stats.mode.toString())\n    hash.update(stats.uid.toString())\n    hash.update(stats.gid.toString())\n    hash.update(stats.size.toString())\n    hash.update(stats.mtimeMs.toString())\n  }\n\n  for (const file of files) {\n    // Add a relative path to hash calculation\n    const relativePath = path.relative(contextPath, file.fullpath())\n    hash.update(relativePath)\n\n    // Add stat information to hash calculation\n    if (file.isSymbolicLink()) {\n      // If the symlink is broken, it will return undefined, otherwise it will return a stats object of the target\n      const stats = fs.statSync(file.fullpath(), { throwIfNoEntry: false })\n      const shouldFollow =\n        resolveSymlinks && (stats?.isFile() || stats?.isDirectory())\n\n      if (!shouldFollow) {\n        const stats = fs.lstatSync(file.fullpath())\n\n        hashStats(stats)\n\n        const content = fs.readlinkSync(file.fullpath())\n        hash.update(content)\n\n        continue\n      }\n    }\n\n    const stats = fs.statSync(file.fullpath())\n\n    hashStats(stats)\n\n    if (stats.isFile()) {\n      const content = fs.readFileSync(file.fullpath())\n      hash.update(new Uint8Array(content))\n    }\n  }\n\n  return hash.digest('hex')\n}\n\n/**\n * Get the caller's stack trace frame at a specific depth.\n *\n * @param depth The depth of the stack trace to retrieve\n *   - Levels: caller (e.g., TemplateBase.fromImage) > original caller (e.g., user's template file)\n * @returns The caller frame as a string, or undefined if not available\n */\nexport function getCallerFrame(depth: number): string | undefined {\n  const stackTrace = new Error().stack\n  if (!stackTrace) {\n    return\n  }\n\n  const lines = stackTrace.split('\\n').slice(1) // Skip the this function (getCallerFrame)\n  if (lines.length < depth + 1) {\n    return\n  }\n\n  return lines.slice(depth).join('\\n')\n}\n\n/**\n * Extract the directory path from a stack trace line.\n *\n * Matches patterns like:\n * - \"at <anonymous> (/path/to/file.js:1:1)\"\n * - \"at /path/to/file.js:1:1\"\n *\n * @param line A line from a stack trace\n * @returns The directory of the file, or undefined if not found\n */\nexport function matchFileDir(line: string): string | undefined {\n  const match = line.match(/\\/[^:]+/)\n  if (match) {\n    const filePath = match[0]\n    return path.dirname(filePath)\n  }\n}\n\n/**\n * Get the directory of the caller at a specific stack depth.\n *\n * @param depth The depth of the stack trace\n * @returns The caller's directory path, or undefined if not available\n */\nexport function getCallerDirectory(depth: number): string | undefined {\n  const caller = getCallerFrame(depth + 1) // +1 depth to skip this function (getCallerDirectory)\n  if (!caller) {\n    return\n  }\n\n  const lines = caller.split('\\n')\n  if (lines.length === 0) {\n    return\n  }\n\n  const firstLine = lines[0]\n  return matchFileDir(firstLine)\n}\n\n/**\n * Convert a numeric file mode to a zero-padded octal string.\n *\n * @param mode File mode as a number (e.g., 493 for 0o755)\n * @returns Zero-padded 4-digit octal string (e.g., \"0755\")\n *\n * @example\n * ```ts\n * padOctal(0o755) // Returns \"0755\"\n * padOctal(0o644) // Returns \"0644\"\n * ```\n */\nexport function padOctal(mode: number): string {\n  return mode.toString(8).padStart(4, '0')\n}\n\n/**\n * Create a compressed tar stream of files matching a pattern.\n *\n * @param fileName Glob pattern for files to include\n * @param fileContextPath Base directory for resolving file paths\n * @param resolveSymlinks Whether to follow symbolic links\n * @returns A readable stream of the gzipped tar archive\n */\nexport async function tarFileStream(\n  fileName: string,\n  fileContextPath: string,\n  resolveSymlinks: boolean\n) {\n  const { globSync } = await dynamicGlob()\n  const { create } = await dynamicTar()\n  const files = globSync(fileName, { cwd: fileContextPath })\n\n  return create(\n    {\n      gzip: true,\n      cwd: fileContextPath,\n      follow: resolveSymlinks,\n    },\n    files\n  )\n}\n\n/**\n * Create a tar stream and calculate its compressed size for upload.\n *\n * @param fileName Glob pattern for files to include\n * @param fileContextPath Base directory for resolving file paths\n * @param resolveSymlinks Whether to follow symbolic links\n * @returns Object containing the content length and upload stream\n */\nexport async function tarFileStreamUpload(\n  fileName: string,\n  fileContextPath: string,\n  resolveSymlinks: boolean\n) {\n  // First pass: calculate the compressed size\n  const sizeCalculationStream = await tarFileStream(\n    fileName,\n    fileContextPath,\n    resolveSymlinks\n  )\n  let contentLength = 0\n  for await (const chunk of sizeCalculationStream as unknown as AsyncIterable<Buffer>) {\n    contentLength += chunk.length\n  }\n\n  return {\n    contentLength,\n    uploadStream: await tarFileStream(\n      fileName,\n      fileContextPath,\n      resolveSymlinks\n    ),\n  }\n}\n\n/**\n * Get the array index for a build step based on its name.\n *\n * Special steps:\n * - BASE_STEP_NAME: Returns 0 (first step)\n * - FINALIZE_STEP_NAME: Returns the last index\n * - Numeric strings: Converted to number\n *\n * @param step Build step name or number as string\n * @param stackTracesLength Total number of stack traces (used for FINALIZE_STEP_NAME)\n * @returns Index for the build step\n */\nexport function getBuildStepIndex(\n  step: string,\n  stackTracesLength: number\n): number {\n  if (step === BASE_STEP_NAME) {\n    return 0\n  }\n\n  if (step === FINALIZE_STEP_NAME) {\n    return stackTracesLength - 1\n  }\n\n  return Number(step)\n}\n\n/**\n * Read GCP service account JSON from a file or object.\n *\n * @param contextPath Base directory for resolving relative file paths\n * @param pathOrContent Either a path to a JSON file or a service account object\n * @returns Service account JSON as a string\n */\nexport function readGCPServiceAccountJSON(\n  contextPath: string,\n  pathOrContent: string | object\n): string {\n  if (typeof pathOrContent === 'string') {\n    return fs.readFileSync(path.join(contextPath, pathOrContent), 'utf-8')\n  }\n  return JSON.stringify(pathOrContent)\n}\n","/**\n * Special step name for the finalization phase of template building.\n * This is the last step that runs after all user-defined instructions.\n * @internal\n */\nexport const FINALIZE_STEP_NAME = 'finalize'\n\n/**\n * Special step name for the base image phase of template building.\n * This is the first step that sets up the base image.\n * @internal\n */\nexport const BASE_STEP_NAME = 'base'\n\n/**\n * Stack trace depth for capturing caller information.\n *\n * Depth levels:\n * 1. Template function\n * 2. TemplateBase class\n * 3. Caller method (e.g., copy(), fromImage(), etc.)\n *\n * This depth is used to determine the original caller's location\n * for stack traces.\n * @internal\n */\nexport const STACK_TRACE_DEPTH = 3\n\n/**\n * Default setting for whether to resolve symbolic links when copying files.\n * When false, symlinks are copied as symlinks rather than following them.\n * @internal\n */\nexport const RESOLVE_SYMLINKS = false\n","import { ApiClient, handleApiError, paths } from '../api'\nimport { stripAnsi } from '../utils'\nimport { BuildError, FileUploadError } from '../errors'\nimport { LogEntry } from './logger'\nimport { getBuildStepIndex, tarFileStreamUpload } from './utils'\n\ntype RequestBuildInput = {\n  alias: string\n  cpuCount: number\n  memoryMB: number\n}\n\ntype GetFileUploadLinkInput = {\n  templateID: string\n  filesHash: string\n}\n\ntype TriggerBuildInput = {\n  templateID: string\n  buildID: string\n  template: TriggerBuildTemplate\n}\n\ntype GetBuildStatusInput = {\n  templateID: string\n  buildID: string\n  logsOffset: number\n}\n\nexport type GetBuildStatusResponse =\n  paths['/templates/{templateID}/builds/{buildID}/status']['get']['responses']['200']['content']['application/json']\n\nexport type TriggerBuildTemplate =\n  paths['/v2/templates/{templateID}/builds/{buildID}']['post']['requestBody']['content']['application/json']\n\nexport async function requestBuild(\n  client: ApiClient,\n  { alias, cpuCount, memoryMB }: RequestBuildInput\n) {\n  const requestBuildRes = await client.api.POST('/v2/templates', {\n    body: {\n      alias,\n      cpuCount,\n      memoryMB,\n    },\n  })\n\n  const error = handleApiError(requestBuildRes, BuildError)\n  if (error) {\n    throw error\n  }\n\n  if (!requestBuildRes.data) {\n    throw new BuildError('Failed to request build')\n  }\n\n  return requestBuildRes.data\n}\n\nexport async function getFileUploadLink(\n  client: ApiClient,\n  { templateID, filesHash }: GetFileUploadLinkInput,\n  stackTrace?: string\n) {\n  const fileUploadLinkRes = await client.api.GET(\n    '/templates/{templateID}/files/{hash}',\n    {\n      params: {\n        path: {\n          templateID,\n          hash: filesHash,\n        },\n      },\n    }\n  )\n\n  const error = handleApiError(fileUploadLinkRes, FileUploadError, stackTrace)\n  if (error) {\n    throw error\n  }\n\n  if (!fileUploadLinkRes.data) {\n    throw new FileUploadError('Failed to get file upload link', stackTrace)\n  }\n\n  return fileUploadLinkRes.data\n}\n\nexport async function uploadFile(\n  options: {\n    fileName: string\n    fileContextPath: string\n    url: string\n    resolveSymlinks: boolean\n  },\n  stackTrace: string | undefined\n) {\n  const { fileName, url, fileContextPath, resolveSymlinks } = options\n  try {\n    const { contentLength, uploadStream } = await tarFileStreamUpload(\n      fileName,\n      fileContextPath,\n      resolveSymlinks\n    )\n\n    // The compiler assumes this is Web fetch API, but it's actually Node.js fetch API\n    const res = await fetch(url, {\n      method: 'PUT',\n      // @ts-expect-error\n      body: uploadStream,\n      headers: {\n        'Content-Length': contentLength.toString(),\n      },\n      duplex: 'half',\n    })\n\n    if (!res.ok) {\n      throw new FileUploadError(\n        `Failed to upload file: ${res.statusText}`,\n        stackTrace\n      )\n    }\n  } catch (error) {\n    if (error instanceof FileUploadError) {\n      throw error\n    }\n    throw new FileUploadError(`Failed to upload file: ${error}`, stackTrace)\n  }\n}\n\nexport async function triggerBuild(\n  client: ApiClient,\n  { templateID, buildID, template }: TriggerBuildInput\n) {\n  const triggerBuildRes = await client.api.POST(\n    '/v2/templates/{templateID}/builds/{buildID}',\n    {\n      params: {\n        path: {\n          templateID,\n          buildID,\n        },\n      },\n      body: template,\n    }\n  )\n\n  const error = handleApiError(triggerBuildRes, BuildError)\n  if (error) {\n    throw error\n  }\n}\n\nexport async function getBuildStatus(\n  client: ApiClient,\n  { templateID, buildID, logsOffset }: GetBuildStatusInput\n) {\n  const buildStatusRes = await client.api.GET(\n    '/templates/{templateID}/builds/{buildID}/status',\n    {\n      params: {\n        path: {\n          templateID,\n          buildID,\n        },\n        query: {\n          logsOffset,\n        },\n      },\n    }\n  )\n\n  const error = handleApiError(buildStatusRes, BuildError)\n  if (error) {\n    throw error\n  }\n\n  if (!buildStatusRes.data) {\n    throw new BuildError('Failed to get build status')\n  }\n\n  return buildStatusRes.data\n}\n\nexport async function waitForBuildFinish(\n  client: ApiClient,\n  {\n    templateID,\n    buildID,\n    onBuildLogs,\n    logsRefreshFrequency,\n    stackTraces,\n  }: {\n    templateID: string\n    buildID: string\n    onBuildLogs?: (logEntry: LogEntry) => void\n    logsRefreshFrequency: number\n    stackTraces: (string | undefined)[]\n  }\n): Promise<void> {\n  let logsOffset = 0\n  let status: GetBuildStatusResponse['status'] = 'building'\n\n  while (status === 'building' || status === 'waiting') {\n    const buildStatus = await getBuildStatus(client, {\n      templateID,\n      buildID,\n      logsOffset,\n    })\n\n    logsOffset += buildStatus.logEntries.length\n\n    buildStatus.logEntries.forEach(\n      (logEntry: GetBuildStatusResponse['logEntries'][number]) =>\n        onBuildLogs?.(\n          new LogEntry(\n            new Date(logEntry.timestamp),\n            logEntry.level,\n            stripAnsi(logEntry.message)\n          )\n        )\n    )\n\n    status = buildStatus.status\n    switch (status) {\n      case 'ready': {\n        return\n      }\n      case 'waiting': {\n        break\n      }\n      case 'error': {\n        let stackError: string | undefined\n        if (buildStatus.reason?.step !== undefined) {\n          const step = getBuildStepIndex(\n            buildStatus.reason.step,\n            stackTraces.length\n          )\n          stackError = stackTraces[step]\n        }\n\n        throw new BuildError(\n          buildStatus?.reason?.message ?? 'Unknown error',\n          stackError\n        )\n      }\n    }\n\n    // Wait for a short period before checking the status again\n    await new Promise((resolve) => setTimeout(resolve, logsRefreshFrequency))\n  }\n\n  throw new BuildError('Unknown build error occurred.')\n}\n","import { CopyItem } from './types'\nimport {\n  Argument,\n  DockerfileParser,\n  Instruction as DockerfileInstruction,\n} from 'dockerfile-ast'\nimport fs from 'node:fs'\nimport { ReadyCmd, waitForTimeout } from './readycmd'\n\nexport interface DockerfileParseResult {\n  baseImage: string\n}\n\ninterface DockerfileFinalParserInterface {}\n\nexport interface DockerfileParserInterface {\n  setWorkdir(workdir: string): DockerfileParserInterface\n  setUser(user: string): DockerfileParserInterface\n  setEnvs(envs: Record<string, string>): DockerfileParserInterface\n  runCmd(\n    commandOrCommands: string | string[],\n    options?: { user?: string }\n  ): DockerfileParserInterface\n  copy(\n    src: string,\n    dest: string,\n    options?: { forceUpload?: true; user?: string; mode?: number }\n  ): DockerfileParserInterface\n  copyItems(\n    items: CopyItem[],\n    options?: { forceUpload?: true; user?: string; mode?: number }\n  ): DockerfileParserInterface\n  setStartCmd(\n    startCommand: string,\n    readyCommand: string | ReadyCmd\n  ): DockerfileFinalParserInterface\n}\n\n/**\n * Parse a Dockerfile and convert it to Template SDK format\n *\n * @param dockerfileContentOrPath Either the Dockerfile content as a string,\n *                                or a path to a Dockerfile file\n * @param templateBuilder Interface providing template builder methods\n * @returns Parsed Dockerfile result with base image and instructions\n */\nexport function parseDockerfile(\n  dockerfileContentOrPath: string,\n  templateBuilder: DockerfileParserInterface\n): DockerfileParseResult {\n  // Check if input is a file path that exists\n  let dockerfileContent: string\n  try {\n    if (\n      fs.existsSync(dockerfileContentOrPath) &&\n      fs.statSync(dockerfileContentOrPath).isFile()\n    ) {\n      // Read the file content\n      dockerfileContent = fs.readFileSync(dockerfileContentOrPath, 'utf-8')\n    } else {\n      // Treat as content directly\n      dockerfileContent = dockerfileContentOrPath\n    }\n  } catch {\n    // If there's any error checking the file, treat as content\n    dockerfileContent = dockerfileContentOrPath\n  }\n\n  const dockerfile = DockerfileParser.parse(dockerfileContent)\n  const instructions = dockerfile.getInstructions()\n\n  // Check for multi-stage builds\n  const fromInstructions = instructions.filter(\n    (instruction) => instruction.getKeyword() === 'FROM'\n  )\n\n  if (fromInstructions.length > 1) {\n    throw new Error('Multi-stage Dockerfiles are not supported')\n  }\n\n  if (fromInstructions.length === 0) {\n    throw new Error('Dockerfile must contain a FROM instruction')\n  }\n\n  // Set the base image from the first FROM instruction\n  const fromInstruction = fromInstructions[0]\n  const argumentsData = fromInstruction.getArguments()\n  let baseImage = 'e2bdev/base' // default fallback\n  if (argumentsData && argumentsData.length > 0) {\n    baseImage = argumentsData[0].getValue()\n  }\n\n  // Set the user and workdir to the Docker defaults\n  templateBuilder.setUser('root')\n  templateBuilder.setWorkdir('/')\n\n  // Process all other instructions\n  for (const instruction of instructions) {\n    const keyword = instruction.getKeyword()\n\n    switch (keyword) {\n      case 'FROM':\n        // Already handled above\n        break\n\n      case 'RUN':\n        handleRunInstruction(instruction, templateBuilder)\n        break\n\n      case 'COPY':\n      case 'ADD':\n        handleCopyInstruction(instruction, templateBuilder)\n        break\n\n      case 'WORKDIR':\n        handleWorkdirInstruction(instruction, templateBuilder)\n        break\n\n      case 'USER':\n        handleUserInstruction(instruction, templateBuilder)\n        break\n\n      case 'ENV':\n      case 'ARG':\n        handleEnvInstruction(instruction, templateBuilder)\n        break\n\n      case 'EXPOSE':\n        // EXPOSE is not directly supported in our SDK, so we'll skip it\n        break\n\n      case 'VOLUME':\n        // VOLUME is not directly supported in our SDK, so we'll skip it\n        break\n\n      case 'CMD':\n      case 'ENTRYPOINT':\n        handleCmdEntrypointInstruction(instruction, templateBuilder)\n        break\n\n      default:\n        console.warn(`Unsupported instruction: ${keyword}`)\n        break\n    }\n  }\n\n  // Set the user and workdir to the E2B defaults\n  templateBuilder.setUser('user')\n  templateBuilder.setWorkdir('/home/user')\n\n  return {\n    baseImage,\n  }\n}\n\nfunction handleRunInstruction(\n  instruction: DockerfileInstruction,\n  templateBuilder: DockerfileParserInterface\n): void {\n  const argumentsData = instruction.getArguments()\n  if (argumentsData && argumentsData.length > 0) {\n    const command = argumentsData\n      .map((arg: Argument) => arg.getValue())\n      .join(' ')\n    templateBuilder.runCmd(command)\n  }\n}\n\nfunction handleCopyInstruction(\n  instruction: DockerfileInstruction,\n  templateBuilder: DockerfileParserInterface\n): void {\n  const argumentsData = instruction.getArguments()\n  if (argumentsData && argumentsData.length >= 2) {\n    const src = argumentsData[0].getValue()\n    const dest = argumentsData[argumentsData.length - 1].getValue()\n    templateBuilder.copy(src, dest)\n  }\n}\n\nfunction handleWorkdirInstruction(\n  instruction: DockerfileInstruction,\n  templateBuilder: DockerfileParserInterface\n): void {\n  const argumentsData = instruction.getArguments()\n  if (argumentsData && argumentsData.length > 0) {\n    const workdir = argumentsData[0].getValue()\n    templateBuilder.setWorkdir(workdir)\n  }\n}\n\nfunction handleUserInstruction(\n  instruction: DockerfileInstruction,\n  templateBuilder: DockerfileParserInterface\n): void {\n  const argumentsData = instruction.getArguments()\n  if (argumentsData && argumentsData.length > 0) {\n    const user = argumentsData[0].getValue()\n    templateBuilder.setUser(user)\n  }\n}\n\nfunction handleEnvInstruction(\n  instruction: DockerfileInstruction,\n  templateBuilder: DockerfileParserInterface\n): void {\n  const argumentsData = instruction.getArguments()\n  const keyword = instruction.getKeyword()\n\n  if (argumentsData && argumentsData.length >= 1) {\n    const envVars: Record<string, string> = {}\n\n    if (argumentsData.length === 2) {\n      // ENV key value format OR multiple key=value pairs (from line continuation)\n      const firstArg = argumentsData[0].getValue()\n      const secondArg = argumentsData[1].getValue()\n\n      // Check if both arguments contain '=' (multiple key=value pairs)\n      if (firstArg.includes('=') && secondArg.includes('=')) {\n        // Both are key=value pairs (line continuation)\n        for (const arg of argumentsData) {\n          const envString = arg.getValue()\n          const equalIndex = envString.indexOf('=')\n          if (equalIndex > 0) {\n            const key = envString.substring(0, equalIndex)\n            const value = envString.substring(equalIndex + 1)\n            envVars[key] = value\n          }\n        }\n      } else {\n        // Traditional ENV key value format\n        envVars[firstArg] = secondArg\n      }\n    } else if (argumentsData.length === 1) {\n      // ENV/ARG key=value format (single argument) or ARG key (without default)\n      const envString = argumentsData[0].getValue()\n\n      // Check if it's a simple key=value or just a key (for ARG without default)\n      const equalIndex = envString.indexOf('=')\n      if (equalIndex > 0) {\n        const key = envString.substring(0, equalIndex)\n        const value = envString.substring(equalIndex + 1)\n        envVars[key] = value\n      } else if (keyword === 'ARG' && envString.trim()) {\n        // ARG without default value - set as empty ENV\n        const key = envString.trim()\n        envVars[key] = ''\n      }\n    } else {\n      // Multiple arguments (from line continuation with backslashes)\n      for (const arg of argumentsData) {\n        const envString = arg.getValue()\n        const equalIndex = envString.indexOf('=')\n        if (equalIndex > 0) {\n          const key = envString.substring(0, equalIndex)\n          const value = envString.substring(equalIndex + 1)\n          envVars[key] = value\n        } else if (keyword === 'ARG') {\n          // ARG without default value\n          const key = envString\n          envVars[key] = ''\n        }\n      }\n    }\n\n    // Call setEnvs once with all environment variables from this instruction\n    if (Object.keys(envVars).length > 0) {\n      templateBuilder.setEnvs(envVars)\n    }\n  }\n}\n\nfunction handleCmdEntrypointInstruction(\n  instruction: DockerfileInstruction,\n  templateBuilder: DockerfileParserInterface\n): void {\n  const argumentsData = instruction.getArguments()\n  if (argumentsData && argumentsData.length > 0) {\n    let command = argumentsData.map((arg: Argument) => arg.getValue()).join(' ')\n\n    try {\n      const parsedCommand = JSON.parse(command)\n      if (Array.isArray(parsedCommand)) {\n        command = parsedCommand.join(' ')\n      }\n    } catch {\n      // Do nothing\n    }\n\n    templateBuilder.setStartCmd(command, waitForTimeout(20_000))\n  }\n}\n","/**\n * Class for ready check commands.\n */\nexport class ReadyCmd {\n  private cmd: string\n\n  constructor(cmd: string) {\n    this.cmd = cmd\n  }\n\n  getCmd(): string {\n    return this.cmd\n  }\n}\n\n/**\n * Wait for a port to be listening.\n * Uses `ss` command to check if a port is open and listening.\n *\n * @param port Port number to wait for\n * @returns ReadyCmd that checks for the port\n *\n * @example\n * ```ts\n * import { Template, waitForPort } from 'e2b'\n *\n * const template = Template()\n *   .fromPythonImage()\n *   .setStartCmd('python -m http.server 8000', waitForPort(8000))\n * ```\n */\nexport function waitForPort(port: number): ReadyCmd {\n  const cmd = `ss -tuln | grep :${port}`\n  return new ReadyCmd(cmd)\n}\n\n/**\n * Wait for a URL to return a specific HTTP status code.\n * Uses `curl` to make HTTP requests and check the response status.\n *\n * @param url URL to check (e.g., 'http://localhost:3000/health')\n * @param statusCode Expected HTTP status code (default: 200)\n * @returns ReadyCmd that checks the URL\n *\n * @example\n * ```ts\n * import { Template, waitForURL } from 'e2b'\n *\n * const template = Template()\n *   .fromNodeImage()\n *   .setStartCmd('npm start', waitForURL('http://localhost:3000/health'))\n * ```\n */\nexport function waitForURL(url: string, statusCode: number = 200): ReadyCmd {\n  const cmd = `curl -s -o /dev/null -w \"%{http_code}\" ${url} | grep -q \"${statusCode}\"`\n  return new ReadyCmd(cmd)\n}\n\n/**\n * Wait for a process with a specific name to be running.\n * Uses `pgrep` to check if a process exists.\n *\n * @param processName Name of the process to wait for\n * @returns ReadyCmd that checks for the process\n *\n * @example\n * ```ts\n * import { Template, waitForProcess } from 'e2b'\n *\n * const template = Template()\n *   .fromBaseImage()\n *   .setStartCmd('./my-daemon', waitForProcess('my-daemon'))\n * ```\n */\nexport function waitForProcess(processName: string): ReadyCmd {\n  const cmd = `pgrep ${processName} > /dev/null`\n  return new ReadyCmd(cmd)\n}\n\n/**\n * Wait for a file to exist.\n * Uses shell test command to check file existence.\n *\n * @param filename Path to the file to wait for\n * @returns ReadyCmd that checks for the file\n *\n * @example\n * ```ts\n * import { Template, waitForFile } from 'e2b'\n *\n * const template = Template()\n *   .fromBaseImage()\n *   .setStartCmd('./init.sh', waitForFile('/tmp/ready'))\n * ```\n */\nexport function waitForFile(filename: string): ReadyCmd {\n  const cmd = `[ -f ${filename} ]`\n  return new ReadyCmd(cmd)\n}\n\n/**\n * Wait for a specified timeout before considering the sandbox ready.\n * Uses `sleep` command to wait for a fixed duration.\n *\n * @param timeout Time to wait in milliseconds (minimum: 1000ms / 1 second)\n * @returns ReadyCmd that waits for the specified duration\n *\n * @example\n * ```ts\n * import { Template, waitForTimeout } from 'e2b'\n *\n * const template = Template()\n *   .fromNodeImage()\n *   .setStartCmd('npm start', waitForTimeout(5000)) // Wait 5 seconds\n * ```\n */\nexport function waitForTimeout(timeout: number): ReadyCmd {\n  // convert to seconds, but ensure minimum of 1 second\n  const seconds = Math.max(1, Math.floor(timeout / 1000))\n  const cmd = `sleep ${seconds}`\n  return new ReadyCmd(cmd)\n}\n","import type { PathLike } from 'node:fs'\nimport { ApiClient } from '../api'\nimport { ConnectionConfig } from '../connectionConfig'\nimport { BuildError } from '../errors'\nimport { runtime } from '../utils'\nimport {\n  getFileUploadLink,\n  requestBuild,\n  triggerBuild,\n  TriggerBuildTemplate,\n  uploadFile,\n  waitForBuildFinish,\n} from './buildApi'\nimport { RESOLVE_SYMLINKS, STACK_TRACE_DEPTH } from './consts'\nimport { parseDockerfile } from './dockerfileParser'\nimport { LogEntry, LogEntryEnd, LogEntryStart } from './logger'\nimport { ReadyCmd, waitForFile } from './readycmd'\nimport {\n  BuildOptions,\n  CopyItem,\n  Instruction,\n  InstructionType,\n  McpServerName,\n  RegistryConfig,\n  TemplateBuilder,\n  TemplateClass,\n  TemplateFinal,\n  TemplateFromImage,\n  TemplateOptions,\n} from './types'\nimport {\n  calculateFilesHash,\n  getCallerDirectory,\n  getCallerFrame,\n  padOctal,\n  readDockerignore,\n  readGCPServiceAccountJSON,\n} from './utils'\n\n/**\n * Base class for building E2B sandbox templates.\n */\nexport class TemplateBase\n  implements TemplateFromImage, TemplateBuilder, TemplateFinal\n{\n  private defaultBaseImage: string = 'e2bdev/base'\n  private baseImage: string | undefined = this.defaultBaseImage\n  private baseTemplate: string | undefined = undefined\n  private registryConfig: RegistryConfig | undefined = undefined\n  private startCmd: string | undefined = undefined\n  private readyCmd: string | undefined = undefined\n  // Force the whole template to be rebuilt\n  private force: boolean = false\n  // Force the next layer to be rebuilt\n  private forceNextLayer: boolean = false\n  private instructions: Instruction[] = []\n  private fileContextPath: PathLike =\n    runtime === 'browser' ? '.' : (getCallerDirectory(STACK_TRACE_DEPTH) ?? '.')\n  private fileIgnorePatterns: string[] = []\n  private logsRefreshFrequency: number = 200\n  private stackTraces: (string | undefined)[] = []\n  private stackTracesEnabled: boolean = true\n  private stackTracesOverride: string | undefined = undefined\n\n  constructor(options?: TemplateOptions) {\n    this.fileContextPath = options?.fileContextPath ?? this.fileContextPath\n    this.fileIgnorePatterns =\n      options?.fileIgnorePatterns ?? this.fileIgnorePatterns\n  }\n\n  /**\n   * Convert a template to JSON representation.\n   *\n   * @param template The template to convert\n   * @param computeHashes Whether to compute file hashes for cache invalidation\n   * @returns JSON string representation of the template\n   */\n  static toJSON(\n    template: TemplateClass,\n    computeHashes: boolean = true\n  ): Promise<string> {\n    return (template as TemplateBase).toJSON(computeHashes)\n  }\n\n  /**\n   * Convert a template to Dockerfile format.\n   * Note: Templates based on other E2B templates cannot be converted to Dockerfile.\n   *\n   * @param template The template to convert\n   * @returns Dockerfile string representation\n   * @throws Error if the template is based on another E2B template\n   */\n  static toDockerfile(template: TemplateClass): string {\n    return (template as TemplateBase).toDockerfile()\n  }\n\n  /**\n   * Build and deploy a template to E2B infrastructure.\n   *\n   * @param template The template to build\n   * @param options Build configuration options\n   *\n   * @example\n   * ```ts\n   * const template = Template().fromPythonImage('3')\n   * await Template.build(template, {\n   *   alias: 'my-python-env',\n   *   cpuCount: 2,\n   *   memoryMB: 1024\n   * })\n   * ```\n   */\n  static async build(\n    template: TemplateClass,\n    options: BuildOptions\n  ): Promise<void> {\n    try {\n      options.onBuildLogs?.(new LogEntryStart(new Date(), 'Build started'))\n      return await (template as TemplateBase).build(options)\n    } finally {\n      options.onBuildLogs?.(new LogEntryEnd(new Date(), 'Build finished'))\n    }\n  }\n\n  fromDebianImage(variant: string = 'stable'): TemplateBuilder {\n    return this.fromImage(`debian:${variant}`)\n  }\n\n  fromUbuntuImage(variant: string = 'latest'): TemplateBuilder {\n    return this.fromImage(`ubuntu:${variant}`)\n  }\n\n  fromPythonImage(version: string = '3'): TemplateBuilder {\n    return this.fromImage(`python:${version}`)\n  }\n\n  fromNodeImage(variant: string = 'lts'): TemplateBuilder {\n    return this.fromImage(`node:${variant}`)\n  }\n\n  fromBunImage(variant: string = 'latest'): TemplateBuilder {\n    return this.fromImage(`oven/bun:${variant}`)\n  }\n\n  fromBaseImage(): TemplateBuilder {\n    return this.fromImage(this.defaultBaseImage)\n  }\n\n  fromImage(\n    baseImage: string,\n    credentials?: { username: string; password: string }\n  ): TemplateBuilder {\n    this.baseImage = baseImage\n    this.baseTemplate = undefined\n\n    // Set the registry config if provided\n    if (credentials) {\n      this.registryConfig = {\n        type: 'registry',\n        username: credentials.username,\n        password: credentials.password,\n      }\n    }\n\n    // If we should force the next layer and it's a FROM command, invalidate whole template\n    if (this.forceNextLayer) {\n      this.force = true\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  fromTemplate(template: string): TemplateBuilder {\n    this.baseTemplate = template\n    this.baseImage = undefined\n\n    // If we should force the next layer and it's a FROM command, invalidate whole template\n    if (this.forceNextLayer) {\n      this.force = true\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  fromDockerfile(dockerfileContentOrPath: string): TemplateBuilder {\n    const { baseImage } = this.runInStackTraceOverrideContext(\n      () => parseDockerfile(dockerfileContentOrPath, this),\n      // -1 as we're going up the call stack from the parseDockerfile function\n      getCallerFrame(STACK_TRACE_DEPTH - 1)\n    )\n    this.baseImage = baseImage\n    this.baseTemplate = undefined\n\n    // If we should force the next layer and it's a FROM command, invalidate whole template\n    if (this.forceNextLayer) {\n      this.force = true\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  fromAWSRegistry(\n    image: string,\n    credentials: {\n      accessKeyId: string\n      secretAccessKey: string\n      region: string\n    }\n  ): TemplateBuilder {\n    this.baseImage = image\n    this.baseTemplate = undefined\n\n    // Set the registry config if provided\n    this.registryConfig = {\n      type: 'aws',\n      awsAccessKeyId: credentials.accessKeyId,\n      awsSecretAccessKey: credentials.secretAccessKey,\n      awsRegion: credentials.region,\n    }\n\n    // If we should force the next layer and it's a FROM command, invalidate whole template\n    if (this.forceNextLayer) {\n      this.force = true\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  fromGCPRegistry(\n    image: string,\n    credentials: {\n      serviceAccountJSON: string | object\n    }\n  ): TemplateBuilder {\n    this.baseImage = image\n    this.baseTemplate = undefined\n\n    // Set the registry config if provided\n    this.registryConfig = {\n      type: 'gcp',\n      serviceAccountJson: readGCPServiceAccountJSON(\n        this.fileContextPath.toString(),\n        credentials.serviceAccountJSON\n      ),\n    }\n\n    // If we should force the next layer and it's a FROM command, invalidate whole template\n    if (this.forceNextLayer) {\n      this.force = true\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  copy(\n    src: PathLike | PathLike[],\n    dest: PathLike,\n    options?: {\n      forceUpload?: true\n      user?: string\n      mode?: number\n      resolveSymlinks?: boolean\n    }\n  ): TemplateBuilder {\n    if (runtime === 'browser') {\n      throw new Error('Browser runtime is not supported for copy')\n    }\n\n    const srcs = Array.isArray(src) ? src : [src]\n\n    for (const src of srcs) {\n      const args = [\n        src.toString(),\n        dest.toString(),\n        options?.user ?? '',\n        options?.mode ? padOctal(options.mode) : '',\n      ]\n\n      this.instructions.push({\n        type: InstructionType.COPY,\n        args,\n        force: options?.forceUpload || this.forceNextLayer,\n        forceUpload: options?.forceUpload,\n        resolveSymlinks: options?.resolveSymlinks,\n      })\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  copyItems(items: CopyItem[]): TemplateBuilder {\n    if (runtime === 'browser') {\n      throw new Error('Browser runtime is not supported for copyItems')\n    }\n\n    this.runInNewStackTraceContext(() => {\n      for (const item of items) {\n        this.copy(item.src, item.dest, {\n          forceUpload: item.forceUpload,\n          user: item.user,\n          mode: item.mode,\n          resolveSymlinks: item.resolveSymlinks,\n        })\n      }\n    })\n\n    return this\n  }\n\n  remove(\n    path: PathLike | PathLike[],\n    options?: { force?: boolean; recursive?: boolean; user?: string }\n  ): TemplateBuilder {\n    const paths = Array.isArray(path) ? path : [path]\n    const args = ['rm']\n    if (options?.recursive) {\n      args.push('-r')\n    }\n    if (options?.force) {\n      args.push('-f')\n    }\n    args.push(...paths.map((p) => p.toString()))\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), { user: options?.user })\n    )\n  }\n\n  rename(\n    src: PathLike,\n    dest: PathLike,\n    options?: { force?: boolean; user?: string }\n  ): TemplateBuilder {\n    const args = ['mv', src.toString(), dest.toString()]\n    if (options?.force) {\n      args.push('-f')\n    }\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), { user: options?.user })\n    )\n  }\n\n  makeDir(\n    path: PathLike | PathLike[],\n    options?: { mode?: number; user?: string }\n  ): TemplateBuilder {\n    const paths = Array.isArray(path) ? path : [path]\n    const args = ['mkdir', '-p']\n    if (options?.mode) {\n      args.push(`-m ${padOctal(options.mode)}`)\n    }\n    args.push(...paths.map((p) => p.toString()))\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), { user: options?.user })\n    )\n  }\n\n  makeSymlink(\n    src: PathLike,\n    dest: PathLike,\n    options?: { user?: string; force?: boolean }\n  ): TemplateBuilder {\n    const args = ['ln', '-s']\n    if (options?.force) {\n      args.push('-f')\n    }\n    args.push(src.toString(), dest.toString())\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), { user: options?.user })\n    )\n  }\n\n  runCmd(command: string, options?: { user?: string }): TemplateBuilder\n  runCmd(commands: string[], options?: { user?: string }): TemplateBuilder\n  runCmd(\n    commandOrCommands: string | string[],\n    options?: { user?: string }\n  ): TemplateBuilder {\n    const cmds = Array.isArray(commandOrCommands)\n      ? commandOrCommands\n      : [commandOrCommands]\n\n    const args = [cmds.join(' && ')]\n    if (options?.user) {\n      args.push(options.user)\n    }\n\n    this.instructions.push({\n      type: InstructionType.RUN,\n      args,\n      force: this.forceNextLayer,\n    })\n\n    this.collectStackTrace()\n    return this\n  }\n\n  setWorkdir(workdir: PathLike): TemplateBuilder {\n    this.instructions.push({\n      type: InstructionType.WORKDIR,\n      args: [workdir.toString()],\n      force: this.forceNextLayer,\n    })\n\n    this.collectStackTrace()\n    return this\n  }\n\n  setUser(user: string): TemplateBuilder {\n    this.instructions.push({\n      type: InstructionType.USER,\n      args: [user],\n      force: this.forceNextLayer,\n    })\n\n    this.collectStackTrace()\n    return this\n  }\n\n  pipInstall(\n    packages?: string | string[],\n    options?: { g?: boolean }\n  ): TemplateBuilder {\n    const g = options?.g ?? true\n\n    const args = ['pip', 'install']\n    const packageList = packages\n      ? Array.isArray(packages)\n        ? packages\n        : [packages]\n      : undefined\n    if (g === false) {\n      args.push('--user')\n    }\n    if (packageList) {\n      args.push(...packageList)\n    } else {\n      args.push('.')\n    }\n\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), {\n        user: g ? 'root' : undefined,\n      })\n    )\n  }\n\n  npmInstall(\n    packages?: string | string[],\n    options?: { g?: boolean; dev?: boolean }\n  ): TemplateBuilder {\n    const args = ['npm', 'install']\n    const packageList = packages\n      ? Array.isArray(packages)\n        ? packages\n        : [packages]\n      : undefined\n    if (options?.g) {\n      args.push('-g')\n    }\n    if (options?.dev) {\n      args.push('--save-dev')\n    }\n    if (packageList) {\n      args.push(...packageList)\n    }\n\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), {\n        user: options?.g ? 'root' : undefined,\n      })\n    )\n  }\n\n  bunInstall(\n    packages?: string | string[],\n    options?: { g?: boolean; dev?: boolean }\n  ): TemplateBuilder {\n    const args = ['bun', 'install']\n    const packageList = packages\n      ? Array.isArray(packages)\n        ? packages\n        : [packages]\n      : undefined\n    if (options?.g) {\n      args.push('-g')\n    }\n    if (options?.dev) {\n      args.push('--dev')\n    }\n    if (packageList) {\n      args.push(...packageList)\n    }\n\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), {\n        user: options?.g ? 'root' : undefined,\n      })\n    )\n  }\n\n  aptInstall(\n    packages: string | string[],\n    options?: { noInstallRecommends?: boolean }\n  ): TemplateBuilder {\n    const packageList = Array.isArray(packages) ? packages : [packages]\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(\n        [\n          'apt-get update',\n          `DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes apt-get install -y ${options?.noInstallRecommends ? '--no-install-recommends ' : ''}${packageList.join(\n            ' '\n          )}`,\n        ],\n        { user: 'root' }\n      )\n    )\n  }\n\n  addMcpServer(servers: McpServerName | McpServerName[]): TemplateBuilder {\n    if (this.baseTemplate !== 'mcp-gateway') {\n      throw new BuildError(\n        'MCP servers can only be added to mcp-gateway template',\n        getCallerFrame(STACK_TRACE_DEPTH - 1)\n      )\n    }\n\n    const serverList = Array.isArray(servers) ? servers : [servers]\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(`mcp-gateway pull ${serverList.join(' ')}`, {\n        user: 'root',\n      })\n    )\n  }\n\n  gitClone(\n    url: string,\n    path?: PathLike,\n    options?: { branch?: string; depth?: number; user?: string }\n  ): TemplateBuilder {\n    const args = ['git', 'clone', url]\n    if (options?.branch) {\n      args.push(`--branch ${options.branch}`)\n      args.push('--single-branch')\n    }\n    if (options?.depth) {\n      args.push(`--depth ${options.depth}`)\n    }\n    if (path) {\n      args.push(path.toString())\n    }\n\n    return this.runInNewStackTraceContext(() =>\n      this.runCmd(args.join(' '), { user: options?.user })\n    )\n  }\n\n  setStartCmd(\n    startCommand: string,\n    readyCommand: string | ReadyCmd\n  ): TemplateFinal {\n    this.startCmd = startCommand\n\n    if (readyCommand instanceof ReadyCmd) {\n      this.readyCmd = readyCommand.getCmd()\n    } else {\n      this.readyCmd = readyCommand\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  setReadyCmd(readyCommand: string | ReadyCmd): TemplateFinal {\n    if (readyCommand instanceof ReadyCmd) {\n      this.readyCmd = readyCommand.getCmd()\n    } else {\n      this.readyCmd = readyCommand\n    }\n\n    this.collectStackTrace()\n    return this\n  }\n\n  setEnvs(envs: Record<string, string>): TemplateBuilder {\n    if (Object.keys(envs).length === 0) {\n      return this\n    }\n\n    this.instructions.push({\n      type: InstructionType.ENV,\n      args: Object.entries(envs).flatMap(([key, value]) => [key, value]),\n      force: this.forceNextLayer,\n    })\n    this.collectStackTrace()\n    return this\n  }\n\n  skipCache(): this {\n    this.forceNextLayer = true\n    return this\n  }\n\n  betaDevContainerPrebuild(devcontainerDirectory: string): TemplateBuilder {\n    if (this.baseTemplate !== 'devcontainer') {\n      throw new BuildError(\n        'Devcontainers can only used in the devcontainer template',\n        getCallerFrame(STACK_TRACE_DEPTH - 1)\n      )\n    }\n\n    return this.runInNewStackTraceContext(() => {\n      return this.runCmd(\n        `devcontainer build --workspace-folder ${devcontainerDirectory}`,\n        { user: 'root' }\n      )\n    })\n  }\n\n  betaSetDevContainerStart(devcontainerDirectory: string): TemplateFinal {\n    if (this.baseTemplate !== 'devcontainer') {\n      throw new BuildError(\n        'Devcontainers can only used in the devcontainer template',\n        getCallerFrame(STACK_TRACE_DEPTH - 1)\n      )\n    }\n\n    return this.runInNewStackTraceContext(() => {\n      return this.setStartCmd(\n        `sudo devcontainer up --workspace-folder ${devcontainerDirectory} && sudo /prepare-exec.sh ${devcontainerDirectory} | sudo tee /devcontainer.sh > /dev/null && sudo chmod +x /devcontainer.sh && sudo touch /devcontainer.up`,\n        waitForFile('/devcontainer.up')\n      )\n    })\n  }\n\n  /**\n   * Collect the current stack trace for debugging purposes.\n   *\n   * @param stackTracesDepth Depth to traverse in the call stack\n   * @returns this for method chaining\n   */\n  private collectStackTrace(stackTracesDepth: number = STACK_TRACE_DEPTH) {\n    if (!this.stackTracesEnabled) {\n      return this\n    }\n\n    if (this.stackTracesOverride) {\n      this.stackTraces.push(this.stackTracesOverride)\n      return this\n    }\n\n    this.stackTraces.push(getCallerFrame(stackTracesDepth))\n    return this\n  }\n\n  /**\n   * Temporarily disable stack trace collection.\n   *\n   * @returns this for method chaining\n   */\n  private disableStackTrace() {\n    this.stackTracesEnabled = false\n    return this\n  }\n\n  /**\n   * Re-enable stack trace collection.\n   *\n   * @returns this for method chaining\n   */\n  private enableStackTrace() {\n    this.stackTracesEnabled = true\n    return this\n  }\n\n  /**\n   * Execute a function in a clean stack trace context.\n   *\n   * @param fn Function to execute\n   * @returns The result of the function\n   */\n  private runInNewStackTraceContext<T>(fn: () => T): T {\n    this.disableStackTrace()\n    const result = fn()\n    this.enableStackTrace()\n    this.collectStackTrace(STACK_TRACE_DEPTH + 1)\n    return result\n  }\n\n  private runInStackTraceOverrideContext<T>(\n    fn: () => T,\n    stackTraceOverride: string | undefined\n  ): T {\n    this.stackTracesOverride = stackTraceOverride\n    const result = fn()\n    this.stackTracesOverride = undefined\n    return result\n  }\n\n  /**\n   * Convert the template to JSON representation.\n   *\n   * @param computeHashes Whether to compute file hashes for COPY instructions\n   * @returns JSON string representation of the template\n   */\n  private async toJSON(computeHashes: boolean): Promise<string> {\n    let instructions = this.instructions\n    if (computeHashes) {\n      instructions = await this.instructionsWithHashes()\n    }\n\n    return JSON.stringify(this.serialize(instructions), undefined, 2)\n  }\n\n  /**\n   * Convert the template to Dockerfile format.\n   *\n   * Note: Only templates based on Docker images can be converted to Dockerfile.\n   * Templates based on other E2B templates cannot be converted because they\n   * may use features not available in standard Dockerfiles.\n   *\n   * @returns Dockerfile string representation\n   * @throws Error if template is based on another E2B template or has no base image\n   */\n  private toDockerfile(): string {\n    if (this.baseTemplate !== undefined) {\n      throw new Error(\n        'Cannot convert template built from another template to Dockerfile. ' +\n          'Templates based on other templates can only be built using the E2B API.'\n      )\n    }\n\n    if (this.baseImage === undefined) {\n      throw new Error('No base image specified for template')\n    }\n\n    let dockerfile = `FROM ${this.baseImage}\\n`\n    for (const instruction of this.instructions) {\n      if (instruction.type === InstructionType.RUN) {\n        dockerfile += `RUN ${instruction.args[0]}\\n`\n        continue\n      }\n      if (instruction.type === InstructionType.COPY) {\n        dockerfile += `COPY ${instruction.args[0]} ${instruction.args[1]}\\n`\n        continue\n      }\n      dockerfile += `${instruction.type} ${instruction.args.join(' ')}\\n`\n    }\n    if (this.startCmd) {\n      dockerfile += `ENTRYPOINT ${this.startCmd}\\n`\n    }\n    return dockerfile\n  }\n\n  /**\n   * Internal implementation of the template build process.\n   *\n   * @param options Build configuration options\n   * @throws BuildError if the build fails\n   */\n  private async build(options: BuildOptions): Promise<void> {\n    const config = new ConnectionConfig({\n      domain: options.domain,\n      apiKey: options.apiKey,\n    })\n    const client = new ApiClient(config)\n\n    if (options.skipCache) {\n      this.force = true\n    }\n\n    // Create template\n    options.onBuildLogs?.(\n      new LogEntry(\n        new Date(),\n        'info',\n        `Requesting build for template: ${options.alias}`\n      )\n    )\n\n    const { templateID, buildID } = await requestBuild(client, {\n      alias: options.alias,\n      cpuCount: options.cpuCount ?? 2,\n      memoryMB: options.memoryMB ?? 1024,\n    })\n\n    options.onBuildLogs?.(\n      new LogEntry(\n        new Date(),\n        'info',\n        `Template created with ID: ${templateID}, Build ID: ${buildID}`\n      )\n    )\n\n    const instructionsWithHashes = await this.instructionsWithHashes()\n\n    // Upload files in parallel\n    const uploadPromises = instructionsWithHashes.map(\n      async (instruction, index) => {\n        if (instruction.type !== InstructionType.COPY) {\n          return\n        }\n\n        const src = instruction.args.length > 0 ? instruction.args[0] : null\n        const filesHash = instruction.filesHash ?? null\n        if (src === null || filesHash === null) {\n          throw new Error('Source path and files hash are required')\n        }\n\n        const forceUpload = instruction.forceUpload\n        let stackTrace = undefined\n        if (index + 1 >= 0 && index + 1 < this.stackTraces.length) {\n          stackTrace = this.stackTraces[index + 1]\n        }\n\n        const { present, url } = await getFileUploadLink(\n          client,\n          {\n            templateID,\n            filesHash,\n          },\n          stackTrace\n        )\n\n        if (\n          (forceUpload && url != null) ||\n          (present === false && url != null)\n        ) {\n          await uploadFile(\n            {\n              fileName: src,\n              fileContextPath: this.fileContextPath.toString(),\n              url,\n              resolveSymlinks: instruction.resolveSymlinks ?? RESOLVE_SYMLINKS,\n            },\n            stackTrace\n          )\n          options.onBuildLogs?.(\n            new LogEntry(new Date(), 'info', `Uploaded '${src}'`)\n          )\n        } else {\n          options.onBuildLogs?.(\n            new LogEntry(\n              new Date(),\n              'info',\n              `Skipping upload of '${src}', already cached`\n            )\n          )\n        }\n      }\n    )\n\n    await Promise.all(uploadPromises)\n\n    options.onBuildLogs?.(\n      new LogEntry(new Date(), 'info', 'All file uploads completed')\n    )\n\n    // Start build\n    options.onBuildLogs?.(\n      new LogEntry(new Date(), 'info', 'Starting building...')\n    )\n\n    await triggerBuild(client, {\n      templateID,\n      buildID,\n      template: this.serialize(instructionsWithHashes),\n    })\n\n    options.onBuildLogs?.(\n      new LogEntry(new Date(), 'info', 'Waiting for logs...')\n    )\n\n    await waitForBuildFinish(client, {\n      templateID,\n      buildID,\n      onBuildLogs: options.onBuildLogs,\n      logsRefreshFrequency: this.logsRefreshFrequency,\n      stackTraces: this.stackTraces,\n    })\n  }\n\n  /**\n   * Add file hashes to COPY instructions for cache invalidation.\n   *\n   * @returns Copy of instructions array with filesHash added to COPY instructions\n   */\n  private async instructionsWithHashes(): Promise<Instruction[]> {\n    return Promise.all(\n      this.instructions.map(async (instruction, index) => {\n        if (instruction.type !== InstructionType.COPY) {\n          return instruction\n        }\n\n        const src = instruction.args.length > 0 ? instruction.args[0] : null\n        const dest = instruction.args.length > 1 ? instruction.args[1] : null\n        if (src === null || dest === null) {\n          throw new Error('Source path and destination path are required')\n        }\n\n        let stackTrace = undefined\n        if (index + 1 >= 0 && index + 1 < this.stackTraces.length) {\n          stackTrace = this.stackTraces[index + 1]\n        }\n\n        return {\n          ...instruction,\n          filesHash: await calculateFilesHash(\n            src,\n            dest,\n            this.fileContextPath.toString(),\n            [\n              ...this.fileIgnorePatterns,\n              ...(runtime === 'browser'\n                ? []\n                : readDockerignore(this.fileContextPath.toString())),\n            ],\n            instruction.resolveSymlinks ?? RESOLVE_SYMLINKS,\n            stackTrace\n          ),\n        }\n      })\n    )\n  }\n\n  /**\n   * Serialize the template to the API request format.\n   *\n   * @param steps Array of build instructions with file hashes\n   * @returns Template data formatted for the API\n   */\n  private serialize(steps: Instruction[]): TriggerBuildTemplate {\n    const templateData: TriggerBuildTemplate = {\n      startCmd: this.startCmd,\n      readyCmd: this.readyCmd,\n      steps,\n      force: this.force,\n    }\n\n    if (this.baseImage !== undefined) {\n      templateData.fromImage = this.baseImage\n    }\n\n    if (this.baseTemplate !== undefined) {\n      templateData.fromTemplate = this.baseTemplate\n    }\n\n    if (this.registryConfig !== undefined) {\n      templateData.fromImageRegistry = this.registryConfig\n    }\n\n    return templateData\n  }\n}\n\n/**\n * Create a new E2B template builder instance.\n *\n * @param options Optional configuration for the template builder\n * @returns A new template builder instance\n *\n * @example\n * ```ts\n * import { Template } from 'e2b'\n *\n * const template = Template()\n *   .fromPythonImage('3')\n *   .copy('requirements.txt', '/app/')\n *   .pipInstall()\n *\n * await Template.build(template, { alias: 'my-python-app' })\n * ```\n */\nexport function Template(options?: TemplateOptions): TemplateFromImage {\n  return new TemplateBase(options)\n}\n\nTemplate.build = TemplateBase.build\nTemplate.toJSON = TemplateBase.toJSON\nTemplate.toDockerfile = TemplateBase.toDockerfile\n\nexport type {\n  BuildOptions,\n  CopyItem,\n  McpServerName,\n  TemplateBuilder,\n  TemplateClass,\n} from './types'\n","export { ApiClient } from './api'\nexport type { components, paths } from './api'\n\nexport { ConnectionConfig } from './connectionConfig'\nexport type { ConnectionOpts, Username } from './connectionConfig'\nexport {\n  AuthenticationError,\n  InvalidArgumentError,\n  NotEnoughSpaceError,\n  NotFoundError,\n  SandboxError,\n  TemplateError,\n  TimeoutError,\n  RateLimitError,\n  BuildError,\n  FileUploadError,\n} from './errors'\nexport type { Logger } from './logs'\n\nexport { getSignature } from './sandbox/signature'\n\nexport { FileType } from './sandbox/filesystem'\nexport type { WriteInfo, EntryInfo, Filesystem } from './sandbox/filesystem'\nexport { FilesystemEventType } from './sandbox/filesystem/watchHandle'\nexport type {\n  FilesystemEvent,\n  WatchHandle,\n} from './sandbox/filesystem/watchHandle'\n\nexport { CommandExitError } from './sandbox/commands/commandHandle'\nexport type {\n  CommandResult,\n  Stdout,\n  Stderr,\n  PtyOutput,\n  CommandHandle,\n} from './sandbox/commands/commandHandle'\nexport type {\n  SandboxInfo,\n  SandboxMetrics,\n  SandboxOpts,\n  SandboxApiOpts,\n  SandboxConnectOpts,\n  SandboxBetaCreateOpts,\n  SandboxMetricsOpts,\n  SandboxState,\n  SandboxListOpts,\n  SandboxPaginator,\n} from './sandbox/sandboxApi'\n\nexport type { McpServer } from './sandbox/mcp'\n\nexport type {\n  ProcessInfo,\n  CommandRequestOpts,\n  CommandConnectOpts,\n  CommandStartOpts,\n  Commands,\n  Pty,\n} from './sandbox/commands'\n\nexport { Sandbox }\nimport { Sandbox } from './sandbox'\n\nexport default Sandbox\n\nexport * from './template'\n\nexport {\n  ReadyCmd,\n  waitForPort,\n  waitForURL,\n  waitForProcess,\n  waitForFile,\n  waitForTimeout,\n} from './template/readycmd'\n\nexport {\n  LogEntry,\n  LogEntryStart,\n  LogEntryEnd,\n  type LogEntryLevel,\n  defaultBuildLogger,\n} from './template/logger'\n"],"mappings":"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","names":["platform","_a","platform","_a","_a","message","_a","path","Code","ConnectError","createClient","createClient","_a","createClient","Code","ConnectError","ConnectError","Code","FilesystemEventType","_a","compareVersions","FileType","Filesystem","createClient","path","_a","compareVersions","ConnectError","Code","_a","Code","ConnectError","createClient","compareVersions","enumDesc","fileDesc","messageDesc","serviceDesc","serviceDesc","Code","ConnectError","createClient","createClient","_a","ConnectError","Code","createClient","ConnectError","Code","_a","pid","compareVersions","compareVersions","_a","compareVersions","compareVersions","_a","Filesystem","path","compareVersions","crypto","crypto","stats","content","_a","fs","fs","_a","version","src","path","paths","_b","_c","_d"]}