from __future__ import annotations from typing import Any from pydantic import BaseModel, ConfigDict class ToolResult(BaseModel): model_config = ConfigDict(frozen=True) name: str argv: tuple[str, ...] exit_code: int stdout: str stderr: str duration_ms: int timed_out: bool class ParsedResult(BaseModel): model_config = ConfigDict(frozen=True) ok: bool count: int details: dict[str, Any] class ImportReport(BaseModel): model_config = ConfigDict(frozen=True) total: int unresolved: tuple[str, ...] by_file: dict[str, tuple[str, ...]] class SandboxResult(BaseModel): model_config = ConfigDict(frozen=True) project_dir: str tools_run: tuple[str, ...] tool_results: dict[str, ToolResult] parsed: dict[str, ParsedResult] imports: ImportReport composite_score: float generated_at: str