前言¶
DSH 的桌面端沒有給頁面開 getDisplayMedia() 的口子,權限處理器只放行麥克風,所以在應用窗口裏截屏這條路是堵死的。日常工作裏又確實會遇到「想把當前屏幕這張圖直接發給模型」的場景:先切出去截屏、存盤、再回到 DSH 上傳,鏈條長而且容易打斷思路。
下面介紹的這個插件就是解這個問題:wdmb123/dsh-composer-screenshot,由 wdmb123 維護。它在輸入框的 + 號右邊加一個圓形按鈕,截下來的圖直接落進消息草稿,不需要離開 DSH。
這是什麼¶
一句話:給 DeepSeek Harness 的 composer(輸入框)加一個截圖入口,截圖由宿主進程完成,瀏覽器側只負責按鈕、菜單和附件寫入。
插件源碼分兩部分,對應兩套運行環境:
index.js是宿主半,跑在dshruntime 裏,負責調用系統的截圖工具、隱藏和恢復窗口。client.js是瀏覽器半,負責渲染按鈕和菜單,把返回的 PNG 變成草稿附件。
之所以截圖放在宿主側做,是因爲 DSH 桌面端主窗口的 Electron session 沒有 setDisplayMediaRequestHandler,頁面裏的 navigator.mediaDevices.getDisplayMedia() 必然被拒。宿主進程本身就運行在這臺機器上,由它調系統截圖工具是最順的路。
核心功能¶
按鈕點開是三行菜單,每一行對應一種截法:
- 截取整個屏幕:直接截全屏,不隱藏任何東西。
- 隱藏窗口後截取整屏:先把本應用窗口隱藏,截全屏,再把窗口恢復。
- 隱藏窗口後框選區域:先隱藏窗口,然後用十字光標拖出範圍,窗口恢復;按 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 可能彈權限請求,需要兩項:
- 屏幕錄製權限給到 DeepSeek Harness,否則截到的可能只有壁紙。
- 自動化 → System Events,只有「隱藏窗口」的兩個模式需要它來隱藏和恢復窗口。
配置好之後,從輸入框點那個圓形按鈕,菜單裏選一項即可。截到的圖會作爲附件出現在輸入區,你接着寫描述文字,回車發送,和內置「文件」按鈕走的是同一條草稿鏈路。
如果只想要某個窗口的內容,選「隱藏窗口後框選區域」,進入框選後按空格切換到窗口選擇,點一下目標窗口即可。想放棄就按 Esc。
接口與實現方式¶
插件暴露的是單一同源路由,只接受經過信任圍欄校驗的請求:
POST /composer-screenshot/capture?mode=fullscreen | hidden | hidden-region
可能的響應:
200 image/png:截圖字節409 {"code":"cancelled"}:用戶按 Esc 取消了框選400:mode不合法401/403:未通過連接信任校驗405:不是 POST501 {"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。