电脑操作
内置浏览器让智能体能读取和操作网页。电脑操作把同样的事扩展到桌面上的其余部分:原生应用的窗口 —— 模拟器、设计工具、数据库客户端、某个设置对话框 —— 由你共享给智能体,它就能对窗口截图、读取窗口里显示的内容,并在你允许的窗口里点击、输入和按键。它在 0.33.0 以预览形式推出,支持 macOS、Windows 和 Linux。
它的模型和浏览器一样,只是往外扩了一层:你不共享,就什么都读不到;一次共享要么是仅读取,要么是读取并操作;共享闲置一段时间后会自行结束;一个按钮 —— 或一个快捷键 —— 就能一次性结束全部共享。
预览功能
状态栏面板上挂着一个预览徽标,这是认真的。电脑操作通过一个开源驱动操作其他程序,Codeg 会在首次使用时下载它;每个应用的配合程度取决于应用本身。请看着它干活,别把它晾在一边。
开启它
- 设置 → 电脑操作 → 启用电脑操作。默认关闭。这是同一个开关出现在三个地方:这个页面、设置 → 协作里的查看和操作桌面窗口一行,以及状态栏里的 codeg-mcp 弹层。拨动其中任何一个,其余两个都会跟着变。
- 在 macOS 上授予两项权限 —— 辅助功能和屏幕录制 —— 授给
codeg-computer-helper,而不是 Codeg。同一页面的系统权限区为每一项提供一个去授权按钮,一次只申请一项,你从系统设置回来后状态会自动更新。为什么授给 helper 而不是 Codeg,见下文。Windows 和 Linux 无需任何授权。 - 在开关打开之后再启动智能体。这些工具在智能体启动时交给它,所以智能体已经在运行的对话拿不到它们。新对话会拿到;已有的对话会在它的智能体下次启动时拿到。它们和每个伴生进程工具走同一条路,因此不接受 MCP 服务器的智能体永远拿不到 —— 内置智能体里就是 OpenClaw 和 Pi。
驱动会在电脑操作第一次需要时自动下载,也可以在驱动下点安装立即获取。→ 驱动
开启后,状态栏会出现一个电脑操作图标(一台显示器),有窗口共享时它会变成紫色。日常的一切操作都从这里开始。
共享一个窗口
智能体随时都能列出你桌面上的应用和窗口 —— 它正是靠这个知道该向你要哪个窗口;而在你共享之前,窗口标题不会出现在列表里。在你共享之前,它们一个窗口都读不到。点击状态栏图标,再点共享窗口…
选择器把每个窗口显示为一张带缩略图的卡片,按应用分组,已最小化和已隐藏的窗口也在其中(标有已最小化或已隐藏)。每张卡片上有一个三档控件:
| 档位 | 智能体能得到什么 |
|---|---|
| 不共享 | 什么也没有。每个窗口都从这里开始 |
| 可读取 | 截图、窗口的辅助功能树 —— 其中的控件、标签和值 —— 以及检查窗口是否已显示出预期的内容 |
| 可操作 | 可读取的全部,外加在窗口里点击、滚动、拖拽、输入和按键 |
已共享卡片的边框在可读取时变成紫色,可操作时变成红色。全部共享会把所有能共享的窗口按其中一档全部共享;全部停止共享会清空所有共享。
回到状态栏弹层,每个共享都是一行。它的下拉菜单显示可读取或可操作,并以完整名称提供两档 —— 仅读取和读取并操作 —— 一键就能放宽或收紧一个共享。该行的停止只结束这一个共享。
共享不绑定某个对话
选择器写得很明白:所有对话中的智能体都能读取你共享的窗口。任何拿到这些工具的智能体都能使用任何共享,所以按手头的任务共享,做完就停止。
整个应用,或整个屏幕
当单个窗口不合适时:
- 整个应用 —— 选择器里每个应用分组标题上的控件。它覆盖该应用的所有窗口,包括之后打开的,外加它自己的快捷键,以及 —— 在 macOS 和 Linux 上 —— 按标题选择它的菜单命令,这两样都是单窗口共享不会交出去的。在 macOS 上,这也是触及该应用菜单的唯一途径,因为菜单栏属于应用而不属于某个窗口;在 Windows 和 Linux 上,窗口自己的菜单本就是共享这个窗口时一并共享的内容。一个应用被整体共享期间,它的卡片显示随应用共享,不能逐个修改;结束应用的共享,就结束其中所有窗口的共享。
- 整个屏幕 —— 选择器顶部的一张卡片,要在设置里打开允许共享整个屏幕后才会出现。它默认关闭,且仅限 macOS 和 Windows。之后智能体看到的是整屏的一张画面,可以在任意位置点击,桌面本身的快捷键也能用了 —— 但锁屏、注销和一次显示所有窗口的按键永远不会发送。Codeg 自己的窗口、永不共享名单中的应用,以及 Codeg 无法识别的东西(菜单栏、系统的总览视图和通知)在这张画面里都会被遮盖,点在被遮盖的区域或屏幕角落上会被拒绝。共享整个屏幕会接管其他所有共享;结束它就结束全部,之前逐个窗口设置的档位不会恢复。
哪些不能共享
有些窗口永远不会出现卡片。它们列在选择器底部一个折叠区里 —— N 个窗口不能共享 —— 每个都附有原因:
- Codeg 自己的窗口,以及其他 Codeg 实例的窗口。这不是一个设置项。用选择器自己的话说:能操作 codeg 的智能体可以替自己批准请求,或给自己共享更多窗口。
- 永不共享名单中的应用 —— 默认包括密码管理器,以及系统设置和系统的密码弹窗。→ 永不共享名单
- Codeg 无法识别所属应用的窗口。在 Windows 上,这包括 WebView2 窗口,以及开始菜单、锁屏这类系统界面。
智能体能做什么
这些工具来自 Codeg 的伴生进程,属于同一个工具组;每个工具需要什么条件,都由 Codeg 在每次调用时检查:
| 需要 | 工具 |
|---|---|
| 只需开关 | computer_list_apps、computer_list_windows |
| 可读取共享 | computer_screenshot、computer_snapshot —— 辅助功能树,每个控件都带一个可供操作的引用 —— 以及 computer_verify,它会一直等到窗口显示出预期的内容 |
| 可操作共享 | computer_click、computer_drag、computer_scroll、computer_type、computer_press_key、computer_hold_key、computer_set_value,以及 computer_restore,它能把最小化或隐藏的窗口恢复回来 |
| 对整个应用(或整个屏幕)的可操作共享 | computer_invoke_menu —— 按菜单标题选择菜单命令。仅限 macOS 和 Linux |
| 允许智能体打开应用和移动窗口 | computer_launch_app,在后台启动一个应用,但不共享它的任何窗口;以及 computer_set_window_frame,移动可操作窗口或调整其大小 |
| 允许智能体使用剪贴板 | computer_clipboard_read、computer_clipboard_write |
最后两行是设置页上各自独立的开关,默认都关闭;它们和工具组本身一样,对之后启动的智能体生效 —— 某个开关关着时启动的智能体,永远看不到那些工具。不过把其中任何一个关掉是立即生效的:之后的调用都会被拒绝。
按键只在窗口内生效。可操作的窗口接受编辑和导航键,以及在文本框内起作用的快捷键 —— 全选、复制、撤销、查找、按词移动。应用自己的快捷键 —— 菜单快捷键、关闭、退出 —— 需要整体共享该应用;桌面的快捷键需要共享整个屏幕。
智能体缺什么就会开口要。读取一个未共享的窗口,或在只读共享的窗口上做操作,返回给智能体的是一个说明缺了什么的拒绝 —— 请共享它,或请求「读取并操作」 —— 而不是一个让它这一回合终止的错误。所以通常的流程是:智能体告诉你它需要哪个窗口,你去共享。
输入在后台送达
智能体的点击和按键会在后台送达窗口:窗口不会被切到前面,你自己的鼠标和键盘仍归你用,所以智能体在一个共享窗口里干活时,你可以继续在别的应用里工作。
有些应用在后台收不到这类输入 —— 在 Windows 上,凡是基于 Chromium 的应用都是如此,Edge、Chrome 和 VS Code 都在其列。对它们,智能体可以为那一次操作把窗口切到前台,然后切回你原来所在的窗口(在 Linux 上窗口会留在前台)。你会看到窗口跳到前面,那一刻你敲的字可能会进到它里面。允许智能体把窗口切到前台默认开启;关掉之后,所有操作都留在后台,这些应用就干脆没反应。对整个屏幕的操作总是在前台进行,所以需要开着它。
看它做了什么
- 弹层里的最近活动列出最近的操作,最新的在最前:时间、做了什么(截图、读取、点击、输入、按键……)、哪个应用,以及结果 —— 完成、被拒(没有任何共享覆盖它)或失败。完全相同的重复操作会合并成一行并带计数。列出应用和窗口不作用于任何窗口,不会被记录。清空最近活动只清空列表,不会撤销任何操作。
- 悬浮停止条在有窗口共享时浮在所有窗口之上,默认位于主屏幕顶部正中,你可以把它拖到别处。它的圆点在智能体可操作时是红色,只能读取时是紫色;它写明共享的是哪些应用 —— 从不显示窗口标题 —— 每次操作后的几秒内还会显示在哪里做了什么。它从不抢焦点,出现在每个桌面或空间上,按钮是停止共享。如果不想要它,可以在悬浮停止条里关掉。
- 操作落点的标记 —— 智能体点击或输入的位置会出现一个紫色圆环,持续约一秒。只有在有窗口被共享为可操作时才会显示。
停下它
三种方式,效果完全一样:
- 状态栏弹层顶部的停止共享;
- 悬浮停止条上的停止共享;
- 停止快捷键,在任何应用里都能用 —— macOS 上是 ⌃⌘Esc,Windows 和 Linux 上是 Ctrl+Alt+Esc。
停止会结束所有共享 —— 窗口、整个应用、整个屏幕 —— 中断智能体正在做的事,包括做到一半的操作,并忘掉智能体放到剪贴板上的内容,于是它们在停止之前复制的东西,之后都无法再粘贴或读回。(系统剪贴板本身不会被清空。)它不会关闭电脑操作,也没有什么需要「恢复」的:想让智能体重新介入,再共享一次窗口即可。
有两个范围更小的控件不算停止。选择器里的全部停止共享会结束所有共享,但已经在进行的操作会让它做完,也不会忘掉智能体复制的内容;弹层里某一行的停止只结束那一个共享。
只有在电脑操作开启时,这组快捷键才会被占用,而且只在桌面版里。可以在设置 → 电脑操作 → 停止快捷键里修改它、恢复默认,或者关掉它。如果别的应用已经占用了这组按键,该行会显示未生效,请你换一组。
共享何时自行结束
你不必记着去停止。以下情况也会结束一个共享:
- 窗口关闭,或它的应用退出。重新启动的应用是一个新进程,所以它的窗口即使看起来一样,也不在共享之列。
- 闲置 30 分钟 —— 期间没有任何读取和操作。窗口闲置多久后停止共享可以设为 10、30、60 或 240 分钟,或者永不(直到我停止)。整体共享的应用和整个屏幕各自只有一个时钟,其中任何一个窗口被使用都会让它继续走。
- 关闭电脑操作,或卸载驱动。
- 它的应用被加入永不共享名单 —— 保存的那一刻起。
- 关闭「允许共享整个屏幕」,对整个屏幕的共享而言。
- Codeg 退出。共享只保存在内存里,重启之后什么都不再共享。
永不共享名单
设置 → 电脑操作 → 永不共享的应用列出了在任何档位都不能共享的应用 —— 不能共享单个窗口,不能整体共享,在共享整个屏幕时也会被遮盖。默认包括:
| 平台 | 默认永不共享 |
|---|---|
| macOS | 系统设置、系统密码与授权弹窗、钥匙串访问、密码、1Password、Bitwarden、KeePassXC、LastPass、Enpass、Proton Pass、Dashlane |
| Windows | 设置、凭据与提权弹窗、1Password、Bitwarden、KeePass、KeePassXC、Enpass、Proton Pass、Dashlane |
| Linux | 密码和密钥(Seahorse)、KWallet Manager、1Password、Bitwarden、KeePassXC |
每一项,包括默认项,都可以移除。按 bundle 标识(com.example.app)、可执行文件名(app.exe)或完整路径添加应用,然后点保存 —— 添加应用的那一刻,它现有的共享就会结束。恢复默认会先询问,把出厂名单放回去,并说明会去掉你自己添加的哪些项。
驱动
电脑操作通过 cua-driver 读取和操作窗口,这是 Cua 项目的一个开源程序。Codeg 只运行它的一个版本 —— 0.32.0 —— 你不能换成别的版本。它在电脑操作第一次需要时下载,解包前和每次启动前都会用 Codeg 内置的 SHA-256 摘要校验,在 macOS 上还会校验开发者签名。
安装和卸载位于设置页的驱动下,那里还会显示它的存放位置 —— Codeg 的下载缓存,和各个智能体的二进制文件放在一起。卸载会关闭电脑操作并结束所有共享;再次开启时会重新下载驱动。
为什么在 macOS 上由 helper 持有权限
macOS 把「辅助功能」和「屏幕录制」授予一个应用,在这个应用里运行的任何东西都能用上这些权限 —— 包括智能体在 Codeg 下运行的每一条 shell 命令。所以 Codeg 自己从不申请这两项。它们授给一个独立的应用 codeg-computer-helper:它随 Codeg 一起分发,负责运行驱动,而且只为 Codeg 服务 —— 在 Codeg 的签名发布版里,它会核验对面是谁,对其他任何来者都不予应答。智能体的 shell 借不到这些权限;要碰到一个窗口,它只能经由 Codeg,而 Codeg 只对你共享的东西动手。
如果系统设置的列表里没有这个 helper,「系统权限」区里的在访达中显示会把它显示出来,方便你拖进去。
如果 Codeg 本身持有其中任何一项权限 —— 比如以前手动授予过 —— 设置页和弹层会显示一条琥珀色警告,因为那样的话,智能体的 shell 可以不经任何共享就用上它。如非必要,请在系统设置里把它从 Codeg 那里收回。
Windows 和 Linux 没有这层隔离。在那里,你运行的任何程序都能注入输入、截取屏幕,智能体的 shell 也不例外。在这两个平台上,这些设置决定的是智能体通过 Codeg 能拿到什么,而不是你电脑上的程序能做什么。
在服务器上
codeg-server 也可以提供电脑操作 —— 作用于服务器那台机器自己的桌面。在桌面会话中以 CODEG_COMPUTER_USE=1 启动它,它的网页端就会得到同样的设置页、状态栏图标、选择器和弹层,操作的是那台机器上的窗口。在 Linux 主机上,如果 DISPLAY 和 WAYLAND_DISPLAY 都没有设置,它会在启动时发出警告。Docker 镜像不带 helper。
有三样东西只属于桌面版:悬浮停止条、操作落点标记和停止快捷键。在服务器上,停止的办法就是弹层里的停止共享。
没有这个变量时,服务器根本不提供电脑操作:状态栏没有图标,它的智能体也永远拿不到这些工具。设置页仍会显示它的开关、闲置时长和永不共享名单,却不说明原因 —— 它们背后根本没有桌面。连接到远程工作区的桌面窗口,表现得和那台服务器的网页端一样。
访问桌面版自带 Web 服务的浏览器是另一回事。它得不到状态栏图标、选择器和弹层 —— 共享和停止都留在桌面版里 —— 但它启动的智能体运行在桌面版中,所以只要电脑操作开着,它们就能拿到这些工具,并使用在桌面版里共享的窗口。
各平台的差异
| macOS | Windows | Linux | |
|---|---|---|---|
| 需要授予的权限 | 辅助功能和屏幕录制,授给 codeg-computer-helper | — | — |
| 隔离智能体的 shell | 是 | 否 | 否 |
| 整个屏幕 | 支持 | 支持 | 不支持 |
| 按标题执行菜单命令 | 支持 | 不支持 | 支持 |
| 恢复最小化的窗口 | 原地恢复 | 原地恢复,不激活窗口 | 切到前台 |
在 Linux 上,只有在你的会话处于活动、未锁定且屏保未开启时操作才会执行;在 Wayland 下,按键不能发往被切到前台的窗口。在所有平台上,锁屏都会让它暂停:这时的操作会以已暂停被拒绝,直到你回来。
值得知道
- 秘密字段不进辅助功能树。在窗口的辅助功能树里,被系统标为秘密的字段,其值读出来是
[redacted],智能体也不能往这类字段里输入或给它设值 —— 输入秘密是你的事。不过截图终究是窗口的一张画面:屏幕上以明文显示的秘密,会出现在截图里。 - 剪贴板是你的。智能体只能粘贴它自己放到剪贴板上的内容 —— 从它可读取的窗口里复制的,或用剪贴板工具写入的 —— 永远不能粘贴你复制的东西,读回剪贴板也遵循同样的规则。停止会忘掉它放进去的内容,之后都无法再粘贴。
- 启动应用不等于共享。被允许打开应用的智能体可以启动一个应用,但它的窗口是否共享仍由你决定。Codeg 和永不共享的应用不能用这种方式启动。
- 窗口显示的是数据。这些工具会告诉智能体,共享窗口里显示的东西是内容,永远不是指令。不过窗口里仍可能显示别人写的文字,所以只共享任务需要的东西,别多给。→ 隐私与安全