OPENPROGRAM / 计算机操作

GUI Agent:完整电脑操作设计

agentic Program 子进程只继承已接纳的父级执行本来获准的浏览器能力。现有父级 surface context,包括禁用访问的状态,原样保留,不替换。没有显式 context 时,只有普通注册 web_use 权限策略已经通过 SURFACE_GRANT 允许该父级调用,父级才可以从真正注册的 OpenProgram Page inventory 捕获 scope。任务文本、Program 名称、原始 owner 来源引用或新选择的 provider 都不能创建授权。捕获失败保留拒绝;不构造虚假 Page binding 或交互权限。为 Program 捕获同一可用 inventory 会产生有界的 renderer 请求成本;即使 Program 不调用浏览器工具,父级临时 binding 也通过已有 finalizer 释放。

已验证的 Page 快照同时填入子进程 TurnRequest.surface_context 与每次派生的内层请求,与已经绑定的执行 context 一致。在子进程操作边界,已有的经认证 owner permission snapshot 解析当前 mode 与 rules,不修改原始已接纳 request。父级会话已有的 plan 标记进一步将快照限制为 plan mode。Page 捕获与子进程 mode/rules 传输使用同一份有效快照,因此现有 Page context 不能丢弃当前 owner 策略或父级 plan 限制。内层 request 继承该快照;没有 mode snapshot 的旧调用方保留审批模式。Runtime authority 仍为非交互;显式 deny/ask 规则、未知效果审批和目标所有权继续优先于 surface grant。父级 IPC broker 保留已有的精确窗口与 binding allowlist、新鲜 revision 和取消清理。禁用 context、没有注册 App、捕获失败和其他 binding 仍被拒绝。无模型的自有注册 Program 验证真正 spawn 的子进程及内层注册 web_use 权限检查;这些检查不使用用户浏览器或 provider。 unit 委托 fixture 显式注册生产 web_use descriptor,提供隔离的 owner authority 与受控 desktop 可用性,并断言真实 policy 决策。缺少注册、desktop 不可用或捕获失败,都不能创建 fallback context。unit 捕获回调只证明传递与清理;真实 spawn 的注册工具检查另行证明 Page 读回。

窗口会话按精确身份绑定一个 ScreenCaptureKit 窗口:窗口 id、所属进程、bundle identifier 与进程启动时间。随后按几何位置把截图窗口关联到一个 Accessibility 窗口:AXWindows 中 AXPosition 与 AXSize 和截图窗口边框相差小于 2 点的元素。恰好一个匹配时,会话读取该窗口的控件,提供 window_press、window_select、window_set_text 与 window_scroll,window_match 报告 method: "unique_geometry"。多个匹配时拒绝该窗口。没有匹配时,会话只截图:包括 AXWindows 为空或无法读取,以及其中元素的边框都不匹配;macOS 版微信可能只返回一个没有位置和尺寸的 AXApplication 元素,且它的 Accessibility 状态会在不同运行之间变化。只截图会话中,window_match 报告 {"verified": true, "method": "capture_only", "ax_association": "unavailable", "reason": ...},其中 verified 指精确的截图身份。观察结果包含该窗口的截图、空控件列表(controls_available: false),以及告诉规划模型控件不可用、需要从截图读取答案的规则;规划模型只能选择 done 或 fail。派发对任何动作都不接触窗口,直接返回可恢复的拒绝结果(action_status: "refused"、reason_code: "window_controls_unavailable")并给出明确原因;不回退到前台、坐标、全局或按进程投递的输入。每次校验只截图窗口时,检查进程启动身份,并向窗口服务器确认该窗口 id 仍属于该进程且在屏幕上。没有 Accessibility 窗口时无法区分最小化与位于其他桌面空间,因此不在屏幕上的窗口被拒绝而不截图。每次 computer_use 步骤都重新绑定,Accessibility 状态恢复后,下一步重新获得控件。

macOS 窗口反馈使用不激活应用、不接收鼠标事件的状态胶囊(位于窗口顶部居中)和停在上一动作处的 agent 指针;外观与动效见 Agent 控制提示层。精确窗口校验与应用排他控制成功后启动 helper。目标矩形减去遮挡窗口区域后作为图层 mask,局部重叠不会隐藏整层提示。标记使用成功动作执行前的控件边界,以目标窗口内的相对坐标保存。能力反馈保留这份显示信息及原窗口身份,在后续同一窗口步骤开始前恢复;它不是输入权限或成功回执。正常步骤结束后短暂显示明确结束的反馈,失败、取消或身份丢失时关闭。helper 失败记录诊断,不虚构动作成功或切换前台操作。源码生命周期修复不能证明安装版原生显示已经验收;遵循用户不测试的要求,功能执行仍未验证。

macOS 窗口适配器从宿主能力注册表中映射到 gui_agent:desktop 的条目确定必需权限。可用性与适配器的 system_access 诊断仅包含这些必需条目:屏幕录制与 Accessibility。无关的日历、提醒事项、麦克风、相机、按目标应用检查的 Automation 和按路径检查的文件访问仍在完整系统报告中显示,并保留各自操作的检查;它们不能阻止窗口截屏或 AX 控制。缺少必需条目,或必需条目状态不是 granted,都会在原生初始化前拒绝窗口操作。窗口动作前重复相同检查,因此撤销授权仍立即生效。缺少注册表 API 的旧宿主保留原有非提示 Quartz/AX 检查。状态读取不请求权限,也不产生前台输入回退。

窗口清单在将能力可用性返回持久化 GUI 步骤前,把 macOS 原生应用名称、bundle identifier 和窗口标题转换为普通 Python 字符串。窗口身份也在将原生 NSDate 启动时间发布到能力结果 target 或 next-feedback window target 前,转换为精确的 Python 字符串类型。NSDate 的第一次字符串转换仍可能返回桥接字符串子类;再次转换这个字符串表示,保留日期文本并移除桥接子类型。缺失值仍为 null,窗口与进程身份仍为整数,文本内容保持不变。缺失启动日期仍拒绝目标,重启和上一目标身份比较保留原有含义。持久化 JSON 校验继续严格执行,原生桥接对象不能进入已保存步骤结果。该转换不捕获窗口、不请求权限、不改变焦点,也不重放结果未知的操作。

共享报告兼容测试的假输入提供两个桌面必需 id,包括仅控制权限被拒绝时已授权的屏幕录制条目。原有报告、拒绝理由和隐私断言保持不变。独立的公开适配器回归测试有意省略各必需条目或提供未知状态,并要求在原生初始化前拒绝操作。

这个按桌面操作限定的适配器报告也提供给已安装 bridge 的持久化能力规划器与桌面系统权限等待。默认浏览器任务仍不依赖桌面权限;可恢复的桌面授权缺失仍在选定桌面效果前进入等待。桌面权限修复交付时,只把 scripts/release/product-runtime.json 的 GUI commit 更新到经独立审查的 Harness 版本;官方刷新归档该确切 commit,并拒绝源码与 pin 不一致。其他程序 pin、依赖、权限和 runtime 能力保持既有值。本地经审查的 commit 与成功本地归档不证明远端仓库或 CI 已包含它。产品 runtime 安装固定 Harness archive,而所属 catalog 在新 loader 命名空间中可以解析其他源码。公开 bridge 源码 metadata 不证明 worker 已缓存的 Harness 模块身份。验收分别记录自有注册入口的精确源码、已安装原生就绪状态与可视桌面执行。

从公开接口、当前源码与测试,确定完整输入、持续代码执行、状态恢复及应用验收。

目标设计 · 尚非完整实现 English
审阅 Resources 与操作预览

浏览器控制界面:十种场景选择(架构仍以本文为准)。

嵌套工具的模型选择

前台轮次为 GUI 和 Workflow 内部模型调用绑定与聊天循环相同的 provider 和 model。优先级为请求 override、会话选择、冻结或当前 agent profile。冻结 profile 请求只读取会话选择。解析后的选择保存在请求中,并与当前工作目录一起传入工具子进程。选定 Runtime 初始化失败时,该错误保留在轮次中,内部模型调用抛出原始错误,不改用其他 provider 或继承外层 Runtime;不调用模型的工具仍可执行。轮次释放时恢复此前 Runtime 上下文。独立检测出的全局 provider 不代表当前聊天选择。

组件验收通过 TurnBindings.bind 覆盖 override、会话、冻结 profile 和 profile 默认选择,并验证上下文恢复。已安装 GUI 和周报执行另需确认认证可用及真实工具调用;组件测试不能证明实际执行成功。

目标与完成标准

产品目标是在浏览器与原生应用里持续完成任务:组合使用已授权的 UI、代码和文件工具,验证交付物,并始终支持控制。覆盖密集控件、自绘画布、多窗口、对话框、下载、保存、恢复,以及操作系统支持的用户与 Agent 同时操作。

这是原位置改写的唯一 GUI Agent 工程设计。正文规定目标,源码核查和文末状态区分现有能力与仍需实现、实机验收的能力。产品使用说明仍在GUI Agent 使用文档。

验收要求相同模型、相近预算下,明确任务集中的行为能力对齐。本次没有检查所贴视频的完整执行轨迹,不能确定其中 Blender/PCB 成品的具体执行方法,也没有测出 Codex 的量化优势。
  • 唯一公开入口 gui_agent(task)、标准 Agent 配置与共享历史。
  • 持续代码执行、完整 UI 原语、浏览器/本机桌面/VM 适配器。
  • 目标归属、权限继承、执行上限、取消、重启恢复和最终验证。
  • 同模型应用测试;前台或 VM 操作不能代替后台桌面验收。

基础模型训练、复现 OpenAI 未公开内部实现、绕过应用安全限制、承诺兼容所有软件不属于本设计。复杂后台输入仍是必须完成的任务,不能把目标缩减为仅操作 Accessibility 控件。

参考系统与证据边界

参考 已建立的事实 采用与限制
OpenAI / Astra [R1] 代码操作 UI、持续环境、短动作组后观察;仍支持结构化动作。 采用普通函数接入;没有托管的本机运行器或公开的 Codex 原生内部实现。
Codex / Work [R2] macOS 后台应用、Windows 当前桌面、应用授权。 保留平台差异;产品行为说明不能证明底层算法。
当前 CUA 工具接口 [R3] 持续 JavaScript、应用/标签对象、AX 差分、截图、语义/坐标操作、批处理。 实际工具契约,不是所有软件兼容性证据。
Claude computer 工具 [R4] 客户端动作、缩放、批次及明确的截图坐标约定。 用于 provider 比较,不假定裁剪坐标规则相同。
Playwright [R5] Locator 重新定位、可操作性检查、有界等待。 可信适配器内部复用,不向模型代码提供无限制 browser 对象。
browser-use / Stagehand [R6] [R7] 任务级浏览器 Agent / 结合语义与程序动作的 SDK。 参考覆盖范围与接口,避免额外嵌套自主 Agent 和不必要依赖。
Playwright MCP / Chrome DevTools MCP [R8] [R9] 结构化浏览器工具与浏览器调试。 保留受准确 Page 归属约束的可选适配器,不等于原生桌面操作。
Apple API 与本机 SDK [R10] 窗口截图和按进程投递的 CGEventPostToPid 接口存在。 API 声明不能证明后台画布接收或正确窗口路由。

Docker/VNC 提供运行与显示设施,不提供模型推理,也不会自动控制 Windows 宿主机。Linux 容器、本机 macOS 应用和 Windows VM 是不同环境。

当前路径与已核实缺口

桥接层只注册一个根入口并解包 Harness 函数。plan_next_capability 将能力历史序列化进 prompt;call_capability 选择内部执行路径。

