import uuid from typing import TYPE_CHECKING, Any from sqlalchemy import JSON, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import Base, TimestampMixin, UUIDMixin if TYPE_CHECKING: from app.models.access_route import AccessRoute from app.models.project import Project from app.models.tool_definition import ToolDefinition class ToolInstance(Base, UUIDMixin, TimestampMixin): __tablename__ = "tool_instance" project_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("project.id"), index=True ) tool_definition_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("tool_definition.id"), index=True ) name: Mapped[str] = mapped_column(String(255)) status: Mapped[str] = mapped_column( String(50), default="pending" ) container_id: Mapped[str | None] = mapped_column( String(255), nullable=True ) subdomain: Mapped[str | None] = mapped_column( String(255), nullable=True, unique=True ) config_override: Mapped[dict[str, Any] | None] = mapped_column( JSON, nullable=True ) traefik_labels: Mapped[dict[str, Any] | None] = mapped_column( JSON, nullable=True ) project: Mapped["Project"] = relationship( back_populates="tool_instances" ) tool_definition: Mapped["ToolDefinition"] = relationship( back_populates="instances" ) access_routes: Mapped[list["AccessRoute"]] = relationship( back_populates="tool_instance" )