用 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

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

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

小夜