gui_agent(task)
  -> plan_next_capability(task, history, availability)  # 模型
  -> computer_use(subtask)
       -> macOS window_session
       -> gui_step: observe
            -> verify_step(previous feedback)        # 有反馈时调用模型
            -> plan_next_action                      # 模型
            -> 一个注册动作
  -> 追加输入输出;再次选择

browser_use(subtask)
  -> 自定义循环,每轮 agent(tools=[browser_page], max_iterations=1)
  -> Page/帧检查、动作、可选截图、终态断言

有反馈的桌面迭代通常在额外定位/重试之前已调用三次模型。这是源码结构计数,不是延迟测量。首轮省去上一步验证;AX 窗口动作不使用 OCR/YOLO,其他桌面/VM 路径可以使用检测定位。

macOS 窗口注册表只暴露 window_press、window_select、window_set_text、window_scroll 和终态标记,只截图窗口只暴露终态标记;其他文件里的全局键鼠函数不能扩大这个入口。浏览器支持点击/输入/按键/悬停/滚动/选择,但未暴露拖拽与持续脚本入口。

Runtime.exec 已使用 DAG 渲染历史并继承调用方权限限制内部工具,不需要再做 Context Engine。execute_code 每次新建 Python 子进程,无法跨调用保留 UI 对象或变量。

稳定保留身份是 tab/资源关联:tab id、会话、分支分组,以及最后确认的 URL 与标题。活的 page key、CDP/BrowserView 句柄、frame 与动作租约只属于当前进程。桌面视图使用原生 persist:webtabs 分区;网页 UI 把中间栏 tab 描述持久化到 localStorage。重启恢复为每个保留 tab 描述重建新的原生 Page/绑定,加载最后确认 URL,并保持会话/分支分组。旧的活句柄可以标为不可用。没有保留 tab 描述的孤儿资源行不会凭空创建,失败时留在原分组。

[S1] [S2] [S3] [S4] [S5]

能力逐项比较

能力 当前证据 目标 验收
原生输入 Mac 窗口仅 AX 控件 坐标、拖拽、修饰键、Unicode、文本选择 画布、编辑器、保存对话框
持续运行器 新子进程;无持续 GUI 脚本 隔离命名空间与限定对象 跨调用保留;重置失效
模型循环 选择器加验证/规划调用 标准 Agent 选择短批次 不逐原语强制调用模型
浏览器控制 Page 租约、ref、CDP/MCP Locator、frame、弹窗、拖拽、文件传输 多标签/iframe/上传/下载
感知 截图、AX/DOM、裁剪定位代码 按需原分辨率裁剪 小目标与坐标映射
上下文 共享 Runtime 加 GUI 序列化历史 规范多模态 DAG 消息 恢复无重复或约束丢失
权限 内部工具权限、Page/窗口校验 逐原语 broker、应用授权/撤销 批次中撤销;不访问其他目标
VM OSWorld 协议和全局目标锁 按环境适配器与租约 双 VM 无交叉投递
验证 终态限制和浏览器断言 最终 UI 与交付物检查 重开保存结果;拒绝未保存内容
恢复 进程内 GUI 循环与活对象 安全点新绑定;不确定副作用 中断后不重复提交
可见控制 函数卡片与原生提示 目标、动作、停止、接管、恢复 输入/等待中取消
后台兼容性 局部 AX 测试 逐应用坐标/键盘投递证据 其他应用仍前台;指针不变
长任务质量/成本 本次无同条件 Codex 对比 相同模型/任务/权限/预算/评价 分层重复应用任务集

部分已有不代表完整验收。所有目标的实现门槛见文末。

目标架构与职责

目标架构 标准 Agent 调用隔离 Python,可信 broker 路由准确目标并返回观察。 一个 gui_agent 根入口 标准 Runtime / AgentSession gui_exec:隔离持续 Python 可信 broker:逐操作校验 浏览器 Page 适配器 macOS / Windows 桌面 远程 VM 适配器 观察、动作回执与交付物证据 DAG 消息与正常已授权工具

一个 gui_agent FunctionInvocation 持有一次标准 Agent 执行生命周期,解析配置、获取资源、暴露工具、执行上限、返回验证结果,不再作为第二个规划器。模型决定观察、UI 操作、正常工具和终态验证。

gui_exec(code) 是普通函数工具。持续 Python 子进程通过限定代理访问资源,可信 broker 持有 Page/窗口对象、权限、租约、坐标映射和回执;模型修改变量不能改变这些。桌面 helper 提供输入/截图,worker 保留 Page 归属与任务控制。

computer_use、browser_use、vm_use 成为兼容边界/内部适配器,新路径不再各自规划子任务。公开表单保持简单;高级配置依次采用显式、环境、默认 Agent 设置。保留 tools=None、tools=[] 和指定列表语义;GUI 工具只在外层授权内加入并排除递归 gui_agent,不能恢复被拒绝的 shell/文件/网络工具。

持续运行器与代码契约

先用 Python,复用现有 Runtime、Harness 和适配器。每次 GUI 调用的隔离子进程保留命名空间并支持顶层 await。broker 内部可用 Playwright,模型只获得限定代理,不拿原始 browser/CDP/AppKit/OS 输入对象。JavaScript 语言适配可后续增加,不是代码操作的必要条件。

复用 backend 进程生命周期与 ToolReturn 图片,采用 GUI 专用强制隔离策略。不改变 execute_code 每次新进程的契约;Python 命名空间限制和 Node vm 都不是安全边界。

原型上限为每段脚本 30 秒、100 次 broker 操作、256 KiB 文本、每次四张图及 provider 像素限制。这是起始参数,不是测得最优值。长时间应用渲染返回异步对象,有界轮询让出执行;超时先撤销写能力再终止子进程。

# 拟议 SDK,当前尚未实现。
page = await ui.browser.open("https://example.org", background=True)
obs = await page.observe()
field = page.get_by_role("textbox", name="Search")
await field.fill("bearing dimensions")
await field.press("Enter")
await page.wait_for_text("Results", timeout_ms=5000)
display(await page.screenshot())
# 下一次 gui_exec 保留 page 和 field。

按序返回文本/图片块,以及 environment、generation、operation ID、status、effects、observation、error、timing 类型化详情。每个原语产生子执行事件;错误说明最后完成的原语和不确定副作用。执行回执只能证明动作应用,不能证明任务成功。

SDK 与操作目标语义

类别 契约 边界
发现 应用/窗口、Page、已配置 VM 与能力描述 稳定身份、可用状态、支持模式;不含凭据。
观察 全量/差分、截图、裁剪、边界 token 绑定目标、generation、帧、几何、映射。
语义输入 按控件、设置/选择文本、支持的次级动作 唯一匹配,并验证当前目标归属。
视觉输入 按钮/次数、悬停、路径拖拽、滚轮、组合键/按下/释放 坐标必须带帧;失败/取消释放输入状态。
浏览器 限定 Locator、frame、弹窗、文件选择、下载 owner/origin/path 检查;先监听事件再触发。
等待/验证 状态谓词、交付物检查、最终视觉检查 有界可取消轮询;证据对应用户目标。
生命周期 释放、重连、让出、接管、重置 只关闭自己资源;重置使对象失效。

Python 代理保留不代表过期目标有效;broker 每次重新验证。同一目标写入串行,独立读取可以并发。

Broker 协议与观察数据

使用限定本次调用的 IPC 连接,JSON 消息带长度边界,图片使用单独有界数据。连接建立时宿主指定 owner 与 generation,生成代码不能选择。请求包含 operation ID、资源对象、方法、参数、观察 token;未知方法和超大消息在执行前拒绝。

# 拟议 broker 消息结构
request = {
  "operation_id": "op-17",
  "resource": "window-handle",
  "method": "drag",
  "observation": "frame-token",
  "arguments": {"path": [[120, 90], [180, 120]], "modifiers": ["Shift"]}
}
observation = {
  "target": {"kind": "window", "handle": "window-handle"},
  "generation": 3, "frame_id": "f-21", "base_frame_id": None,
  "image": {"width": 1600, "height": 1000, "detail": "original"},
  "transform": {"origin_x": 0, "origin_y": 0, "scale_x": 2, "scale_y": 2},
  "controls": [], "capabilities": ["observe", "click", "drag", "keypress"]
}
receipt = {
  "operation_id": "op-17", "state": "applied",
  "last_applied_index": 1, "effect_uncertain": False,
  "observation_token": "new-frame-token"
}

broker 通过现有 execution effects 记录接收与完成,再返回成功回执;接收不证明副作用发生。原生事件派发通常没有事务确认,响应丢失后先观察而非重放;恢复后以租约 generation 阻止旧连接。

回执完成规范化和当前权限检查后,提交准入与撤销通过同一个短锁确定先后顺序。撤销前已获准提交的回执可以在撤销后完成持久化,因为它记录的是已经完成的原语,不授予后续输入权限。锁内不运行适配器、校验函数或数据库调用。动态校验返回后重新检查执行状态、attempt 和取消状态;每次 broker 派发使用独立复制的宿主 owner Context。

无旋转窗口截图的桌面点为 x = origin_x + image_x / scale_x,y 同理;裁剪先映射回父图。一般显示变换使用可逆矩阵,规则由源观察定义。浏览器从截图设备像素映射到 viewport CSS 像素。拒绝超出允许范围或过期变换,不能重复乘除 Retina 比例。

SDK 可以隐藏协议字段,但不能隐藏权限变化。Locator 可在已知目标内重读几何;打开另一应用或在新 origin 操作必须重新通过策略。

macOS:完整输入与后台可行性

保留 ScreenCaptureKit 与 AX。增加稳定签名的完整输入原生 helper,绑定应用身份、窗口和 broker 租约。支持的控件用 AX;画布与键盘流程研究进程定向事件。

本机 SDK 声明了 CGEventPostToPid,AXUIElementPostKeyboardEvent 已弃用。PID 不是窗口 ID;必须验证窗口路由、坐标解释、事件接收和前台/指针保持,不声称 OpenAI 使用该 API。

Harness 的显式测试探针 tests/probe_native_input.py 使用自有 AppKit 测试窗口。在 macOS 15.7.3 arm64 上,原始进程定向鼠标事件到达应用时没有关联窗口;NSEvent 能关联窗口,但后续鼠标坐标错误。实验性 CGEventSetWindowLocation 注记配合包含标题栏的完整窗口 frame,得到预期的点击和拖拽坐标。该 setter 未公开,实验只证明本机可行性,不构成受支持的生产契约。默认探针保留公开 API 对照组,未公开路径需要 --private-window-location。

事件测试窗口不使用剪贴板即可收到普通及 Unicode key-down 字符。独立的 --controls 测试窗口通过实际控件值和 DOM 事件位置,检查原生文本替换、NSButton 动作、本地 WebKit 文本框替换和画布拖拽。Command+A 需要测试应用的标准 Edit 菜单;初次实验缺少该菜单,文本被追加,判定失败。控件几何在 WebKit 加载完成后测量。这些测试只证明少量 AppKit/WebKit 控件行为,不代表已安装应用兼容性、IME、一般快捷键、多窗口隔离或截图坐标映射通过。

更严格的应用身份与双窗口检查表明,不能由上述单窗口样本推断一般后台输入能力。临时签名 App 通过 LaunchServices 启动后,能满足现有 MacWindow 的启动身份校验并取得准确窗口截图。但另一个窗口初始持有键盘焦点时,普通鼠标事件不能使 WebKit 获得焦点,随后网页文本被写入原生输入框;显式添加 Command 修饰后,画布能收到鼠标事件,但键盘文本被写入另一个窗口。这是尚未解决的路由和焦点问题,不是可透明采用的回退方式。探针对两种情况均判定控件验收失败,并在每条回执中检查另一窗口的真实文本,包括输入结束后明确请求的最终状态。生产适配器必须先确认目标焦点,并保持请求的修饰键语义,再发送按键。

