用 dsh-computer-use 给 DeepSeek Harness 补上 macOS 电脑控制

前言

DeepSeek Harness(以下简称 DSH)的核心理念是「一切皆插件」:模型、工具、Skill、会话、沙箱、存储和界面都可以替换或重组。智能体在终端里改代码、跑命令已经比较顺手,但一旦任务落到本机原生应用——点按钮、填表单、在后台窗口里确认状态——常见做法就变成截一张图、猜坐标、再往全局桌面灌鼠标键盘事件。界面一变,旧截图立刻失效;光标被拽走、前台应用被抢走,人还在同一台机器上工作时就会互相干扰。

dsh-computer-use 走的是另一条路:先读 macOS 无障碍树,再把动作绑到未过期的观测结果上,点击和输入尽量投递给选定进程,而不是整个桌面。本文依据社区插件目录页、GitHub 仓库 README / package.json 交叉核对后整理。需要说明的是:社区目录 deepseek-harness-plugin.com 是独立站点,与 DeepSeek / 幻方没有官方从属关系,不能把它当成官方应用商店。

这是什么

dsh-computer-use 是一款面向 DeepSeek Harness 的工具与能力插件,由 Anionex 维护,npm 包名为 @anionex/dsh-computer-use,许可证 MIT。仓库主要语言是 TypeScript,并带有 Swift 实现的 macOS native helper。截至 2026-08-17,GitHub 仓库约 21 星;社区目录页收录时显示为 19 星。package.json 中的版本是 0.1.0,README 明确写成早期版本,稳定发布前模型可见行为和 provider 行为都可能变化。

它解决的问题可以收成一句话:给 DSH 智能体提供原生 macOS 电脑控制,默认不移动系统光标、指针动作不抢前台,并把每次操作钉在「新鲜、未过期」的 Accessibility 观测上。

当前 provider 只支持 macOS 14 及以上(arm64x86_64 通用二进制)。Windows UI Automation 和 Linux provider 尚未实现。它把自己定位成原生动作层,并不打算取代浏览器自动化、应用 API / CLI,或独立安装的视觉工具包。

核心功能

先观察,再动作

插件先选定准确的 bundle id 和 pid,取得按应用划分的读权限,再返回一份有界的 Accessibility 树:带 index 的元素、进程 / 窗口元数据、权限状态,以及可选的截图 Artifact。每个元素同时带有本次观测内的兼容 index 和不透明的 targetHandle。动作不是对着整块屏幕盲点,而是对着这份观测里的具体目标。

观测是按请求捕获的离散快照,不是实时桌面流。成功动作会经过一段有界 settle,再返回新的完整或差分观测,方便模型核对「点完之后界面变成了什么」。

过期状态直接拒绝

每个观测带有不透明 id 和过期时间。动作必须绑定准确、未过期的观测;过期后复用会被拒绝,而不是拿旧树继续点。配置项 observationTtlMs 控制这份观测允许多久被复用:默认 0 表示关闭过期,也可设到最多 24 小时。Settings 一旦通过校验并替换当前 provider generation,已有观测和待用确认会一并失效。

元素定位同样偏保守。仅传 index 时保持准确 locator;低风险动作可以带上 targetHandle 并设置 allowRebind: true。输入前会重新取新鲜 Accessibility 状态,依次核对原 locator、唯一的 native identifier(例如 AXIdentifier),以及基于 role、可访问名称、已声明 action 和祖先指纹的唯一语义匹配。对不上或置信度不够时,返回 COMPUTER_TARGET_AMBIGUOUSCOMPUTER_TARGET_LOW_CONFIDENCE,而不是猜一个按钮。

语义输入优先,指针只作为 fallback

点击优先走 AXPress;可编辑控件用 computer_set_value 直接改 Accessibility value,不走剪贴板;文本插入优先走 Accessibility,键盘只是进程定向的 fallback。元素自己声明的 Accessibility action 可以通过 computer_perform_action 执行。

鼠标、滚轮、拖拽在需要时才会用到,并且投递给选定 pid 和 CGWindowID,使用窗口本地坐标,而不是全局 HID 事件流。README 写明 helper 里没有系统光标 warp 路径;目标进程指针投递依赖动态解析的 SkyLight SPI,这条路由不可用时会直接失败,不会退回全局注入。

默认不抢光标、不抢前台

默认 interaction policy 是:

