dsh-web-close:DSH Web 界面的常駐關閉按鈕

在使用 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。

  1. 克隆倉庫到本地。
  2. 進入倉庫根目錄。
  3. 執行安裝命令。
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 進程)。它通過以下機制實現優雅關閉:

  1. 調用 ctx.get('appExit')(0),觸發 DSH 啓動器的退出邏輯,先 dispose 插件樹再退出。
  2. 觸發 process.emit('SIGINT'),命中 DSH 註冊的信號處理,執行相同流程。
  3. 兜底機制調用 process.exit(0)。

插件在 Web 服務器上註冊了三個同源路由:

路由 方法 說明
/dsh-web-close/info.json GET 返回當前進程信息(PID、地址等)。
/dsh-web-close/widget.js GET 瀏覽器端腳本,每次請求從磁盤讀取。
/dsh-web-close/shutdown POST 接收關閉請求,延遲 0.9 秒後觸發關閉邏輯。

驗證安裝

可以通過以下命令驗證插件是否正確安裝並運行。

  1. 檢查配置:
    dsh --profile web --dump-config
輸出中應包含 `- id: dsh-web-close`。
  1. 檢查服務(默認端口 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。
羽毛球分组比赛记分
小程序二维码

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

小夜