数据截至 (上游 commit ead48da2032c)
跨平台一致性、权限与分发
30 秒导读: 前四章讲的是"一台机器上,一个 computer-use agent 怎么看见 UI、怎么把动作落地"。 这一章讲的是工程收尾:同样这 9 个工具、同样的 MCP 契约,怎么在 macOS、Linux、Windows 三套 完全不同的无障碍后端上都跑起来;跑起来之后,操作系统的权限该挂在谁身上;最后这一坨东西怎么打成 一个
npm install -g就能用的包。
本章不再讲"怎么点一个按钮"(那是 03-action-execution 的活),而是讲 "同一份契约如何铺到三平台并落地安装"。
1. 这是什么(零基础也能懂)
一句话: 这个项目对外只承诺一件事——一个叫 open-computer-use 的 MCP 服务器,提供 9 个工具
(list_apps、get_app_state、click、type_text……详见 02-mcp-tools-surface)。
本章讲的是:这一份承诺,在三个操作系统上是三套实现,但对上层 agent 看起来必须长得一样。
为什么这很难? 三个系统"读 UI + 动 UI"的原生技术栈毫不相干:
| 平台 | 无障碍技术 | 语言/形态 |
|---|---|---|
| macOS | Accessibility (AX) API + CoreGraphics 截图 | Swift 原生 .app |
| Linux | AT-SPI2(经 D-Bus)+ GDK | Go 壳 + 内嵌 runtime.py |
| Windows | UI Automation (UIA) patterns | Go 壳 + 内嵌 runtime.ps1 |
三套后端,却要给上层同一套工具名、同一套参数 schema、几乎同一套 serverInstructions。做到"看起来一样"
本身就是一项工程,这是本章第一条主线。
第二条主线是权限。 computer-use 要读别人窗口、要截屏,操作系统天生把这类能力锁得很死。三平台 各有各的门槛:macOS 要 TCC 授权(Accessibility + Screen Recording),Linux 要能连上登录用户的桌面 会话(D-Bus / Wayland / X11),Windows 要跑在登录桌面会话里。光有代码不够,得让权限"挂得住"。
第三条主线是分发。 最终交付物是一个 npm 包,npm install -g open-computer-use 之后,一条
open-computer-use mcp 就能给任意 MCP 客户端(Claude / Codex / Gemini / opencode)当后端。
用起来什么样(macOS):
npm install -g open-computer-use
open-computer-use doctor # 查权限,缺了就弹引导窗
open-computer-use install-codex-mcp # 把自己写进 ~/.codex/config.toml
open-computer-use mcp # 启动 stdio MCP 服务器
2. 顶层全景(它大概怎么转)
2.1 一张图:同一份契约,三条落地路径
下面这张图从左到右是"上层 agent 看到的东西 → 平台分叉 → 各自的原生后端"。关键:虚线框里三支 共享同一套工具定义和 serverInstructions,只是执行体不同。
MCP 客户端 (Claude / Codex / Gemini / opencode)
│ stdio JSON-RPC
▼
┌───────────────────────────────────────────┐
│ 同一份对外契约(9 工具 + serverInstructions)│
│ tools/list 三平台字段对齐,措辞仅按平台微调 │
└───────────────────────────────────────────┘
│ │ │
┌───────┘ ┌──────┘ ┌──────┘
▼ ▼ ▼
┌─────────┐ ┌──────────┐ ┌──────────┐
│ macOS │ │ Linux │ │ Windows │
│ Swift │ │ Go 壳 │ │ Go 壳 │
│ 原生.app │ │+runtime.py│ │+runtime.ps1│
│ AX API │ │ AT-SPI2 │ │ UIA │
└────┬────┘ └────┬─────┘ └────┬─────┘
│ │ │
截屏走 CG 发现桌面会话 跑在登录
AX 读树 (/proc environ) 桌面会话里
│ 起 python3 起 powershell
▼ ▼ ▼
TCC 授权 D-Bus/Wayland UIA 只读也
(App 代理) /XDG 环境变量 要会话可达
2.2 部件一句话职责
| 部件 | 干什么 | 在哪 |
|---|---|---|
| macOS 主程序 | Swift .app,内含全部 AX 逻辑 | apps/OpenComputerUse/Sources/OpenComputerUse/OpenComputerUseMain.swift |
| Linux Go 壳 | 解析 CLI/MCP,内嵌并调用 runtime.py | apps/OpenComputerUseLinux/main.go |
| Windows Go 壳 | 解析 CLI/MCP,内嵌并调用 runtime.ps1 | apps/OpenComputerUseWindows/main.go |
| App 代理 | macOS:把 CLI 请求代理进稳定 .app 实例 | apps/OpenComputerUse/Sources/OpenComputerUse/MacOSAppAgentProxy.swift |
| 权限诊断 | 查 AX / 截屏 授权,读 TCC.db | packages/…/OpenComputerUseKit/Permissions.swift |
| 引导窗 | macOS 缺权限时弹窗引导 | apps/…/PermissionOnboardingApp.swift |
| npm 打包器 | 把三平台二进制打成一个包 | scripts/npm/build-packages.mjs |
| install-* | 把自己写进各 agent 的 MCP 配置 | scripts/install-*.sh |