from __future__ import annotations from datetime import datetime, timezone from enum import Enum from typing import Any, Literal from pydantic import BaseModel, Field def utc_now_iso() -> str: return datetime.now(timezone.utc).isoformat() class Platform(str, Enum): windows = "windows" pwa = "pwa" web = "web" unknown = "unknown" class DeviceHello(BaseModel): device_id: str = Field(min_length=3, max_length=128) platform: Platform = Platform.unknown version: str = "0.0.0" hostname: str = "" capabilities: list[str] = Field(default_factory=list) class ConnectedDevice(BaseModel): device_id: str platform: Platform version: str hostname: str = "" capabilities: list[str] = Field(default_factory=list) connected_at: str = Field(default_factory=utc_now_iso) last_seen_at: str = Field(default_factory=utc_now_iso) class DispatchRequest(BaseModel): action: Literal["notify", "wallpaper_set", "overlay_show", "sync_settings", "ping"] data: dict[str, Any] = Field(default_factory=dict) target_scope: Literal["all", "windows", "pwa", "web", "device_ids"] = "all" device_ids: list[str] = Field(default_factory=list) class DispatchResult(BaseModel): command_id: str delivered_to: list[str] = Field(default_factory=list) skipped: list[str] = Field(default_factory=list) class UpdateManifest(BaseModel): version: str = "0.0.0" download_url: str = "" sha256: str = "" notes: str = "" published_at: str = Field(default_factory=utc_now_iso)