from typing import Literal from pydantic import BaseModel, Field from .schematic import Diagnostic class ApiError(BaseModel): code: str message: str class ErrorEnvelope(BaseModel): success: Literal[False] = False error: ApiError class RenderStatus(BaseModel): success: bool id: str = Field(description='Unpredictable 192-bit identifier, encoded as 48 hex characters') status: Literal['queued','processing','completed','failed'] viewer_url: str = Field(description='Base viewer URL; only initial upload includes private token fragment') expires_at: float = Field(description='Unix timestamp, UTC seconds') access: Literal['private','unlisted'] schema_version: str | None = None compatibility: Literal['partial','supported_subset'] | None = None record_count: int | None = None component_count: int | None = None primitive_count: int | None = None diagnostics: list[Diagnostic] | None = None error: ApiError | None = None class UploadResponse(RenderStatus): status_url: str viewer_token: str | None = Field(default=None,description='Read capability returned once for a private upload') class ComparisonStatus(RenderStatus): comparison_id: str url: str status_url: str document_type: Literal['schematic_comparison'] | None = None summary: dict[Literal['added','removed','modified','moved'], int] | None = None total_changed: int | None = None changes: list[dict] | None = None old: dict | None = None new: dict | None = None nets: dict | None = None matching: dict | None = None limitations: list[str] | None = None class ComparisonUploadResponse(ComparisonStatus): viewer_token: str | None = Field(default=None, description='Read capability returned once for a private comparison')