前台身份和指针位置只在实验前后采样,不能排除瞬时变化;完整实现门槛通过前,background_input 仍不可用。探索性后台点击分析提供了未公开窗口坐标注记的候选线索,其中关于其他软件的主张不作为已核实事实。

实现第一道门槛:签名 helper、自有 AppKit/WebKit/Electron 夹具、已安装画布应用,另一应用保持前台。记录目标真实状态、截图、前台身份、指针和按键状态。失败意味着后台要求仍未解决,不能以“前台/VM 能做”代替通过。

声明 background_ax、background_input、foreground_input 或不可用。验证过的能力默认后台;前台需要任务/会话策略允许并显示控制,不能静默激活应用。公共 API 不能完成要求时,评估受支持的供应商接入或经过实测的原生方式,该指标继续未完成。

通过 display 身份、窗口原点、比例与裁剪元信息映射截图像素。覆盖 Retina、多屏负原点、窗口移动和比例变化,拒绝过期几何。截图与输入权限分别检查,最小化、安全输入、锁屏、权限框分别返回明确结果。

优先 AX 替换和验证过的按键插入。默认后台和前台文本输入都不以全局剪贴板作为自动传输;使用 AX、Unicode/按键事件或应用局部插入/导入 API。change counter 只能保护恢复,不能防止其他进程在 paste 前替换内容。用户明确要求的系统剪贴板任务使用宿主/pasteboard 仲裁、保留同时发生的用户修改,不承诺并发用户操作时内容正确;浏览器局部 paste 单独限定范围。物理键鼠租约按宿主/会话串行,不能只按窗口。模态 sheet/菜单绑定为子目标或显式新目标,不选择当前最前窗口代替。

[R10] [S6]

浏览器:复用归属并补齐操作

可编辑字段观察保留四层诊断祖先,并可在 field_context.label_binding 中提供十二层祖先以内最近语义容器的简明标签证据。完整扫描最多 120 个后代,必须发现恰好一个可见可编辑控件和一个可见、不可编辑的叶节点 label;有歧义、扫描不完整或位于可编辑值中的标签不绑定。证据记录来源、规范化的完整标签、深度、计数及独立的 redacted/truncated 标记,原生和 ARIA 标签保持不变;密码控件不提供绑定。完整秘密掩码先于现有字符串截断和 32768 字节上下文总预算。预算裁剪可移除无关诊断祖先而保留完整绑定;绑定标签被掩码或截断时不能使用。结构证据本身不授予写入权限。 原生 ref 操作在内部保留公开截断前完整规范化的原生标签身份和完整简明绑定,并在输入前比较新读取的语义证据。绑定改变、消失、新增或变得有歧义时,该观察失效;无关诊断布局文本和 class 不作为操作身份。

复用 WebUseSessionRegistry、Page token、worker 持有的 WebContentsView/CDP、帧检查和清理。绑定准确的提交 Page 或创建自己拥有的后台 Page,不选择当前活动标签代替;可选 MCP 后端继续作为执行适配器。

发现 Page 不代表所选 MCP 后端能够启动。已知 MCP 启动失败返回 computer_use_backend_unavailable、availability=unavailable、实际选中的 backend 和已关闭的会话标识,不输出上游原始诊断,也不自动选择其他后端。观察失败时释放 Page 租约和捕获的绑定,删除临时绑定 marker,并在线程停止后关闭自有 MCP event loop。取消、权限失败和未知缺陷保留原有错误语义。

提供限定的 role/name、label、text、test-ID、相对 Locator 和 frame 进入,复用 Playwright 可操作性检查和有界等待。每动作重新定位;歧义、语义或归属变化返回 stale-target。数字 ref 只在当前观察有效。

补齐拖拽、多击、修饰键、横向滚动、文件选择/下载、iframe 和弹窗。弹窗按 opener 和准确身份绑定,重新校验目标权限,文件只经授权路径传输;先监听下载/弹窗再触发,避免丢事件。

UI 脚本不暴露原始 page.evaluate、任意 CDP send、cookies、profile 目录或浏览器启动。可信代码可为有界观察读取 DOM。通用 shell/文件/代码工具仍经正常权限提供,显式开发调试能力同样受策略约束;UI SDK 不能成为无限制浏览器控制入口。

[S3] [S7] [R5]

Windows、Linux 与 VM 边界

Windows 明确采用当前桌面模式:截取准确 display/窗口,并在前台租约内输入。检测用户接管、桌面切换、锁屏与完整性级别限制。标准控件用 UI Automation,自绘画布用坐标输入。参考产品不声称 Windows 后台控制,我们也不隐式承诺。

Linux X11 与 Wayland 使用不同适配器。X11 可复用输入/截图设施,Wayland 必须有明确支持的 compositor/portal 或远程桌面后端。不支持时返回不可用,不能假定具备 X11 权限。首个 Linux 验收目标是明确的隔离桌面/VM 镜像,不是所有发行版。

保留 OSWorld 兼容的截图/execute 协议,但把目标身份从进程全局 monkeypatch 中移出。每个环境对象持有传输、截图路径、输入状态和租约,凭据留在执行器。检查图片和超时,区分可重试读取与不确定写入,测试两个独立 VM。Docker 是可选 Linux 设施,本机 macOS 和 Windows 宿主操作不要求 Docker。

macOS 锁屏自动操作需要独立审查 OS 授权设计,不能在补齐 UI 时附带新增特权解锁 helper。该门槛通过前,Locked use 明确列为仅参考产品具备;任务记录原因暂停,用户手动解锁后重新观察再恢复。

[S8] [R2]

上下文如何保证连续

模型只使用 DAG 中的正常 user/assistant/tool 消息作为历史。UI 代码、每个操作结果和选中截图记录在相同调用关系中。迁移后移除重复注入的 JSON 历史;兼容返回的 history 由事件派生,不作为第二份事实来源。

分清三个生命周期:Agent 对话、执行命名空间、外部应用状态。继续模型响应不会恢复 Python 对象或应用窗口。安全点记录环境 generation 和资源绑定;压缩保留任务、权限、未满足条件、交付物路径、最后验证状态及不确定副作用。AX/CDP 活对象不能序列化为可移植 checkpoint。

默认返回小型 AX/DOM 差分,使用稳定 broker ID,并允许请求完整快照。缺失基准或差分乱序时返回全量。图片附带 frame/target 与 provider 支持的 detail。按明确保存策略保留近期相关视觉状态、最终证据和失败观察;token 预算与摘要使用共享 Context Engine。

按需裁剪原分辨率图,每张裁剪保存到父图的仿射映射;坐标 SDK 调用必须带裁剪 token 或明确父帧。已有 OCR/检测/zoom 定位作为不确定目标的可选工具,不强制每个 AX/DOM 动作都预处理或额外调用模型。ScreenSpot 类定位只能测一个组件,不能代表长任务完成率。

[S4] [S9] [R1]

延迟、成本与验证策略

优化实际端到端任务。当前结构反复选择能力并逐步验证/规划;目标是一次 Agent 决策执行短的确定性操作组,返回状态再决策。不删除结果验证:确定性检查在执行器完成,视觉歧义和任务阶段结果才需要模型验证。

变化 原因 测量与约束
批量输入和等待 减少逐原语模型往返。 动作数/模型调用、p50/p95 耗时;目标/权限变化停止批次。
AX/DOM 差分与按需裁剪 减少重复像素和文本。 输入/图片 token、误操作率;基准缺失强制全量观察。
复用绑定与命名空间 避免反复连接和创建对象。 连接/截图延迟;generation 阻止旧对象复用。
按需验证 确定性状态检查和最终交付物证明。 误报成功与恢复率不能变差;视觉阶段仍需检查。
有界进展检测 识别重复而不另加规划器。 重复指纹且状态未变时新观察/换策略或明确失败。
模型选择 使用配置模型,独立评估 effort 和小模型替代。 同任务预算配对试验;不能从低成本推断质量。

总耗时拆为模型、截图/编码、broker/输入、应用等待、恢复。记录模型请求、UI 原语、观察、图片 token、重试和人工干预。模型完成 API 调用生成不等于执行器已经应用动作。

测量前不承诺加速倍数。初始性能验收是在完成率不下降的前提下,确定性任务子集的模型请求中位数减少;完整任务集公布耗时分布和失败。复杂视觉任务如能提高完成率,可以使用更多图片预算。

执行权限与隔离

生成的 Python 是任意代码,必须由 OS 隔离。持续子进程使用 GUI 专用 sandbox profile,将外层限制与不可关闭的 scratch/runtime/IPC-only 策略求交。普通 Backend.spawn_spec 路径不足;使用拥有独立临时目录、固定解释器与强制策略的严格启动上下文,要求平台 sandbox 且禁止降级。运行库启动可以读取祖先目录本身的目录项,但不能因此读取其后代文件内容。danger-full-access、宽松继承 override 或 sandbox 不可用都不能关闭该工具隔离;此时 gui_exec 不可用,正常独立授权工具保持原行为。子进程不能直接联网、自动控制桌面、任意读取宿主文件或取得原始 CDP/native 对象;过滤 globals 不是隔离措施。

可信 broker 持有 OS 权限和外部对象,用进程身份与本次调用绑定通道认证子进程,不把可复用全局 bearer 凭据交给生成代码。每次副作用前校验 owner、generation、准确目标、动作、当前用户授权、deadline、取消状态。批次被接受不代表未来新目标都被授权。

正常 Agent 工具分别受权限限制。脚本需要文件/shell 操作时,经显式 broker 工具代理请求正常工具,或返回 Agent 再调用;复用现有 dispatcher 和不可扩大权限的外层请求,不能把旧浏览器路径的特殊 bypass 复制进通用代码运行器。

页面文本和截图是非可信数据,不能授权新应用、修改系统指令或调用受限工具。工具说明与应用能力来自可信宿主。相同授权动作继续使用已有批准,新增应用或扩大副作用按当前策略处理,不给每次无害点击新增确认。

撤销先阻止新副作用、释放已按下的键/按钮并停止脚本,然后清理。私有轨迹有界本地保存,交付物采用明确保存策略;遮蔽安全输入与凭据,测试不自动发布截图或用户数据。

[S4] [S10]

失败、取消与重启恢复

在已选择能力边界检查桌面权限

仅传 task 的 gui_agent 入口允许规划与已授权浏览器操作,不预先要求本地桌面权限。显式桌面执行保留副作用前权限检查。默认能力发现区分可恢复的 OS 授权缺失与不可用的原生依赖:只有选中本地桌面操作后才请求所需授权。浏览器与 VM 操作继续遵守各自的目标准入和授权边界。

