Sandbox Cheat Sheet¶
Core Entry Points¶
use Cognesy\Sandbox\Config\ExecutionPolicy;
use Cognesy\Sandbox\Enums\SandboxDriver;
use Cognesy\Sandbox\Sandbox;
$policy = ExecutionPolicy::in(__DIR__);
$sandbox = Sandbox::fromPolicy($policy)->using(SandboxDriver::Host);
Static constructors:
Sandbox::fromPolicy(ExecutionPolicy $policy): SandboxSandbox::host(ExecutionPolicy $policy): CanExecuteCommandSandbox::docker(ExecutionPolicy $policy, ?string $image = null, ?string $dockerBin = null): CanExecuteCommandSandbox::podman(ExecutionPolicy $policy, ?string $image = null, ?string $podmanBin = null): CanExecuteCommandSandbox::firejail(ExecutionPolicy $policy, ?string $firejailBin = null): CanExecuteCommandSandbox::bubblewrap(ExecutionPolicy $policy, ?string $bubblewrapBin = null): CanExecuteCommand
Driver selection:
using(string|SandboxDriver $driver): CanExecuteCommand(uses default image/binary for container drivers)
Driver Enum¶
SandboxDriver values:
SandboxDriver::Host(host)SandboxDriver::Docker(docker)SandboxDriver::Podman(podman)SandboxDriver::Firejail(firejail)SandboxDriver::Bubblewrap(bubblewrap)
ExecutionPolicy¶
Create policy:
ExecutionPolicy::default(): ExecutionPolicy(baseDir:/tmp)ExecutionPolicy::in(string $baseDir): ExecutionPolicy
Defaults: timeout 5s, memory 128M, no idle timeout, no network, no env inheritance, 1MB output caps.
Accessors:
baseDir(): stringtimeoutSeconds(): intidleTimeoutSeconds(): ?intmemoryLimit(): stringreadablePaths(): arraywritablePaths(): arrayenv(): arrayinheritEnv(): boolnetworkEnabled(): boolstdoutLimitBytes(): intstderrLimitBytes(): int
Immutable mutators:
withTimeout(int $seconds): selfwithIdleTimeout(?int $seconds): selfwithMemory(string $limit): selfwithReadablePaths(string ...$paths): selfwithWritablePaths(string ...$paths): selfwithEnv(array $env, ?bool $inherit = null): selfinheritEnvironment(bool $inherit = true): selfwithNetwork(bool $enabled): selfwithOutputCaps(int $stdoutBytes, int $stderrBytes): selfwith(?string $baseDir, ?int $timeoutSeconds, ?int $idleTimeoutSeconds, ?string $memoryLimit, ?array $readablePaths, ?array $writablePaths, ?array $env, ?bool $inheritEnv, ?bool $networkEnabled, ?int $stdoutLimitBytes, ?int $stderrLimitBytes): self(all params nullable, unset params keep current values)
Command Execution API¶
Contract (CanExecuteCommand):
interface CanExecuteCommand {
public function policy(): ExecutionPolicy;
public function execute(array $argv, ?string $stdin = null, ?callable $onOutput = null): ExecResult;
}
Streaming callback:
- Signature:
fn(string $type, string $chunk): void $typeis'out'or'err'
Example:
$result = $sandbox->execute(
['ls', '-la'],
null,
function (string $type, string $chunk): void {
echo $chunk;
}
);
ExecResult¶
Constructor:
new ExecResult(
string $stdout,
string $stderr,
int $exitCode,
float $duration,
bool $timedOut = false,
bool $truncatedStdout = false,
bool $truncatedStderr = false,
)
Getters:
stdout(): stringstderr(): stringexitCode(): intduration(): floattimedOut(): booltruncatedStdout(): booltruncatedStderr(): boolsuccess(): boolcombinedOutput(): stringtoArray(): array
Value Objects¶
Argv:
Argv::of(array $items): Argvwith(string $value): ArgvtoArray(): array
CommandSpec:
new CommandSpec(Argv $argv, ?string $stdin = null)argv(): Argvstdin(): ?string
Testing¶
FakeSandbox (implements CanExecuteCommand):
new FakeSandbox(ExecutionPolicy $policy, array $responses = [], ?ExecResult $defaultResponse = null)FakeSandbox::fromResponses(array $responses, ?ExecResult $defaultResponse = null): FakeSandbox
Responses format: array<string, list<ExecResult|array>> -- each entry can be an ExecResult or an associative array with keys: stdout, stderr, exit_code, duration, timed_out, truncated_stdout, truncated_stderr.
policy(): ExecutionPolicycommands(): array(recorded argv calls)enqueue(string $commandKey, ExecResult $result): voidexecute(array $argv, ?string $stdin = null, ?callable $onOutput = null): ExecResult
Command key format for queued responses:
'cmd arg1 arg2'(joined with spaces)
Mount (container drivers)¶
Mount (used by Docker/Podman drivers for volume binds):
new Mount(string $host, string $container, string $options)host(): stringcontainer(): stringoptions(): stringtoVolumeArg(): string(returnshost:container:options)
TimeoutReason Enum¶
TimeoutReason values:
TimeoutReason::WALL(wall) — wall-clock timeout exceededTimeoutReason::IDLE(idle) — idle timeout exceeded
Exit Code Constants¶
ExitCodes:
ExitCodes::TIMEOUT=124(GNU timeout convention)
Useful Environment Variables¶
Driver binary overrides:
DOCKER_BINPODMAN_BINFIREJAIL_BINBWRAP_BIN