From b527e19db18b60e4e9a8ff2ea545788088fcd8a1 Mon Sep 17 00:00:00 2001 From: markov Date: Tue, 24 Feb 2026 12:22:51 +0100 Subject: [PATCH] fix: system messages go to project chat (visible in ChatPanel) --- src/tracker/api/tasks.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/tracker/api/tasks.py b/src/tracker/api/tasks.py index af05ad4..32dcc0d 100644 --- a/src/tracker/api/tasks.py +++ b/src/tracker/api/tasks.py @@ -10,7 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload, joinedload from tracker.database import get_db -from tracker.models import Task, Step, Project, Member, Message +from tracker.models import Task, Step, Project, Member, Message, Chat router = APIRouter(tags=["tasks"]) @@ -81,9 +81,24 @@ class AssignRequest(BaseModel): # --- Helpers --- async def _system_message(db: AsyncSession, task: Task, content: str, project_slug: str = ""): - """Create a system message for a task and broadcast it via WS.""" + """Create a system message for a task and broadcast it via WS. + + Message goes to the project chat (visible in ChatPanel) with task_id reference. + """ from tracker.ws.manager import manager + + # Find project chat + chat_id = None + if task.project_id: + result = await db.execute( + select(Chat).where(Chat.project_id == task.project_id, Chat.kind == "project") + ) + chat = result.scalar_one_or_none() + if chat: + chat_id = chat.id + msg = Message( + chat_id=chat_id, task_id=task.id, author_type="system", author_slug="system", @@ -96,15 +111,17 @@ async def _system_message(db: AsyncSession, task: Task, content: str, project_sl prefix = project_slug[:2].upper() if project_slug else "XX" key = f"{prefix}-{task.number}" - await manager.broadcast_task_event(str(task.project_id), "message.new", { + event_data = { "id": str(msg.id), + "chat_id": str(chat_id) if chat_id else None, "task_id": str(task.id), "task_key": key, "author_type": "system", "author_slug": "system", "content": content, "created_at": msg.created_at.isoformat() if msg.created_at else "", - }) + } + await manager.broadcast_task_event(str(task.project_id), "message.new", event_data) def _task_out(t: Task, project_slug: str = "") -> dict: