17 KiB
17 KiB
RBAC / Skill / 主 Agent 权限与回归矩阵
更新时间:2026-04-27
这份文档只梳理当前已经落地或明确未生产化的多用户、RBAC、Skill、主 Agent 权限和多设备控制链路。当前运行真相仍以 current_runtime_and_deploy_status_cn.md 和 api_and_service_inventory_cn.md 为准。
1. 当前开发状态
1.1 已落地
- 多用户 / RBAC 第一阶段已经落地到文件状态:
accountDeviceGrants / accountProjectGrants / accountSkillGrants / skillCatalog / permissionAuditLogs已进入BossState。 - 最高管理员授权台已经可用:
GET/POST /api/v1/admin/access仅highest_admin可访问,支持创建 / 更新子账号、授予设备 / 项目 / Skill 权限、套用模板和撤销授权。 - Web
/me/access与 AndroidAccessManagementActivity已接入授权管理;member不显示入口,直接请求也应返回403。 - 会话、设备、项目详情、消息读写、设备 Skill、
/api/state已按当前登录账号裁剪;最高管理员保持全局可见。 - 主 Agent prompt 与任务队列已接入授权快照:生成提示词时只带当前账号可见设备、项目、线程状态文档、进展事件和 Skill;
MasterAgentTask会记录authorizedDeviceIds / authorizedProjectIds / authorizedSkillIds / requiredPermissions。 - 本地
local-agent已能扫描~/.codex/skills并同步到云端设备 Skill 接口;Web / Android Skill 页按授权后的设备和 Skill 展示。 - 普通线程单聊、群聊下发、设备导入审核、browser/desktop 控制都已经进入
master-agent task queue -> local-agent -> complete主链。 - browser/desktop 控制已从占位结果升级为外部 runtime 桥:未配置时 fail closed,配置 smoke runtime 时可回写结构化
control_summary。
1.2 部分落地但仍属 MVP
- 登录会话已有
boss_session、原生restore token和单会话撤销,但还没有独立刷新令牌、完整吊销审计、CSRF 防护和更细风控策略。 permissionAuditLogs已有第一版最高管理员查询入口和 deterministic 风险摘要;仍不是后台持久告警、归档和独立审计存储系统。- Skill 当前已支持“扫描、展示、授权、复制调用语句、进入主 Agent 授权上下文”,并新增最高管理员发起的远程安装 / 更新 / 卸载 / 回滚 / 版本锁请求;local-agent 会认领并执行本机 Skill 文件或 Git 操作,但还不是带签名校验、依赖沙箱和执行审计的完整 Skill 平台。
- 主 Agent 可以携带授权快照并派任务,但审批流仍是局部场景:群聊
approval_required已有确认 / 拒绝;高风险 Skill、远程安装、跨设备接管还没有统一审批引擎。 - 多设备控制当前以设备在线状态、设备绑定、项目线程绑定和 runtime 配置为准,尚未形成租约、抢占、并发冲突仲裁的完整生产级控制面。
2. 权限模型
2.1 角色
| 角色 | 当前含义 | 当前边界 |
|---|---|---|
highest_admin |
最高管理员,默认账号 krisolo |
全局可见;可管理账号、授权、AI 账号、Telegram、运维入口和所有活跃会话 |
admin |
管理员 / 可信协作者 | 可见更多“我的”入口,但当前不是全局授权管理员;不能访问 /api/v1/admin/access |
member |
子账号 / 普通成员 | 只看被授权设备、项目和 Skill;我的 入口限制为个人安全、设置、技能、关于 |
2.2 权限点
| 权限 | 作用对象 | 当前作用 |
|---|---|---|
device.view |
设备 | 查看设备;可带来该设备关联项目的只读可见性 |
device.manage |
设备 | 预留给设备管理动作,当前不是主要前台能力 |
project.view |
项目 / 线程 / 群聊 | 查看项目详情、会话列表、线程状态和项目投影 |
thread.chat |
项目 / 线程 / 群聊 | 向普通项目或线程发送消息并创建 conversation_reply |
master_agent.ask |
项目 / 主 Agent | 向主 Agent 提问或让主 Agent 生成推荐 / 任务 |
master_agent.takeover |
项目 / 线程 | 允许主 Agent 接管或代表用户推动线程执行 |
computer.control |
设备 / 项目 | 允许 browser/desktop 控制类任务进入执行链 |
skill.view |
Skill | 查看已授权 Skill |
skill.use |
Skill | 把 Skill 作为可用能力放入授权上下文或调用语句 |
skill.manage |
Skill | 预留给细粒度 Skill 管理;当前远程安装 / 更新仍由 highest_admin 入口硬限制 |
account.manage |
账号 | 预留;当前账号授权管理仍以 highest_admin 角色硬限制为准 |
audit.view |
审计 | 预留;当前权限审计查询入口仍以 highest_admin 硬限制为准 |
2.3 继承与显式授权
highest_admin绕过设备、项目和 Skill 授权检查。- 非最高管理员如果拥有某台设备或被授予
device.view,可以只读看到该设备关联的项目。 device.view不会自动放大为thread.chat / master_agent.ask / master_agent.takeover / computer.control / skill.use。- 聊天、主 Agent 接管、电脑控制和 Skill 使用必须来自项目授权、设备授权或 Skill 授权中的显式权限。
- Skill 授权可带
deviceId / projectIdscope;同名 Skill 会聚合进skillCatalog,但实际可见 / 可用仍要按设备和项目 scope 判断。 - 过期授权通过
expiresAt失效;当前应在回归中覆盖过期授权不再生效。
2.4 内置模板
| 模板 | 设备权限 | 项目权限 | Skill 权限 | 适用场景 |
|---|---|---|---|---|
| 只读观察员 | device.view |
project.view |
skill.view |
只看设备、项目和 Skill,不允许聊天或执行 |
| 项目开发者 | device.view |
project.view / thread.chat / master_agent.ask |
skill.view / skill.use |
参与项目开发,可问主 Agent 和调用已分配 Skill |
| 设备操作者 | device.view / computer.control |
project.view / thread.chat / master_agent.ask / master_agent.takeover / computer.control |
skill.view / skill.use |
可信协作者,可触发接管和电脑控制 |
3. 控制链路权限边界
3.1 主 Agent 单聊
- 入口:
POST /api/v1/projects/master-agent/messages。 - 权限:当前需要
master_agent.ask;最高管理员全局通过。 - 执行链:写入消息后创建
MasterAgentTask,优先走Master Codex Node,设备离线或立即失败时可退到已配置 API / 阿里备用链。 - 授权快照:任务保存
authorizedDeviceIds / authorizedProjectIds / authorizedSkillIds / requiredPermissions,用于执行器和后续审计判断。
3.2 普通线程单聊
- 入口:
POST /api/v1/projects/[projectId]/messages。 - 权限:普通项目需要
thread.chat;只读project.view不能发送消息。 - 执行链:创建
conversation_reply,由绑定设备local-agent用codex exec resume <targetCodexThreadRef>回到真实 Codex 线程。 - 重要边界:如果线程缺失、设备离线、cwd 不匹配或历史只读线程上下文未解除,应失败并给出明确原因,不应假成功。
3.3 群聊下发
- 入口:群聊消息进入主 Agent 推荐;用户确认后调用 dispatch plan confirm。
- 权限:需要项目聊天 / 主 Agent 推荐能力;最终下发目标必须是真实可执行线程成员。
- 当前审批:
approval_required群聊支持确认 / 拒绝,一次只保留一个待确认推荐,避免叠加。 - 回写:
dispatch_execution完成后线程原始结果回群,再追加主 Agent 汇总;重复完成应幂等。
3.4 Skill
- 采集:
local-agent扫描本机~/.codex/skills,上报/api/v1/devices/[deviceId]/skills。 - 展示:
GET /api/v1/devices/[deviceId]/skills和 Web / Android Skill 页按账号授权过滤。 - 使用:
skill.use决定 Skill 是否能进入当前账号的主 Agent 授权上下文或被用户复制调用。 - 已落地第一版:远程安装、远程更新、远程卸载、Git checkout 回滚和版本锁请求会被 local-agent 认领执行并同步最新清单。
- 未生产化:远程 Skill 执行、签名校验、沙箱隔离、撤销后本地禁用、来源信任和依赖安装策略尚未完成。
3.5 多设备与电脑控制
- 设备能力来自 heartbeat:Codex GUI / CLI、browserAutomation、computerUse 等。
- browser/desktop 控制任务要求
computer.control,并通过MasterAgentTask进入local-agent外部 runtime 桥。 - smoke runtime 当前能做最小真实动作和 artifact 回写,但还不是完整 Playwright / Computer Use 生产运行时。
- 同项目 GUI / CLI 并行写入已有冲突控制:默认阻断,用户可对异常项目选择本次 / 永久放行。
4. 回归矩阵
4.1 Web / API
| 场景 | 要测什么 | 命令 |
|---|---|---|
| 基础构建 | Next.js 构建和 lint 无退化 | npm run build && npm run lint |
| 健康检查 | Web 服务可启动、健康探针正常 | npm start 后执行 curl -sS http://127.0.0.1:3000/api/health |
| 登录态 | 登录、session、restore、logout 链路 | curl -sS -H 'Content-Type: application/json' -d '{"account":"krisolo","password":"<admin-password>","method":"password"}' http://127.0.0.1:3000/api/auth/login |
| 会话治理 | 最高管理员可看全部会话,子账号只能看自己,会话 token 不泄露 | curl -sS http://127.0.0.1:3000/api/v1/auth/sessions |
| 授权台保护 | 未登录返回 401,非最高管理员返回 403,最高管理员可读脱敏数据 |
curl -i http://127.0.0.1:3000/api/v1/admin/access |
| 授权动作 | upsert_account / grant_device / grant_project / grant_skill / apply_template / revoke_grant 都写入 permissionAuditLogs |
用最高管理员 Cookie 对 /api/v1/admin/access 发 JSON POST |
| 权限审计查询 | 最高管理员可按 action / actor / target / device / project / skill / cursor / limit 查询,普通账号 403 |
npx tsx --test tests/audit-permission-logs-route.test.ts |
| 权限审计风险 | 能识别短时间大量授权、Skill lifecycle 失败、过期授权仍存在、admin route 拒绝访问 | npx tsx --test tests/audit-permission-logs-route.test.ts |
| 账号裁剪 | 子账号只看到被授权设备 / 项目 / Skill | 用子账号 Cookie 分别请求 /api/v1/devices、/api/v1/conversations、/api/v1/devices/mac-studio/skills |
| 项目写权限 | 只有 thread.chat 可发普通线程消息,只读账号应 403 |
curl -i -H 'Content-Type: application/json' -d '{"kind":"text","body":"权限回归"}' http://127.0.0.1:3000/api/v1/projects/<projectId>/messages |
| 主 Agent 权限 | master_agent.ask 才能进入主 Agent 任务链,任务包含授权快照 |
curl -sS -H 'Content-Type: application/json' -d '{"kind":"text","body":"列出我可见的设备和 Skill"}' http://127.0.0.1:3000/api/v1/projects/master-agent/messages |
| Skill 过滤 | Skill 列表按设备和账号授权过滤 | curl -sS http://127.0.0.1:3000/api/v1/devices/mac-studio/skills |
| Skill 治理请求 | 最高管理员可创建请求,设备可认领和回写 | npx tsx --test tests/skill-lifecycle-route.test.ts |
| browser/desktop fail closed | 未配置 runtime 时返回明确 disabled,不写假成功 | 关闭 browserControl* / computerUse* 后发控制类主 Agent 消息 |
| 群聊审批 | approval_required 只能有一条待确认推荐,确认 / 拒绝状态正确 |
用群聊项目消息接口触发 dispatch plan,再测 confirm / reject |
4.2 local-agent / 本机设备
| 场景 | 要测什么 | 命令 |
|---|---|---|
| 健康探针 | launchd 常驻不被首次 heartbeat 阻塞 |
curl -sS http://127.0.0.1:4317/health |
| Skill 扫描 | 本机 Skill 能递归扫描并返回 | curl -sS http://127.0.0.1:4317/api/v1/skills |
| Skill lifecycle | local-agent 能认领请求、执行版本锁/卸载等安全本机操作并同步清单 | node --test tests/local-agent-skill-lifecycle-runner.test.mjs |
| 心跳上报 | 设备、能力、Skill、thread-context 能上报 | curl -sS -X POST http://127.0.0.1:4317/api/v1/heartbeat |
| 任务认领 | conversation_reply / dispatch_execution / browser_control / desktop_control 能被认领或明确失败 |
触发对应 Web/API 消息后观察项目消息账本和 local-agent 日志 |
| Codex 线程恢复 | 有 targetCodexThreadRef 时走 codex exec resume,缺失时才退 --ephemeral |
发送普通线程消息并检查回写内容 |
| rollout 镜像 | Boss 用户消息先镜像进 Codex Desktop 同线程,重试不重复写入 | 对已绑定真实线程的项目发送消息后检查 Desktop 线程历史 |
4.3 Android
| 场景 | 要测什么 | 命令 |
|---|---|---|
| 构建 | Debug APK 可构建并发布到 downloads | npm run apk:debug |
| Release | signed release APK 可构建 | npm run apk:release |
| 单元测试 | Android 本地测试串行通过,避免 Gradle 中间产物互踩 | cd android && ./gradlew testDebugUnitTest |
| 真机安装 | OPPO PHZ110 安装并可启动 |
adb -s U84XJRIB7D65ZH45 install -r android/app/build/outputs/apk/debug/app-debug.apk |
| 角色入口 | member / admin / highest_admin 的“我的”入口差异正确 |
真机登录不同账号,检查 用户与权限 / 技能 / 运维 / AI 账号 / Telegram 可见性 |
| 权限管理页 | 最高管理员可创建子账号、套模板、撤销授权 | 真机打开 我的 > 用户与权限 |
| Skill 页 | 子账号只看到授权 Skill,可复制调用语句 | 真机打开 我的 > 技能 |
| 聊天等待态 | 主 Agent、普通线程、群聊下发都显示等待直到真实回写或超时 | 真机分别发送三类消息 |
| 控制结果卡 | browser/desktop 控制结果以目标 URL / 应用名卡片展示 | 真机向主 Agent 发送控制类请求 |
4.4 真机 / 多设备控制
| 场景 | 要测什么 | 命令 |
|---|---|---|
| ADB 目标 | 默认只使用 OPPO PHZ110,不自动回退旧设备 |
adb devices |
| 无线调试 | 同一局域网 + USB 初次启用后可切无线 | adb -s U84XJRIB7D65ZH45 tcpip 5555 && adb connect <phone-ip>:5555 |
| 设备在线 | Boss 设备页显示 mac-studio 在线及 browser/computer 能力 |
curl -sS http://127.0.0.1:4317/health && curl -sS -X POST http://127.0.0.1:4317/api/v1/heartbeat |
| GUI / CLI 冲突 | 同项目双执行模式默认阻断,允许本次 / 永久放行生效 | 在设备详情或项目冲突提示中切换策略后再次派发 |
| 设备离线 | 主 Agent / 项目确认接口返回明确离线原因,不假成功 | 停掉 local-agent 后发送线程或控制任务 |
4.5 服务器部署
| 场景 | 要测什么 | 命令 |
|---|---|---|
| SSH 健康 | 固定服务器 106.53.170.158 可连 |
"$HOME/.codex/skills/boss-server-debug/scripts/server_ssh.sh" health |
| Web 服务 | boss-web.service 运行且本机 API 正常 |
"$HOME/.codex/skills/boss-server-debug/scripts/server_ssh.sh" exec "systemctl status boss-web --no-pager && curl -sS http://127.0.0.1:3000/api/health" |
| Caddy / HTTPS | Caddy 运行,域名跳转正常 | "$HOME/.codex/skills/boss-server-debug/scripts/server_ssh.sh" exec "systemctl status caddy --no-pager && curl -I --resolve boss.hyzq.net:443:127.0.0.1 https://boss.hyzq.net" |
| 外网域名 | 当前网络能访问公网 HTTPS API | curl -I https://boss.hyzq.net && curl -sS https://boss.hyzq.net/api/health |
| 状态文件 | 部署不覆盖服务器 data/boss-state.json |
部署前后在服务器检查 /opt/boss/data/boss-state.json mtime 和关键账号数据 |
| 邮件端口 | Postfix / Dovecot 在线 | "$HOME/.codex/skills/boss-server-debug/scripts/server_ssh.sh" exec "systemctl status postfix --no-pager && systemctl status dovecot --no-pager" |
5. 剩余缺口
5.1 需要生产化的权限能力
- Skill 远程安装 / 更新 / 卸载:第一版设备端安装器和版本锁已落地;仍需要签名校验、来源信任、安装审计增强和失败自动回滚。
- Skill 远程执行:需要明确输入输出协议、沙箱边界、资源限制、敏感权限提示和 per-run 审计。
- 统一审批流:高风险 Skill、电脑控制、跨设备接管、生产部署、账号和存储配置变更应进入同一审批模型,而不是分散在群聊确认里。
- 多级组织:当前只有角色 + 单账号授权;还没有组织、团队、项目组、继承授权、批量授权、离职回收和委派管理员。
- 审计告警:授权日志已有账本,但缺少审计检索、异常检测、告警通道、不可篡改归档和审计报表。
- 风险分级执行:
requiresConfirmation / riskLevel已开始进入任务元数据,但还没有统一策略中心约束哪些风险必须二次确认。
5.2 需要生产化的运行能力
- 数据库:当前仍是
data/boss-state.json文件存储;RBAC、审计、会话和任务队列生产化前需要迁移到数据库并补索引和事务边界。 - 会话安全:需要独立刷新令牌、完整吊销审计、CSRF 防护、设备绑定策略、登录风险检测和异常会话告警。
- 多设备控制租约:需要 device lease、抢占、超时释放、只读观察、独占输入和并发写入审计。
- 真实 Browser / Computer Use runtime:当前 smoke runtime 只能作为过渡层;生产需要接入真实浏览器自动化和桌面控制执行器。
- 服务器出网:公网服务器当前对
api.openai.com直接出网仍未完全打通,OpenAI API 线上探针和调用依赖网络恢复。 - 生产邮件验收:Postfix / Dovecot 已部署,但 SPF、DKIM、DMARC、MX、退信策略和真实外部收件链路仍需最终验收。