Skip to content

feat(workbuddy): 默认全自动 VLM 执行与持续投屏 - #95

Merged
HarveySang merged 7 commits into
mainfrom
codex/workbuddy-vlm-persistent-mirror
Sep 7, 2026
Merged

feat(workbuddy): 默认全自动 VLM 执行与持续投屏#95
HarveySang merged 7 commits into
mainfrom
codex/workbuddy-vlm-persistent-mirror

Conversation

@HarveySang

@HarveySang HarveySang commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

概要

独立的 WorkBuddy OpenGUI MCP + opengui Skill 本地候选实现。最新候选为 0.2.0 / broker protocol 7,加入原生生命周期 Hooks,实现已授权任务的自动续跑与收尾,删除插件逐动作确认流程。

本 PR 包含完整 workbuddy-plugin/ 和此前新增的两个 WorkBuddy 专用工作流;本次追加提交只修改 WorkBuddy 插件。DSH/Codex 生产源码、配置、缓存和进程不动。不合并、不创建正式 Release、不提交市场。

产品行为

  • 新的 OpenGUI 请求默认展示全部已连接、已授权手机;仅锁定选中的一至四台任务设备。设备查询本身不弹窗。
  • 首次控制前验证 macOS 自有窗口可见及渲染就绪。已建立展示后,最小化、遮挡、切换桌面和关窗不打断独立截图驱动的控制,不反复抢焦点。
  • 回复结束、任务完成、取消、MCP 回收不关闭持续投屏。自动恢复不重新打开用户已关闭的窗口;显式单设备重开不重开其他窗口。
  • WorkBuddy 当前 VLM 使用真实图片 → 单个白名单动作 → 新图片闭环;纯观看不向模型发送图片。
  • 已明确授权的任务不再因发送、发布、购买、删除分类产生插件确认页、原生确认表单或内部批准参数。任务范围、USB 授权、账号认证和宿主强制限制仍然有效。

自动化、恢复及隔离

  • 原生 PreToolUse 为直接 MCP / DeferExecuteTool 参数绑定短期一次性上下文,保留宿主 session 与 agent 身份;模型自填任务 ID 不构成授权。Hook 不执行手机动作、不设置 permissionDecision=allow、不替换图片。
  • Stop/SubagentStop 使用当前 WorkBuddy 5.5.3 实现可识别的 decision: block 反馈;最多十轮续跑。FinalStop/SessionEnd、取消信号和十分钟执行无活动租约收尾。状态轮询、投屏不续租。
  • 用户停止优先;在途创建会话绑定任务取消信号,迟到会话关闭后才返回,避免停止后遗留控制锁。原生任务与连接归属均检查。
  • 原任务冻结设备、一百次每设备观察/操作预算和无进展历史跨 MCP 重建保留;不恢复旧控制权限或观察凭据。
  • 错误区分 not_executed、executed、outcome_unknown;瞬态读取/下载最多重试两次,设备恢复有三十秒期限,不重放结果未知的动作。
  • 像素差异检查整体页面和点击区域;动作后每 250ms 检查稳定性,最多两秒。微小噪声不清除无进展记录;三次相同无进展后要求换策略。变化检测不冒充语义成功。
  • 失败截图清除该设备的完成证据;未知结果按设备保存,不会被另一台手机成功观察清除。完成必须引用每台任务设备最新结果,关闭资源本身不等于成功。
  • 本地安装器使用不可变版本目录,增量合并并备份 MCP、Hook、Skill;拒绝父路径软链接重定向,预写恢复日志,部分切换失败时仅回滚仍属于本次安装的内容。

当前验证

