在使用 DeepSeek Harness (DSH) 時,結束當前會話或關閉 Web 服務需要一種可控的方式。dsh-web-close 插件解決了一個具體問題:在 DSH Web 界面上提供一個常駐的關閉按鈕,允許用戶通過交互式確認來執行優雅關閉。
這是一個標準 DSH bundle 插件,由 Aclguh 維護,採用 MIT 許可證。它不依賴任何圖片資源,通過原生 DOM 實現功能,支持跨平臺運行。
核心功能¶
- 常駐自啓:作爲標準 DSH bundle 插件,安裝一次後每次
dsh web啓動都會自動加載。 - 界面設計:半透明紅色圓形按鈕,背景色爲
rgba(220,38,38,.42),帶有毛玻璃效果和紅色描邊光暈。圖標爲內聯 SVG 手繪電源符號,無圖片資源。 - 位置記憶:按鈕默認顯示在視口
top: 1234px / left: 306px。支持拖動,位置會寫入localStorage(鍵名爲dsh-web-close-pos),刷新或重啓瀏覽器後自動恢復。 - 二次確認:點擊按鈕後彈出視口居中的確認框,顯示目標進程 PID 與地址。包含“取消”和“確認關閉”兩個選項。
- 優雅關閉:不使用
kill -9強制終止,而是通過調用 DSH 的appExit機制或發送SIGINT信號,先卸載整棵插件樹,再退出進程。 - 關閉標籤頁:確認關閉後,瀏覽器側會自動執行
window.close()嘗試關閉當前標籤頁。若瀏覽器安全策略阻止,則將頁面替換爲about:blank。該操作僅作用於當前標籤頁。
安裝與啓用¶
安裝前請確保已安裝 pnpm。
- 克隆倉庫到本地。
- 進入倉庫根目錄。
- 執行安裝命令。
dsh plugin --profile web add link:.
注意事項:
* 倉庫根目錄本身就是插件包,路徑不要帶子目錄(如 link:.\dsh-web-close),否則會被當作普通依賴而非插件。
* 安裝後必須重啓 dsh web 才能生效。
使用方法¶
- 移動位置:按住按鈕拖動,位移超過 4px 纔會觸發拖動邏輯。
- 恢復默認:如果位置記憶失效或需要重置,在瀏覽器控制台執行以下命令:
localStorage.removeItem('dsh-web-close-pos')
刷新頁面後按鈕將回到默認位置。
- 執行關閉:點擊按鈕 → 在彈窗中確認 → 等待約 0.9 秒 → DSH 進程退出並嘗試關閉當前標籤頁。
技術實現與路由¶
插件運行在 DSH 宿主進程內部(即承載 Web 服務與 Agent 的 node 進程)。它通過以下機制實現優雅關閉:
- 調用
ctx.get('appExit')(0),觸發 DSH 啓動器的退出邏輯,先 dispose 插件樹再退出。 - 觸發
process.emit('SIGINT'),命中 DSH 註冊的信號處理,執行相同流程。 - 兜底機制調用
process.exit(0)。
插件在 Web 服務器上註冊了三個同源路由:
| 路由 | 方法 | 說明 |
|---|---|---|
/dsh-web-close/info.json |
GET | 返回當前進程信息(PID、地址等)。 |
/dsh-web-close/widget.js |
GET | 瀏覽器端腳本,每次請求從磁盤讀取。 |
/dsh-web-close/shutdown |
POST | 接收關閉請求,延遲 0.9 秒後觸發關閉邏輯。 |
驗證安裝¶
可以通過以下命令驗證插件是否正確安裝並運行。
- 檢查配置:
dsh --profile web --dump-config
輸出中應包含 `- id: dsh-web-close`。
- 檢查服務(默認端口 3080):
curl http://127.0.0.1:3080/dsh-web-close/info.json
返回包含 `"ok":true` 的 JSON。
注意事項¶
- Profile 限制:僅對 web profile 有效,依賴 DSH Web 服務器運行。
- 瀏覽器安全策略:出於安全限制,腳本通常只能關閉由腳本自身打開的窗口。如果瀏覽器拒絕自動關閉當前標籤頁,彈窗中會出現“關閉本頁”按鈕作爲兜底。
- 存儲限制:在無痕/隱私模式下,
localStorage不可用,位置記憶僅在當前會話有效。 - 代碼熱更新:修改
lib/widget.js只需刷新頁面;修改lib/index.js需要重啓dsh web。