from datetime import UTC, datetime from pydantic import BaseModel, Field from core.schemas.manifest import ModuleManifest from core.schemas.results import AuditResults from core.schemas.status import AuditSeverity class PluginRuntimeError(BaseModel): plugin_kind: str plugin_name: str stage: str message: str class ModuleExecutionStats(BaseModel): duration_seconds: float = Field(ge=0) finding_counts: dict[AuditSeverity, int] = Field(default_factory=dict) class ModuleAuditResult(BaseModel): module: ModuleManifest result: AuditResults stats: ModuleExecutionStats | None = None error: PluginRuntimeError | None = None class AuditReport(BaseModel): generated_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) results: list[ModuleAuditResult] exit_code: int plugin_errors: list[PluginRuntimeError] = Field(default_factory=list) class RenderedReport(BaseModel): format_name: str media_type: str file_extension: str content: str