Overview
Create a registry system for managing multiple sandbox providers and a factory for creating provider instances.
Design
Provider Registry
// src/e2b/providers/registry.ts
export class ProviderRegistry {
private providers: Map<string, SandboxProvider> = new Map();
register(provider: SandboxProvider): void {
this.providers.set(provider.name, provider);
}
get(name: string): SandboxProvider | undefined {
return this.providers.get(name);
}
list(): string[] {
return Array.from(this.providers.keys());
}
getDefault(): SandboxProvider {
// Return based on config or first available
}
}
Provider Factory
// src/e2b/providers/factory.ts
export function createProvider(
name: string,
config?: ProviderConfig
): SandboxProvider {
switch (name) {
case 'e2b':
return new E2BProvider(config);
case 'native':
return new NativeProvider(config);
case 'docker':
return new DockerProvider(config);
default:
throw new Error(\`Unknown provider: \${name}\`);
}
}
Auto-Discovery
// Auto-discover available providers on startup
async function discoverProviders(): Promise<string[]> {
const available: string[] = [];
if (await E2BProvider.isAvailable()) available.push('e2b');
if (await NativeProvider.isAvailable()) available.push('native');
if (await DockerProvider.isAvailable()) available.push('docker');
return available;
}
Configuration
// ~/.parallel-cc/config.json
{
"sandbox": {
"defaultProvider": "e2b",
"fallbackChain": ["native", "docker"],
"providers": {
"e2b": {
"template": "anthropic-claude-code"
},
"docker": {
"image": "claude-code:latest"
}
}
}
}
Files to Create
src/e2b/providers/registry.ts
src/e2b/providers/factory.ts
src/e2b/providers/discovery.ts
Acceptance Criteria
Dependencies
Overview
Create a registry system for managing multiple sandbox providers and a factory for creating provider instances.
Design
Provider Registry
Provider Factory
Auto-Discovery
Configuration
Files to Create
src/e2b/providers/registry.tssrc/e2b/providers/factory.tssrc/e2b/providers/discovery.tsAcceptance Criteria
Dependencies