from __future__ import annotations from datetime import datetime, timezone from typing import Optional from sqlmodel import Field, SQLModel def _now() -> datetime: return datetime.now(timezone.utc) class Agent(SQLModel, table=True): """A remote host running stackpilot-agent.""" id: Optional[int] = Field(default=None, primary_key=True) name: str url: str # e.g. http://10.0.0.5:5010 token: str # shared AGENT_TOKEN of that host status: str = "unknown" # online | offline | unauthorized | unknown hostname: Optional[str] = None # reported by the agent on ping last_seen: Optional[datetime] = None created_at: datetime = Field(default_factory=_now) # --- API schemas --- class AgentCreate(SQLModel): name: str url: str token: str class AgentUpdate(SQLModel): name: Optional[str] = None url: Optional[str] = None token: Optional[str] = None class AgentRead(SQLModel): id: int name: str url: str status: str hostname: Optional[str] last_seen: Optional[datetime] created_at: datetime token_set: bool