From 4d35e35b5e69f77e4bb42b09420f05fa0c2b543d Mon Sep 17 00:00:00 2001 From: markov Date: Sun, 15 Mar 2026 07:12:04 +0100 Subject: [PATCH] feat: ?mentionable query param on project members endpoint --- src/tracker/api/projects.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/tracker/api/projects.py b/src/tracker/api/projects.py index f55bff0..fdaa938 100644 --- a/src/tracker/api/projects.py +++ b/src/tracker/api/projects.py @@ -156,8 +156,12 @@ async def delete_project(project_id: str, request: Request, db: AsyncSession = D return {"ok": True} -@router.get("/projects/{project_id}/members", response_model=list[ProjectMemberOut]) -async def get_project_members(project_id: str, db: AsyncSession = Depends(get_db)): +@router.get("/projects/{project_id}/members") +async def get_project_members( + project_id: str, + mentionable: bool | None = None, + db: AsyncSession = Depends(get_db), +): project = await _get_project(project_id, db) result = await db.execute( @@ -167,10 +171,27 @@ async def get_project_members(project_id: str, db: AsyncSession = Depends(get_db .options(selectinload(Member.agent_config)) ) - return [ - {"id": str(m.id), "name": m.name, "slug": m.slug, "type": m.type, "role": role} - for m, role in result.all() - ] + members = [] + for m, role in result.all(): + if mentionable is not None: + # bridge никогда не mentionable + if m.type == "bridge": + if mentionable: + continue + elif m.agent_config and m.agent_config.mentionable != mentionable: + continue + ac = None + if m.agent_config: + ac = { + "mentionable": m.agent_config.mentionable, + "chat_listen": m.agent_config.chat_listen, + "task_listen": m.agent_config.task_listen, + } + members.append({ + "id": str(m.id), "name": m.name, "slug": m.slug, + "type": m.type, "role": role, "agent_config": ac, + }) + return members @router.post("/projects/{project_id}/members")