最新提交 9f9f205(核心实现 b650324),在独立 MR 工作树完成,未混入原工作区未提交内容:

  • npm run check / npm run pack:release121 tests / 21 files、TypeScript、macOS 原生辅助程序、11 工具契约、源码隔离和 ADB 校验通过。

  • npm run smoke:packed:真实安装器的保留/备份/幂等/父目录软链接拒绝检查;最终 tarball 的全新隔离缓存和离线缓存 stdio、发现、ping、broker、只读设备查询通过。使用独立前台 ADB 和不存在的测试设备选择器,不获取真机。

  • npm run test:native:合成子进程日志就绪、温和退出、有界强制清理通过。

  • npm run test:browser:合成设备墙真实 Chromium 图片解码、更新和会话关闭后停止读取通过。不存在确认页测试路径,因为该功能已移除。

  • 新增回归覆盖建立后失效连接缓存、旧连接回调、首次可恢复失败续跑、Stop 上限、原生任务/Agent 隔离、停止与会话创建竞争、跨任务关窗拒绝、截图失败完成证据、多设备未知结果、租约以及已下发动作不重放。

  • 独立安全/架构/并发/级联复核发现的问题已修正并重跑测试。直接核对 WorkBuddy 5.5.3 的 Stop 解析与派发条件;这是宿主契约检查,不代替桌面续跑验收。

  • 首轮远端 Windows 并发 registry 测试暴露文件锁删除期间偶发 EPERM;补充有期限的共享冲突重试,扫描同类 scrcpy 安装锁并一并处理,不把 EPERM 当作删除其他锁的权限。两条模拟回归均完成失败→通过对照。

  • 补充 legacy mirror handle 的 FinalStop 保留回归;已接受的显式投屏启动由 broker 生命周期持有,不因调用方回复结束或断开而失效。对应回归完成失败→通过对照。

最终本地候选 tarball SHA-256:05e8e43717e7ab28b2cf293f48b79930b872552c42cf32933eb81b1022391141。已备份 WorkBuddy 配置并安装到新的不可变目录,保留旧包及恢复记录;旧 WorkBuddy OpenGUI 投屏/broker 已正常结束。

桌面验收与未完成项

本轮实际重开 WorkBuddy 5.5.3,在桌面 /opengui 菜单看到了新名称及新技能描述,并选中技能。之后 Mac 锁屏,原生 Computer Use 因物理输入保护暂停,未绕过系统锁屏。

因此 0.2.0 的普通自然语言真机闭环、桌面自动续跑、用户停止、持续视频更新、最小化/关窗后的真机控制、MCP 回收后持续投屏与双真机均尚未完成本轮验收。此前 0.1.0 的单机滑动/关闭窗口/重连记录只作历史证据,不能视为本版本已通过。当前 WorkBuddy 已结束,解锁后可重新打开使用已安装候选。

真实发布、购买、删除不作为默认验收动作;只使用模拟测试。macOS 优先,Windows/Linux 不宣称具有 macOS 初次窗口验证能力;它们的打包启动由 CI 单独检查。当前提交 CI 以本 PR checks 的对应 SHA 为准。

release-readiness.json 继续保持未验证,不据此发布。外部测试、桌面验收、CI、合并、正式 Release 和市场审核分别报告。

Keep default device displays independent from ongoing screenshot-based control. The old per-action visibility checks and display callbacks repeatedly invalidated valid observations; sticky initial verification and regression tests now distinguish window closure from physical device disconnection.

Add protocol 6, per-device abort generations, one-time human confirmation, stable reconnect identity, cancellable install/process cleanup, native packaging and independent CI. Hardware acceptance remains explicitly unverified; production DSH/Codex plugins are unchanged.
The old true executable fixture failed on Windows and returned no owned forward row even on Unix. Mock explicit ADB listing/removal results and assert exact commands plus failure retention on every platform.
The Windows failure recurred because the 20ms idle deadline raced the first socket handshake, before the retention fixture had a display. Establish the display first and delay connection beyond that deadline; the regression fails without this setup and passes with it. Align the legacy running-mirror fixture with hasMirrors as well.
Windows smoke reached both success assertions but failed cleanup because an auto-started daemon held the cached adb.exe. Run a foreground child on a private loopback port with a nonexistent USB selector and discovery disabled, then stop only that child before removing test files. Keep the smoke cleanup in the CI regression path.
@HarveySang HarveySang changed the title feat(workbuddy): 独立 VLM 操作闭环与默认持续投屏 feat(workbuddy): 默认全自动 VLM 执行与持续投屏 Sep 6, 2026
@HarveySang
HarveySang merged commit 748d347 into main Sep 7, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant