DjangoAILab/dsh-plugins--plugins-manual-dsh-computer-use ↗★ 1
dsh-computer-use
DSH 视觉整机控制插件(P2):经 macOS Accessibility API(AXUIElement)把本机 GUI app 变成 AX 快照优先的元素级工具集(观察 4 + 窗口管理 1 + 动作 6 + 截图兜底 1,共 12 个 computer_* 工具);v0.2.0 窗口对象化:windowId 不透明句柄(WindowRegistry + tombstone + CG 截图绑定)+ 输入后端分层(mode/delivery,Tier 1 pid 定向预留);Swift 辅助进程零 npm 依赖;敏感动作可选人工审批(默认关)。 适合在 macOS 上自动化操作图形应用的用户,需辅助功能权限。
같은 패키지 이름의 다른 저장소
설치
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:DjangoAILab/dsh-plugins#18ae7e5df085d28e7a573d1e3ef0286bda1ea793&path:plugins/manual/dsh-computer-use用 v0.1.1 的包重装(clean break 的回滚 = 整包回退,无配置兼容层)
dsh plugin remove dsh-computer-use && dsh plugin add # 之后重启 DSH
或 `git` 回退本目录至 v0.1.1 提交后按 v0.1.1 流程重装。编译产物
`driver/axdriver` 删掉即触发重编译(v0.1.1 源码对应产物)。
### 迁移注意(breaking changes)
- `computer_snapshot/click/type` 的 `pid`+`windowIndex` 参数**已删除**:先 `computer_windows`
换 windowId,无 fallback。
- `computer_windows` 返回项从 `ref: w` 变为 `windowId`;`w` 序号寻址不复存在。
- `computer_screenshot` window 模式的 `pid`/`windowIndex` 已删除,必须 `windowId`。
- click/type 的 `ref` 现在**必须**携带 `windowId`(路径相对该窗口根,跨窗 ref 无效)。
- 输入工具输出新增 `mode`/`delivery` 字段;`mode: "ax"/"coordinate"/"ax-set"/"unicode-inject"`
旧值全部废弃。
- driver 协议新增 op(`windowAction`/`resolveCapture`)、错误信封字段(`code/retryable/recovery`)、
`ping` 返回 `nonce`;旧 Node 配新 driver(或反之)不保证兼容——整包升级。
## v0.1.x 历史(v0.1.0 功能基线 + v0.1.1 修复;v0.2.0 起部分描述已被上节取代)
新增 `plugins/manual/dsh-computer-use`。阶段③交付**全部 11 个工具**:
新增 `plugins/manual/dsh-computer-use`。阶段③交付**全部 11 个工具**:
**观察(阶段①)**:
- `computer_doctor` — Swift driver 现场编译 + macOS 辅助功能授权探针(`AXIsProcessTrusted()` 实测,
不猜)。授权缺席给精确指引(系统设置路径 + 责任进程说明 + TCC 缓存坑),绝不半残运行。
- `computer_list_apps` — 运行中的 GUI app(pid/名称/bundleId/前台/AX 窗口计数;`axWin=null` 即该 app
AX 树暂不可读的信号)。
- `computer_windows` — 某 app 的可读窗口列表(ref `w` / 标题 / frame / 最小化)。
- `computer_snapshot` — 窗口 AX 树快照:元素带稳定 ref(`@w0/1/2` 路径)、role/title/value/可执行动作
(`[AXPress]` 等),是动作工具的寻址来源;`maxDepth`/`maxNodes` 双封顶防失控树。
**动作(阶段②,全部敏感动作可选审批,默认关)**:
- `computer_click` — ref(AXPress 语义动作)优先,x/y 坐标兜底(CGEvent)。
- `computer_type` — ref 元素直接 set value(整段替换,AXTextArea/AXTextField 可写时最准);
省略 ref 则向焦点元素按字符注入(unicode 事件)。
- `computer_key` — 组合键(`return` / `cmd+shift+t` / `ctrl+a`…),CGEvent 注入前台 app。
**严格解析(2026-08-31 起)**:键名在 JS 侧 `parseKeyCombo` 解析成结构化 `plan`(keyCode +
原始 CGEventFlags)下发给 driver 哑执行;未知键名/双主键/未知修饰键一律报错(错误信息附
支持键名表),**绝不退化为把键名当文本注入**。带修饰键必须查键名表(字母/数字/标点全表,
`plus`=0x18+shift、`minus`=0x1B 别名);无修饰键的裸单字符走 unicode 注入(键盘布局无关,
大小写保留)。JS 表与 Swift `KEY_CODES` 镜像,改动必须两侧同步。
- `computer_scroll` — 滚轮滚动(dy 正=上负=下,可带 dx 与位置)。
- `computer_menu` — 菜单栏路径点击(`["文件","新建"]`),自动先 activate(menu bar 只对前台 app 可读)。
- `computer_app` — launch(按 bundleId)/ activate / quit(优雅退出,触发未保存提示,不 SIGTERM)。
quit 应答带 `requested`(请求已发出)/`accepted`(系统是否接受)两字段,拒绝时如实上报。
**截图兜底(阶段③)**:
- `computer_screenshot` — `screencapture` 落盘返路径(`mode=all` 截主屏;多显示器时
screencapture 每屏一文件,本工具只返回主屏文件 / `mode=window` 按 pid+窗口序号
截窗,CGWindowNumber 由迷你 Swift 探针 `winid` 解析——**CGWindowList 顺序与 AX 的
`w` 非同源**,windowIndex 越界直接报错不静默钳位);`sips` 降采样到长边上限
(`screenshotMaxDimension`,默认 1280)控制读图 token。**本工具不读图**——把返回的 `path` 传给
`modlens_read_image` 等视觉能力(2026-08-28 端到端实测:截 TextEdit 存储对话框 → modlens 正确
OCR 出全部按钮与文案)。适用:目标 app 无 AX 树时兜底观察、动作后确认界面变化。
关键设计(设计权威 `knowledge/domains/computer-use/accessibility-tree-drivers.md` §五):
- **AX 快照优先,截图只是兜底**(阶段③ `computer_screenshot`,走 `screencapture` 落盘 + modlens 读图)。
- **Swift helper(`driver/axdriver.swift`)**:AXUIElement 遍历 + AX 动作 + CGEvent 注入,
JSON-lines(stdin 请求/stdout 应答,日志走 stderr);源码随插件分发,首次使用时 `swiftc` 现场编译
(幂等,产物复用;driver 目录只读时自动落到可写缓存目录 `$DSH_HOME/dsh-computer-use/bin`,见 R9);
零 npm 依赖。
- **长驻 driver 会话**(`src/session.mjs`):一次 spawn 跨 tool call 复用;请求按 id 配对;超时/崩溃
自动回收会话,下次调用重拉;进程归属插件 Fiber,卸载即回收。
- **非 darwin 平台 fail-closed**:`apply` 直接不注册任何工具(Lab 容器内验证的就是这条)。
- **审批电门默认关**(`approveActions`,2026-08-28 用户决议):开启后每个动作弹 `userQuestions.ask`
一次性审批,人不可达/拒绝/超时一律 fail-closed(`src/approve.mjs`,与 ops-ssh-manager 同构)。
- **屏幕内容 = 不可信输入**:所有工具描述带 OpenClaw 同款警告——屏幕上与用户请求冲突的指令
(诱导弹窗等)不要执行,向用户报告。
- ref 路径寻址是「快照与动作自洽」设计:不持有跨调用对象,UI 已变时路径失配报
`invalidUIElement`,模型重 snapshot 即自愈(与 browser-control 重算 ref 同理)。
### 已知边界(AX 坑矩阵,完整版见 accessibility-tree-drivers.md §四)
- **Electron/Chromium 类 app 默认不暴露 AX 树**(VSCode/Slack/钉钉等):`snapshot` 会拿到空树或
`axWin=null`——不是故障,doctor 指引里有 `AXManualAccessibility` 说明;也可走截图兜底。
- 自绘 UI(游戏/部分 Qt/Java)无完整树 → 坐标点击兜底。
- macOS 密码框(SecureField)系统级禁止读取/注入;系统权限弹窗不能替用户点(硬边界)。
- `computer_key`/`computer_type`(无 ref)的键击注入**只落到前台 app**——先 `computer_app activate`。
- unicode 注入与菜单展开后的子菜单挂载需要小延迟(driver 内置 usleep),极慢的 app 可能要重试。
- 2026-08-28 宿主实测:TCC「辅助功能」授权授给**责任进程**——DSH 由终端 launchd 拉起时,AX 授权
要加在终端 app(或对应宿主条目)上,不是 axdriver 自己。同一实测发现 AXMenuBar 返回
**单个元素**而非数组(与 AXWindows 不同),`as? [AXUIElement]` 静默失败——已按单元素处理。
## 怎么生效
1. **macOS 14+,装 Xcode Command Line Tools**(`swiftc` 在 `/usr/bin/swiftc`)。
2. 隔离验证统一走 dsh-lab(强约束,AGENTS.md §八):
```bash
knowledge/runbooks/dsh-plugin-development/dsh-lab install dsh-computer-use
knowledge/runbooks/dsh-plugin-development/dsh-lab verify dsh-computer-use
(Lab 是 Linux 容器,验证的是安装/加载/fail-closed 链;AX 能力只能在宿主 macOS 实测。)
3. 安装到目标 macOS profile 后做模型侧闭环:computer_doctor(首次)→ computer_list_apps → computer_snapshot
→ computer_click/computer_type/computer_menu…。授权缺失时按 doctor 指引到
「系统设置 → 隐私与安全性 → 辅助功能」把 DSH 责任进程加进去。
怎么回滚
dsh plugin remove dsh-computer-use # 之后重启 DSH
dsh-lab 验证阶段:dsh-lab reset --yes 丢弃 Lab 状态即可,本机 profile 不受影响。
driver 编译产物在 driver/axdriver(v0.1.x 时代另有 winid 探针产物 driver/winid、
driver/winid.swift,v0.2.0 起已不再生成;残留文件可删),均 git 忽略,不入 tarball,
删掉即触发下次重新编译;
只读安装场景下这些产物在缓存目录 $DSH_HOME/dsh-computer-use/bin(R9),一并删除即可。
修复记录(v0.1.1,2026-08-31,两轮:round-1 内部复审 + round-2 独立 QA 复审)
改动覆盖 Swift driver / Node 会话层 / 工具输出契约 / 编译与打包护栏 / 测试防线。 每条含:改了什么 / 怎么生效 / 怎么回滚(整体回滚 = 回退本目录至上一提交)。 措辞约束:只描述已验证的行为边界,不做「全量/彻底修复」式断言。
A. driver/axdriver.swift
- A1 KEY_CODES 补全 ANSI 全表(字母/数字/标点)| 组合键主键不再只能靠单字符回退 |
回退:git checkout 旧源码 + 删
driver/axdriver产物。 - A2 键击重构为 plan 协议:JS 解析 →
args.plan {unicode|keyCode, flags, tapDelayMs}哑执行; legacy combo 严格化(未知键名 ERROR、双主键 ERROR,不再当文本注入);plus=0x18+shift、minus=0x1B | 拼错的cmd+retrun现在报错而不是乱打字 | 回滚同上。 - A3
postUnicodeString按 UTF-16 code unit 迭代(每事件 ≤20 单元)| emoji/扩展 CJK 代理对不再被 unicodeScalars 拆坏 | 回滚同上。 - A4
click/type的 AX 窗口解析只在 ref 分支 | 坐标点击/焦点注入对零 AX 窗口 app (Electron 兜底)可用 | 回滚同上。 - A5 ref 严格解析(
parseRefPath:每段非负整数、拒绝空段)| 畸形 ref 报 「ref 格式非法」而不是静默丢段点错元素 | 回滚同上。 - A6 scroll 的 dx/dy 用
Int32(exactly:)+ x/y 有限性检查 | 超界报错不截断不 trap | 回滚同上。 - A7 quit 检查
terminate()返回值(round-2 R5 拆分requested/accepted两字段)| 系统拒绝退出时accepted:false如实上报,不假装成功 | 回滚同上。 - A8 doctor 上报
screenCapture: CGPreflightScreenCaptureAccess()| 屏幕录制授权实测 | 回滚同上。 - A9 删 snapshotWindow 里读
AXFocused为 String 的死代码 | 无行为变化 | 回滚同上。 - A10
swiftc -O编译零告警通过。
B. src/session.mjs
- B1 stdin 挂
error处理器 | driver 死后继续写的 EPIPE 路由进 pending reject, 不再以 unhandled error 带崩 DSH 宿主 | 回滚:git checkout。 - B2
stdin.write带回调 + 返回 false 时等drain再发下一条(闸门带超时)| 大载荷不 在用户侧内存无限积压;driver 不读 stdin 时按超时失败不挂死 | 回滚同上。 - B3 exit 处理器只在
sessions.get(binary) === entry时删除 | 超时换新会话后旧进程 迟到退出不误删新会话 | 回滚同上。 - B4 kill 升级:SIGTERM 后 1500ms 仍存活 → SIGKILL | 超时回收路径上忽略 SIGTERM 的卡死 driver 被升级强杀;round-2 R6 修复 closeAll 路径清除定时器的泄漏后,两条关闭路径均有 此保证 | 回滚同上。
- B5
call()支持options.signal(AbortSignal)|computer_key已接入exec?.signal(可选,老调用面不变)| 回滚同上。
C. src/tools.mjs + doctor.mjs + screenshot.mjs + package.json
- C1
computer_doctor:probe 失败(spawn/超时/错误应答)如实返回driverReady:false+ driver 故障 reason(不误报 TCC);frontApp条件性存在;screenCapture透传并渲染 trusted/untrusted/unknown + 屏幕录制指引 | 模型拿到真实故障原因可自愈 | 回滚:git checkout。 - C2
computer_list_apps:schema 增hidden;null bundleId/axWindows 在 JS 边界删键 | 输出稳定过 schema 校验(不用 oneOf-null)| 回滚同上。 - C3
computer_snapshot:输出精确 shape{pid,windowIndex,windowCount,nodeCount, truncatedNodes?,lines[]},lines进 schema,删除_lines私有约定 | run_code 可无损 消费,渲染只读value.lines| 回滚同上。 - C4
computer_windowshint 条件 spread | 无 hint 时不再有 undefined 占位 | 回滚同上。 - C5
parseKeyCombo导出(JS 侧严格解析 + plan 下发 + 未知键名报错附支持表);exec?.signal可选接入 | 见 A2 与 B5 | 回滚同上。 - C6 全工具 undefined 扫描 + 文件头输出契约注释(可选字段条件存在、null 边界归一化)| run_code 无损 JSON 保证 | 回滚同上。
- C7
computer_screenshot描述插值修复(长边 1280曾拼接断掉)| 模型看到真实默认值 | 回滚同上。 - C8
ensureDriverCompiled:错误信息带 swiftc stderr 末 400 字符(原误报log.name); 单飞(并发共享一次编译);source/binary mtime 对比;临时名 +renameSync原子落位。 winid 探针同款处理 | 并发不再重复编译、编译失败可诊断、中断不留半个二进制 | 回滚同上。 - C9
resolveWindowId越界抛错(不静默钳位);captureTo失败清理半截文件;截图目录0o700;描述改为「主屏文件;CGWindowList 与 AX w 非同源」| 截错窗口/权限过宽/ 坏 PNG 下游三类问题关死 | 回滚同上。 - C10 版本 0.1.1;devDependencies 钉住
@deepseek-ai/dsh-tools@0.1.1-rc.2、@deepseek-ai/cordis@4.0.1(测试用validateJsonSchemaValue);node_modules由仓库 根.gitignore覆盖 | 回滚:git checkout package.json + 删 node_modules。
D. 测试防线(npm test 全绿:87 用例,含 round-2 与 QA 复审新增)
test/tools-schema.test.mjs(新):register-capture harness + stub driver(含历史上 出问题的应答形状),对每个工具 execute() 结果跑validateJsonSchemaValue+ 无损 JSON (undefined 树遍历)检查。test/key-combo.test.mjs(新):parseKeyCombo 全分支(正确解析/拼写错报错/plus 别名/ 裸字符 unicode 路径/双主键报错;round-2 增裸"+"、cmd++、F4 键名表两侧一致性比对)。test/session.test.mjs:增 EPIPE、SIGTERM 忽略→SIGKILL 升级 + 迟到退出保护、写背压、 畸形应答行/未知 id 忽略;round-2 增 closeAll 后 SIGKILL 升级(F6)、drain 闸门超时判死 会话与闸门响应 abort(F11),并移除兜底process.exit(0)(以node --test自然退出为验收)。test/doctor.test.mjs:增编译错误 stderr 上浮、单飞计数断言、mtime 重编译三组用例。test/screenshot.test.mjs:round-2 增 winid 只读回退编译(stub swiftc)、源码内容刷新 触发重编译、assertWindowIdStableTOCTOU 校验、降采样失败删文件四组用例。
R. round-2(2026-08-31 独立 QA 复审修复)
- R1
postUnicodeString批次切分收敛为纯函数utf16Batches:每事件 ≤20 UTF-16 单元,且 批次边界绝不落在代理对中间(高代理挪到下一批;退化输入扩容装下整对)| emoji/扩展 CJK 在批次边界不再被拆坏 | 回滚:git checkout。 - R2
click/type的 ref 分支收紧:只要提供了args.ref(任意字符串)就走严格校验 (@开头 + 每段非负整数 + 无空段),畸形 ref(0/1、@0//1、@-1、@foo)一律报 「ref 格式非法 + 重新 computer_snapshot」,绝不静默落回坐标点击/焦点键入;仅 ref 完全 缺席才走无 ref 路径 | 回滚同上。 - R3
parseKeyCombo支持裸"+"(unicode 文本注入)与cmd++(plus 别名 0x18+shift);+a/a++b/++等多余空段报可读错误 | 回滚同上。 - R4 键名表防漂移:测试期解析
driver/axdriver.swift的KEY_CODES字典,与 JSKEY_NAMES逐项比对(键名集合 + 键码 + plus/minus 别名全一致)| 两侧漂移直接红 | 回滚同上。 - R5 quit 应答拆分:
requested:true(请求已发出)/accepted(terminate()返回值), 工具层透传并在渲染中如实显示「系统拒绝退出请求」 | 回滚同上。 - R6
closeAll不再清除 kill 升级定时器(定时器 unref 不挂事件循环;进程自然退出时仍由 exit 处理器清理)| 忽略 SIGTERM 的卡死 driver 在显式关闭(含插件卸载全关)后仍在宽限期 后被 SIGKILL,不再泄漏进程 | 回滚同上。 - R7 测试去掉兜底
process.exit(0):会话、升级定时器(unref)、子进程 stdio 句柄全部可 回收,node --test自然退出 | 回滚同上。 - R8 打包修复:
driver/.npmignore排除axdriver/winid/winid.swift/*.tmp-*,.gitignore同步覆盖 |npm pack只带 Swift 源码不带编译产物(arm64 二进制不跨机分发;winid/winid.swift是运行时生成物);已用npm pack --dry-run验证 tarball 无二进制 | 回滚:git checkout package.json + 删 driver/.npmignore。 - R9 只读安装目录编译回退:driver 目录不可写(写探测文件实测)时,
axdriver编译落到可写 缓存目录cacheBinDir(默认$DSH_HOME/dsh-computer-use/bin,mtime 判旧 + 原子落位 + 单飞流程不变);运行时生成的winid/winid.swift同样整体回退,且源码内容与当前常量 不同会自动重写并重编译(升级自愈);所有工具调用与 doctor 探测改用ensureDriverCompiled/listWindowIds返回的实际二进制路径,不再假设 driverDir | 回滚同上。 - R10
computer_screenshot(window 模式)TOCTOU 防线:审批前解析 windowId 作基线,审批 通过后 capture 前重解析并比对 id——窗口已关闭或 CGWindowNumber 被系统重排即报错让模型 重新列窗口,绝不照旧 id 盲截(重解析与 capture 间隙最小化) | 回滚同上。 - R11
call()的 drain 闸门与请求定时器共享同一总预算(进 call 时统一 deadline);闸门 等待响应 AbortSignal(中止立刻拒绝且不写);闸门超时判死会话(killEntry)| driver 永不 读 stdin 时不留连环超时 | 回滚同上。 - R12 截图卫生:已存在的截图目录补 chmod 0700(mkdir recursive 不改已存在目录);截图 成功后文件 chmod 0600(均 best-effort);sips 降采样失败时删除落盘文件再报错(不把未按 预算降采样的屏幕原图留在磁盘) | 回滚同上。
- R13
package-lock.json重新生成:root version 0.1.1,devDependencies 与 package.json 逐字一致(精确版本,无 carets) | 回滚同上。 - R14 本 README 措辞收敛(不做「全量修复」式断言,B4 表述按 R6 后的真实边界改写)并补记 R8/R9 | 回滚同上。
QA 复审轮(2026-08-31,独立 QA 第二轮复审后的收尾修复)
- QA-1
isDirWritable写探测安全化:旧实现用固定名探测文件且先 unlink 再创建——目录里 恰有同名文件时会被删除(QA 用 sentinel 实证,数据丢失级)。改为随机后缀 +openSync 'wx'独占创建:绝不 pre-delete 任何既有文件,只清理本次成功创建的探测文件;补 sentinel 保留与 并发不碰撞测试 | 回滚:还原 config.mjs 的 isDirWritable 与对应测试。 - QA-2 编译缓存回退的二次可写探测:mkdir 对「已存在的只读目录」成功且不报错,随后写
winid.swift / rename 二进制会抛裸 EACCES。listWindowIds 与 ensureDriverCompiled 在选定
缓存目录后都补
isDirWritable复查,失败转成带路径与 config.driverDir/cacheBinDir 处置 指引的可读错误;补只读缓存用例 | 回滚:还原 screenshot.mjs/doctor.mjs 对应分支与测试。 - QA-3
downscale的 statSync 失败分支同样清理落盘文件(此前只覆盖 sips 失败分支) | 回滚:还原 screenshot.mjs。 - QA-4 F4 键表一致性测试的数量断言从弱
>40升级为>=70护栏(两侧键集合 deepEqual 已 保证同步;护栏防正则漏解析整表) | 回滚:还原 test/key-combo.test.mjs。 - QA-5(终轮)
listWindowIds缓存回退顺序修正:先mkdirSync再isDirWritable复查—— 首次运行时缓存目录尚不存在,先探测会误报「不可写」(QA 终轮实测阻断项);mkdir 失败错误补齐与「不可写」同款的处置指引;补「缓存目录不存在 → 自动创建并编译成功」回归测试 | 回滚:还原 screenshot.mjs 的 listWindowIds 开头与对应测试。
状态
v0.2.0 窗口对象化 + 输入后端分层(2026-08-31:ADR-1..ADR-4 的 Phases A-D 交付;
QA round 1 修复 FIX-1..FIX-8 后 npm test 全绿 101 用例、swiftc -O 零告警、
npm pack tarball 不含编译产物)。
Tier 1(pid-cgevent)未实现,spike 门控;已知边界见上与坑矩阵。
QA round 1(2026-08-31,独立 QA 对 v0.2.0 的 5 项 release-blocking + 3 项 P2 修复)
- FIX-1 type 的 inputMode 透传 + set 失败 fallback 纪律:
inputMode随 click/type/key/scroll op 全量透传 driver;driver type ref 分支 set 失败时 cannotComplete/invalidUIElement 绝不 落全局注入(WINDOW_TRANSIENT/WINDOW_GONE)、cursorless 报INPUT_UNSUPPORTED、auto/global 须过前台纪律才允许聚焦注入;fallback 应答如实标注global-cgevent/posted-unverified。 - FIX-2 截图绑定 title 纪律:AX title 非空且 CG 候选有可用窗名时必须精确一致,同尺寸不同题 绝不 frame 拍绑;全部候选窗名合法为空才允许 frame-only 唯一匹配。
- FIX-3 动作期 AX 错误统一映射
mapWindowAXError:invalidUIElement → tombstone + WINDOW_GONE、 cannotComplete → WINDOW_TRANSIENT(不 tombstone)、unsupported → WINDOW_ACTION_UNSUPPORTED / INPUT_UNSUPPORTED(句柄保留);windowAction/click(ref)/type(ref) 全部走该映射。 - FIX-4 activate 如实上报:activateApp Bool 校验 + AXRaise/激活后有界等待(~300ms 轮询)读回
frontmost,未到位报
ACTIVATE_FAILED(retryable:true),不假装 ok。 - FIX-5 tombstone TTL 在 bury() 与 resolveWindowEntry 的 tombstone 查找处都强制(不再只在 listWindows 清理);过期句柄报 WINDOW_UNKNOWN。
- FIX-6 doctor 新增
postEventAccess(CGPreflightPostEventAccess,条件性字段 + 渲染行); CGEvent 创建失败映射INPUT_POST_ACCESS_DENIED(权限缺席)vsINPUT_POST_FAILED。 - FIX-7 测试改用当前工作树源码现场编译的 driver(test/helpers/driver-build.mjs 单飞;
swiftc 不可用按原因跳过),不再 spawn 陈旧的
driver/axdriver产物;新增真实 driver 只读 探针(重列句柄沿用 / snapshot 形状 / 伪造与异 nonce 句柄错误信封)。 - FIX-8 README 按修复后的实现收紧断言(cursorless 绝不 Tier 2 / cannotComplete 绝不 fallback / title 不符绝不 frame 绑)并补全错误码表。
v0.1.1 两轮缺陷修复 + QA 复审收尾(2026-08-31:round-1 A1-C10 + round-2 R1-R14 +
QA 复审 QA-1..QA-5;当时 npm test 87 用例)。修复是针对性的,不声明「无缺陷」;已知
边界见上节坑矩阵。
功能基线 v0.1.0 功能完整(阶段①-④全部交付,2026-08-28)。验收记录见
knowledge/domains/computer-use/accessibility-tree-drivers.md §六(GUI-only 对话框 3 步解除、
截图→modlens 读图链路均实测通过)。
后续可选增强(未排期):Windows(UIA)/ Linux(AT-SPI)driver runtime、拖拽手势、 动作后自动回带窗口截图(对齐 open-computer-use)、CGWindowList 与 AX 窗口的 title+frame 精确匹配。