架构技术评论

再看Peekaboo(OpenClaw桌面自动化)

https://github.com/steipete/Peekaboo

Peekaboo 是OpenClaw幕后操作macOS的核心技术:用 macOS 的屏幕捕获能力 + Accessibility(AX) 自动化能力 +(可选)视觉模型分析,把“看见屏幕并对 UI 执行动作”封装成 CLI/MCP 工具链。

Image

下面按“系统分层 + 关键机制”拆开讲。

⸻

  1. 1. 总体架构:三条管线拼起来

Peekaboo 在 README 里把能力说得很直白:屏幕捕获(screens/windows/menu bar)+ AI 分析 + 完整 GUI 自动化(click/type/scroll/hotkey/menu…)。 

你可以把它理解为三条管线:
1. Capture 管线(像素层)
• 把目标(屏幕/窗口/菜单栏区域)截成图片(支持 Retina 2x 等)。 
• 需要 Screen Recording 权限(系统层面的屏幕录制授权)。 
2. Perception 管线(语义层,可选)
• 把图片丢给视觉模型做 VQA/描述/OCR 等(可以 OpenAI/Claude/Gemini,也可以走本地 Ollama)。 
• MCP 的 image/analyze/list 三个 tool 就是把这些能力“协议化”。 
3. Actuation 管线(交互层)
• 用 macOS Accessibility (AXUIElement) 去找控件、读属性、执行 press/setValue/scroll 等动作。
• 这块核心抽成了一个库:AXorcist,Peekaboo 直接依赖它。 

⸻

  1. 2. 代码分层:Swift 模块怎么拆的

从 Package.swift 能看到 Peekaboo 的 Swift 包结构(这是理解“原理”的关键,因为它揭示了分层边界): 
• PeekabooFoundation:基础类型/工具(更偏“地基层”)。 
• PeekabooProtocols:协议与结构化数据(很像“跨模块 contract”,配合严格并发/主线程隔离)。 
• PeekabooAutomationKit:自动化能力聚合层(这里把 Foundation + Protocols + AXorcist + algorithms 组装成“可用的自动化工具箱”)。 
• PeekabooBridge:桥接层(把内部能力对接到 CLI/MCP/外部调用面)。 

你如果要读源码,优先从 AutomationKit → Bridge → Apps/CLI 命令 这条链路看,会最快建立心智模型。

⸻

  1. 3. AX 自动化的“原理”:AXorcist 为什么重要

Peekaboo 不只是“截图 + 坐标点击”,它更偏向“结构化 UI 自动化”:先把 UI 树(按钮/文本框/菜单等)结构化出来,再基于 element id/属性去定位与操作。

AXorcist README 里把它的设计写得非常清楚: 
• Element 是对 AXUIElement 的 Swift 封装,支持读属性、取 children/parent、执行 action、setValue 等。 
• Query/Command 架构:所有操作都走“命令包 + 响应”的形式(可批量 batch)。 
• 匹配策略:exact/contains/regex/prefix/suffix/containsAny 等,支持 fuzzy/灵活定位。 
• JSON/CLI 输入输出:天然适合被 agent 或脚本驱动(Peekaboo 的 see/click/type 本质就是把这个能力产品化)。 

这解释了 Peekaboo 的一个关键体验:
它可以先 see 得到一个 snapshot(含结构化 elements),再 click --on "Reload this page" 这种“按语义找控件并点击”,而不是只靠坐标。 

⸻

  1. 4. “跨 Space 聚焦窗口”为什么专门做了一套

真正让 macOS 自动化难用的,不是 click 本身,而是:
• 目标窗口可能不在当前 Space(虚拟桌面)
• 窗口没 frontmost / 没 focus
• 你拿到 window id 了,但 AX 层要能映射到正确的 AXUIElement

Peekaboo 的 docs/focus-impl.md 直接给了架构图,说明它把“聚焦”当成一个独立的基础设施来做: 

CLI 命令(click/type/menu/scroll…)
→ ensureWindowFocus()(智能聚焦,支持 Space)
→ Window resolution(CGWindowID → AXUIElement → focus actions)
→ Space 管理(用 CGSSpace/CGSManagedDisplay… 一类 API 做切换/移动) 

同时文档还点名了这些概念:CGWindowID、CGSSpaceID、以及通过 CGSManagedDisplaySetCurrentSpace、CGSAddWindowsToSpaces 等进行 Space 切换/窗口移动。 
这意味着 Peekaboo 的“可靠点击”不是一条直线,而是:

解析窗口身份 → 确保窗口在当前 Space → 置前/聚焦 → 才执行 AX 动作

这也是它比很多“简单封装 AX 的小工具”更工程化的地方:把不稳定因素(Space/focus)系统性收敛掉。

⸻

  1. 5. MCP/Node 那层到底干嘛:为什么有 peekaboo-mcp.js

Peekaboo 的核心是 Swift 二进制,但为了在 MCP 生态(Claude Desktop/Cursor 等)里更好分发和运行,它提供了一个 Node 包入口。

peekaboo-mcp.js 的作用非常朴素:spawn Swift 二进制跑 peekaboo mcp serve,如果崩了就指数退避重启,并处理可执行权限等小坑。 

所以你可以把 MCP 层理解为:
• 协议/分发/运行时外壳(Node)
• 真正干活的是 Swift CLI/server(底层能力在 Swift 模块里)

⸻

  1. 6. 权限模型:为什么必须要两个权限

Peekaboo 明确写了需要:
• Screen Recording(才能截屏/抓窗口内容)
• Accessibility(才能读 UI 树并执行点击/输入等) 

这是 macOS 安全模型决定的:像素与交互是两套不同的敏感能力,系统分别授权。