Desktop Control 默认启用
Computer Use 桌面自动化 — get_app_state、click、set_value、键盘/指针操作。统一技能,用于所有 UI 自动化,根据目标在 CDP(浏览器 DOM)和 Computer Use(桌面应用)之间自动路由。
browser 和 vision-click 技能,将它们的功能整合到统一的路由系统中。快速参考
执行路径
| 路径 | 适用场景 | 速度 | 示例 |
|---|---|---|---|
| CDP | 目标是 Web DOM(页面元素、表单、按钮) | ~120 ms/操作 | 点击 naver.com 上的按钮 |
| Computer Use | 桌面应用、Chrome 浏览器界面、系统对话框、快捷键 | ~1200 ms/操作 | 打开 Finder、按 Cmd+Tab |
| CDP + CU | DOM 查找 + 像素点击(Canvas、iframe、WebGL) | 不固定 | 点击没有 DOM 引用的地图标签 |
操作类别
| 类别 | 契约 | 描述 | 示例 |
|---|---|---|---|
state-read | CU-00 / TX-00 | 读取当前 UI 状态 | get_app_state("Finder")、snapshot --interactive |
element-action | CU-01 / TX-01 | 通过元素引用进行点击/交互 | click(element_index=730)、click e3 |
value-injection | CU-02 / TX-02 | 直接设置字段值 | set_value(element_index=12, value="text") |
keyboard-action | CU-03 | 按键或组合键 | press_key(key="super+Tab") |
pointer-action | CU-04 | 原始坐标点击 | click(x=812, y=514) |
pointer-action+vision | CU-05 | 视觉引导的坐标点击 | 视觉查找"播放按钮"然后 click(x,y) |
stale-recovery | CU-06 | 收到过期警告后重新读取 | 过期时重新调用 get_app_state |
secondary-action | CU-10 | 无障碍辅助操作 | perform_secondary_action(el=44, action="AXShowMenu") |
scroll-action | CU-11 | 滚动可滚动元素 | scroll(element_index=9, direction="down") |
drag-action | CU-12 | 按坐标拖动 | drag(from_x=100, from_y=100, to_x=400, to_y=100) |
意图路由
该技能在执行操作之前决定执行路径。每个任务的第一行必须声明 path=cdp、path=computer-use 或 path=cdp+cu。
决策表
| 目标 | 用户意图示例 | 路径 | 操作类别 |
|---|---|---|---|
| Web 页面 DOM | "打开 naver.com 搜索 foo" | CDP | element-action |
| Web 页面 DOM(读取) | "这个页面的标题是什么?" | CDP | state-read |
| 桌面应用窗口 | "打开 Finder → 下载" | CU | element-action |
| Chrome 浏览器界面(非 DOM) | "切换到右边的标签页" | CU | element-action |
| 原生对话框输入 | "在 macOS 对话框中输入" | CU | value-injection |
| 全局快捷键 | "按 Command-Tab" | CU | keyboard-action |
| 任意像素 | "点击 (812, 514)" | CU | pointer-action |
| Canvas / iframe / WebGL | "点击播放按钮(无 DOM 引用)" | CDP+CU | pointer-action+vision |
| DOM 查找 + 指针点击 | "通过 DOM 找到按钮,用光标点击" | CDP+CU | element-action → pointer-action |
解析顺序
- 显式指定: 消息包含
$computer-use或/computer-use→ 立即使用 Computer Use 路径。如果工具不可用,停止并报告precondition failed: computer-use unavailable。 - 目标能否通过
cli-jaw browser snapshot --interactive引用来定位? → CDP。 - 非 DOM 的 Web 组件(Canvas、WebGL、iframe)在
get_app_state截图中可见? → Computer Useclick(x, y)。 - 目标在任何网页之外(应用窗口、菜单栏、系统对话框)? → Computer Use。
- 用户直接给出的像素坐标? → Computer Use pointer-action。
- 需要 DOM 来定位,但用户坚持使用真实光标点击? → 混合模式。
- 应用名称不明确? → 先调用
list_apps(),再调用get_app_state(app)。 - 以上均不匹配 → 停止并报告
needs boss follow-up: ambiguous target。
绝对规则
这些规则不可违反。违反任何一条都会导致错误的记录或浪费操作。
- 操作前声明路径。 每个任务的第一行必须是
path=cdp、path=computer-use或path=cdp+cu。 - 状态优先规则。 Computer Use 每次助手回合总是先调用
get_app_state(app)再进行交互。在收到过期警告时、UI 发生变化的操作之后、以及置信度下降时都需要重新调用。 - 每个有意义的操作都要记录
action_class。 类别包括:state-read、element-action、value-injection、keyboard-action、pointer-action、pointer-action+vision。 - 禁止静默回退。 如果所需路径不可用,停止并报告哪个前置条件失败。
- 禁止声称光标可见。 当前版本中光标覆盖层是尽力而为的。
- 不确定时,先截图。 禁止在不确定的情况下连续执行操作。如果连续两个操作产生了模糊的状态,下一次调用必须是 state-read。
get_app_state(app)。猜测索引会导致无限纠错循环。多做一次状态读取总比一次错误点击要好。Computer Use 工具接口
Computer Use 路径通过活跃的运行时暴露以下工具:
| 工具 | 签名 | 用途 |
|---|---|---|
list_apps() | — | 当应用名称未知时,发现可用/最近的应用 |
get_app_state | (app) | 开始或刷新会话;返回截图 + 无障碍树 |
click | (app, element_index) 或 (app, x, y) | 通过元素引用或原始坐标点击 |
drag | (app, from_x, from_y, to_x, to_y) | 按坐标拖动 |
press_key | (app, key) | 按键或组合键:Return、Tab、super+c |
scroll | (app, element_index, direction, pages) | 滚动可滚动的无障碍元素 |
set_value | (app, element_index, value) | 设置可编辑无障碍元素的值 |
type_text | (app, text) | 向当前焦点输入文本(先验证焦点!) |
perform_secondary_action | (app, element_index, action) | 调用无障碍辅助操作 |
set_value 而非 type_text。 type_text(app, text) 会向当前焦点元素发送按键事件 — 除非最新状态证明光标在目标字段中,否则不可靠。set_value(app, element_index, value) 针对特定元素 — 确定性强且可靠。CDP 路径 — cli-jaw browser
适用于所有可通过 Chrome DOM 定位的内容:页面文本、表单字段、页面内的按钮。处理 Web 内容时比 Computer Use 快 10 倍。
会话命令
cli-jaw browser status # 会话是否活跃?
cli-jaw browser start --agent # 无头自动化会话
cli-jaw browser start --headless # 手动无头模式(WSL/CI/Docker)
cli-jaw browser start # 可见窗口(仅在用户要求时使用)
cli-jaw browser navigate "https://example.com" # 导航到 URL
cli-jaw browser open "https://example.com" # 在新标签页中打开
cli-jaw browser tabs # 列出标签页
快照 + 操作
cli-jaw browser snapshot --interactive # 列出可点击元素(e1、e2、...)
cli-jaw browser click e3 # 通过引用点击
cli-jaw browser type e5 "query" --submit # 输入 + 回车
cli-jaw browser press Enter # 备用按键
cli-jaw browser screenshot # 保存 PNG 截图
cli-jaw browser text # 输出可见文本
CDP 操作类别映射
| 命令 | 操作类别 | 契约 |
|---|---|---|
snapshot、text、screenshot | state-read | TX-00 |
click、type ... --submit | element-action | TX-01 |
type <ref> "value"(不提交) | value-injection | TX-02 |
press Enter / press Escape | keyboard-action | — |
前置条件
Computer Use 路径
- 平台: 仅限 macOS。
- 活跃的代理运行时必须暴露所有 Computer Use 工具(
list_apps、get_app_state、click、drag、press_key、scroll、set_value、type_text、perform_secondary_action)。 - TCC 无障碍权限和 AppleEvents 必须授予控制应用。
- 在打包安装中,可能需要
/Applications/Jaw.app和/Applications/Codex Computer Use.app用于 TCC 归属。 - 如果应用名称未知,先调用
list_apps()。
CDP 路径
cli-jaw serve必须正在运行(通过cli-jaw browser status检查)。- 浏览器会话必须处于活跃状态(通过
cli-jaw browser start --agent启动)。
precondition failed: <name> 并停止。禁止静默切换路径。记录格式
每个操作都会记录在结构化记录中。上级会解析这些记录 — 请勿省略 path= 行。
CDP 记录
path=cdp
url=https://example.com
action=click e3
result=ok
Computer Use 记录
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=730)
stale_warning=no
result=ok
混合模式记录
path=cdp+cu
lookup=cli-jaw browser snapshot -> bbox of "Play"
action_class=pointer-action
action=click(x=812, y=514)
result=ok
错误记录
path=computer-use
app=Finder
action_class=element-action
action=click(element_index=34)
stale_warning=yes
result=error: stale element tree
过期恢复模式
当返回 stale_warning=yes 时,元素树已发生变化。请严格按照以下顺序操作:
get_app_state(app)— 重新定位;记录目标的真实 element_index。- 记录
action_class=stale-recovery(CU-06),附带一行说明(reason=disambiguation)。 - 使用最新的 element_index 重新执行目标操作。
- 操作完成后,再次调用
get_app_state(app)确认效果。
# 收到过期警告
path=computer-use
app=Google Chrome
action_class=stale-recovery
action=get_app_state("Google Chrome")
stale_warning=no
result=ok (52 elements -- tree changed)
# 使用新索引重试
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=38) # 同一目标,新索引
stale_warning=no
result=ok
Vision-Click 集成
Vision-click 是更广泛的 UI 目标定位问题中的一种特定策略。它是旧版方案,通常已被从截图直接进行坐标点击所取代。
决策顺序
cli-jaw browser snapshot --interactive是否返回了引用? → CDPclick。- Computer Use 可用且目标在截图中可见? → 直接使用
click(x, y)pointer-action(首选)。 - 没有引用且直接坐标不适用 →
cli-jaw browser vision-click(仅限 Codex,旧版)。
# CDP vision-click(在 Chrome 内,仅限 Codex)
cli-jaw browser vision-click "Submit button"
cli-jaw browser vision-click "Play button" --double
# 桌面 vision-click(CU-05)
# 1. get_app_state(app) 获取截图
# 2. 视觉模型识别坐标
# 3. 通过 Computer Use 执行 click(x=vx, y=vy)
element_index,请使用它。完整示例:Chrome → Spotify 跟踪记录
一个真实的端到端跟踪记录,展示了状态优先、元素定位、过期恢复和 CDP 速度切换。
1. 状态优先
path=computer-use
app=Google Chrome
action_class=state-read
action=get_app_state("Google Chrome")
stale_warning=no
result=ok (47 elements, focused tab: open.spotify.com)
2. 元素索引定位(非仅焦点输入)
# 点击搜索输入框
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=12)
stale_warning=no
result=ok
# 确定性地设置搜索值
path=computer-use
app=Google Chrome
action_class=value-injection
action=set_value(element_index=12, value="Daft Punk")
stale_warning=no
result=ok
3. 过期警告 → 恢复
# 搜索结果异步加载 -- 元素树变化
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=34)
stale_warning=yes
result=error: stale element tree
# 正确的恢复方式
path=computer-use
app=Google Chrome
action_class=stale-recovery
action=get_app_state("Google Chrome")
result=ok (52 elements -- tree changed)
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=38) # 同一结果,新索引
stale_warning=no
result=ok
4. 切换到 CDP 获得 10 倍速度
# 发现所有目标都是 DOM 节点 -- 切换到 CDP
path=cdp
url=https://open.spotify.com
action=cli-jaw browser snapshot --interactive
result=ok (ref IDs: e1..e89)
path=cdp
url=https://open.spotify.com
action=click e42 # "Shuffle Play" 按钮
result=ok
常见故障与正确响应
| 症状 | 正确报告 |
|---|---|
| "我看不到光标" | cursor overlay is best-effort in the current build -- action=click(...) succeeded; visible cursor not guaranteed |
| CDP 服务器未运行 | precondition failed: cli-jaw serve not running. Start with 'jaw serve' and retry. |
| Computer Use 工具缺失 | precondition failed: computer-use unavailable |
| cli-jaw CU 应用缺失(打包安装) | precondition failed: /Applications/Codex Computer Use.app missing. Recover: jaw doctor --tcc --fix |
| 操作时收到过期警告 | 重新调用 get_app_state(app) 然后重试;记录 stale_warning=yes |
| 未找到目标引用 | 如果在截图中可见,使用 Computer Use click(x, y)。否则报告缺失。 |
| 快照与点击之间发生导航偏移 | 重新获取快照并重试一次;如果仍然不对,报告问题。 |
| CDP 会话在任务中途终止 | precondition failed: cdp session terminated |
| 视觉模型返回"无匹配" | vision lookup failed for "<query>" -- suggest a more specific description |
| 非 GUI 任务被路由到此处 | needs boss follow-up: not GUI automation |
契约 ID 参考
所有路由都映射到内部 Computer Use 规范中定义的能力契约。在记录中需要契约名称时使用这些 ID。
| 路径 | 契约 | 描述 |
|---|---|---|
| CDP state-read | TX-00 | 通过 snapshot/text/screenshot 读取页面状态 |
| CDP element-action | TX-01 | 通过 DOM 引用点击/输入 |
| CDP value-injection | TX-02 | 设置字段值但不提交 |
| CDP hybrid-lookup | TX-03 | 混合路径的 DOM 查找 |
| CDP vision-lookup | TX-04 | 基于视觉的坐标查找(仅限 Codex) |
| CDP error-report | TX-05 | 报告 CDP 错误 |
| CU state-read | CU-00 | get_app_state 截图 + 树 |
| CU element-action | CU-01 | 通过 element_index 点击 |
| CU value-injection | CU-02 | set_value / type_text |
| CU keyboard-action | CU-03 | press_key 组合键 |
| CU pointer-action | CU-04 | 原始坐标点击 |
| CU pointer-action+vision | CU-05 | 视觉引导的坐标点击 |
| CU stale-recovery | CU-06 | 过期警告后重新读取 |
| CU precondition-fail | CU-07 | 报告前置条件失败 |
| CU confirmation-prompt | CU-08 | 执行破坏性操作前确认 |
| CU transcript-summary | CU-09 | 操作后向上级汇报摘要 |
| CU secondary-action | CU-10 | 无障碍辅助操作 |
| CU scroll-action | CU-11 | 滚动可滚动元素 |
| CU drag-action | CU-12 | 按坐标拖动 |
"~해줘" 使用示例
触发 desktop-control 技能的自然韩语请求。路由系统能理解韩语和英语。
"네이버에서 '서울 날씨' 검색해줘"
路径:CDP → navigate 到 naver.com → snapshot --interactive → type 输入搜索框 → click 提交
"Finder에서 다운로드 폴더 열어줘"
路径:CU → get_app_state("Finder") → 在下载文件夹上 click(element_index=N) → 通过 get_app_state 验证
"크롬 탭 Gmail로 전환해줘"
路径:CU → get_app_state("Google Chrome") → 在无障碍树中找到 Gmail 标签页 → click(element_index=N)
"네이버 지도에서 '스타벅스' 라벨 클릭해줘"
路径:CDP+CU → get_app_state 截图显示标签但不在元素树中 → 使用截图坐标 click(x=719, y=388) pointer-action
"시스템 설정에서 다크 모드 켜줘"
路径:CU → list_apps() → get_app_state("System Settings") → 导航到外观 → click 深色模式选项
规则:禁止事项
- 不要"以防万一"尝试错误的路径 — 这会浪费 TCC 提示并扰乱日志。
- 不要在未更新操作类别的情况下静默从
state-read升级到element-action。 - 不要省略
path=行。上级会解析它。 - 不要使用
curl/wget来"读取页面" — 务必使用 CDP。 - 不要仅仅为了查看日志而打开可见浏览器窗口 — 使用 Web UI 调试控制台。
- 不要在引用存在时使用坐标点击 — 使用引用。
- 不要假设光标可见。只报告操作的成功/失败。
- 不要因为"记得按钮在哪里"就跳过
get_app_state。元素索引在每次状态变化后都会漂移。 - 不要在两次 Computer Use 操作之间不重新读取状态,如果前一次操作改变了任何内容。
- 不要通过试错来解决不确定性。"让我点击 342,如果不行再试 357"是被禁止的 — 先截图。
- 不要将
type_text(app, text)作为定向表单输入的快捷方式,除非在最新状态中已验证焦点。 - 不要用不同措辞重试 vision-click — 每次调用只尝试一次;失败时报告并停止。
相关技能
| 技能 | 关系 |
|---|---|
browser | CDP 命令参考 — 此技能取代了其覆盖范围 |
screen-capture | 通用 macOS 截图/摄像头/录屏(不变,独立关注点) |
vision-click | 不再自动启用;已作为策略被吸收。通过 cli-jaw skill install vision-click 安装可获取底层配方(NDJSON 解析、DPR 校正) |