diff --git a/src/tracker/api/messages.py b/src/tracker/api/messages.py index da9c263..8887f46 100644 --- a/src/tracker/api/messages.py +++ b/src/tracker/api/messages.py @@ -73,7 +73,7 @@ def _message_out(m: Message) -> dict: "task_id": str(m.task_id) if m.task_id else None, "parent_id": str(m.parent_id) if m.parent_id else None, "author_type": m.author_type, - "author_id": str(m.author_id), + "author_id": str(m.author_id) if m.author_id else None, "author": {"id": str(m.author.id), "slug": m.author.slug, "name": m.author.name} if m.author else None, "content": m.content, "mentions": m.mentions or [], @@ -164,8 +164,8 @@ async def create_message(req: MessageCreate, request: Request, db: AsyncSession msg = result2.scalar_one() # Get author name for broadcast (already loaded via relationship) - author_name = msg.author.name if msg.author else "Unknown" - author_slug = msg.author.slug if msg.author else "unknown" + author_name = msg.author.name if msg.author else "System" + author_slug = msg.author.slug if msg.author else "system" # Broadcast via WebSocket from tracker.ws.manager import manager diff --git a/src/tracker/api/tasks.py b/src/tracker/api/tasks.py index 42c21eb..599628a 100644 --- a/src/tracker/api/tasks.py +++ b/src/tracker/api/tasks.py @@ -144,14 +144,13 @@ async def _system_message( now = datetime.datetime.now(datetime.timezone.utc) chat_id = await _get_project_chat_id(db, task.project_id) - actor_id = actor.id if actor else None actor_slug = actor.slug if actor else "system" - # 1. Task comment + # 1. Task comment (author=None for system, actor tracked in task_actions) task_msg = Message( task_id=task.id, author_type=AuthorType.SYSTEM, - author_id=actor_id, + author_id=None, content=task_text, mentions=[], ) @@ -163,7 +162,7 @@ async def _system_message( chat_msg = Message( chat_id=chat_id, author_type=AuthorType.SYSTEM, - author_id=actor_id, + author_id=None, content=chat_text, mentions=[], ) @@ -177,8 +176,9 @@ async def _system_message( "task_id": str(task.id), "task_key": key, "author_type": AuthorType.SYSTEM, - "author_id": str(actor_id) if actor_id else None, - "author_slug": actor_slug, + "author_id": None, + "author_slug": "system", + "author": None, "content": task_text, "created_at": task_msg.created_at.isoformat() if task_msg.created_at else now.isoformat(), }) @@ -189,11 +189,12 @@ async def _system_message( "id": str(chat_msg.id), "chat_id": str(chat_id), "author_type": AuthorType.SYSTEM, - "author_id": str(actor_id) if actor_id else None, - "author_slug": actor_slug, + "author_id": None, + "author_slug": "system", + "author": None, "content": chat_text, "created_at": chat_msg.created_at.isoformat() if chat_msg.created_at else now.isoformat(), - }, author_slug=actor_slug) + }, author_slug="system") def _task_out(t: Task, project_slug: str = "") -> dict: diff --git a/src/tracker/models/chat.py b/src/tracker/models/chat.py index aa2a64d..94a9df4 100644 --- a/src/tracker/models/chat.py +++ b/src/tracker/models/chat.py @@ -42,7 +42,7 @@ class Message(Base): # Author author_type: Mapped[str] = mapped_column(String(20), nullable=False) # human | agent | system - author_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("members.id"), nullable=False) + author_id: Mapped[uuid.UUID | None] = mapped_column(ForeignKey("members.id"), nullable=True) # Content content: Mapped[str] = mapped_column(Text, nullable=False)