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.
72 lines
2.6 KiB
TypeScript
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.`,
|
|
);
|
|
}
|
|
}
|