Desktop Control 默认启用

Computer Use 桌面自动化 — get_app_stateclickset_value、键盘/指针操作。统一技能,用于所有 UI 自动化,根据目标在 CDP(浏览器 DOM)和 Computer Use(桌面应用)之间自动路由。

技能 ID: desktop-control
类型: 自动启用
平台: macOS
依赖: cli-jaw、Google Chrome
可选: cliclick (brew)
此技能始终注入到系统提示词中,无需手动加载。它取代了独立的 browservision-click 技能,将它们的功能整合到统一的路由系统中。

快速参考

执行路径

路径适用场景速度示例
CDP目标是 Web DOM(页面元素、表单、按钮)~120 ms/操作点击 naver.com 上的按钮
Computer Use桌面应用、Chrome 浏览器界面、系统对话框、快捷键~1200 ms/操作打开 Finder、按 Cmd+Tab
CDP + CUDOM 查找 + 像素点击(Canvas、iframe、WebGL)不固定点击没有 DOM 引用的地图标签

操作类别

类别契约描述示例
state-readCU-00 / TX-00读取当前 UI 状态get_app_state("Finder")snapshot --interactive
element-actionCU-01 / TX-01通过元素引用进行点击/交互click(element_index=730)click e3
value-injectionCU-02 / TX-02直接设置字段值set_value(element_index=12, value="text")
keyboard-actionCU-03按键或组合键press_key(key="super+Tab")
pointer-actionCU-04原始坐标点击click(x=812, y=514)
pointer-action+visionCU-05视觉引导的坐标点击视觉查找"播放按钮"然后 click(x,y)
stale-recoveryCU-06收到过期警告后重新读取过期时重新调用 get_app_state
secondary-actionCU-10无障碍辅助操作perform_secondary_action(el=44, action="AXShowMenu")
scroll-actionCU-11滚动可滚动元素scroll(element_index=9, direction="down")
drag-actionCU-12按坐标拖动drag(from_x=100, from_y=100, to_x=400, to_y=100)

意图路由

该技能在执行操作之前决定执行路径。每个任务的第一行必须声明 path=cdppath=computer-usepath=cdp+cu

决策表

目标用户意图示例路径操作类别
Web 页面 DOM"打开 naver.com 搜索 foo"CDPelement-action
Web 页面 DOM(读取)"这个页面的标题是什么?"CDPstate-read
桌面应用窗口"打开 Finder → 下载"CUelement-action
Chrome 浏览器界面(非 DOM)"切换到右边的标签页"CUelement-action
原生对话框输入"在 macOS 对话框中输入"CUvalue-injection
全局快捷键"按 Command-Tab"CUkeyboard-action
任意像素"点击 (812, 514)"CUpointer-action
Canvas / iframe / WebGL"点击播放按钮(无 DOM 引用)"CDP+CUpointer-action+vision
DOM 查找 + 指针点击"通过 DOM 找到按钮,用光标点击"CDP+CUelement-actionpointer-action

解析顺序

  1. 显式指定: 消息包含 $computer-use/computer-use → 立即使用 Computer Use 路径。如果工具不可用,停止并报告 precondition failed: computer-use unavailable
  2. 目标能否通过 cli-jaw browser snapshot --interactive 引用来定位? → CDP
  3. 非 DOM 的 Web 组件(Canvas、WebGL、iframe)在 get_app_state 截图中可见? → Computer Use click(x, y)
  4. 目标在任何网页之外(应用窗口、菜单栏、系统对话框)? → Computer Use
  5. 用户直接给出的像素坐标? → Computer Use pointer-action。
  6. 需要 DOM 来定位,但用户坚持使用真实光标点击? → 混合模式
  7. 应用名称不明确? → 先调用 list_apps(),再调用 get_app_state(app)
  8. 以上均不匹配 → 停止并报告 needs boss follow-up: ambiguous target
get_app_state(app) | 目标在截图中可见? |-- 是 + 在元素树中 --> element_index click |-- 是 + 不在树中 --> 立即 click(x, y) '-- 否 --> 滚动/缩放/搜索,然后重新读取

绝对规则

这些规则不可违反。违反任何一条都会导致错误的记录或浪费操作。

  1. 操作前声明路径。 每个任务的第一行必须是 path=cdppath=computer-usepath=cdp+cu
  2. 状态优先规则。 Computer Use 每次助手回合总是先调用 get_app_state(app) 再进行交互。在收到过期警告时、UI 发生变化的操作之后、以及置信度下降时都需要重新调用。
  3. 每个有意义的操作都要记录 action_class 类别包括:state-readelement-actionvalue-injectionkeyboard-actionpointer-actionpointer-action+vision
  4. 禁止静默回退。 如果所需路径不可用,停止并报告哪个前置条件失败。
  5. 禁止声称光标可见。 当前版本中光标覆盖层是尽力而为的。
  6. 不确定时,先截图。 禁止在不确定的情况下连续执行操作。如果连续两个操作产生了模糊的状态,下一次调用必须是 state-read。
