from typing import List, Optional from pydantic import BaseModel, Field class ActionRequest(BaseModel): countdown: Optional[int] = Field(default=None, ge=0, description="Seconds for countdown") sound: Optional[bool] = Field(default=None, description="Play sound alongside notification") message: Optional[str] = Field( default=None, description="Optional message to show the user; falls back to default text.", ) class ActionResponse(BaseModel): user: str action: str dry_run: bool steps: List[str] logged_in: bool class UserStatus(BaseModel): user: str logged_in: bool account_locked: bool class LoginRequest(BaseModel): username: str password: str class LoginResponse(BaseModel): token: str expires_in: int class UpdateStatus(BaseModel): current_version: str last_status: str last_error: Optional[str] = None last_timestamp: Optional[str] = None enrolled: bool = False class EnrollRequest(BaseModel): enroll_token: Optional[str] = None class EnrollResponse(BaseModel): enrolled: bool message: str class UpdateCheckResponse(BaseModel): available: bool latest_version: str artifact_url: str sha256: str message: Optional[str] = None class UpdateActionResponse(BaseModel): started: bool message: str class UpdateLogEntry(BaseModel): timestamp: str status: str message: Optional[str] = None version: Optional[str] = None error: Optional[str] = None device_id: Optional[str] = None