diff --git a/src/tracker/ws/handler.py b/src/tracker/ws/handler.py index 51fd0e2..8a1ec2e 100644 --- a/src/tracker/ws/handler.py +++ b/src/tracker/ws/handler.py @@ -330,7 +330,7 @@ async def _handle_chat_send(session_id: str, data: dict): return if project_id: - await manager.broadcast_message(project_id, msg_data, author_slug=slug) + await manager.broadcast_message(project_id, msg_data, author_slug=slug, author_session_id=session_id) else: await manager.broadcast_all( {"type": WSEventType.MESSAGE_NEW, "data": msg_data}, diff --git a/src/tracker/ws/manager.py b/src/tracker/ws/manager.py index 902a70b..69364e7 100644 --- a/src/tracker/ws/manager.py +++ b/src/tracker/ws/manager.py @@ -79,11 +79,11 @@ class ConnectionManager: except Exception: await self.disconnect(client.session_id) - async def broadcast_message(self, project_id: str, message: dict, author_slug: str): + async def broadcast_message(self, project_id: str, message: dict, author_slug: str, author_session_id: str | None = None): """Broadcast message.new. Humans get everything, agents filtered. Filtering for agents: - - Skip own messages (author_slug == client slug) + - Skip author's session (by session_id if available, else by slug) - Skip if not subscribed to project - Skip if chat_listen == "none" - If chat_listen == "mentions": only if @slug in mentions @@ -95,7 +95,10 @@ class ConnectionManager: payload = {"type": WSEventType.MESSAGE_NEW, "data": message} for session_id, client in list(self.sessions.items()): - if client.member_slug == author_slug: + # Skip only the sending session, not all sessions of the same user + if author_session_id and session_id == author_session_id: + continue + if not author_session_id and client.member_slug == author_slug: continue # Humans/bridges get ALL messages if client.member_type in (MemberType.HUMAN, MemberType.BRIDGE):