"""Typed, serializable failures used across the single-stage workflow.""" from __future__ import annotations from dataclasses import dataclass, field from enum import StrEnum from typing import Any class ErrorCode(StrEnum): CANCELLED = "CANCELLED" RUNTIME_CONTRACT_INVALID = "RUNTIME_CONTRACT_INVALID" MODEL_STRUCTURED_OUTPUT_UNSUPPORTED = "MODEL_STRUCTURED_OUTPUT_UNSUPPORTED" AUTHOR_TRANSPORT_UNAVAILABLE = "AUTHOR_TRANSPORT_UNAVAILABLE" RENDER_SERVICE_UNAVAILABLE = "RENDER_SERVICE_UNAVAILABLE" STORAGE_FAILURE = "STORAGE_FAILURE" RUNTIME_EXECUTION_FAILURE = "RUNTIME_EXECUTION_FAILURE" BEST_EFFORT_COMPLETED = "BEST_EFFORT_COMPLETED" FAILED_INTERNAL = "FAILED_INTERNAL" WAITING_FOR_USER = "WAITING_FOR_USER" AUTHOR_FORBIDDEN_FIELD = "AUTHOR_FORBIDDEN_FIELD" AUTHOR_SCHEMA_INVALID = "AUTHOR_SCHEMA_INVALID" AUTHOR_REFERENCE_INVALID = "AUTHOR_REFERENCE_INVALID" AUTHOR_CYCLE = "AUTHOR_CYCLE" OPERATION_UNSUPPORTED = "OPERATION_UNSUPPORTED" SELECTOR_NOT_FOUND = "SELECTOR_NOT_FOUND" SELECTOR_AMBIGUOUS = "SELECTOR_AMBIGUOUS" SELECTOR_DEPENDENCY_UNAVAILABLE = "SELECTOR_DEPENDENCY_UNAVAILABLE" SELECTOR_KIND_MISMATCH = "SELECTOR_KIND_MISMATCH" ENGINE_EXECUTION_FAILED = "ENGINE_EXECUTION_FAILED" @dataclass(frozen=True, slots=True) class WorkflowError: """An expected domain rejection, never a free-form exception channel.""" code: ErrorCode message: str field_errors: tuple[dict[str, Any], ...] = () retryable: bool = False details: dict[str, Any] = field(default_factory=dict) def payload(self) -> dict[str, Any]: return { "code": self.code.value, "message": self.message, "field_errors": list(self.field_errors), "retryable": self.retryable, "details": self.details, }