docs: add desktop dialog guard design

This commit is contained in:
AI Bot
2026-05-09 20:49:52 +08:00
parent 2c719168b6
commit 0757d07521

View File

@@ -0,0 +1,245 @@
# Desktop Dialog Guard 跨平台弹窗治理设计
## 背景
Boss 当前已经具备 `desktop_control` 任务链路,本地设备端通过 `local-agent/computer-use-task-runner.mjs` 调用 `scripts/computer-use-smoke.mjs` 完成桌面控制 smoke 执行。现状的问题是:桌面自动化在遇到系统级弹窗、应用首次启动弹窗、权限申请、账号/隐私确认时,没有统一处理层,容易中断任务,或者需要临时针对 Chrome、QQ、系统设置等单个应用补丁化处理。
本设计目标是新增一个通用 `Desktop Dialog Guard`,作为所有桌面控制任务的前置和运行中治理层,分别支持 macOS 与 Windows不把能力写死到某一个应用。
## 目标
1. 让 Boss APP 控制电脑时,常见系统/应用弹窗可以被稳定识别、分级和处理。
2. 支持 macOS 与 Windows 两套平台适配器,统一上层策略、审计和 APP 确认交互。
3. 安全弹窗可以自动处理,未知或高风险弹窗必须暂停任务并请求用户确认。
4. 所有处理过程可追踪,避免自动化黑箱乱点。
5. 作为通用能力服务于主 Agent 托管、用户直接桌面控制、Codex GUI/CLI 辅助操作、浏览器自动化等链路。
## 非目标
1. 不绕过系统安全模型不静默授予屏幕录制、辅助功能、输入监控、完整磁盘访问、钥匙串、管理员密码、Apple ID、Windows UAC 等敏感权限。
2. 不默认用坐标点击作为主方案。坐标只能作为控件树和 OCR 都失败后的受控 fallback。
3. 不把弹窗策略写死在主 Agent 提示词里。
4. 不做全局永久放行。长期放行必须绑定设备、平台、应用、弹窗签名和动作范围。
## 推荐方案
采用“平台适配器 + 策略引擎 + APP 人工确认”的组合方案。
备选方案一是继续在各应用控制脚本里写特例,成本低但不可维护,遇到新应用会重复踩坑。备选方案二是完全依赖大模型看图判断弹窗,通用性强但延迟高、成本高、审计难。推荐方案把可预测弹窗交给本地规则,把未知和高风险弹窗交给用户确认,必要时再让模型参与摘要,不让模型直接决定敏感点击。
## 总体架构
新增模块分为五层:
1. `DialogGuardOrchestrator`:桌面任务统一入口,负责 preflight、执行中 watch、超时和任务恢复。
2. `DialogPolicyEngine`:读取规则表,基于平台、应用、窗口标题、弹窗文本、按钮、风险级别匹配处理策略。
3. `MacDialogAdapter`:基于 macOS Accessibility/AX 获取窗口、控件、按钮和文本,必要时结合截图 OCR。
4. `WindowsDialogAdapter`:基于 Windows UI Automation 获取窗口、控件、按钮和文本,必要时结合截图 OCR。
5. `DialogConsentGateway`:将未知或高风险弹窗推送到 Boss 服务端,再由 APP 展示确认卡片。
数据流:
1. Boss 服务端下发 `desktop_control` 任务。
2. `local-agent/computer-use-task-runner.mjs` 构造 runtime payload。
3. 桌面 runtime 启动 `DialogGuardOrchestrator`
4. 执行前先跑权限和弹窗 preflight。
5. 执行过程中 watcher 周期性采集当前前台窗口和系统弹窗。
6. 命中安全策略则自动点击或关闭,并写审计。
7. 命中未知或敏感策略则暂停任务,返回 `needs_user_action`Boss APP 显示确认卡片。
8. 用户确认后,任务按同一 request/session 继续执行。
## 策略模型
新增 `dialog-policies` 配置,规则结构如下:
```json
{
"id": "common-dismiss-welcome",
"platforms": ["darwin", "win32"],
"appPatterns": ["*"],
"titlePatterns": ["欢迎", "Welcome", "提示", "Notice"],
"textPatterns": ["稍后", "跳过", "以后再说", "Not now", "Skip"],
"buttonPatterns": ["稍后", "跳过", "以后再说", "Not now", "Skip"],
"risk": "safe",
"action": "click_button",
"scope": "device_app_dialog",
"auditRequired": true
}
```
动作类型:
1. `click_button`:点击指定按钮。
2. `dismiss`:关闭弹窗。
3. `pause_for_user`:暂停任务,请求 APP 确认。
4. `deny`:默认拒绝,例如通知权限或非必要追踪权限。
5. `ignore`:不处理,只记录。
风险级别:
1. `safe`:普通欢迎、更新、稍后提醒、非必要通知。
2. `medium`:账号登录、浏览器默认设置、下载打开、跨应用自动化授权。
3. `sensitive`:隐私、付款、删除、发送外部消息、权限授权。
4. `blocked`:系统明确禁止或必须人工授权的安全权限。
## 弹窗签名
每个弹窗生成稳定签名,避免误放行:
```json
{
"platform": "darwin",
"deviceId": "mac-studio",
"appBundleId": "com.google.Chrome",
"windowTitleHash": "sha256:title",
"textHash": "sha256:normalized-text",
"buttonHash": "sha256:buttons",
"risk": "medium"
}
```
用户选择“本次允许”只作用于当前 task/session。用户选择“对此设备和此类弹窗允许”只作用于同一设备、同一应用、同一弹窗签名和同一动作不提升到全局。
## macOS 版本
macOS 适配器优先使用 Accessibility/AX
1. 获取前台应用、窗口、sheet、alert、popover。
2. 读取 `AXTitle``AXDescription``AXValue`、按钮列表和可点击控件。
3. 通过 AX element reference 点击按钮,避免坐标漂移。
4. 当 AX 不可读时,使用截图 OCR 识别文本,再进入人工确认或受控坐标 fallback。
macOS 权限策略:
1. Accessibility 缺失:不能自动操作,返回 `needs_permission`
2. Screen Recording 缺失:可以继续文本控件树任务,但不能做视觉判断,提示用户授权。
3. Input Monitoring 缺失:影响全局键盘输入,提示用户授权。
4. Automation consent 弹窗:如果 helper 已具备 Accessibility 且用户预先允许当前设备策略,可点击;否则请求用户确认。
5. Keychain、管理员密码、Apple ID、系统隐私授权永远不自动输入或绕过。
## Windows 版本
Windows 适配器优先使用 UI Automation
1. 通过 UIA 获取前台窗口、子窗口、Dialog、Button、Text、Edit 控件。
2. 使用 AutomationId、Name、ControlType 和 BoundingRectangle 建立控件引用。
3. 优先调用 InvokePattern 点击按钮,不直接鼠标坐标点击。
4. UIA 不可读时,使用截图 OCR 识别并进入人工确认。
Windows 权限策略:
1. UAC 安全桌面不可被普通进程可靠控制,必须提示用户本机确认。
2. Windows Defender、SmartScreen、安装器高危提示默认 `pause_for_user`
3. 浏览器欢迎页、默认浏览器、通知权限、更新提示可按策略自动处理。
4. 管理员密码、系统账号、企业安全策略相关弹窗永远不自动输入或绕过。
## Boss APP 交互
当弹窗需要用户处理时,服务端向 APP 推送一张确认卡片:
1. 标题:`电脑弹窗需要确认`
2. 内容:应用名、设备名、弹窗摘要、推荐动作、风险级别。
3. 按钮:`允许本次``对此设备和此弹窗类型允许``拒绝`
4. 敏感弹窗只显示 `我已在电脑上处理``取消任务`,不提供远程自动允许。
APP 不显示内部字段、控件树、权限原文长日志,只展示和用户决策直接相关的信息。
## 服务端与本地 agent 接口
`desktop_control` runtime 输出新增状态:
```json
{
"status": "needs_user_action",
"requestId": "task-id",
"kind": "dialog_intervention_required",
"dialogId": "dialog-signature-id",
"risk": "medium",
"summary": "Chrome 请求成为默认浏览器",
"recommendedAction": "dismiss",
"availableActions": ["allow_once", "allow_for_device_dialog", "deny"]
}
```
用户确认后Boss 服务端向 local-agent 下发:
```json
{
"requestId": "task-id",
"dialogId": "dialog-signature-id",
"decision": "allow_once"
}
```
local-agent 根据原始 request/session 恢复执行,避免重新发起任务导致重复操作。
## 审计与安全
每次处理记录:
1. 设备、平台、应用、窗口摘要。
2. 弹窗签名和风险级别。
3. 命中的策略 ID。
4. 实际执行动作。
5. 用户确认人和确认范围。
6. 时间戳和任务 ID。
7. 可选截图路径或 OCR 摘要。
审计日志需要进入现有 Boss 风险/权限日志体系,供企业管理员查看。
## 测试策略
单元测试:
1. 策略匹配优先级。
2. 弹窗签名稳定性。
3. 风险分级和禁止自动越权规则。
4. `needs_user_action` 输出结构。
5. 用户确认 scope 不能越权到全局。
平台 fixture 测试:
1. macOS AX snapshot fixture。
2. Windows UIA snapshot fixture。
3. OCR fallback fixture。
4. 未知弹窗 fixture。
真机回归:
1. macOSChrome 首启、QQ/浏览器普通弹窗、系统权限缺失检测、Automation consent。
2. Windows浏览器首启、通知权限、安装器提示、UAC 检测。
3. Boss APP确认卡片展示、允许本次、拒绝、设备级弹窗规则生效。
4. 主 Agent 托管:遇到弹窗暂停,不丢任务;用户确认后继续。
## 分阶段实现
第一阶段:
1. 新增通用策略模型和策略匹配测试。
2. 新增 runtime 结果类型 `needs_user_action`
3. macOS 适配器接入现有 helper/AX 能力。
4. APP 展示基础确认卡片。
第二阶段:
1. Windows UI Automation helper。
2. Windows fixture 和本机回归。
3. 设备级弹窗策略持久化。
4. 审计日志进入后台风险视图。
第三阶段:
1. OCR fallback。
2. 弹窗处理效果统计。
3. 企业部署策略模板。
4. MDM/PPPC 预配置指引,用于企业批量授权 macOS 权限。
## 验收标准
1. Chrome 只是普通测试样例,不是专用实现。
2. macOS 和 Windows 都有独立 adapter统一上层接口。
3. 安全弹窗能自动处理,敏感弹窗不能自动越权。
4. Boss APP 能收到弹窗确认卡片并恢复任务。
5. 主 Agent 托管和用户直接控制都复用同一套弹窗治理。
6. 所有自动处理都有审计记录。
7. 权限不足时给出明确原因和用户下一步动作。