GitHub Copilot 获得桌面操控能力,支持读取界面、点击、输入;文章重点解析 macOS 无障碍权限、企业kill switch 等三层防护机制。
GitHub 在 10 月 1 日发布了 Copilot 的 computer use 功能,面向 Copilot CLI 以及 macOS 和 Windows 上的 Copilot 应用进行公开预览。Copilot 可以读取无障碍应用内容和视觉上下文、点击控件、输入和编辑文本、按键、滚动、拖拽,以及在应用程序之间移动操作。目标场景很明确:没有 API、没有 CLI、也没有 MCP 集成的遗留软件和纯 GUI 软件。
我每天都在做 Agent 配置,所以我的第一个问题不是"它能做什么",而是"什么能阻止它"。变更日志很短,但提到了权限模型,而这个模型比演示更重要。以下是它告诉我们的内容,以及你的规则文件还剩多少掌控空间。
三层,按硬度排序:
操作系统权限。 在 macOS 上,这个功能会引导你完成 Accessibility 和 Screen Recording 授权。没有授权,就无法使用计算机。这是整个堆栈中最硬的拦截点。
按应用审批。 Copilot 在控制应用之前会请求许可,你之后也可以查看或重置"始终允许"列表。这是一个真正的关卡,但是按应用而非按操作。
组织级 kill switch。 组织管理的设置可以完全禁用该功能。如果你管理一个租户,这是要在任何人之前找到的那个设置。
对比一下终端 Agent:hook 可以拦截每一次 Bash 调用、检查命令并拒绝执行;配置文件可以限定哪些路径可写。这些控制作用于 tool call 的粒度。GUI 会话没有可拦截的 tool call 等价物。动作单元是"Copilot 正在驱动 Safari",一旦获批,该批准范围内的单独点击和按键都不是你仓库级规则能够否决的。
规则文件之所以有效,是因为工具有名字。Bash、Edit、一个叫 search_docs 的 MCP 工具,诸如此类。你针对这些名字编写策略:允许这个、拒绝那个、在另一个之前询问。我在另一篇文章里写过这种执行职责在配置文件和 hook 之间的划分,整个框架都假设工具表面是可枚举的。
Computer use 将工具表面坍缩成了"无障碍树和屏幕所暴露的一切"。没有工具名字对应"支付对话框里的第十个按钮"。所以大多数 Agent 配置所依赖的允许列表和拒绝列表词汇,在这里没有用武之地。按照变更日志本身的说法,取而代之的是描述:computer use"在你描述你想要的outcome、涉及的应用以及任何重要的约束时效果最好。"这句话承担了大量的支撑工作。自然语言中的约束是 GUI 会话的主要控制面。那是规则文件的领域,只是没有牙齿。
自然语言并非毫无用处。模型行为大多数时候会遵循陈述的约束,一个以明确约束开头的会话和一个以"就做费用报告"开头的会话行为是不同的。如果你启用这个功能,在你 Setup 加载的指令文件里写一个 GUI 小节:
# Computer use sessions
- Allowed apps: Safari, Numbers, Mail. Nothing else.
- Never type into: password manager, banking sites, anything 2FA.
- Financial actions over $50: stop and show me the screen first.
- If a dialog appears that was not in the plan, stop, screenshot, ask.
- Never install software or grant new permissions to any app.
这会塑造行为。它不会保证行为,就像拦截 rm -rf 的 hook 那样保证它。知道你在写哪一种。把指令级的 guardrail 视为行为塑形,把操作系统权限和始终允许列表视为真正的围栏。
Screen Recording 加上 Accessibility 意味着 Agent 可以读取屏幕上的一切,并驱动带有对话框的一切。现在回想一下,本周 DEV 上的热帖标题就是"Prompt Injection 是新的 SQL Injection(而我们还没准备好)",而且我们已经见过 Agent 通过用来打败扫描器的令牌泄露秘密。一个读取了被污染页面的 GUI Agent 可以用你的手对其操作。浏览器既是工具也是攻击面。我不会在一台活跃着密码管理器扩展的机器上启用这个功能,而且我会把始终允许列表保持为空,直到一个工作流经过几次验证值得信任。
只在你能承受误操作的机器上启用。不是你那台装着生产凭证的日常主力机。
认真走一遍 macOS 权限提示。你正在授予 Accessibility 和 Screen Recording,读懂那意味着什么。
每次会话后运行 /computer show 确认状态,用完 /computer off。这些命令很便宜;让它们成为本能。
起初保持始终允许列表为空。在一个工作流变得无聊之前按会话审批。
在第一次真正的任务之前写好 GUI 约束小节,而不是在第一次事故之后。
如果你管理组织,现在就设置托管禁用策略,按团队opt in,而不是反过来。
第一批 Agent 获得了终端。然后它们获得了你的文件,然后通过 MCP 获得你的工具,现在又获得了屏幕本身。每一步都将执行检查点从你的仓库移得越来越远、越来越靠近操作系统。你的指令仍然随 Agent 一起携带,但是围栏一直在被建在你无法版本控制的地方。这正是为什么我把每个新 Agent 表面的权限模型和规则本身放在同一套配置包里,这样两者就不会悄悄地漂移开。
如果你为团队维护 Agent 配置,这次发布是很好的契机,可以在一个人在用默认设置启用该功能之前,加上一个"GUI sessions"小节。AgentConfig Studio($29)中的套件把规则、hook 和权限说明放在一个版本化的地方,所以 GUI 约束块可以插槽进 Bash 策略旁边,而不是活在某人的记忆里。如果你想在扩展一个仓库之前看看哪些文件实际会被加载,Verify First(€19)会遍历目录树并告诉你。免费的 Next.js 示例套件展示结构,不含付费部分。
变更日志只有一页。在看演示视频之前先读它,因为演示展示了它能做什么,而变更日志展示了什么能阻止它。对于一个你即将把键盘交给它的 Agent,第二个问题才是重要的问题。