evOo-local/packages/adapters/src/sandbox-factory.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

72 lines
2.6 KiB
TypeScript

import type { SandboxProvider } from "@rakazo/adapter-kit";
import { BoxSandboxEmulator } from "./box-emulator.js";
import { BoxSandboxProvider } from "./box-sandbox.js";
import { DaytonaSandboxEmulator } from "./daytona-emulator.js";
import { DaytonaSandboxProvider } from "./daytona-sandbox.js";
import { DesktopSandboxProvider } from "./desktop-sandbox.js";
import { DockerSandboxProvider } from "./docker-sandbox.js";
import { ManagedSandboxEmulator } from "./e2b-emulator.js";
import { E2BSandboxProvider } from "./e2b-sandbox.js";
import { FakeSandboxProvider } from "./fake-sandbox.js";
import { NoneSandboxProvider } from "./none-sandbox.js";
export interface SandboxProviderOptions {
supervisorUrl?: string;
supervisorToken?: string;
e2bApiKey?: string;
daytonaApiKey?: string;
daytonaApiUrl?: string;
daytonaTarget?: string;
boxApiKey?: string;
boxApiUrl?: string;
dataDir?: string;
}
function missingRemoteKey(provider: "e2b" | "daytona" | "box", envName: string): SandboxProvider {
return new NoneSandboxProvider(
`Computers unavailable: ${envName} is required for SANDBOX_PROVIDER=${provider}.`,
);
}
export function createSandboxProvider(kind: string, opts: SandboxProviderOptions): SandboxProvider {
switch (kind) {
case "none":
case "":
return new NoneSandboxProvider();
case "e2b":
if (!opts.e2bApiKey?.trim()) return missingRemoteKey("e2b", "E2B_API_KEY");
return new E2BSandboxProvider(opts.e2bApiKey);
case "daytona":
if (!opts.daytonaApiKey?.trim()) return missingRemoteKey("daytona", "DAYTONA_API_KEY");
return new DaytonaSandboxProvider({
apiKey: opts.daytonaApiKey,
apiUrl: opts.daytonaApiUrl,
target: opts.daytonaTarget,
});
case "box":
if (!opts.boxApiKey?.trim()) return missingRemoteKey("box", "BOX_API_KEY");
return new BoxSandboxProvider({ apiKey: opts.boxApiKey, apiUrl: opts.boxApiUrl });
case "docker":
return new DockerSandboxProvider(
opts.supervisorUrl ?? "http://127.0.0.1:7091",
opts.supervisorToken,
);
case "e2b-emulator":
return new ManagedSandboxEmulator();
case "daytona-emulator":
return new DaytonaSandboxEmulator();
case "box-emulator":
return new BoxSandboxEmulator();
case "desktop":
return new DesktopSandboxProvider({
root: opts.dataDir,
});
case "fake":
return new FakeSandboxProvider();
default:
throw new Error(
`Unknown SANDBOX_PROVIDER "${kind}". Use none | docker | e2b | daytona | box | e2b-emulator | daytona-emulator | box-emulator | desktop | fake.`,
);
}
}