12作者: frabonacci3 个月前原帖
嗨,HN,我是来自Cua的Francesco。 上个周末我拼凑了这个项目,灵感来自Codex Computer-Use的发布以及我们为客户部署GUI操作代理时的经验教训。 主要问题是:当UI自动化过程控制桌面应用程序时,它通常会接管人类的会话。你的光标会移动,键盘焦点被抢走,窗口会跳到最前面,你必须停止工作,直到代理完成。这就是为什么我们历史上一直避免鼓励用户直接在他们的主机上运行这些过程,而是依赖虚拟机或GUI容器来实现并发和后台执行。 但是,计算机使用——我们给代理操作计算机的工具——并不能以这种方式干净地扩展。随着模型变得更智能,代理需要安全地共享主机,在后台运行,并避免与使用同一台机器的人类或其他代理发生冲突。 我们意识到macOS没有“在不触碰光标的情况下驱动这个应用”的一流API。CGEventPost通过硬件输入流进行路由,因此会移动你的光标。CGEvent.postToPid避免了光标的扭曲,但Chromium将这些事件视为不可信,并在渲染器边界静默丢弃点击。首先激活目标应用会使窗口升起并抢占焦点,这违背了后台执行的目的。 Cua Driver是我们对真正解决方案的尝试:一个用于macOS的后台计算机使用驱动程序,允许代理在你的光标、最前面的应用和空间保持不变的情况下点击、输入、滚动和读取本地应用。默认接口是命令行界面,因此很容易从任何编码代理的shell中进行脚本编写或调用。 在macOS 14+上试试: ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.sh)" ``` 第一个内部用例是委派演示录制。我们让Claude Code驱动一个应用,而“cua-driver recording start”则捕捉轨迹、截图、动作和点击标记。结果是一个由代理生成的产品演示,灵感来自Screen Studio。 我们还用它做了其他事情: - 替代Vercel的代理浏览器和其他浏览器使用的命令行工具。使用Claude Code和Cua Driver,你根本不需要Chrome DevTools协议。 - 一个开发循环的QA代理,重现视觉错误,编辑代码,重建并验证UI,同时我的编辑器保持在最前面。 - 使用Claude Code、Hermes或其他通用代理命令行工具的个人助手流程。 - 从我不在看的Chrome、Figma、预览或YouTube窗口中提取视觉上下文,而不依赖它们的API。 让这件事比预期更困难的原因: - CGEventPost会扭曲光标,因为它通过HID流。 - CGEvent.postToPid不会扭曲光标,但Chromium在渲染器IPC边界丢弃它。 - 首先激活目标会使窗口升起,并可能将你拖到不同的空间。 - 当窗口被遮挡时,Electron应用会停止保持有用的AX树,除非有私有的远程感知SPI。 解决方案是SkyLight。SLEventPostToPid是公共每个PID调用的兄弟,但它通过WindowServer通道传输,Chromium将其视为可信。将其与yabai的无抬升聚焦模式配对,再加上在(-1, -1)处的屏幕外初始点击,点击就会落下,而窗口从未升起。 我们学到的一件事是:正确的寻址模式取决于应用。原生macOS应用通常具有丰富的AX树,Chromium系列应用通常需要AX和截图的混合,而像Blender或CAD工具这样的应用几乎不暴露有用的AX表面。错误在于到处默认使用像素——或者到处默认使用AX。 长篇技术文档:[链接](https://github.com/trycua/cua/blob/main/blog/inside-macos-window-internals.md) 我希望能得到那些构建Mac自动化、代理工具或无障碍工具的人的反馈。如果它在你关心的macOS应用上出现问题,那对我们来说是有用的数据。