diff --git a/src/tracker/ws/manager.py b/src/tracker/ws/manager.py index 43cf900..33cd6fe 100644 --- a/src/tracker/ws/manager.py +++ b/src/tracker/ws/manager.py @@ -77,8 +77,18 @@ class ConnectionManager: await self.disconnect(client.session_id) async def broadcast_message(self, project_id: str, message: dict, author_slug: str): - """Broadcast message.new. Humans get everything, agents filtered.""" + """Broadcast message.new. Humans get everything, agents filtered. + + Filtering for agents: + - Skip own messages (author_slug == client slug) + - Skip if not subscribed to project + - Skip if chat_listen == "none" + - If chat_listen == "mentions": only if @slug in mentions + - System messages: only if @slug mentioned in content + """ mentions = message.get("mentions", []) + content = message.get("content", "") + author_type = message.get("author_type", "") payload = {"type": "message.new", "data": message} for session_id, client in list(self.sessions.items()): @@ -88,11 +98,18 @@ class ConnectionManager: if client.member_type in ("human", "bridge"): await self.send_to_session(session_id, payload) continue - # Agents: subscription + chat_listen + # Agents: subscription check if project_id not in client.subscribed_projects: continue if client.chat_listen == "none": continue + # System messages: only if agent is mentioned in content + if author_type == "system": + if f"@{client.member_slug}" not in content: + continue + await self.send_to_session(session_id, payload) + continue + # Regular messages: chat_listen filter if client.chat_listen == "mentions" and client.member_slug not in mentions: continue await self.send_to_session(session_id, payload)