104 lines
4.0 KiB
Python
104 lines
4.0 KiB
Python
"""Agent models for database storage."""
|
|
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
from uuid import UUID, uuid4
|
|
|
|
from sqlalchemy import DateTime, Enum, Index, String, Text, func
|
|
from sqlalchemy.dialects.postgresql import JSONB, UUID as PGUUID
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.core.base import SQLBase, TimestampMixin, UUIDMixin
|
|
|
|
|
|
class AgentState(SQLBase, UUIDMixin, TimestampMixin):
|
|
"""Agent state tracking."""
|
|
|
|
__tablename__ = "agent_states"
|
|
|
|
agent_id: Mapped[str] = mapped_column(String(50), unique=True, nullable=False)
|
|
status: Mapped[str] = mapped_column(String(20), nullable=False, default="idle")
|
|
last_run: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
|
|
current_task: Mapped[str | None] = mapped_column(Text, nullable=True)
|
|
extra: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
|
|
|
|
__table_args__ = (
|
|
Index("ix_agent_states_agent_id", "agent_id"),
|
|
)
|
|
|
|
|
|
class AgentReport(SQLBase, UUIDMixin, TimestampMixin):
|
|
"""Agent execution reports."""
|
|
|
|
__tablename__ = "agent_reports"
|
|
|
|
agent_id: Mapped[str] = mapped_column(String(50), nullable=False, index=True)
|
|
status: Mapped[str] = mapped_column(String(20), nullable=False)
|
|
message: Mapped[str] = mapped_column(Text, nullable=True)
|
|
details: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
|
|
duration_ms: Mapped[int] = mapped_column(default=0)
|
|
errors: Mapped[list | None] = mapped_column(JSONB, nullable=True)
|
|
context: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
|
|
success: Mapped[bool] = mapped_column(default=True)
|
|
|
|
__table_args__ = (
|
|
Index("ix_agent_reports_agent_timestamp", "agent_id", "created_at"),
|
|
)
|
|
|
|
|
|
class AgentMetric(SQLBase, UUIDMixin):
|
|
"""Agent performance metrics."""
|
|
|
|
__tablename__ = "agent_metrics"
|
|
|
|
agent_id: Mapped[str] = mapped_column(String(50), nullable=False, index=True)
|
|
metric_name: Mapped[str] = mapped_column(String(100), nullable=False)
|
|
value: Mapped[float] = mapped_column(default=0.0)
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
server_default=func.now(),
|
|
)
|
|
|
|
__table_args__ = (
|
|
Index("ix_agent_metrics_agent_metric", "agent_id", "metric_name"),
|
|
)
|
|
|
|
|
|
class BacklogItem(SQLBase, UUIDMixin, TimestampMixin):
|
|
"""Backlog items for tracking ideas, tasks, plans."""
|
|
|
|
__tablename__ = "backlog_items"
|
|
|
|
item_type: Mapped[str] = mapped_column(String(20), nullable=False)
|
|
title: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
description: Mapped[str | None] = mapped_column(Text, nullable=True)
|
|
priority: Mapped[str] = mapped_column(String(20), nullable=False, default="medium")
|
|
status: Mapped[str] = mapped_column(String(20), nullable=False, default="pending")
|
|
source: Mapped[str] = mapped_column(String(50), nullable=False)
|
|
created_by: Mapped[str] = mapped_column(String(100), nullable=False)
|
|
parent_id: Mapped[UUID | None] = mapped_column(PGUUID, nullable=True)
|
|
tags: Mapped[list | None] = mapped_column(JSONB, nullable=True)
|
|
block_ref: Mapped[str | None] = mapped_column(String(255), nullable=True)
|
|
extra: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
|
|
|
|
__table_args__ = (
|
|
Index("ix_backlog_items_type_status", "item_type", "status"),
|
|
Index("ix_backlog_items_priority", "priority"),
|
|
)
|
|
|
|
|
|
class Observation(SQLBase, UUIDMixin, TimestampMixin):
|
|
"""User observations from ObserverAgent."""
|
|
|
|
__tablename__ = "observations"
|
|
|
|
observation_type: Mapped[str] = mapped_column(String(50), nullable=False)
|
|
user_id: Mapped[str | None] = mapped_column(String(100), nullable=True, index=True)
|
|
metric_name: Mapped[str] = mapped_column(String(100), nullable=False)
|
|
metric_value: Mapped[float] = mapped_column(default=0.0)
|
|
extra: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
|
|
session_id: Mapped[str | None] = mapped_column(String(100), nullable=True)
|
|
|
|
__table_args__ = (
|
|
Index("ix_observations_type_user", "observation_type", "user_id"),
|
|
) |