可信宿主编排适配器通过现有 durable function 记录,将每个规划决定和能力结果保留为 JSON。可恢复参数只包含任务与配置,实时 Runtime 由宿主 ContextVar 绑定。固定且有版本的 GUI-operation API 将保留的编排连接到 pinned Harness 的规划器、执行器与总结函数;快照准入仅识别这些操作,不放开任意动态 import、不透明宿主对象或生成代码。公共 resume_state、历史或游标参数不能替换持久执行状态。

  1. 在选择外部操作前提交本轮规划决定。
  2. 选择 computer_use 后,在登记或派发其副作用之前重新检查桌面授权。可恢复的授权缺失产生 typed function suspension,携带保留的调用身份与已选能力;依赖不可用仍终结执行。
  3. 子进程通过 IPC 报告暂停。父进程重新检查执行主机,在自己当前拥有的 attempt 中打开现有 system_access 等待。子进程或模型的报告不能证明授权已成立。
  4. forced 调用在等待 checkpoint 中保留函数游标。Agent 工具调用先保留函数游标与现有 provider/tool continuation,再打开等待。两个提交之间发生崩溃时,恢复已暂停函数并重新建立必要的等待。
  5. 真实授权后恢复同一任务,取回已提交的规划与浏览器 step 结果,重新检查权限,再首次派发待执行桌面操作。取消、授权撤销、旧 generation 或未确定副作用均阻止派发。
  6. 父进程在准入时已确认授权,则保存静默 resolved wait,在释放 Runtime 和 handle 后仅恢复其确切 attempt/checkpoint。释放后的恢复不会检查、解决或恢复其他 open wait;显式权限等待保留 worker 原有的统一核对流程。

权限检查独立于 desktop step,并先于该 step:step() 在调用操作前将副作用标为已派发,在 desktop step 内等待会产生未确定副作用并阻止安全恢复。子进程也不能直接打开父进程拥有的等待,因为打开等待会结束当前 attempt。默认 forced 调用同时捕获浏览器能力可用的已授权 Page 上下文与已选原生能力上下文。

条件 必须行为 验收
观察过期或窗口移动 输入前拒绝,重新观察绑定。 不向旧坐标输入。
弹窗/模态/导航 停止旧状态续执行,发现准确新目标并授权。 不写入其他活动标签/窗口。
批次部分失败 返回已执行前缀与不确定操作,不重放整段。 不重复完成的保存。
输入派发后超时 标记副作用不确定,重试前检查外部状态。 不声称 UI 输入 exactly-once。
用户接管/暂停 阻止写入,安全释放输入状态与租约,保存任务。 恢复先观察,遵守新指令。
worker/helper 死亡 使 generation 失效,只重连归属资源并检查最后副作用。 旧脚本重启后不能继续操作。
App 或 worker 进程重启且仍有保留网页 保留 tab/资源关联。用新的能力身份重建已校验的原生 Page/绑定。加载最后确认的 URL 与标题。在后台恢复。不复制保留的 tab。不重开用户已关闭的网页。已隐藏的 PiP 保持隐藏。旧的活句柄保持无效。 已实现于保留 tab。默认 App 端口 18100:隐藏延迟导航、固定与隐藏预览偏好、恢复后首次人工点击、明确关闭的网页保持关闭。三轮合并测试、Web、contracts 与 Desktop/docs 门槛通过。整个 GUI Agent 项目仍未完成。
拖拽中取消 停止新输入,释放鼠标/修饰键,终止回收运行器。 无按键卡住、孤儿进程或迟到写入。
清理失败 保留主结果,单独报告清理失败。 不关闭借用的用户窗口/Page。
provider 失败 现有有界重试,不重放已执行工具。 模型请求重试不重做副作用。

复用现有 execution-control 安全点、取消和 owner generation,不新增调度器。持久化可序列化资源描述与最后确认的动作回执。崩溃使活命名空间丢失:在脚本边界恢复,重新绑定观察,不承诺恢复 Python 调用栈或重放 UI 写序列。

公开结果仍为 succeeded、infeasible、failed;取消由执行系统 cancelled 状态表示。暂停/审批/接管是可恢复控制状态,不是成功。结果包含原因、未完成条件、最后验证状态及交付物证据,清理失败不能把任务失败改为成功。

[S11]

浏览器重启恢复

worker 或 Desktop 进程死亡不等于用户关闭网页。保留的 tab/资源关联(tab id、会话、分支、最后确认的 URL 与标题)继续存在。先前的活 page key、frame、CDP/BrowserView 句柄和动作租约不再有效。App 与 worker 恢复健康后,为每个仍保留的 tab 在后台自动恢复:创建带新能力身份的已校验原生 Page/绑定,加载最后确认 URL,不抬起窗口、不额外增加顶部标签、不显示先前已隐藏的 PiP。紧凑 PiP、纵向 Files / Activity / Resources 侧栏、以及按分支分组的资源行保持 Resources 与操作预览一节的规定。文案跟随 App 语言设置。

最后确认的 URL 与标题必须属于同一保留关联。已持久化的后续导航不得在 arXiv 标题下重新打开更早的 Google URL。即使 URL 相同,不同保留 tab 仍保持独立。用户明确关闭的网页保持关闭,只出现在“已关闭的网页”,不作为 live 行。隐藏 PiP 是预览偏好,不是失败。

进程 incarnation 可以为安全把旧的活句柄标为不可用并必须丢弃它们。不得把保留的 tab 关联当成用户关闭,不得复制该 tab,也不得把可恢复的恢复中或断开状态丢进通用 Unavailable 分组。恢复进行中或失败时,行留在原分支。渲染进程重建保留的原生 Page 后会再次注册窗口;如果这次注册到达时该连接的恢复仍在运行,就在它结束后再排一次且只排一次,让第一轮期间才创建的 Page 也能重新绑定,而不是一直停在失败。恢复时以 restore 范围向渲染进程要网页清单,列出窗口持有的全部 Page,包括只属于某个会话的私有 Page;Agent 发起的清单请求仍按会话范围过滤。

用户可见状态(英文 / 中文) 含义 分组
Restoring page… / 正在恢复网页… 后台恢复已开始,新的原生绑定尚未就绪。 原分支。无 Agent 租约。恢复本身不出现“让 Agent 继续”。
Could not restore page / 网页恢复失败 有界恢复最后确认 URL 失败。 原分支。用户可打开或重试。不复制保留 tab。
Reconnect / 需要重新连接 新绑定缺失或已断开,保留 tab 仍列出。 原分支。不是通用 Unavailable。不是已关闭的网页。

恢复网页存在并不要求、也不意味着“让 Agent 继续”。空闲页面仍显示“可直接操作”。新任务动作仍须在新绑定存在后做普通的重新观察与授权。旧绑定、frame 与动作句柄保持无效。不绕过权限或应用安全;不自动恢复旧 Agent 动作、写栅栏或输入租约。恢复会重新加载最后确认 URL,并使用 persist:webtabs 中已有的站点持久存储;不恢复未保存的 DOM 或表单。没有保留 tab 描述的旧孤儿资源记录不会自动重建,在原分组显示“网页恢复失败”。这一有界重启契约已经实现。默认 App 原生验收(含仅重启 App)已核实隐藏延迟导航(含查询与片段)、固定与隐藏预览偏好、站点 token 与计数器持久化、恢复后首次人工点击,以及明确关闭的网页保持关闭。三轮合并测试、Web、contracts 与 Desktop/docs 门槛通过。GUI Agent 的其他恢复、桌面与 VM 工作仍待完成。本段不把整个 GUI Agent 项目标为完成。

Resources 与统一操作预览

Resources 按会话分支整理保留的目标。Resources 没有搜索框。单击条目显示可交互聊天预览,并保持现有选择行为。显式“在会话中预览”图标按钮对确切的现有 Page 做同样的事,不增加顶部标签,恢复已隐藏的 PiP;若当前正在查看网页,则回到所属会话,使聊天预览可见。隐藏保留 Page。没有单独的“显示预览”控件。显式“打开页面”把同一 Page 显示为普通顶部标签,并隐藏该预览及其预留空间;返回会话后,除非用户已隐藏,否则恢复预览。网页标签与其 PiP 不得同时显示。桌面 PiP 直接呈现同一个原生 Page,支持点击、输入和拖动时持续更新;窗口大小决定可见区域与页面缩放。从未显示过的 Page 初始使用 1920×1080 CSS 像素视口。普通浏览器使用独立的 sandboxed iframe,受网站嵌入限制,且不共享 Desktop Page 状态。浏览器交互是首项实现范围;原生软件与 VM 适配、轨迹复盘与学习分别讨论后再实施。验证情况与剩余工作集中记录在实现状态附录。

每个会话的右侧 Resources 按分支显示全部已关联的操作目标。Agent 打开的网页默认在后台保留,不增加顶部标签;聊天中只有一个预览,默认显示当前分支最近正在操作的目标。浏览器页面、单个应用窗口、宿主桌面与 VM 虚拟屏幕使用同一套选择规则,实际输入能力分别校验。

预览标题栏标明自动预览或固定预览,并显示当前控制状态。固定预览保持当前 Page。取消固定预览后恢复自动显示 Agent 正在操作的页面。预览标题变化不会改写 Agent 目标、恢复或启动 Agent,也不改变 Page 生命周期或顶部标签。该固定控件只在聊天预览上,Resources 没有固定按钮。默认 App 验收是单独的发布检查。

可操作样式稿

点资源条目切换预览,点“模拟下一次操作”观察自动预览,固定后用取消固定预览恢复自动显示。也可切换当前分支、隐藏或展开预览。展开不会固定。用资源行或“在会话中预览”恢复已隐藏的预览。全部为文档中的示例数据,不连接真实页面或机器。

仅设计模拟

比较方案

检查五个页面,整理差异。页面保留,后续还要继续使用。

只切换小窗正在预览的目标,五个 Page 均保持连接。

资源与预览的职责

  • 持续保留的浏览器资源描述和分支关联组成资源清单。临时使用记录表达执行期间的占用,不决定 Page 的存续。同一个 Page 可以被多个分支引用。
  • 单击资源条目选择可交互聊天预览,并保持当前标签。显式“在会话中预览”使用确切的现有 Page,进入手动查看,不固定也不复制顶部标签。若网页占据中心区域,该动作激活所属当前会话,使请求的预览可见,且不改变正在查看的分支。显式“打开页面”把确切的现有 Page 显示为普通顶部视图,并隐藏该预览及其预留空间。跟随不抢占标签焦点。返回会话后,除非用户已隐藏,否则恢复预览。
  • 资源存续、预览偏好和执行输入租约分别记录。窗口级状态更新在 Resources 收起时继续维护自动跟随和控制状态。隐藏预览结束截图订阅并保留目标。

列表与小窗的具体样式

右侧栏顶部的 Files、Activity、Resources 保持现有纵向排列,不改为横向标签。本方案只设计 Resources 内部内容。沿用右侧栏的暗色背景、系统字体和 16px 类型图标;不为每个资源画边框卡片。分组标题复用左侧栏 Pinned/Projects 的 SectionHeader:14px 常规字重的次要色文字,16px 折叠箭头紧挨截断后的分支名,内边距和悬停与左侧栏相同,Current 与数量作为行尾操作。Enter 或 Space 只展开或折叠该组。条目约 44–48px 高,第一行是页面或窗口标题,第二行是类型、状态及需要时的子 Agent 名。标题过长省略,完整标题、脱敏来源和目标身份在详情中查看。悬停使用轻底色,选中使用稍深底色;“正在操作”圆点与“正在预览”选中态分别显示,不只靠颜色区分状态。网页行在标题旁提供三个紧凑 Lucide 图标按钮:在会话中预览、在标签中打开、关闭网页。它们与 PiP 顶栏共用现有紧凑工具栏样式(24px 点击区域、14px 图标,以及相同的悬停、禁用和键盘焦点处理)。不要使用字面箭头,也不要把全局 36px Button 用在这些控件上。

