前言¶
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 及以上(arm64 与 x86_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_AMBIGUOUS 或 COMPUTER_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-toolsSkill 后把截图 Artifact 路径传给对应视觉工具,不要用 shell 拉起tesseract、screencapture或临时脚本去顶替 - 自定义 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