from __future__ import annotations from datetime import datetime from typing import Any from uuid import UUID, uuid4 from sqlalchemy import JSON, Column, Text from sqlmodel import Field, SQLModel from app.core.time import utcnow class Agent(SQLModel, table=True): __tablename__ = "agents" id: UUID = Field(default_factory=uuid4, primary_key=True) board_id: UUID | None = Field(default=None, foreign_key="boards.id", index=True) name: str = Field(index=True) status: str = Field(default="provisioning", index=True) openclaw_session_id: str | None = Field(default=None, index=True) agent_token_hash: str | None = Field(default=None, index=True) heartbeat_config: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON)) identity_profile: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON)) identity_template: str | None = Field(default=None, sa_column=Column(Text)) soul_template: str | None = Field(default=None, sa_column=Column(Text)) provision_requested_at: datetime | None = Field(default=None) provision_confirm_token_hash: str | None = Field(default=None, index=True) provision_action: str | None = Field(default=None, index=True) delete_requested_at: datetime | None = Field(default=None) delete_confirm_token_hash: str | None = Field(default=None, index=True) last_seen_at: datetime | None = Field(default=None) is_board_lead: bool = Field(default=False, index=True) created_at: datetime = Field(default_factory=utcnow) updated_at: datetime = Field(default_factory=utcnow)