from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field NODE_PROTOCOL_VERSION = "1" class EdgeNodeIdentityBase(BaseModel): protocol_version: str = NODE_PROTOCOL_VERSION node_id: str display_name: str service: str = "dashboard-edge" transport_kind: str = "edge" runtime_kind: str = "docker" core_adapter: str = "nanobot" class EdgeStatusResponse(BaseModel): status: str class EdgeStateWriteRequest(BaseModel): data: Dict[str, Any] = Field(default_factory=dict) workspace_root: Optional[str] = None class EdgeStateResponse(BaseModel): bot_id: str state_key: str data: Dict[str, Any] = Field(default_factory=dict) class EdgeNativePreflightRequest(BaseModel): native_command: Optional[str] = None native_workdir: Optional[str] = None class EdgeNativePreflightResponse(BaseModel): ok: bool = False command: List[str] = Field(default_factory=list) workdir: str = "" command_available: bool = False workdir_exists: bool = False detail: str = "" class EdgeStartBotRequest(BaseModel): image_tag: str runtime_kind: str = "docker" env_vars: Dict[str, str] = Field(default_factory=dict) workspace_root: Optional[str] = None native_command: Optional[str] = None native_workdir: Optional[str] = None cpu_cores: float = 1.0 memory_mb: int = 1024 storage_gb: int = 10 class EdgeCommandRequest(BaseModel): command: str media: List[str] = Field(default_factory=list) class EdgeLogsResponse(BaseModel): bot_id: str logs: List[str] = Field(default_factory=list) class EdgeMonitorEnsureResponse(BaseModel): ensured: bool = False class EdgeMonitorPacket(BaseModel): protocol_version: str = NODE_PROTOCOL_VERSION node_id: str = "" bot_id: str = "" seq: int = 0 captured_at: str = "" packet: Dict[str, Any] = Field(default_factory=dict) class EdgeMonitorPacketsResponse(BaseModel): protocol_version: str = NODE_PROTOCOL_VERSION node_id: str = "" bot_id: str latest_seq: int = 0 packets: List[EdgeMonitorPacket] = Field(default_factory=list) class EdgeWorkspaceSyncRequest(BaseModel): channels_override: Optional[List[Dict[str, Any]]] = None global_delivery_override: Optional[Dict[str, Any]] = None runtime_overrides: Optional[Dict[str, Any]] = None class EdgeMarkdownWriteRequest(BaseModel): content: str = "" class EdgeNodeResourcesResponse(BaseModel): protocol_version: str = NODE_PROTOCOL_VERSION node_id: str display_name: str = "" service: str = "dashboard-edge" transport_kind: str = "edge" runtime_kind: str = "docker" core_adapter: str = "nanobot" resources: Dict[str, Any] = Field(default_factory=dict) reported_at: str = "" class EdgeNodeSelfResponse(BaseModel): protocol_version: str = NODE_PROTOCOL_VERSION node_id: str display_name: str service: str = "dashboard-edge" transport_kind: str = "edge" runtime_kind: str = "docker" core_adapter: str = "nanobot" capabilities: Dict[str, Any] = Field(default_factory=dict) resources: Dict[str, Any] = Field(default_factory=dict) reported_at: str = "" class EdgeNodeHeartbeatResponse(EdgeNodeIdentityBase): capabilities: Dict[str, Any] = Field(default_factory=dict) resources: Dict[str, Any] = Field(default_factory=dict) reported_at: str = ""