Files
claudetools/api/models/coord_work_item.py
Mike Swanson 63975284f4 feat: agent coordination system (workflows, locks, components, messages)
Adds /api/coord/* endpoints for real-time cross-session coordination:
- coord_workflows: named units of work per project
- coord_work_items: tasks within workflows with dependency chains
- coord_session_locks: exclusive resource locks with auto-expiry (TTL)
- coord_component_states: live component state per project (upsert)
- coord_messages: cross-session messaging and broadcasts
- /api/coord/status: cross-project snapshot endpoint

Replaces PROJECT_STATE.md as the coordination layer for Claude sessions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 08:25:33 -07:00

88 lines
2.5 KiB
Python

"""Coordination work item model."""
from datetime import datetime
from typing import Optional
from sqlalchemy import CHAR, CheckConstraint, ForeignKey, Index, Integer, String, Text, DateTime
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base, TimestampMixin, UUIDMixin
class CoordWorkItem(Base, UUIDMixin, TimestampMixin):
"""A discrete task within a coordination workflow."""
__tablename__ = "coord_work_items"
workflow_id: Mapped[str] = mapped_column(
CHAR(36),
ForeignKey("coord_workflows.id", ondelete="CASCADE"),
nullable=False,
doc="Parent workflow"
)
project_key: Mapped[str] = mapped_column(
String(200),
nullable=False,
doc="Denormalized project key for filtering without join"
)
title: Mapped[str] = mapped_column(
String(500),
nullable=False,
doc="Short title"
)
description: Mapped[Optional[str]] = mapped_column(
Text,
doc="Full description, markdown ok — store design specs, schemas, etc."
)
status: Mapped[str] = mapped_column(
String(20),
nullable=False,
default="pending",
doc="Status: pending, in_progress, blocked, completed, cancelled"
)
priority: Mapped[int] = mapped_column(
Integer,
nullable=False,
default=0,
doc="Higher value = more urgent"
)
assigned_session: Mapped[Optional[str]] = mapped_column(
String(200),
doc="Session currently working this item"
)
depends_on_id: Mapped[Optional[str]] = mapped_column(
CHAR(36),
ForeignKey("coord_work_items.id", ondelete="SET NULL"),
doc="Blocking predecessor item"
)
started_at: Mapped[Optional[datetime]] = mapped_column(
DateTime,
doc="When work began"
)
completed_at: Mapped[Optional[datetime]] = mapped_column(
DateTime,
doc="When item reached a terminal state"
)
__table_args__ = (
CheckConstraint(
"status IN ('pending', 'in_progress', 'blocked', 'completed', 'cancelled')",
name="ck_coord_work_items_status"
),
Index("idx_coord_work_items_workflow", "workflow_id"),
Index("idx_coord_work_items_project_status", "project_key", "status"),
Index("idx_coord_work_items_assigned", "assigned_session"),
)
def __repr__(self) -> str:
return f"<CoordWorkItem(title='{self.title}', status='{self.status}')>"