class AppError(Exception): status_code = 400 code = "APP_ERROR" def __init__(self, message: str, *, details: dict | None = None): super().__init__(message) self.message = message self.details = details or {} class NotFoundError(AppError): status_code = 404 code = "NOT_FOUND" class ConfigurationError(AppError): status_code = 500 code = "CONFIGURATION_ERROR" class ProviderError(AppError): status_code = 502 code = "PROVIDER_ERROR" class ConflictError(AppError): status_code = 409 code = "CONFLICT" class RefreshNotDueError(AppError): status_code = 409 code = "REFRESH_NOT_DUE" class UnauthorizedError(AppError): status_code = 401 code = "UNAUTHORIZED" class ForbiddenError(AppError): status_code = 403 code = "FORBIDDEN"