聊天预览标明标题。控件只有一行且不得换行,在最小 240px、默认 300×198.75(300×168.75 画面加单行标题栏)和展开 720px 宽度下均如此:省略标题、紧凑控制状态、打开页面、按状态显示的暂停 Agent,我来操作、让 Agent 继续或重试暂停、始终显示的固定预览 / 取消固定预览、展开或收起、更多、隐藏。标题在按钮之前截断。“显示操作”和“操作记录”放入现有原生安全的更多菜单。主操作留在这一行,不放到第二行或弹出工具栏。截图以未变形的 contain 填满剩余区域并保持截取画面的宽高比,桌面端按窗口宽度调整原生布局缩放,直接接收页面输入。空闲和已关闭显示“可直接操作”,不提供暂停或继续按钮。失败信息通过状态指示、标题提示和 aria-live 可发现,不另加第二行。侧栏宽度复用现有可调整宽度,不固定重做布局;窄屏以 Resources 抽屉选择目标,聊天和预览保持可用。上方样式稿在窄屏改为上下排列以便审阅,不代表新增产品页。

选择与跟随

  • 每个 App 窗口最多显示一个预览,状态按当前会话和分支记忆。自动跟随只响应当前查看分支中,已获宿主许可的实际操作事件;资源刚打开、状态轮询或截图更新本身不切换预览。
  • 多个子 Agent 并行时,按宿主事件顺序跟随最后实际操作的目标,显示正在使用它的 Agent。约 200ms 合并连续更新,只渲染最新帧,不积压旧帧;这是待测初始参数。
  • 点任意资源进入“固定预览”,Agent 继续原任务,预览不会被后台切换覆盖。查看其他分支的资源不切换会话分支,也不授予写权限。按钮明确显示“取消固定预览”以返回自动模式。
  • 隐藏小窗只改变可见性;后台操作继续,Resources 保留全部目标。后续事件不自动重新弹出,点条目或“在会话中预览”才恢复。隐藏保留 Page。手动展开只改变展示尺寸,不复制 Page 或把应用置前。
  • 切换分支后恢复该分支的预览偏好;从未选择时跟随其最近操作目标;该目标已关闭则显示不可用,没有操作记录时显示空状态。其他分支仍可运行,其消息不能覆盖当前预览。

保留、打开与关闭

  • Resources 不提供 pin 控件,也没有搜索框。单击条目选择可交互聊天预览;“在会话中预览”是可访问的显式等价操作,恢复已隐藏的 PiP,并在网页占据中心时回到所属会话。“展开”显示同一目标的大视图。显式“打开页面”把这个确切的现有 Page 显示为普通顶部标签并隐藏预览。重复打开复用同一 Page。后台 Agent 页面继续保留在 Resources 中。
  • 已有用户手动固定或打开的顶部页面保留为普通用户视图;迁移不能关闭它们,也不自动把所有旧页面隐藏。后台资源不会因为最近使用而自动生成新标签。
  • 任务结束释放 Python、输入租约与临时观察文件,已关联页面和 VM 保留,转为闲置。仅声明为临时的测试/中间资源按原有明确策略销毁,不把“任务结束”当成“关闭所有资源”。
  • 行菜单使用具体动作:“关闭网页”“断开窗口关联”“断开 VM 连接”。“停止 VM”单独列出,不能随关小窗触发;借用的用户 App 不自动退出。
  • 关闭正在使用或被其他分支引用的目标,需要展示受影响执行,先请求停止并等待写租约释放。未能确认停止时保持“停止中”,不能谎报已关闭。已关闭记录移入可折叠的不可用分组;默认数量只计当前可连接目标。

浏览器、软件窗口、桌面与 VM 的能力边界

资源后台目标与预览不可行时如何显示
浏览器 Page复用准确 Page/CDP target;后台保持文档、登录和导航状态。用户看预览不需要激活网页。打开的弹窗登记为原分支新资源,确实操作弹窗时才跟随。页面已关闭、脱离归属或 frame 过期时停止写入。重新打开 URL 创建新的资源身份,不冒充原页面状态。
单个原生应用窗口绑定进程实例和准确窗口,可支持窗口截图与经过验证的后台输入。列表显示“后台可操作”“仅预览”或“需要前台”,按动作能力判断。不能承诺所有软件都支持完整后台点击/输入。现有原生矩阵仍失败。最小化、锁屏、权限不足、无法准确定位时给出具体原因;只有用户明确选择前台方式才允许激活窗口。
宿主桌面屏幕对应宿主显示器及其坐标空间,能反映整个桌面。它没有独立于用户的输入环境。全局鼠标和键盘可能影响用户当前工作,不标为“独立后台”。需要协商使用前台,或改用隔离 VM;选中预览不代表允许全局输入。
VM 虚拟屏幕VM 在后台运行,其 guest 虚拟显示和输入适配器提供截图、键盘和鼠标;不要求宿主 VM 控制台保持前台。VM 进程、guest 图形会话与远程显示服务仍须运行。guest 无图形会话、锁定、显示断开或输入通道不支持时显示具体状态,不伪装实时画面。重连后重新观察,禁止自动重放不确定输入。Docker 可作为环境实现选项,不新增必填容器层。

数据归属、分支与并发

Resources 保存可序列化的资源描述,真正的 Page/窗口/VM 句柄及租约仍由宿主管理。复用现有会话与分支投影,分组键必须来自稳定的分支身份或可验证的分叉谱系,不能使用不断变化的当前消息 HEAD,也不能把一次执行当成一个分支。分支改名、继续对话和重试只更新展示或关联;分叉不会复制真实网页状态。

  • 资源描述包含资源 ID、类型、脱敏目标描述、真实所有者、生命周期状态、连接代次和预览能力;分支关联另外保存来源调用、所属分支、子 Agent 和共享方式。同 URL 的不同 Page 不合并;同一 Page 的 UI 与使用记录合并为一个真实资源。
  • 子 Agent 资源在父会话原始分支下展示,并标明实际子 Agent 所有者;子 Agent 转向新任务或父分支改名不能改变历史归属。原会话/执行授权仍逐条检查,不能因为显示在同组而越权。
  • 从共同祖先继承的资源显示“引用自…”;浏览器默认新建独立 Page 用于分支写入,不能声称外部网站或登录状态因此隔离。原生窗口和 VM 不能自动克隆;需要显式转移写租约或提供独立目标。
  • 选择预览不是获取控制权限。同一个目标在各分支行中可作为共享引用出现,标明当前控制方;写入租约按实际冲突域互斥,如 Page、共享输入焦点的应用进程、VM 或宿主桌面。按窗口分组不证明应用能并发输入。
  • 预览事件带会话、分支、资源 ID、连接代次和单调序号;切分支、重连或撤销后丢弃过期事件。元数据可恢复,进程内句柄不可复用。旧记录无法归属分支时放入“待归属”,不猜测迁移。

预览、接管与断线

图像镜像只读,实际 tab 或原应用保持正常可用。人工入口与让出规则见下文。显式等待停止确认和用户直接访问是不同路径,不能把 Agent 的操作权限变成阻挡网页的遮罩。

后台空闲目标保留连接但停止高频截图;仅当前预览订阅图像,不周期扫描所有宿主应用。运行中显示帧的新鲜度与操作进度;最后一张截图显示“连接中断 / 最后画面”,未连接的资源允许查看元数据,但不提供远程输入。App 重启、网页崩溃与 VM 重启均需重新验证目标身份;持久记录不等于外部资源仍存活。内存不足时提示用户释放资源,不静默丢弃表单或停止 VM。

状态转换的确定规则

事件预览结果执行与目标
Agent 派发操作仅自动跟随且未隐藏时切到对应目标;手动查看或大视图保持当前目标。“正在操作”从经过校验的 adapter 派发开始,到回执、取消确认或失败结束。入队、持有租约、截图轮询都不单独显示该标记;超时或缺少事件显示“状态未知”。
点资源 / 预览 / 展开单击条目打开只读聊天镜像,不切换当前标签。“在会话中预览”使用同一 Page 身份,并在当前是网页时激活所属会话,使镜像可见。展开仅放大镜像。“打开页面”把真实人工入口显示为普通顶部标签并隐藏预览。预览选择不增加 Agent 写权限。打开后的真实页面中的用户输入触发 Agent 让出。
隐藏 / 恢复隐藏保存模式和目标,并保留 Page。没有单独的“显示预览”控件。单击资源行保持现有选择行为并恢复聊天预览。资源行上的“在会话中预览”恢复已隐藏的 PiP,目标仍是确切的现有 Page。列表继续更新。不最小化 OS 窗口,不切断 VM 虚拟显示,不结束执行。
跟随当前分支 / 恢复 Agent“取消固定预览”只改变选择模式,退出大视图。“恢复 Agent”才请求重新观察与自动化授权。查看或隐藏镜像不停止真实 tab 中的人工操作。等待停止确认超过 5 秒时,显示“暂停失败,请重试”,在仍连接时提供“重试暂停”,并保持禁止后续 Agent 派发;这是 UI 提示时限,不是已测停止保证。
目标冲突 / 子 Agent 结束显示真实控制方;不同目标可同时有多个“正在操作”条目,单个小窗仍只显示最新目标。第二个 Agent 写入者得到 busy,不隐式排队或抢占。需用户显式转移或分配独立目标;子执行结束释放自己的租约,父执行不能自动继承。
断线 / 目标失效 / 重启最后画面加失效标记,停用对应远程输入连接;未取得过图像显示“暂无画面”。身份和能力未知时停止写入,不显示“正在操作”。只自动尝试只读重连到可验证的同一实例;重建 Page、启动 VM、恢复写入须走显式动作和授权。

父分支的跟随集合包含父执行与在该分支创建的子执行,使用宿主派发顺序;子会话窗口只跟随子会话自身的分支。相同真实目标可在不同分支中显示引用行,资源数量按每组唯一目标计,Unavailable 的数量单列。“移除引用”只解除闲置关联;“关闭网页 / 停止 VM”作用于真实目标,必须列出全部受影响引用。任务完成保留原分组;App 重启保留分组与预览偏好,但不恢复远程人工输入连接或 Agent 写租约。标题和 URL 查询凭据不作为归属依据,不持久保存秘密查询参数。

原生输入的焦点或结果验证失败显示“输入失败”,撤销写入并保留证据,不能继续按后台模式尝试。无明确派发/结束事件的旧适配器显示“执行中 · 操作状态未验证”,不显示操作圆点,也不提供无确认的交互接管。宿主桌面按显示器标识绑定;屏幕布局变化令旧坐标失效。无论 App 是用户先打开还是 Agent 打开,断开关联均不退出 App;退出软件作为单独的用户明确动作。VM 的断开连接只释放传输连接,guest 与虚拟显示继续运行。

“当前分支”指当前会话聊天区域已检出的分支,资源选择不会更改它。“取消固定预览”只跟随该分支及其所属子 Agent;“恢复 Agent”是需要重新观察和授权的独立操作。

当前目标关闭或 VM 停止时,清除操作标记并显示该目标不可用或最后画面。手动查看一直保留此状态,直到用户另选资源;自动跟随也保留,直到当前分支有更新的获准操作选择另一个目标,不自行回退到旧资源。用资源行或“在会话中预览”恢复已隐藏预览,以及恢复分支偏好,遵守相同规则。

已有网页、操作提示与人类接管

PiP 只作为聊天预览。打开任意普通网页标签时隐藏该预览及其预留空间,让原生 Page 占满可用内容区。网页标签与其 PiP 不得同时显示。不得把 Page 截图叠在真实页面旁或之上,不得变暗、加遮罩,也不得用 CSS 藏起 iframe 却仍为原生几何预留空间。打开页面保持同一 Page 身份、资源和跟随偏好。返回会话后,除非用户已隐藏,否则按分支恢复预览。单击条目和跟随不抢占标签焦点。显式“在会话中预览”不揭示顶部标签;若当前网页占据中心,则激活所属会话使聊天预览可见。只有显式“打开页面”才把 Page 显示为顶部标签。真实网页在其自己的标签中保持可用、不变暗。完整网页工具栏、控制菜单和操作仍位于 Electron Page 之上。

