dsh-composer-screenshot:讓 DSH 輸入框直接接住屏幕截圖

前言

DSH 的桌面端沒有給頁面開 getDisplayMedia() 的口子,權限處理器只放行麥克風,所以在應用窗口裏截屏這條路是堵死的。日常工作裏又確實會遇到「想把當前屏幕這張圖直接發給模型」的場景:先切出去截屏、存盤、再回到 DSH 上傳,鏈條長而且容易打斷思路。

下面介紹的這個插件就是解這個問題:wdmb123/dsh-composer-screenshot,由 wdmb123 維護。它在輸入框的 + 號右邊加一個圓形按鈕,截下來的圖直接落進消息草稿,不需要離開 DSH。

這是什麼

一句話:給 DeepSeek Harness 的 composer(輸入框)加一個截圖入口,截圖由宿主進程完成,瀏覽器側只負責按鈕、菜單和附件寫入。

插件源碼分兩部分,對應兩套運行環境:

  • index.js 是宿主半,跑在 dsh runtime 裏,負責調用系統的截圖工具、隱藏和恢復窗口。
  • client.js 是瀏覽器半,負責渲染按鈕和菜單,把返回的 PNG 變成草稿附件。

之所以截圖放在宿主側做,是因爲 DSH 桌面端主窗口的 Electron session 沒有 setDisplayMediaRequestHandler,頁面裏的 navigator.mediaDevices.getDisplayMedia() 必然被拒。宿主進程本身就運行在這臺機器上,由它調系統截圖工具是最順的路。

核心功能

按鈕點開是三行菜單,每一行對應一種截法:

  1. 截取整個屏幕:直接截全屏,不隱藏任何東西。
  2. 隱藏窗口後截取整屏:先把本應用窗口隱藏,截全屏,再把窗口恢復。
  3. 隱藏窗口後框選區域:先隱藏窗口,然後用十字光標拖出範圍,窗口恢復;按 Esc 可以取消本次框選。

截圖生效後作爲一張圖片附件進入當前會話的輸入框。插件不會替你提交消息:你自己寫文字、按回車發送。

三個模式的行爲細節:

  • 隱藏窗口按 bundle identifier com.deepseek.dsh 定位本應用,而不是按「最前面的應用」,所以不會隱藏錯窗口。無論截圖成功、失敗還是按 Esc 取消,窗口都會被恢復爲可見並置前臺。
  • 框選模式底層是 screencapture -i:十字光標拖拽選區,按空格可切換成窗口選擇,Esc 取消,超時 180s。取消時返回 409 cancelled,前端靜默處理:不彈錯、不產生附件。
  • 普通截屏超時 30s,返回 PNG 原始分辨率,後續壓縮由宿主按模型要求做。
  • 非 macOS 平臺返回 501 capture-unavailable,前端顯示提示。

安裝與啓用

環境要求:

  • DeepSeek Harness 0.2.1 及以上(作者在 0.2.1-rc.3 上驗證過)
  • macOS,目前只有 screencapture 實現;其他平臺走這條路會拿到 501
  • 桌面端窗口或瀏覽器打開的同一個 Web GUI 都可以

通過插件管理器安裝時,把倉庫地址作爲安裝目標:

github:wdmb123/dsh-composer-screenshot

管理器會完成依賴安裝與 bundle 選擇。命令行等價寫法:

dsh plugin --profile <你的 profile> add github:wdmb123/dsh-composer-screenshot

然後在該 profile 的 package.json 裏把包名 dsh-composer-screenshot 加進 dsh.profile.bundles,插件自帶的 cordis.patch.yml 會插入自己的那一行。

"dsh": {
  "profile": {
    "bundles": [
      "dsh-composer-screenshot"
    ]
  }
}

裝完重啓 App(或刷新界面)就能看到按鈕。

典型用法

第一次使用時 macOS 可能彈權限請求,需要兩項:

  1. 屏幕錄製權限給到 DeepSeek Harness,否則截到的可能只有壁紙。
  2. 自動化 → System Events,只有「隱藏窗口」的兩個模式需要它來隱藏和恢復窗口。

配置好之後,從輸入框點那個圓形按鈕,菜單裏選一項即可。截到的圖會作爲附件出現在輸入區,你接着寫描述文字,回車發送,和內置「文件」按鈕走的是同一條草稿鏈路。

如果只想要某個窗口的內容,選「隱藏窗口後框選區域」,進入框選後按空格切換到窗口選擇,點一下目標窗口即可。想放棄就按 Esc。

接口與實現方式

插件暴露的是單一同源路由,只接受經過信任圍欄校驗的請求:

POST /composer-screenshot/capture?mode=fullscreen | hidden | hidden-region

可能的響應:

  • 200 image/png:截圖字節
  • 409 {"code":"cancelled"}:用戶按 Esc 取消了框選
  • 400:mode 不合法
  • 401 / 403:未通過連接信任校驗
  • 405:不是 POST
  • 501 {"code":"capture-unavailable"}:平臺不支持或截圖工具報錯

截圖寫入系統臨時目錄下的獨立目錄,任何路徑最終都會在 finally 中刪除。瀏覽器半註冊進會話作用域的 conversation.input.left 槽,附件通過 conversation.createDrafts() 和輸入框的 addAttachments() 掛上草稿。

適用場景與注意事項

適合 macOS 上做日常調試、文檔配圖、把實現結果直接丟給模型看的人。它能省掉「切窗口、截屏、找文件、回來上傳」這四步。

幾點要留意:

  • 插件以當前 dsh 進程的身份和權限運行,安裝前應先過一遍源碼,同時確認許可證(MIT)是否符合你的使用要求。
  • 目前只有 macOS 實現,Windows / Linux 需要各自接截圖工具,插件路由會返回 501。
  • 菜單向上錨定在按鈕上,三行的順序固定爲:全屏、隱藏全屏、隱藏框選,目前不可配置。
  • 隱藏窗口依賴 System Events 自動化授權;如果拒絕授權,「隱藏窗口」的兩個模式會報錯,但窗口保持可見。

結尾

這個插件的價值不在於截圖本身,而在於它把截圖嵌入了輸入流程:截完即得附件,不用切應用、不用找文件路徑。對 macOS 上常和 DSH 打交道的人來說,這算是把一條常見路徑補上了。目錄頁在 https://www.skillhub.cn/plugins/wdmb123/dsh-composer-screenshot,源碼在 https://github.com/wdmb123/dsh-composer-screenshot,許可證 MIT,插件版本 1.0.0。

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

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

小夜