命令与访问权限
🔵 团队 — 用户之间共享的主体:共享的 team:<id>
state 以及对 agent、工具和路由的权限。成员关系为“多对多”:
一个用户可以属于多个团队,而一个团队可以有多个
成员。该功能默认关闭,通过存在团队注册表来启用。
45.1 模型
团队为 scoped state store 增加了第四种 scope
(session / user / agent / team):
enum Scope { Session(String), User(String), Agent(String), Team(String) }
- 键
team:<id>— 对团队所有成员共享; - 标量解析
get_resolved按user → session → team(s) → agent进行: 个人覆盖团队,团队覆盖 agent 模板。团队 从用户的成员关系中展开(按 id 排序); - 在需要具体 id 的地方,团队通过显式方式寻址(
team:<id>)。
成员关系和授权由 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
- 团队、成员关系和授权 — 永久保留(不按年龄清理);
- state 清理 — 仅按逐元素
ttl_secs(周期性purge_expired,每小时); DELETE /v1/teams/:id会级联删除成员、授权以及整个team:<id>state。