猜测前必须截图(硬性规则): 如果你不是 100% 确定当前状态 — 哪个标签页处于焦点、点击是否成功、目标的 element_index 是什么 — 在执行任何下一步操作之前,先调用 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)按键或组合键:ReturnTabsuper+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                     # 输出可见文本
导航后引用 ID 会重置。 导航到新页面后务必重新获取快照。

CDP 操作类别映射

命令操作类别契约
snapshottextscreenshotstate-readTX-00
clicktype ... --submitelement-actionTX-01
type <ref> "value"(不提交)value-injectionTX-02
press Enter / press Escapekeyboard-action

前置条件

Computer Use 路径

CDP 路径

如果任何阻塞条件失败,报告 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 时,元素树已发生变化。请严格按照以下顺序操作:

  1. get_app_state(app) — 重新定位;记录目标的真实 element_index。
  2. 记录 action_class=stale-recoveryCU-06),附带一行说明(reason=disambiguation)。
  3. 使用最新的 element_index 重新执行目标操作。
  4. 操作完成后,再次调用 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 目标定位问题中的一种特定策略。它是旧版方案,通常已被从截图直接进行坐标点击所取代。

决策顺序

  1. cli-jaw browser snapshot --interactive 是否返回了引用? → CDP click
  2. Computer Use 可用且目标在截图中可见? → 直接使用 click(x, y) pointer-action(首选)。
  3. 没有引用且直接坐标不适用 → 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)
务必优先尝试基于引用的点击。 Vision-click 消耗 token 且增加延迟。如果无障碍树暴露了 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
速度对比: 每次 CDP 操作约 120 ms,每次 Computer Use 操作约 1200 ms。当目标是 Web DOM 时,CDP 快一个数量级。Web 内容务必优先使用 CDP。

常见故障与正确响应

症状正确报告
"我看不到光标"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-readTX-00通过 snapshot/text/screenshot 读取页面状态
CDP element-actionTX-01通过 DOM 引用点击/输入
CDP value-injectionTX-02设置字段值但不提交
CDP hybrid-lookupTX-03混合路径的 DOM 查找
CDP vision-lookupTX-04基于视觉的坐标查找(仅限 Codex)
CDP error-reportTX-05报告 CDP 错误
CU state-readCU-00get_app_state 截图 + 树
CU element-actionCU-01通过 element_index 点击
CU value-injectionCU-02set_value / type_text
CU keyboard-actionCU-03press_key 组合键
CU pointer-actionCU-04原始坐标点击
CU pointer-action+visionCU-05视觉引导的坐标点击
CU stale-recoveryCU-06过期警告后重新读取
CU precondition-failCU-07报告前置条件失败
CU confirmation-promptCU-08执行破坏性操作前确认
CU transcript-summaryCU-09操作后向上级汇报摘要
CU secondary-actionCU-10无障碍辅助操作
CU scroll-actionCU-11滚动可滚动元素
CU drag-actionCU-12按坐标拖动

"~해줘" 使用示例

触发 desktop-control 技能的自然韩语请求。路由系统能理解韩语和英语。

示例 1 — Web 自动化(CDP)

"네이버에서 '서울 날씨' 검색해줘"

路径:CDPnavigate 到 naver.com → snapshot --interactivetype 输入搜索框 → click 提交

示例 2 — 桌面应用(Computer Use)

"Finder에서 다운로드 폴더 열어줘"

路径:CUget_app_state("Finder") → 在下载文件夹上 click(element_index=N) → 通过 get_app_state 验证

示例 3 — Chrome 标签页切换(Computer Use)

"크롬 탭 Gmail로 전환해줘"

路径:CUget_app_state("Google Chrome") → 在无障碍树中找到 Gmail 标签页 → click(element_index=N)

示例 4 — 地图点击(混合模式)

"네이버 지도에서 '스타벅스' 라벨 클릭해줘"

路径:CDP+CUget_app_state 截图显示标签但不在元素树中 → 使用截图坐标 click(x=719, y=388) pointer-action

示例 5 — 系统设置(Computer Use)

"시스템 설정에서 다크 모드 켜줘"

路径:CUlist_apps()get_app_state("System Settings") → 导航到外观 → click 深色模式选项

规则:禁止事项

相关技能

技能关系
browserCDP 命令参考 — 此技能取代了其覆盖范围
screen-capture通用 macOS 截图/摄像头/录屏(不变,独立关注点)
vision-click不再自动启用;已作为策略被吸收。通过 cli-jaw skill install vision-click 安装可获取底层配方(NDJSON 解析、DPR 校正)