interaction:
  focusPolicy: preserve
  keyboardPolicy: activate
  pointerInputPolicy: targeted
  cursorVisualization: visible
  cursorMotionMs: 180
  cursorAutoHideMs: 0

含义可以对照仓库说明来读:

  • focusPolicy: preserve:指针类动作默认不把目标应用拉到前台。
  • keyboardPolicy: activate:键盘 fallback 和 press-key 前会先激活目标应用,以保证输入落到正确窗口;这是 Bundle 默认值,也是会打断前台工作的兼容选择。若设为 preserve,键盘事件也不激活。
  • 点击、滚动、拖拽会显示一个独立的 Agent 软件光标(点击穿透、不激活应用),系统真实光标保持不动。不需要视觉反馈时可把 cursorVisualization 设为 hidden
  • pointerInputPolicy: deny 会关掉坐标点击 / fallback、滚动和拖拽。

仓库带有确定性 AppKit fixture 和独立 native monitor:发布测试用 open -g 在后台启动 fixture,默认路径要求 activationCount 不增加,系统光标坐标和前台 pid 保持不变。模型不能通过 Tool 参数覆盖这些宿主策略。

按应用授权,敏感动作另要一次性确认

访问按准确 bundle id 分成两类 lease:

  • read:读 Accessibility 状态和请求的截图,Session 内有效。
  • control:向选定应用发送 UI 输入,只在当前 turn 有效。

未配置 grant 时,DSH 会请求 approval。用户拒绝后,该应用在当前 Session 的对应范围内保持拒绝。高影响动作——例如对外通信、敏感数据传输、不可逆删除、账户 / 安全 / 隐私变更、未经请求的安装、接受法律条款、超出明确授权的财务完成——需要在执行前调用 computer_confirm。Token 寿命短、一次性,并绑定准确的 app、process、观测、target handle 和动作;grant 不能绕过它。目标一旦需要 rebind,旧确认立即失效。

allowAllApps 默认是 false。打开后会忽略精确 grants,向所有运行中的应用授予读和控,只适合自己非常清楚风险的环境。

安全文本在观测里会显示为 [secure],不进入 target 描述、树文本、Tool 结果或 native 错误。截图仍可能拍到屏幕上的其他可见内容,需要按敏感数据对待。

先加载 Skill,再暴露执行工具

Bundle 初始只贡献 computer_use_activate。当前 Agent 加载 Computer Use Skill 之后,才会露出执行工具。仓库列出的工具如下:

工具 用途
computer_list_apps 列出有界用户应用及 bundle id、pid、前台状态和权限诊断
computer_observe 返回新鲜的 full / diff Accessibility 观测,可选截图 Artifact
computer_click 优先 AXPress;可用 index 或 targetHandle,必要时再走目标进程坐标 fallback
computer_set_value 设置或清空可编辑 Accessibility value,不使用剪贴板
computer_type_text 支持时通过 Accessibility 插入 Unicode,否则进程定向键盘 fallback
computer_press_key 向选定进程发送有限词表中的按键,可带 modifier
computer_scroll 向选定进程与窗口发送有界方向滚动
computer_drag 在引用观测的窗口 / 屏幕两点之间拖拽
computer_perform_action 执行元素已声明的 Accessibility action
computer_wait 轮询有界 text / role / title 条件,不修改应用
computer_confirm 获取绑定准确敏感动作的一次性 token

这些工具都不接受 AppleScript、JXA、shell、Swift、Objective-C、native selector、任意 Accessibility 常量或源码。

安装与启用

使用前需要满足仓库列出的前置条件:

  • macOS 14 或更新版本
  • 已安装 Web 或 Headless Profile、并挂载 Skill Tool 的 DeepSeek Harness
  • 用于观察和原生动作的 macOS 辅助功能(Accessibility)权限
  • 只有请求截图时才需要屏幕录制(Screen Recording)权限
  • 若要从本仓库构建,需要 Node.js ^22.19.0>=24.0.0

社区目录页给出的安装命令是:

dsh plugin add github:Anionex/dsh-computer-use

如需可复现安装,目录页建议固定 commit 哈希:

dsh plugin add github:Anionex/dsh-computer-use#commit

#commit 换成实际提交哈希即可。仓库 README 另外给出了按 Profile 从 npm 安装的写法,可同时挂到 Web 与 Headless:

dsh plugin --profile web add @anionex/dsh-computer-use
dsh plugin --profile headless add @anionex/dsh-computer-use

