MINDI-1.5-Vision-Coder / src /sandbox /sandbox_runner.py
Faaz
feat: initial project scaffold for MINDI 1.5 Vision-Coder
553fbf7
"""
MINDI 1.5 Vision-Coder — Sandbox Runner
Executes generated code in an isolated environment (E2B cloud sandbox
or local Docker container) to test for errors and capture screenshots.
"""
from __future__ import annotations
import os
from dataclasses import dataclass, field
from pathlib import Path
from typing import Optional
@dataclass
class SandboxResult:
"""Result from running code in the sandbox."""
success: bool
stdout: str = ""
stderr: str = ""
exit_code: int = -1
screenshot_path: Optional[Path] = None
execution_time_ms: float = 0.0
errors: list[str] = field(default_factory=list)
class SandboxRunner:
"""
Isolated code execution environment.
Supports two backends:
- E2B (cloud): For production — real browser rendering + screenshots
- Docker (local): For development/testing
"""
def __init__(
self,
backend: str = "e2b",
e2b_api_key: Optional[str] = None,
screenshot_dir: Optional[Path] = None,
) -> None:
self.backend = backend
self.e2b_api_key = e2b_api_key or os.environ.get("E2B_API_KEY", "")
self.screenshot_dir = screenshot_dir or Path("./logs/screenshots")
self.screenshot_dir.mkdir(parents=True, exist_ok=True)
async def run_code(
self,
code: str,
filename: str = "page.tsx",
capture_screenshot: bool = True,
) -> SandboxResult:
"""
Execute code in the sandbox and optionally capture a screenshot.
The screenshot is used by the VisionCritic to evaluate UI quality.
"""
if self.backend == "e2b":
return await self._run_e2b(code, filename, capture_screenshot)
elif self.backend == "docker":
return await self._run_docker(code, filename, capture_screenshot)
else:
return SandboxResult(
success=False,
stderr=f"Unknown sandbox backend: {self.backend}",
errors=[f"Unknown backend: {self.backend}"],
)
async def _run_e2b(
self, code: str, filename: str, capture_screenshot: bool
) -> SandboxResult:
"""Execute in E2B cloud sandbox."""
if not self.e2b_api_key:
return SandboxResult(
success=False,
stderr="E2B_API_KEY not set",
errors=["E2B_API_KEY not configured"],
)
# Will be implemented with e2b-code-interpreter SDK
return SandboxResult(success=False, stderr="E2B integration pending")
async def _run_docker(
self, code: str, filename: str, capture_screenshot: bool
) -> SandboxResult:
"""Execute in local Docker container."""
# Will be implemented with Docker SDK
return SandboxResult(success=False, stderr="Docker integration pending")