同一原生 WebContentsView 不能同时占据两个矩形区域:页面标签当前时保留一个原生交互视图;仅当所属会话当前时,小窗才接收同一目标的截图/图像流。这里限制的是原生视图的同时挂载位置,不限制同一 Page 的 UI 引用数量;其他呈现位置使用镜像,定位现有 tab 时选择那个真实交互视图并隐藏预览。聊天中的小窗仍是会话上的悬浮预览。小窗图像区域严格只读,不转发缩放后的点击、键盘或滚动输入,也不为了放大缩略图而裁切或放大捕获画面。从未显示过的 Page 以 1920×1080 CSS 像素视口和用户正常页面缩放创建,使捕获有稳定的 1080p 布局;PiP 尺寸独立于该原生视口。可见 Page 回到后台时保留最后一次原生 bounds,不缩小到缩略图,也不重新套用创建默认值。不要把旧的 PiP 布局缩放路径用到缩略图尺寸上。“打开页面”定位到准确的现有 tab;没有可见 tab 时显式打开这个 Page 的视图,不另建 Page、不重复登录、不重载文档、不按 URL 猜测目标。原生窗口和 VM 同样区分真实控制入口与只读镜像。镜像隐藏不会中断已经打开的真实页面。仅查看或聚焦真实 tab 不触发暂停。

小窗可见时,持续订阅这个准确 Page 的画面,Agent 和人造成的变化都需要更新;不能为了截图搬走真实交互视图。每帧包含资源 ID、连接代次、序号与捕获时间,旧绑定的帧直接丢弃。适配器验收时确定有界刷新频率和过期阈值,显示最后画面的时间;捕获延迟或不可用时标为“最后画面”,不显示“实时”。静态截图不算实时镜像。隐藏小窗后取消对应捕获需求,Page 继续保留,不持续捕获所有资源。拖动聊天悬浮小窗时,在指针按下时缓存容器范围,并用动画帧上的 transform 预览位移。指针移动过程中不重新测量布局、不写入 React 或 store、不持久化矩形。指针抬起、取消和丢失捕获时,按当前容器范围再夹紧一次后写入最新位置。卸载、离开聊天宿主或切换资源时丢弃未完成的拖动,清除 transform 并释放指针捕获,不写入该矩形。拖动期间暂停截图与画面替换,并在指针抬起、取消或丢失捕获时恢复;已停止的循环不再恢复。暂停前已发出的捕获即使在恢复之后才完成也要丢弃;旧请求结束后立即开始一次新捕获,并保持单飞。暂停不得通过清空 isCurrent 永久停掉循环。

不遮挡内容的操作样式稿

下面演示互斥呈现:聊天预览或真实页面,二者不同时出现。不更改右侧 Files、Activity、Resources 的纵向导航。可以模拟 Agent 点击、打开准确 Page、切换“显示操作”、直接修改示例页面、等待停止确认和恢复 Agent;全部是文档内状态,不控制真实网页。

设计模拟 · 不连接真实目标
方案总览

方案总览

Page #01

保存次数(用户与 Agent): 0

方案总览

只读设计示意;实际桌面预览直接接收同一 Page 的输入。

