Skip to main content

Sandbox System

Extensible sandbox provider system for safe code execution in isolated environments.


Overview

The sandbox system provides an extensible provider architecture for executing code safely in isolated environments. Sandbox configuration is a session-level configuration, not an Agent configuration.


Provider Types

ProviderIsolation LevelNetwork AccessUse Case
NativeNoneYesDevelopment/testing, fallback for other providers
CodexOS-level (Seatbelt/Landlock)NoHigh security requirements
ClaudeProcess-levelYesGeneral security requirements

Selection Priority

Codex (most secure) > Claude (moderate) > Native (no isolation, fallback)

Architecture

Desktop (React) packages/core Sandbox Provider
| | |
| /api/sandbox/exec | |
+-----------------------------> |
| | SandboxService.exec() |
| +------------------------------>
| | |
| { stdout, stderr, ... } |<------------------------------
|<---------------------------- SandboxExecResult |
| | |

Type Definitions

Core Types

type SandboxProviderType = 'native' | 'codex' | 'claude';

interface SandboxCapabilities {
supportsVolumeMounts: boolean;
supportsNetworking: boolean;
isolation: 'vm' | 'container' | 'process' | 'none';
supportedRuntimes: string[];
supportsPooling: boolean;
}

interface SandboxExecOptions {
command: string;
args?: string[];
cwd?: string;
env?: Record<string, string>;
timeout?: number;
image?: string;
}

interface SandboxExecResult {
stdout: string;
stderr: string;
exitCode: number;
duration: number;
provider?: {
type: SandboxProviderType;
name: string;
};
}

Sandbox Config (Session-Level)

interface SandboxConfig {
enabled: boolean;
provider?: SandboxProviderType;
image?: string;
providerConfig?: Record<string, unknown>;
}

Provider Interface

interface ISandboxProvider {
readonly type: SandboxProviderType;
readonly name: string;

isAvailable(): Promise<boolean>;
init(config?: Record<string, unknown>): Promise<void>;
exec(options: SandboxExecOptions): Promise<SandboxExecResult>;
runScript(filePath: string, workDir: string, options?: ScriptOptions): Promise<SandboxExecResult>;
stop(): Promise<void>;
shutdown(): Promise<void>;
getCapabilities(): SandboxCapabilities;
}

Provider Implementations

Native Provider

File: packages/core/src/sandbox/providers/native.ts

  • No isolation, uses spawn() directly
  • Auto-detects runtime (node, python, bash)
  • Supports package installation (npm, pip)
  • Always available as fallback

Codex Provider

File: packages/core/src/sandbox/providers/codex.ts

  • Uses OpenAI Codex CLI sandbox functionality
  • OS-level isolation (macOS: Seatbelt, Linux: Landlock)
  • No network access (security-first)
  • Auto-detects codex executable path

Claude Provider

File: packages/core/src/sandbox/providers/claude.ts

  • Uses Anthropic sandbox-runtime (srt)
  • Process-level isolation
  • Supports network access
  • Auto-detects srt executable path

Service Layer

SandboxService

export class SandboxService {
async init(): Promise<void>;
async getBestProvider(preferred?: SandboxProviderType): Promise<ISandboxProvider>;
async exec(options: SandboxExecOptions, preferred?: SandboxProviderType): Promise<SandboxExecResult>;
async runScript(filePath: string, workDir: string, options?: ScriptOptions, preferred?: SandboxProviderType): Promise<SandboxExecResult>;
async getAvailableProviders(): Promise<SandboxProviderType[]>;
async shutdown(): Promise<void>;
}

Gateway Routes

EndpointMethodDescription
/api/sandbox/availableGETGet available provider list
/api/sandbox/execPOSTExecute a command
/api/sandbox/run/filePOSTRun a script file

Example Requests

# Check available providers
curl http://127.0.0.1:18790/api/sandbox/available

# Execute command (Native)
curl -X POST http://127.0.0.1:18790/api/sandbox/exec \
-H "Content-Type: application/json" \
-d '{"command": "echo", "args": ["hello"]}'

# Run script
curl -X POST http://127.0.0.1:18790/api/sandbox/run/file \
-H "Content-Type: application/json" \
-d '{"filePath": "/path/to/script.js", "workDir": "/tmp"}'

Session Configuration Integration

The sandboxConfig is passed at the request level, not as part of Agent configuration:

interface AgentRunRequest {
prompt: string;
cwd?: string;
agentConfigPath?: string;
agentConfig?: AgentConfigPayload;
sessionId?: string;
taskId?: string;
sandboxConfig?: SandboxConfig;
}

File Structure

packages/core/src/sandbox/
+-- types.ts # Type definitions
+-- providers/
+-- index.ts # Provider registration and exports
+-- native.ts # Native provider
+-- codex.ts # Codex provider
+-- claude.ts # Claude provider

packages/core/src/services/
+-- sandbox.ts # Sandbox service

packages/core/src/gateway/routes/
+-- sandbox.ts # Sandbox API routes

Troubleshooting

Codex Provider Not Available

Check if Codex CLI is installed:

which codex
# or
npm install -g @openai/codex

Claude Provider Not Available

Check if sandbox-runtime is installed:

which srt
# or
npm install -g @anthropic-ai/sandbox-runtime

Network Access Issues

  • Codex provider disables network access by design (security)
  • Use Claude or Native provider when network access is needed