Cell - Ta Computer Use
Ta 自带的 pi 包(默认开启,可在 Web 客户端的 设置 → 扩展 关闭):让 Ta 经 Cua Driver 在后台使用这台电脑上的桌面应用——列出应用和窗口、读取窗口的辅助功能树、点击、输入、滚动、截图,不抢用户的鼠标和键盘。只有一个 pi 扩展(src/extension.ts → extension/index.mjs),不改 Ta 的核心,pi 也能装。
Ta Desktop 自带 Cua Driver(固定版本),装好就能用。终端里的 Ta 用用户自己装的那一份:
bash
/bin/bash -c "$(curl -fsSL https://cua.ai/driver/install.sh)" # macOS、Linux
irm https://cua.ai/driver/install.ps1 | iex # Windows(PowerShell)/computer-use 显示用的是哪个程序,并检查系统还缺什么(缺什么就像第一次使用时一样引导用户);没装时给出安装命令。
机制
- 找程序:先看环境变量
TA_CUA_DRIVER(Ta Desktop 给它启动的 ta serve 设置,指向自带的那份),再依次看PATH、~/.local/bin(安装脚本的默认位置)、macOS 的/Applications/CuaDriver.app和~/Applications/CuaDriver.app。只做stat,不运行任何程序。没找到时每条消息前再找一次,会话中途装好也不用重启。 - 提示:找到时在系统提示里加一段
<computer_use>:工具名是tools.mcp__cua_driver__*,先用describeNamespace("mcp__cua_driver")看用法,另加一句当前系统的限制(macOS:在等授权时不要再向用户要;Windows:以管理员身份运行的窗口操作不了;Linux:需要桌面会话和 AT-SPI)。没找到时什么都不加。 - 按需启动:MCP 服务器
cua-driver(codemode 暴露)不在会话开始时注册,第一次有 codemode 脚本点名mcp__cua_driver时(按 pi 的reachesTools;搜索工具的脚本要在文字里写出它)才用pi.registerMcpServer注册,等工具出现(最多 5 秒)后这次调用就能用。pi 会在每个会话开始时连接所有已注册的服务器,提前注册就意味着每个会话多一个cua-driver mcp进程(约 10–24 MB);按需注册后,不用桌面应用的会话没有任何额外进程。 - 系统要求与授权(
src/cua-driver-access.ts,每个进程第一次使用时检查一次,同时到来的调用共用这一次检查):- macOS:Cua Driver 需要辅助功能(读取和操作应用)和屏幕录制(截图)两项授权,授权属于 CuaDriver.app(
com.trycua.driver,Cua 的开发者签名),不属于 Ta。用cua-driver call check_permissions查询(约 20 ms)。缺授权时,CuaDriver.app 会自己弹出两步引导窗口;Ta 发一条通知说明要开哪两个开关,然后每秒查一次,开好后这次调用继续执行,不用重试。引导窗口被关掉时,Ta 直接打开系统设置的对应页面。最多等 3 分钟,用户按“停止”立即结束;没有辅助功能时,这次调用失败,失败原因会告诉模型去请用户开启,/computer-use可以再走一遍引导。只缺屏幕录制时照常继续(不截图也能读取和操作),并提示一次。守护进程刚启动的几百毫秒里会先返回permissions_pending,所以先静默等最多 3 秒,避免误报。 - Linux:不需要授权,但需要图形会话(X11,或带 XWayland 的 Wayland)、AT-SPI 辅助功能总线,以及 libX11 / libXi / libxkbcommon。用
cua-driver doctor --json检查(约 0.3 s):没有图形会话(例如通过 SSH)或缺库时,这次调用失败并说明原因和安装命令;AT-SPI 等警告通知用户一次,照常继续。 - Windows:不需要授权;同样用
doctor检查桌面会话。以管理员身份运行的窗口需要 Ta 也以管理员身份运行(UIPI),这一点写在提示里。 - 系统说不清的时候(用户自己装的那份守护进程还没启动)不阻止调用,下一次再查。
- macOS:Cua Driver 需要辅助功能(读取和操作应用)和屏幕录制(截图)两项授权,授权属于 CuaDriver.app(
- Ta Desktop 自带的那份,在 macOS 上(
src/cua-driver-daemon.ts):MCP 进程只负责转发,真正干活的守护进程必须经 LaunchServices 作为 CuaDriver.app 启动,授权才算在它自己名下。Ta 在自己的 socket(~/Library/Caches/ta/cua-driver.sock)上启动一个守护进程,MCP 服务器是cua-driver mcp --embedded --socket <它>。具体做法:- 嵌在另一个 app 包里的 app,macOS 会算成外层 app 的一部分(授权会挂到 Ta 名下,每次构建都会丢)。所以第一次使用时,把它按版本克隆到
~/Library/Application Support/Ta/cua-driver/<版本>/(APFS 克隆,约 30 ms,不额外占磁盘),从那里启动,同时删掉旧版本的克隆。 - LaunchServices 按 bundle id 挑副本,可能挑中本机其他应用带的 CuaDriver.app(版本不同,转发会报不兼容)。所以启动前先用
lsregister -f注册这份,启动后核对实际运行的程序路径;对不上就停掉,并提示cua-driver doctor --fix。socket 上已有的守护进程(其他 Ta 进程或上次留下的)同样先核对一次。 - 自带的那份关闭 Cua 的产品遥测和更新检查(
CUA_DRIVER_RS_TELEMETRY_ENABLED=0、CUA_DRIVER_RS_UPDATE_CHECK=0),由 Ta 的版本更新负责升级;用户自己装的那份保持用户自己的设置。 - 守护进程每次被用到前都会确认它还活着(一次 socket 连接),挂了就重启;10 分钟没用就退出(约 60 MB),转发进程随之退出,pi 在下一次调用时自动重连;启动它的进程退出时也会把它停掉。
- 嵌在另一个 app 包里的 app,macOS 会算成外层 app 的一部分(授权会挂到 Ta 名下,每次构建都会丢)。所以第一次使用时,把它按版本克隆到
实测(M4 Pro,假模型跑 ta -p,自带 Cua Driver 0.47.5,用 Ta.app 打包产物里的那份):第一次调用比不调用多约 0.3 s(克隆加守护进程启动);之后每次新进程的首次调用,和不调用时的差别在测量误差内(约 1.18 s 对 1.20 s)。守护进程启动约 150–250 ms,授权查询约 20 ms,空闲时占约 33–60 MB。
限制
mcp.json里已有同名(cua-driver)服务器时以文件为准;以其他名字配置的 Cua Driver(例如cua-driver connect写的cua-computer-use)不会被识别,工具会出现两份,可以关掉本扩展。- 远程执行(
ta serve --exec)时 MCP 服务器在执行环境里启动,而程序是在 ta serve 所在的机器上找的,两边路径不同时连不上。 - macOS 上,用户在引导窗口里点“退出并重新打开”(屏幕录制要求)后,macOS 会不带 Ta 的参数重新启动 CuaDriver.app;Ta 会重启自己的守护进程,并在授权完成后停掉这个多出来的实例。
- Windows 和 Linux 的安装包没有在真机上验证过;Linux 的
doctor输出在容器里验证过。