操作记录

    位置标记与操作记录使用同一回执事件。本例未开启用户示范录制。

    直接修改输入框或点击保存:网页保持可用,Agent 让出。只查看页面不会暂停。

    哪些目标可以由人直接使用

    目标真实人工入口接管按钮与限制
    OpenProgram 已有网页 tab当前真实网页始终可看、滚动、点击和输入。只查看或切到该 tab 不自动暂停 Agent;真实输入、滚动、导航才触发让出。“打开页面”定位准确 tab 并隐藏聊天预览。“接管”显式等待停止确认。空闲和已关闭显示“可直接操作”,不提供暂停或继续按钮。用户也可直接操作网页,不出现控制遮罩。
    本机软件窗口人可以在原应用中操作,即使该应用尚不支持 Agent 后台输入。人工可用性和自动化能力分开显示。“在应用中接管”先请求 Agent 停写,再定位准确进程/窗口;用户明确点击后才允许将原应用置前。无法确认目标或停止状态时说明原因;不在窗口截图上伪造可输入界面。
    宿主桌面 / 显示器用户直接使用自己的桌面键鼠;小窗不是一个独立虚拟桌面。提供“暂停桌面操作”,输入来源是实际显示器及 OS。可检测的人类输入立即触发让出;无法检测或停止全局输入的适配器不能声明自动安全接管。
    有可写控制台的 VM在 OpenProgram 的 guest 控制台或已经连接的授权 VNC/RDP 控制台输入,不要求把宿主虚拟机程序放到前台。“打开 VM 控制台”复用同一个 VM/guest 显示。凭据、写权限、guest 图形会话和输入通道都有效才显示可操作;后台 VM 运行状态不因看预览而变化。
    外部浏览器、只读流或失效目标外部浏览器只有已验证 tab 绑定才能定位现有页面;同 URL 不能当成同一 tab。只读截图或断开的图像流不是人工输入入口。分别显示“在原浏览器打开”“仅查看”“需要重新连接”或“已关闭”。不得把只读资源统一标为可接管;重新创建目标是独立操作。

    让出控制的规则:人可以继续访问页面

    “Agent 使用中”表示宿主已授权的自动化写入状态;不是禁止用户访问页面的锁。用户在真实入口发出输入时,立即禁止冲突范围内的后续 Agent 派发、废弃待执行的旧帧动作,并请求暂停拥有写权限的执行。界面保持原亮度与可用性,在工具栏显示“正在暂停…”;不会复制或稍后重放用户点击。

    已经派发的操作可能无法立即撤回,尤其是原生输入和长时间浏览器调用。让出过程中可以有迟到结果,不能宣称“零并发”或已确认停止;未确定副作用单独记录,完成后重新观察,既不自动撤销用户修改,也不自动恢复 Agent。只有停止确认、输入状态释放和目标状态核对完成后,才显示“Agent 已暂停”。若失败或超时,工具栏明确显示“暂停失败,请重试”,在仍连接时提供“重试暂停”;用户仍可使用真实页面,Agent 保持禁止新派发。只有经过适配器实测,才能额外声明无重叠的自动接管。

    显式“接管”在停止确认后打开准确人工入口,避免把“已发送暂停请求”当成成功。等待期间按钮显示“正在暂停…”,已有真实 tab 仍可点击、输入和导航;禁用的是 Agent 后续派发,不是页面的人类输入。尚未打开的入口等待停止确认后再定位,用户仍可另行选择“打开页面”直接访问并隐藏聊天预览。空闲和已关闭目标显示“可直接操作”,不提供暂停或继续按钮。无法确认状态(连接已知断开时显示“连接已断开”)不得声称暂停失败,并保留禁用的“暂停 Agent,我来操作”。“暂停失败,请重试”在仍连接时提供可点的“重试暂停”,不得显示为已暂停。同一输入范围只保留一个停止请求:如果直接人工输入已触发让出,显式接管沿用该请求和确认,不重复停止。关闭接管入口的展示不会取消停止请求。正在暂停…、无法确认状态或暂停失败时禁用“让 Agent 继续”;“让 Agent 继续”仅在已暂停时可用;可重试核对停止状态,必要时重连到同一可验证实例,只有确认旧操作停止并核对状态后才进入已暂停。迟到确认也只转为已暂停,不自动恢复。由用户在真实页面主动操作触发的暂停没有需要确认的弹窗。返回自动化必须单独点击“让 Agent 继续”,重新观察并按当前权限获取新的执行许可;“跟随”只改变预览选择,不恢复输入,也不抢占标签焦点。

    预览、展开、隐藏、分支查看与真实输入权限分开。隐藏镜像不会撤销仍在可见真实 tab 中的人工操作,也不会恢复 Agent;关闭实际控制视图、失去连接或目标身份失效,会关闭该连接的自动化/远程输入权限并保持 Agent 暂停,不能声称 OpenProgram 能禁止用户使用本地 OS。当前选择其他分支只改变展示;已存在的接管请求继续按原资源 ID 跟踪,不转移到新选中的资源。

    真实页面中的指针按下(包括开始选择文本)、会操作页面的按键/输入、滚动和用户发起的导航触发让出;查看、单纯聚焦(包括 Tab/Shift+Tab 焦点导航和单独修饰键)、指针移动/悬停,以及操作只读小窗的查看控件不触发。悬停造成页面变化仍需使旧观察失效。浏览器适配器必须区分人类输入与 Agent 派发,接管识别不能只依赖页面内容脚本;不具备可靠识别的适配器仅提供显式暂停路径,不宣称支持自动让出。

    暂停范围由实际输入通道确定:浏览器按 Page 身份,现有 tab、第二个视图和镜像都关联同一个范围;原生窗口只有验证窗口独立输入后才按窗口,否则按实际共享的进程输入域或宿主键鼠输入域;全局桌面输入按宿主输入域;VM 按 guest 输入域,连接同一 guest 的不同控制台共享这个范围。关闭范围内所有 Agent 写入,不能只暂停发出请求的视图。真实 tab 在“正在暂停… / 暂停失败,请重试”期间仍能输入;只是不能报告“Agent 已暂停”,显式等待停止确认的路径也不能报告接管完成。

    边缘提示、工具栏与操作位置

    下面的描边、工具栏和动作标记只位于 OpenProgram 自有呈现区域:内嵌网页的宿主边缘/工具栏、OpenProgram guest 控制台,以及小窗预览层。原应用、宿主桌面或外部 VNC/RDP 客户端不属于这些区域;不改其菜单或绘制其外框,控制状态、“显示操作”和记录入口留在 OpenProgram 小窗或对应控制面板,动作位置叠在捕获预览上。打开原窗口只是定位人工入口,不意味着 OpenProgram 获得修改外部软件界面的权限。

    • Agent 活跃时,在目标视图外缘加约 1px 的低强度发光描边,不改变网页亮度、布局、滚动、焦点或点击区域,不采用持续闪烁。工具栏显示 Agent 名、分支和“使用中 / 正在暂停… / 已暂停 / 无法确认状态 / 连接已断开 / 暂停失败,请重试”;边缘只是辅助,不能只靠颜色判断控制状态。当前可见表面——真实页面标签或聊天 PiP,二者不同时出现——显示状态描边:使用中为蓝色,正在暂停…为低强度琥珀色,已暂停、无法确认状态或暂停失败使用普通边缘及明确文字,不继续显示活跃光效。
    • 在现有页面工具栏增加“显示操作”切换和“操作记录”入口,而不是在网页 DOM 内塞入按钮。“显示操作”默认开启,仅展示最近一次动作;打开记录后按顺序查看点击、输入、滚动、拖动、导航及验证结果,不改变 Files/Activity/Resources 导航。
    • 点击显示短暂圆环,拖动显示起止点和路径,滚动显示方向;输入只标识字段和动作类型,不显示密码或完整输入内容。键盘快捷键显示文字说明。标记归属于真实目标,而不是系统鼠标;绝不为了演示移动用户光标。
    • 只有可信宿主的派发/回执事件驱动标记,区分“尝试”“已派发”“已确认”“失败”“结果未知”。DOM ref 操作没有准确落点时显示元素范围或文字,不伪造像素坐标;原语回执不等于整个任务成功。
    • 用资源 ID、连接代次、观察帧和视口映射,把坐标转换到真实视图与缩放镜像。考虑内容区域、DPR、页面缩放、滚动和 iframe 偏移;导航、布局/窗口变化或过期帧使标记失效,只保留带旧帧标签的历史记录,不叠到当前画面。
    • 呈现层采用宿主自有、pointer-events:none 的显示层,实际输入事件仍交给原页面。Electron 原生视图上的显示层必须通过实机验证,不能假设普通 DOM 覆盖层必然可见;不能向外部网页注入脚本来模拟 Agent 的轨迹。真实视图的标记归 OpenProgram 原生宿主呈现层,小窗标记归预览呈现层;两者使用同一资源/帧映射和开关状态。关闭“显示操作”只隐藏两处动作标记,不影响状态描边、执行或操作记录。开始暂停时清除两处动作标记;正在暂停…、已暂停和暂停失败期间,迟到回执只进入带状态的记录,不画到当前画面。只有重新授权且帧有效的 Agent 动作才再次显示标记;减少动态效果时用静态短标记。

    后续复盘与学习:先保留可核对的记录

    复用已有操作回执,关联任务/分支/资源、前后观察、目标描述、动作参数、时间顺序、结果和用户修正。UI 的操作标记消费同一事件来源,不能另外捏造一套演示轨迹。记录首先用于调试和用户查看;用户确认后,可让 Agent 在后续任务读取选定的脱敏片段,分析错误定位或生成待验证的操作规则。

    “记录我接下来的示范”是单独的用户选项,明确开始、停止、范围、预览与删除。默认不录制用户的所有桌面动作,不保存秘密字段、密码、安全输入或带凭据 URL;屏幕图像只有经过允许和遮蔽检查才保留。无法可靠遮蔽时仅记录不含内容的动作元数据,放弃对应图像/示范片段。示范、自动化回执和失败轨迹分别标注,使用前要求用户确认选中的材料。

    任务内复盘、保存可复用步骤和模型训练是三个不同阶段。本设计不自动训练、上传数据或宣称“操作一次就学会”;生成的规则必须在独立测试目标验证,不能直接重放到用户的真实网页、软件或 VM。训练与数据导出需要后续单独讨论和授权。

    实施顺序

    1. 当前 Resources 交互为:分支分组、点击预览、显式“在会话中预览”、自动预览与固定预览(固定开关仅在小窗上,Resources 不提供 pin,也没有搜索框)、以及关闭语义。已隐藏的 PiP 由资源行“在会话中预览”图标恢复;单击行保持现有选择行为。没有单独的“显示预览”控件。隐藏保留 Page。
    2. 资源记录及分支投影保留持久描述、真实归属、子 Agent 引用与遗留数据迁移。
    3. 统一预览状态与 Resources 列表保留现有页面身份,并分离隐藏、展开和关闭。
    4. 真实网页标签与聊天预览互斥;人工输入让出、停止确认和显式恢复遵循当前接管规则。
    5. 原生窗口、宿主桌面与后台 VM 适配仍分别实施;每类只有真实目标验收通过才显示对应能力。
    6. 接入边缘提示、“显示操作”和回执记录;核验原生显示层不影响输入、坐标有效期、画面隐私。示范录制和后续复盘另行实施。

    主要位置:session-resources-panel.tsx、session-resources.ts、use-session-resources.ts、web-tab-pip-store.ts、desktop-bridge.ts 与现有 ResourceUseStore、执行归属、浏览器注册表。复用现有执行控制,不新增另一套任务调度器。

    验收用例

    • 一个分支打开五页:顶部标签不增长,五个资源均可在纵向 Resources 列表再次访问,预览随实际动作切换。对从未打开过的 Page 使用“在会话中预览”时保持该 Page 身份,不增加顶部标签,并进入手动预览。
    • 两个分支及其子 Agent 并行:按真实分支分组,切分支不改变外部任务,资源不会错误重绑定。
    • 手动查看 A 时 Agent 操作 B:A 保持聊天预览,B 仍显示“正在操作”;恢复跟随才切回 B。选择和跟随都不抢占标签焦点。
    • 隐藏、展开、折叠分组不会重载网页、停止 VM、授予控制或销毁目标。
    • 关闭使用中目标、撤销权限、迟到帧、重启与断线有明确状态,未确认停止不能报告已暂停,用户直接访问仍可用。
    • 打开网页标签时隐藏聊天预览及其预留空间,原生 Page 占满内容区。从该网页使用“在会话中预览”会回到所属会话并显示所请求 Page 的聊天预览。返回聊天后,除非已隐藏,否则恢复预览。页面不变暗,可直接操作,人工输入关闭后续 Agent 派发;迟到动作不会被误报为已停止,聚焦本身不暂停。
    • 当前可见的 Page 画面持续更新;捕获中断标注最后画面。操作标记不拦截输入,旧帧或视口变化后不显示错误坐标。
    • 同进程多窗口、用户同时操作和两个 VM 分别验证输入冲突边界;不以截图成功代替后台输入成功。

    保留唯一 GUI Agent 表单、准确提交窗口/Page 身份、真实交付物证据及现有原生操作提示。产品验收仍使用默认 App;文档原型的交互通过不等于这些功能已经实现。

    [S13] 当前 Resources/PiP 源码 · [S12] App 入口

    应用任务集与同条件对比

    采用两种评估避免混淆:A 相同模型运行当前与新 OpenProgram,隔离执行系统变化;B Codex 产品与 OpenProgram 使用相同模型、任务、OS/应用版本、输入文件和实际预算,比较产品结果。B 的工具能力与隐藏提示不同,必须报告;API 结果不能证明产品能力对齐。

    任务类别 具体任务与独立结果 必须扰动
    浏览器表单 按提供数据填本地多步表单,本地服务校验精确值。 延迟按钮、重渲染、iframe、弹窗、同名控件。
    浏览器文件 选择授权夹具文件,下载报告并校验内容路径。 取消、传输中断;不向外部上传。
    原生文本 编辑夹具文档,选择替换混合语言文字,保存重开。 对话框、多窗口、用户修改剪贴板。
    原生画布 绘制/移动/缩放图形,带修饰键拖拽,导出重开。 后台/前台、窗口移动、DPI 变化。
    Blender 按尺寸/材质制作小装配体,保存 blend 并渲染。 同时检查文件结构与渲染;区分脚本辅助和纯 UI。
    PCB/CAD 在样例工程放置指定元件/尺寸并导出。 用应用验证器检查连接/尺寸;不声称可生产或工程安全。
    跨应用 读本地表格,更新原生文档,验证浏览器预览。 明确应用切换、权限拒绝、取消恢复。
    长任务/恢复 可重置夹具中至少 30 分钟、多阶段编辑保存验证。 worker/helper 死亡、provider 延迟、人工接管、不确定保存。

    初始每类两个任务,每任务三次独立重置运行:每系统/模型条件 48 次。这是诊断任务集,不是统计上足以证明普遍能力的 benchmark。运行前冻结输入、结果检查、预算和失败分类;记录所有尝试,把不支持任务与环境故障分开,不从分母删除困难任务。

    报告完成率、误报成功率、p50/p95 耗时、模型/图片 token、已知 API 成本、工具调用、干预、恢复成功率。采用配对任务结果与不确定区间,能力对齐结论仍不明确就扩大样本。视觉判断与确定性交付物检查分开,条件允许时由不知道运行系统的评审判定。

    发布必须满足:所有确定性归属/取消/旧帧/隔离测试通过;每项声明的关键能力通过真实应用夹具;验收集无误报成功;完成率相对基线不下降;记录产品对比及限制。建议初始控制目标为同机取消请求后 500 ms 内阻止新动作、1 秒内释放按住输入;必须测量,调整需要明确证据,不能事后为了通过而放宽。

    采用、修改与拒绝的方案

    决定 原因与结果
    采用标准 Agent 与持续代码 一个模型可见循环、普通工具消息、灵活短批次。
    采用现有资源和策略边界 保留 Page/窗口归属、签名 helper、DAG、执行控制生命周期。
    修改固定逐动作模型验证 原语使用确定性检查,视觉阶段与最终验证仍必要。
    保留可选定位 优先 AX/DOM,不确定时裁剪定位;benchmark 代码不作为控制器。
    拒绝嵌套自主控制器 每个 UI 工具不再包含能力选择器或浏览器 Agent。
    拒绝以 provider 原生协议为前置 普通函数/代码工具支持 Astra 等模型;原生 computer 协议仅在测得收益后适配。
    拒绝无限制原始对象 生成代码不能通过 CDP/宿主输入绕过目标权限。
    采用进程重启后在后台恢复保留的 tab 关联 复用保留的 tab id、会话/分支、最后 URL/标题、中间栏持久化与 persist:webtabs。重建新的原生 Page/绑定。旧活句柄可以标为不可用。不复制保留 tab。用户已关闭的网页只在“已关闭的网页”。已隐藏 PiP 保持隐藏。可恢复的恢复状态留在原分支。
    拒绝跨进程死亡恢复 DOM/表单或自动继续 Agent 崩溃会销毁渲染进程与租约。在新绑定上加载最后确认 URL。空闲恢复不显示“让 Agent 继续”。新写入需要普通的重新观察与授权。
    拒绝自动后端/前台回退 失败写入可能已生效,换后端会重复或写错目标。
    拒绝任务硬编码 可复用应用 skill 说明验证过的流程,不按任务文本写死程序。
    拒绝以 benchmark 代替产品完成 定位分数和 mock 测试不能证明原生长任务可用。

    实现顺序与有界任务包

    依赖顺序为 P0 → P1 → P2/P3/P4 → P5 → P6。broker 契约确定后浏览器与原生适配器可独立开发,但必须在同一个合并候选上验收。每包需要公共入口失败测试、最小实现、受影响检查、独立规格审查、质量审查及精确提交证据。

    任务包 文件/职责 必须失败项与完成证据
    P0 原生可行性 mac_window 旁的原生输入原型;自有 AppKit/画布夹具。 证明当前不能在目标拖拽/输入;证明路由/后台不变量或记录准确不支持项。完整后台声明前必须解决。
    P1 运行器与标准 Agent 共享 Runtime 配置、GUI 入口、拟议 gui_exec runner/broker 模块、现有 backend。 两次调用保留变量/UI 对象;danger-full-access、宽松 sandbox override、缺失 sandbox 均保持隔离底线或拒绝启动;阻止逃逸/撤销后操作;一个 GUI 根和标准工具循环。
    P2 浏览器 SDK workflow/browser 与 registry;必要时修改 server webtab/desktop bridge。 公共 GUI 入口完成表单/拖拽/iframe/弹窗/文件,不再逐动作子规划;旧 Page 测试保持通过。
    P3 原生桌面 mac_window/native helper/input adapter;Windows adapter;mac_indicator。 完整输入/文本、准确窗口、权限、后台矩阵、用户同时操作、按键释放、双目标同时输入及用户修改剪贴板时文本不损坏。
    P4 VM 隔离 vm_adapter、输入目标与截图传输。 双 VM 不影响彼此或宿主;重连检查外部状态。
    P5 恢复与产品 UI 现有 process runner、执行控制、结果卡片、函数派发入口。 公共 App 暂停/停止/接管/重启;已应用前缀回执,不重复不确定写入。
    P6 评估与整理 应用夹具、live 验收集、产品文档、本设计状态。 每条件 48 次诊断运行、同条件对比、局部/完整检查、新路径无旧控制器、默认 App 验收。

    开始编码前,每份 brief 写明精确新测试文件名和命令;上表是职责归属,不假装测试已存在。保持适配器兼容,行为门槛通过后才切换唯一 GUI 根。旧 browser_agent、browser_control 兼容名称、web_use 和 CLI 参数在调用方迁移前显式兼容,同一任务绝不同时运行新旧路径。

    发布时核对 OpenProgram 与独立版本的 GUI-Agent-Harness:准确源码、未提交工作、安装来源选择和 App bundle 内容。保留无关 Harness 修改。完整功能提交后从集成 checkout 执行一次 scripts/refresh-local-app.sh,不从旧 worktree 重启或创建另一可见 App;远程发布需要明确授权。

    证据索引

    R3 · 已安装 CUA 工具的合同

    本次 cua.getState 返回的应用/标签 API、持续 REPL、AX 差分、坐标输入和批处理说明,不复制私人应用内容;未实测原生画布兼容性。

    R6 · browser-use

    任务 Agent 与浏览器连接参考,不采用宣传性 benchmark 数值。

    R7 · Stagehand

    语义 act/observe/extract 与程序 Locator 操作。

    R9 · Chrome DevTools MCP

    浏览器调试/自动化,启用适配器时检查隐私设置。

    R10 · Apple CGEvent / ScreenCaptureKit

    SDK CGEvent.h 声明 CGEventPostToPid;AXUIElement.h 标记 AXUIElementPostKeyboardEvent 弃用。网页正文要求 JS,本机 SDK 头文件只证明这些 API 事实,不证明应用支持。

    源码定位

    其他入口与测试文件

    GitHub main 链接用于定位,本文事实来自当前本机源码核查;主仓库和独立 Harness 的不可变版本、文件摘要、未提交状态与命令日志记录在本次审查包,不能把远程链接当成本机版本相同的证明。

    实现状态与发布门槛

    本文是目标设计,不是 Computer Use 已完成实现。浏览器运行器、broker 与显式浏览器入口已合入。源码整合、已安装构建检查和真实任务验收分别记录,不能据此认定完整桌面支持或产品能力对齐。

    要求 当前证据 状态与剩余门槛
    仅传 task 的 GUI 按已选桌面能力请求授权公共 bridge 通过固定 durable function API 保留规划决策和能力结果。选择桌面能力后,在登记副作用前暂停并创建 canonical system-access wait;已授权的浏览器操作不要求桌面权限。live Runtime 只通过 host binding 传入,不写入保存的参数。源码已有受控 forced 子进程和 Agent checkpoint 测试,覆盖同任务续跑、worker 替换、取消、实时撤销授权、截止时间失效、旧所有权和未确认副作用。完整稳定性测试、独立复核及已安装默认 App 的权限验收仍待完成。这些检查不证明原生桌面或 VM 兼容性。
    现有 GUI/浏览器边界 156 个 OpenProgram 局部测试通过:能力循环、不可行结果、VM 协议、Page runtime、浏览器 Agent。 只证明现有契约,很多使用 fake;不代表模型质量或真实桌面覆盖。
    现有 Harness 行为 46 个 Harness 局部测试通过:后台窗口与 execute-task,包括观察错误/取消后的清理。 观察步骤在截图后失败时必须删除临时图片目录。清理测试不证明原生输入能力;真实应用矩阵仍未完成。
    只截图的窗口关联 Harness 测试用模拟的 AppKit、Accessibility、Quartz 与 ScreenCaptureKit 覆盖:对没有几何信息的应用元素、空或无法读取的 AXWindows 与不匹配的窗口建立只截图会话;多个匹配继续拒绝,唯一匹配保留控件;观察不含控件;只提供终态决定;拒绝所有动作;通过窗口服务器校验精确窗口。OpenProgram 报告测试覆盖微信读取器在只截图窗口上的行为。 已以 worker 身份在真实微信主窗口上运行,并强制辅助功能窗口列表为空:会话以 capture_only 绑定,截图为真实图像,控件列表为空,window_press、window_set_text 与 window_scroll 均以 window_controls_unavailable 拒绝,窗口未被触碰。微信自身的失效状态时有时无,尚不能按需复现,该触发条件的验收仍待完成。
    P0 完整原生输入 已执行审查后的自有测试窗口矩阵:三次普通双窗口运行复现 WebKit 焦点失败;一次显式 Command 运行能拖动画布,但文本写入另一窗口。事件级回归与准确窗口截图通过,前台和鼠标位置保持不变。 完整输入验收失败。准确窗口截图与最终控件回执一致,测试进程清理已确认。生产输入、签名 helper 与真实应用兼容性仍未解决。
    P1 持续运行器/标准 GUI Agent 已合入的 macOS 实现提供强制隔离、支持顶层 await 的持久 Python 和有界通信。broker 校验宿主注册的目标与执行权限,保留 owner ContextVars,并通过现有 EffectStore 记录原语副作用;原生 AgentTool 绑定当前执行 attempt 和调用,保留解释器状态,通过现有结果转换函数返回宿主截图,并在取消或退出上下文时关闭。受控模型通过标准 AgentSession 完成工具调用和图片读取。整合测试记录为 360 项通过;另有 6 项 Activity 回归检查,覆盖一项保留的主分支修改,不代表额外 GUI 能力。 公共入口在显式选择浏览器时使用标准 Agent 和隔离工具;未指定路径、桌面与 VM 选择仍使用现有 Harness 循环。脚本完成消息不可信,只有宿主适配器回执能够确认原语副作用。完整高级 Agent 配置和产品验收仍未完成;浏览器绑定的独立测试见下文,原生和 VM 适配器仍未完成。可信适配器必须在输入前和等待后重新校验权限;终止 Python 子进程不能停止不配合取消的宿主适配器。
    P2 浏览器/P3 桌面/P4 VM 已合入的 ControllerBackend 保留调用者 ContextVars,在 Page 排队及目标查找后、调用浏览器 API 前执行宿主校验。观察取消和清理过程中的中断均会释放会话租约。不透明 broker handle 将已有 owner/session 绑定到有宿主校验的浏览器调用,要求显式观察 ID。受控 Page 测试覆盖观察、输入、验证和截图;仅宿主持有的 PNG 字节有数量与尺寸限制,并按执行归属分块保存,未确定结果的操作保留完整图片索引和结构化错误诊断。宿主资源清单允许脚本列出授权 Page 并获取一次性 Page 权限;关闭时先撤销句柄,再释放专属 owner 的资源。注册表返回真实会话和 backend 身份。这些检查包含在同一组 360 项整合测试中,不另行累加。 隔离脚本到浏览器的绑定和资源选择已通过受控 Page 测试;显式浏览器入口已通过实际 Runtime、标准 AgentSession 和受控模型验证,默认 App 验收尚未完成。最终成功要求宿主浏览器断言成立,且没有未确定的原语副作用。严格清理会尝试释放所有所属资源后报告异常,但仍可能等待正在执行的操作释放锁。外层身份字段不完整时禁用内部工具。执行中清理的时间上限尚未验证。MCP 暂不支持受限派发,已派发 Playwright 操作的取消尚未验证。完整浏览器 SDK、桌面和 VM 适配器仍未完成。
    已安装构建与默认 App 验收记录中的整合构建已安装到默认 App。内置 Python 直接加载已安装 wheel,未注入源码路径。自有测试对象验证了外部文件读写和网络访问被拒绝、秘密环境变量不继承、临时目录可写、跨次调用保留变量、SQLite 操作回执已提交及子进程已回收。默认 App 恢复连接并显示正常界面。 刷新脚本因健康检查等待超时而非正常退出;worker 随后在没有再次重启的情况下恢复健康,不能将该次刷新脚本记为通过。这些结果仅适用于受测安装构建,不自动覆盖后续安装。尚未通过默认 App 的公共入口验收真实浏览器任务;浏览器交互、页面最终结果和资源释放仍需实机验收。
    Resources 与统一预览浏览器实现保留准确的 Page、会话分支与子 Agent 归属,提供自动预览和固定预览、小窗内的固定/取消固定开关、显式“在会话中预览”,并复用现有原生 Page 显示实时内容,不创建第二个 Page。现有纵向 Files、Activity、Resources 导航保持不变。单击资源条目选择可交互聊天预览;“在会话中预览”保持同一 Page 身份,并在当前是网页时回到所属会话。显式“打开页面”把确切的现有 Page 显示为普通顶部标签并隐藏该预览。返回会话后,除非用户已隐藏,否则恢复预览。网页标签与其 PiP 不得同时显示;原生 Page 在普通网页工具栏下占满内容区。从未显示过的 Page 使用 1920×1080 CSS 像素创建视口;可见 Page 返回后台后保留最后一次原生 bounds。默认聊天 PiP 画面为 300×168.75 加单行标题栏,在较小聊天中被夹紧,并按窗口宽度调整原生页面缩放。Resources 不提供 pin 控件。真实页面保持可交互。浏览器接管使用现有执行暂停与恢复命令,并记录有界的操作标记和历史。聊天 PiP 控件是单行紧凑栏(标题、控制状态、打开页面、按状态显示暂停 Agent,我来操作 / 让 Agent 继续 / 重试暂停、固定预览 / 取消固定预览、展开/收起、更多、隐藏);空闲和已关闭显示“可直接操作”,不提供暂停或继续按钮。资源行与 PiP 图标按钮共用 24px/14px Lucide 紧凑工具栏样式。Resources 没有搜索框。已隐藏的 PiP 由资源行“在会话中预览”恢复;单击行保持现有选择行为。隐藏保留 Page。没有单独的“显示预览”控件。此项预览 UX 的浏览器源码(Web 与 Desktop 隐藏创建默认值)已实现;规格复核、质量复核、默认 App 原生互斥预览、多页面与接管验收尚未通过,完整三轮门槛仍待完成。原生软件与 VM 的预览和控制适配、子 Agent 审批缺口、以及示范录制与训练仍为分别实施的后续工作。本行不把整个 GUI Agent 项目标为完成。
    P5 恢复与 UX 定位共享执行控制和当前原生提示。保留 tab 的有界浏览器重启恢复已实现:新原生绑定、最后确认 URL/标题、原分支分组、仅明确关闭进入已关闭的网页、隐藏与固定预览偏好保留、站点持久存储重新加载、不恢复未保存 DOM/表单、不自动继续 Agent。 浏览器重启恢复已实现,并在默认 App 通过原生验收。三轮合并测试、Web、contracts 与 Desktop/docs 门槛通过。仅重启 App 会恢复带查询与片段的隐藏延迟导航;固定与隐藏偏好保留;恢复后首次人工点击推进已持久化计数器;明确关闭的网页保持关闭。没有保留 tab 描述的孤儿资源记录在原分组报告失败,不会自动重建。超出该浏览器 tab 契约的崩溃/部分副作用恢复、原生软件与 VM 适配,以及 GUI Agent 其余工作仍待完成。本行不把整个 GUI Agent 项目标为完成。
    P6 产品对比 规定任务类别、重置协议、指标与门槛。 尚未运行;Codex 对齐、速度和成本改进未测量。
    调研/设计交付 双语唯一文档、参考矩阵、架构、协议、计划、验收契约。 文档检查和独立审查在审查包记录,不代表生产就绪。

    工程记录在原位置维护当前设计,不追加带日期的决策历史或重复版本。任一目标标成已实现前,必须对应公共入口、测试、实机证据、已审查源码和合并发布检查;基线失败与不支持项保持可见。

    不调用模型的 agentic Program 可以在未选择模型时执行。无法解析的选择作为终止模型配置错误传递到子进程,仅在 Program 调用 Runtime.exec 或 async_exec 时抛出。子进程不会通过自动检测其他 provider 替代该选择。强制调用工具同样要求明确的 provider 和 model 才能构造可用 Runtime;缺失或不完整的选择保留不可重试的模型配置错误,不影响不调用模型的工具执行。会话 GraphStore 独立保持绑定。