diff --git a/src/tracker/models/member.py b/src/tracker/models/member.py index 73cde10..4cdcbe2 100644 --- a/src/tracker/models/member.py +++ b/src/tracker/models/member.py @@ -48,5 +48,7 @@ class AgentConfig(Base): task_listen: Mapped[str] = mapped_column(String(20), default=ListenMode.MENTIONS) # all | mentions | none prompt: Mapped[str | None] = mapped_column(Text) model: Mapped[str | None] = mapped_column(String(100)) + provider: Mapped[str | None] = mapped_column(String(50)) + max_concurrent_tasks: Mapped[int] = mapped_column(default=2) member: Mapped["Member"] = relationship(back_populates="agent_config") diff --git a/src/tracker/ws/handler.py b/src/tracker/ws/handler.py index 08aae1b..b4ceed2 100644 --- a/src/tracker/ws/handler.py +++ b/src/tracker/ws/handler.py @@ -232,15 +232,31 @@ async def _authenticate(ws: WebSocket, token: str, on_behalf_of: str | None = No seen.add(s.member_id) online_list.append({"id": s.member_id, "slug": s.member_slug}) + auth_data: dict = { + "member_id": str(effective_member.id), + "slug": effective_member.slug, + "name": effective_member.name, + "lobby_chat_id": str(lobby_chat.id) if lobby_chat else None, + "projects": project_list, + "online": online_list, + } + + # For agents: include full config from DB + if effective_member.agent_config: + ac = effective_member.agent_config + auth_data["agent_config"] = { + "model": ac.model, + "provider": ac.provider, + "prompt": ac.prompt, + "chat_listen": ac.chat_listen, + "task_listen": ac.task_listen, + "max_concurrent_tasks": ac.max_concurrent_tasks, + "capabilities": ac.capabilities or [], + } + await ws.send_json({ "type": WSEventType.AUTH_OK, - "data": { - "member_id": str(effective_member.id), - "slug": effective_member.slug, - "lobby_chat_id": str(lobby_chat.id) if lobby_chat else None, - "projects": project_list, - "online": online_list, - }, + "data": auth_data, }) # Notify others @@ -324,6 +340,12 @@ async def _handle_chat_send(session_id: str, data: dict): chat = chat_result.scalar_one_or_none() if chat and chat.project_id: project_id = str(chat.project_id) + elif chat and chat.kind == ChatKind.LOBBY: + await manager.broadcast_all( + {"type": WSEventType.MESSAGE_NEW, "data": msg_data}, + exclude_member_id=client.member_id, + ) + return elif task_id: from ..models import Task as TaskModel task_result = await db.execute(select(TaskModel).where(TaskModel.id == uuid.UUID(task_id))) @@ -333,12 +355,6 @@ async def _handle_chat_send(session_id: str, data: dict): if project_id: msg_data["project_id"] = project_id - elif chat and chat.kind == ChatKind.LOBBY: - await manager.broadcast_all( - {"type": WSEventType.MESSAGE_NEW, "data": msg_data}, - exclude_member_id=client.member_id, - ) - return if project_id: await manager.broadcast_message(