{"version":3,"file":"index.mjs","names":["E2BSandbox","events: ProcessOutputEvent[]"],"sources":["../../../src/providers/e2b/index.ts"],"sourcesContent":["import { Sandbox as E2BSandbox } from \"e2b\";\nimport { normalizeError } from \"../../core/errors\";\nimport type { SandboxProvider } from \"../../core/provider\";\nimport type { ProcessOutputEvent, SandboxProcess, SandboxSnapshot } from \"../../core/types\";\nimport {\n  commandString,\n  portResult,\n  toUint8Array,\n  unsupported,\n} from \"../../internal/provider-utils\";\nimport { e2bCapabilities } from \"../capabilities\";\nimport { withManagedSessions } from \"../../internal/managed-provider\";\n\nexport interface E2BOptions {\n  apiKey?: string;\n  template?: string;\n  timeout?: number;\n}\n\nexport { e2bCapabilities } from \"../capabilities\";\n\nexport function e2b(options: E2BOptions = {}): SandboxProvider<E2BSandbox> {\n  return withManagedSessions(\n    {\n      id: \"e2b\",\n      capabilities: e2bCapabilities,\n      async create(createOptions) {\n        const create = {\n          apiKey: options.apiKey,\n          timeoutMs: options.timeout ?? createOptions.timeout,\n          envs: { ...createOptions.env },\n          signal: createOptions.signal,\n        };\n        const raw = options.template\n          ? await E2BSandbox.create(options.template, create)\n          : await E2BSandbox.create(create);\n        try {\n          await raw.files.makeDir(createOptions.cwd);\n        } catch (error) {\n          await raw.kill().catch(() => undefined);\n          throw error;\n        }\n        return {\n          id: raw.sandboxId,\n          raw,\n          capabilities: e2bCapabilities,\n          files: {\n            async write(path, value) {\n              await raw.files.write(path, Uint8Array.from(await toUint8Array(value)).buffer);\n            },\n            read: (path) => raw.files.read(path, { format: \"bytes\" }),\n            async list(path) {\n              return (await raw.files.list(path)).map((entry) => ({\n                name: entry.name,\n                path: entry.path,\n                type:\n                  entry.type === \"file\"\n                    ? (\"file\" as const)\n                    : entry.type === \"dir\"\n                      ? (\"directory\" as const)\n                      : (\"unknown\" as const),\n                size: entry.size,\n              }));\n            },\n            async mkdir(path) {\n              await raw.files.makeDir(path);\n            },\n            remove: (path) => raw.files.remove(path),\n            exists: (path) => raw.files.exists(path),\n          },\n          async run(command, runOptions) {\n            try {\n              const started = performance.now();\n              const result = await raw.commands.run(commandString(command), {\n                cwd: runOptions.cwd,\n                envs: { ...runOptions.env },\n                timeoutMs: runOptions.timeout,\n                signal: runOptions.signal,\n              });\n              return {\n                stdout: result.stdout,\n                stderr: result.stderr,\n                exitCode: result.exitCode,\n                success: result.exitCode === 0,\n                durationMs: Math.round(performance.now() - started),\n              };\n            } catch (error) {\n              throw normalizeError(\"e2b\", \"process.run\", error);\n            }\n          },\n          async start(command, runOptions) {\n            const events: ProcessOutputEvent[] = [];\n            const waiters = new Set<() => void>();\n            let running = true;\n            const push = (stream: \"stdout\" | \"stderr\", data: string) => {\n              events.push({ stream, data, timestamp: new Date() });\n              for (const wake of waiters) wake();\n              waiters.clear();\n            };\n            const handle = await raw.commands.run(commandString(command), {\n              cwd: runOptions.cwd,\n              envs: { ...runOptions.env },\n              timeoutMs: runOptions.timeout,\n              signal: runOptions.signal,\n              background: true,\n              stdin: true,\n              onStdout: (data) => push(\"stdout\", data),\n              onStderr: (data) => push(\"stderr\", data),\n            });\n            const completed = handle.wait().then((result) => ({ exitCode: result.exitCode }));\n            const finish = () => {\n              running = false;\n              for (const wake of waiters) wake();\n              waiters.clear();\n            };\n            void completed.then(finish, finish);\n            const process: SandboxProcess = {\n              id: String(handle.pid),\n              async status() {\n                return running ? \"running\" : \"exited\";\n              },\n              async *output() {\n                let index = 0;\n                while (running || index < events.length) {\n                  while (index < events.length) yield events[index++]!;\n                  if (!running) break;\n                  await new Promise<void>((resolve) => waiters.add(resolve));\n                }\n              },\n              write: (value) => handle.sendStdin(value),\n              wait: () => completed,\n              async kill() {\n                await handle.kill();\n                running = false;\n              },\n            };\n            return process;\n          },\n          async expose(port) {\n            const host = raw.getHost(port);\n            const url = `https://${host}`;\n            const token = raw.trafficAccessToken;\n            return portResult(\n              port,\n              url,\n              !token,\n              Boolean(token),\n              token\n                ? (path = \"/\", init = {}) =>\n                    fetch(new URL(path, url), {\n                      ...init,\n                      headers: {\n                        ...Object.fromEntries(new Headers(init.headers)),\n                        \"x-access-token\": token,\n                      },\n                    })\n                : undefined,\n            );\n          },\n          snapshots: {\n            async create(snapshotOptions) {\n              const snapshot = await raw.createSnapshot({ name: snapshotOptions?.name });\n              return {\n                id: snapshot.snapshotId,\n                name: snapshot.names[0],\n                mode: \"template\",\n              } as SandboxSnapshot;\n            },\n            async delete(snapshot) {\n              await E2BSandbox.deleteSnapshot(\n                typeof snapshot === \"string\" ? snapshot : snapshot.id,\n                {\n                  apiKey: options.apiKey,\n                },\n              );\n            },\n            async restore() {\n              unsupported(\"e2b\", \"snapshot.restore\");\n            },\n          },\n          async stop() {\n            await raw.kill();\n          },\n        };\n      },\n    },\n    [],\n    {\n      stop: async (sandbox) => {\n        await sandbox.raw.pause();\n      },\n      resume: async (sandbox) => {\n        await sandbox.raw.connect();\n      },\n      destroy: async (sandbox) => {\n        await sandbox.raw.kill();\n      },\n    },\n  );\n}\n\nexport type { E2BSandbox };\n"],"mappings":";;;;;;;;;AAqBA,SAAgB,IAAI,UAAsB,EAAE,EAA+B;AACzE,QAAO,oBACL;EACE,IAAI;EACJ,cAAc;EACd,MAAM,OAAO,eAAe;GAC1B,MAAM,SAAS;IACb,QAAQ,QAAQ;IAChB,WAAW,QAAQ,WAAW,cAAc;IAC5C,MAAM,EAAE,GAAG,cAAc,KAAK;IAC9B,QAAQ,cAAc;IACvB;GACD,MAAM,MAAM,QAAQ,WAChB,MAAMA,QAAW,OAAO,QAAQ,UAAU,OAAO,GACjD,MAAMA,QAAW,OAAO,OAAO;AACnC,OAAI;AACF,UAAM,IAAI,MAAM,QAAQ,cAAc,IAAI;YACnC,OAAO;AACd,UAAM,IAAI,MAAM,CAAC,YAAY,OAAU;AACvC,UAAM;;AAER,UAAO;IACL,IAAI,IAAI;IACR;IACA,cAAc;IACd,OAAO;KACL,MAAM,MAAM,MAAM,OAAO;AACvB,YAAM,IAAI,MAAM,MAAM,MAAM,WAAW,KAAK,MAAM,aAAa,MAAM,CAAC,CAAC,OAAO;;KAEhF,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,EAAE,QAAQ,SAAS,CAAC;KACzD,MAAM,KAAK,MAAM;AACf,cAAQ,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,KAAK,WAAW;OAClD,MAAM,MAAM;OACZ,MAAM,MAAM;OACZ,MACE,MAAM,SAAS,SACV,SACD,MAAM,SAAS,QACZ,cACA;OACT,MAAM,MAAM;OACb,EAAE;;KAEL,MAAM,MAAM,MAAM;AAChB,YAAM,IAAI,MAAM,QAAQ,KAAK;;KAE/B,SAAS,SAAS,IAAI,MAAM,OAAO,KAAK;KACxC,SAAS,SAAS,IAAI,MAAM,OAAO,KAAK;KACzC;IACD,MAAM,IAAI,SAAS,YAAY;AAC7B,SAAI;MACF,MAAM,UAAU,YAAY,KAAK;MACjC,MAAM,SAAS,MAAM,IAAI,SAAS,IAAI,cAAc,QAAQ,EAAE;OAC5D,KAAK,WAAW;OAChB,MAAM,EAAE,GAAG,WAAW,KAAK;OAC3B,WAAW,WAAW;OACtB,QAAQ,WAAW;OACpB,CAAC;AACF,aAAO;OACL,QAAQ,OAAO;OACf,QAAQ,OAAO;OACf,UAAU,OAAO;OACjB,SAAS,OAAO,aAAa;OAC7B,YAAY,KAAK,MAAM,YAAY,KAAK,GAAG,QAAQ;OACpD;cACM,OAAO;AACd,YAAM,eAAe,OAAO,eAAe,MAAM;;;IAGrD,MAAM,MAAM,SAAS,YAAY;KAC/B,MAAMC,SAA+B,EAAE;KACvC,MAAM,0BAAU,IAAI,KAAiB;KACrC,IAAI,UAAU;KACd,MAAM,QAAQ,QAA6B,SAAiB;AAC1D,aAAO,KAAK;OAAE;OAAQ;OAAM,2BAAW,IAAI,MAAM;OAAE,CAAC;AACpD,WAAK,MAAM,QAAQ,QAAS,OAAM;AAClC,cAAQ,OAAO;;KAEjB,MAAM,SAAS,MAAM,IAAI,SAAS,IAAI,cAAc,QAAQ,EAAE;MAC5D,KAAK,WAAW;MAChB,MAAM,EAAE,GAAG,WAAW,KAAK;MAC3B,WAAW,WAAW;MACtB,QAAQ,WAAW;MACnB,YAAY;MACZ,OAAO;MACP,WAAW,SAAS,KAAK,UAAU,KAAK;MACxC,WAAW,SAAS,KAAK,UAAU,KAAK;MACzC,CAAC;KACF,MAAM,YAAY,OAAO,MAAM,CAAC,MAAM,YAAY,EAAE,UAAU,OAAO,UAAU,EAAE;KACjF,MAAM,eAAe;AACnB,gBAAU;AACV,WAAK,MAAM,QAAQ,QAAS,OAAM;AAClC,cAAQ,OAAO;;AAEjB,KAAK,UAAU,KAAK,QAAQ,OAAO;AAqBnC,YApBgC;MAC9B,IAAI,OAAO,OAAO,IAAI;MACtB,MAAM,SAAS;AACb,cAAO,UAAU,YAAY;;MAE/B,OAAO,SAAS;OACd,IAAI,QAAQ;AACZ,cAAO,WAAW,QAAQ,OAAO,QAAQ;AACvC,eAAO,QAAQ,OAAO,OAAQ,OAAM,OAAO;AAC3C,YAAI,CAAC,QAAS;AACd,cAAM,IAAI,SAAe,YAAY,QAAQ,IAAI,QAAQ,CAAC;;;MAG9D,QAAQ,UAAU,OAAO,UAAU,MAAM;MACzC,YAAY;MACZ,MAAM,OAAO;AACX,aAAM,OAAO,MAAM;AACnB,iBAAU;;MAEb;;IAGH,MAAM,OAAO,MAAM;KAEjB,MAAM,MAAM,WADC,IAAI,QAAQ,KAAK;KAE9B,MAAM,QAAQ,IAAI;AAClB,YAAO,WACL,MACA,KACA,CAAC,OACD,QAAQ,MAAM,EACd,SACK,OAAO,KAAK,OAAO,EAAE,KACpB,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE;MACxB,GAAG;MACH,SAAS;OACP,GAAG,OAAO,YAAY,IAAI,QAAQ,KAAK,QAAQ,CAAC;OAChD,kBAAkB;OACnB;MACF,CAAC,GACJ,OACL;;IAEH,WAAW;KACT,MAAM,OAAO,iBAAiB;MAC5B,MAAM,WAAW,MAAM,IAAI,eAAe,EAAE,MAAM,iBAAiB,MAAM,CAAC;AAC1E,aAAO;OACL,IAAI,SAAS;OACb,MAAM,SAAS,MAAM;OACrB,MAAM;OACP;;KAEH,MAAM,OAAO,UAAU;AACrB,YAAMD,QAAW,eACf,OAAO,aAAa,WAAW,WAAW,SAAS,IACnD,EACE,QAAQ,QAAQ,QACjB,CACF;;KAEH,MAAM,UAAU;AACd,kBAAY,OAAO,mBAAmB;;KAEzC;IACD,MAAM,OAAO;AACX,WAAM,IAAI,MAAM;;IAEnB;;EAEJ,EACD,EAAE,EACF;EACE,MAAM,OAAO,YAAY;AACvB,SAAM,QAAQ,IAAI,OAAO;;EAE3B,QAAQ,OAAO,YAAY;AACzB,SAAM,QAAQ,IAAI,SAAS;;EAE7B,SAAS,OAAO,YAAY;AAC1B,SAAM,QAAQ,IAAI,MAAM;;EAE3B,CACF"}