命令与访问权限

🔵 团队 — 用户之间共享的主体:共享的 team:<id> state 以及对 agent、工具和路由的权限。成员关系为“多对多”: 一个用户可以属于多个团队,而一个团队可以有多个 成员。该功能默认关闭,通过存在团队注册表来启用。


45.1 模型

团队为 scoped state store 增加了第四种 scope (session / user / agent / team):

enum Scope { Session(String), User(String), Agent(String), Team(String) }

成员关系和授权由 TeamRegistry(logs/teams.db,DuckDB)存储。它是 权限的事实来源;当注册表不存在时,团队“fail closed”。

实体 角色
TeamRole::Member 读取/写入团队 state
TeamRole::Owner 同上 + 管理成员构成和授权
GrantKind 授予什么
template 对 agent 模板的访问权限
tool 对 team-gated 工具的访问权限
route 对模块化路由 Access::Team 的访问权限
admin 对具体模板的管理员访问权限(仅操作员)

按构造不存在提权。 Owner 只能向其他团队授予 他自己已经拥有的东西;admin 授权只能由操作员授予,并且 只由 owner 继承。


45.2 启用

logging:
  team_db_path: "logs/teams.db"   # пусто = команды выключены

teams:
  # Инструменты, доступные только по гранту команды.
  gated_tools: []

auth:
  oidc:
    providers:
      yandex:
        userinfo_groups_field: "groups"   # claim со списком команд
    team_owner_groups: ["admins"]         # эти группы → роль owner
设置 默认值 含义
logging.team_db_path logs/teams.db 团队注册表;为空 = 功能关闭
teams.gated_tools [] team-gated 工具列表
auth.oidc.providers.<p>.userinfo_groups_field (空) userinfo 中表示组列表的字段
auth.oidc.team_owner_groups [] 在同步时授予 owner 角色的组

45.3 管理:admin API 和 owner API

管理员 API(操作员身份验证,完全访问权限,允许 admin 授权):

方法和路径 操作
GET /v1/teams 团队列表
POST /v1/teams 创建/更新 {id, name?}
GET /v1/teams/:id 团队 + 成员 + 授权
DELETE /v1/teams/:id 删除团队(级联:成员、授权和 team:<id> state)
POST /v1/teams/:id/members 添加成员 {user_id, role?, source?}
DELETE /v1/teams/:id/members/:user 移除成员
POST /v1/teams/:id/grants 授予授权 {kind, resource}
DELETE /v1/teams/:id/grants/:kind/:resource 撤销授权

Owner API(终端用户身份验证)— owner 只管理自己的 团队,并且只在自己的授权范围内(禁止 admin 授权):

方法和路径 操作
POST /v1/my/teams/:id/members 添加成员
DELETE /v1/my/teams/:id/members/:user 移除成员
POST /v1/my/teams/:id/grants 授予授权(只能从自己的授权中)
DELETE /v1/my/teams/:id/grants/:kind/:resource 撤销授权

OIDC 同步。 当终端用户通过 OIDC 登录时,来自 userinfo_groups_field 的组会以追加方式添加为成员关系(source = oidc; 来自 team_owner_groups 的组 → owner,否则为 member)。同步不会删除任何内容, 因此手动授权不会被覆盖。


45.4 具体强制执行的内容

实体 规则
State Set/Get/DeleteState 系统调用只允许团队成员 team:<id>
Agent 属于某些团队的用户,只有在模板被授予其某个团队且通过 per-agent login 要求时,才能与该模板聊天
工具 来自 teams.gated_tools 的工具需要 tool 授权
路由 模块化路由 Access::Team 需要对路由路径的 route 授权

向后兼容性: 在没有团队注册表、匿名请求或 用户不属于任何团队时,行为不变。


45.5 Retention