dsh --profile web --dump-config | grep computer-use
dsh --profile headless --dump-config | grep computer-use

本地开发时,把包名换成 checkout 的绝对路径。改完已安装插件后,需要重启正在运行的 dsh web host,再开一个新 Session,让 host 重新载入 Bundle 和 Skill catalog。

插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证。

典型用法

在新 Session 里先加载 Skill:

/computer-use

仓库给出的入门提示词是:

使用 Computer Use 检查正在运行的 DSH Computer Use Fixture,启用 deterministic option,并根据动作后返回的新状态报告结果。优先使用 Accessibility 元素,不要复用旧 observation。

发布测试里的后台 fixture 路径可以对照理解实际协议:

observe exact bundle id + pid
-> element: "Targeted pointer probe", no AXPress action
-> computer_click with observationId + element index + allowCoordinateFallback
-> fresh observation
-> activation "not-requested"; pointerRouting "target-process"
-> status "Status: pointer click"

Web Settings 分区会展示 helper 完整性、Accessibility / Screen Recording 状态、当前 generation、interaction policy、限制和精确应用 grant。只有用户点击后,按钮才会打开对应的 macOS 隐私设置页;插件不能自行授予 TCC 权限。

Accessibility 和 Screen Recording 是 UI 权限,不是文件系统权限。正常使用保持在 DSH workspace-write 下:截图留在 Session workspace,临时文件用 Session 私有目录。Bundle 不要求 danger-full-access。需要注意:danger-full-access preset 使用 approval/policy: never,未授权应用会在弹窗前被策略阻断,插件返回 COMPUTER_PERMISSION_REQUIRED,并不会把这记成用户拒绝。这时应在 Computer Use Settings 里添加准确 bundle id,或改用 approval policy 为 ask 的 preset。

卸载命令(README):

dsh plugin --profile web remove @anionex/dsh-computer-use
dsh plugin --profile headless remove @anionex/dsh-computer-use

移除后会注销 Skill 与 Tool、取消 helper 工作、释放进程内观测和 turn 级 control grant。已经生成的截图和插件自有的 computer_use_state sidecar 会保留,需要的话再手动清理。

适用场景与注意事项

比较适合这些情况:

  • 在 macOS 上跑 DSH,需要操作没有稳定 API / CLI 的原生应用
  • 希望智能体在后台窗口里点选、填值,同时人继续使用当前前台应用
  • 需要把动作钉在无障碍树上,而不是对过期截图做坐标重放

不适合、或应改用更窄接口的情况,仓库也写得很清楚:

  • 浏览器任务继续用 browser automation 和 DOM / CDP,状态更窄、更精确
  • 有 API、CLI 或专用应用插件时,仍应优先走那些接口
  • OCR、视觉 grounding、像素理解应交给独立安装的 dsh-vision-toolkit,加载 vision-tools Skill 后把截图 Artifact 路径传给对应视觉工具,不要用 shell 拉起 tesseractscreencapture 或临时脚本去顶替
  • 自定义 canvas、游戏、强化输入界面,以及未来 macOS 版本,可能拒绝目标进程指针或键盘事件;能走语义 Accessibility 就不要走坐标
  • 最小化、隐藏或无窗口目标会直接失败;点击点必须落在选定应用的某个屏幕内窗口中
  • focusPolicy: activate 与默认的 keyboardPolicy: activate 会打断前台工作,只应作为操作方显式选择的兼容模式
  • 目标应用仍可能因为接受了某个动作而自行改变激活或焦点状态

安全方面还有几条需要单独记住。Helper 是 DSH 内部传输实现,不是公共授权 API;不能把 danger-full-access 当成阻止直接 native 调用的保护。应通过已注册 Tool 使用,以保留应用 lease、敏感动作确认和宿主策略检查。自定义 Profile 如果需要交互式 read grant 或持久拒绝状态,必须在本 Bundle 之前组合 @deepseek-ai/dsh-storage-domain;Web Profile 已经组合了该依赖。

小结

dsh-computer-use 给 DeepSeek Harness 补的是一层 macOS 原生动作能力:无障碍树实时观测、过期状态拒绝、按 bundle id 划分的读写权限,以及尽量不移动系统光标、不灌全局指针事件的输入路径。它目前只覆盖 macOS,版本仍是早期 0.1.0,更适合已经在用 DSH、并且接受检查源码后再挂插件的开发者。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-computer-use/

GitHub:https://github.com/Anionex/dsh-computer-use

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