dsh-harness-restart:給 DSH 桌面端標題欄加一個重啓入口

前言

DeepSeek Harness 桌面端在打包成應用後,原生菜單裏沒有「重啓應用與 Host」這一項,只有開發版纔有;而插件也無法往 Electron 原生菜單裏插項。要做重啓,要麼手動結束進程再雙擊啓動,要麼接受「殼一旦退出,Host 作爲它的子進程也會被帶走」這個事實。dsh-harness-restart 就是解決這個問題的一個客戶端 bundle:它在標題欄菜單條的「更多」啓動器後面放一個自帶的重啓按鈕,二次確認後重啓應用與 Host。維護者是 githublmk,分類爲客戶端。

這是什麼

一句話定位:給 DeepSeek Harness 桌面端標題欄(caption band)加一個重啓控件,點擊後經確認重啓應用及其 Host。

它解決的問題不是「多一個按鈕」,而是打包版桌面端缺失的重啓路徑,同時保證最差情況下不會把應用搞到起不來(詳見下文「它是怎麼重啓的」)。

界面與觸發條件

  • 只在桌面端出現。要求面板導航位於標題欄(dsh-panel-titlebar 把側欄導航搬進標題條的那種佈局),或 [data-windows-menu] 位於頂部。普通瀏覽器頁面(dsh web)不顯示——那裏的「重啓」沒有意義。
  • 位置緊跟「更多」啓動器([aria-haspopup])右緣 +8px。隨側欄摺疊、語言切換、窗口寬度每秒重測;右側留 168px 給窗口按鈕,空間不夠時自動隱藏。
  • 交互上,點一下彈出確認氣泡(按 Esc 或點空白關閉):

重啓應用與 Host?
正在進行的任務會被中斷,界面會在幾秒後自動恢復。
             [取消] [重啓]

確認後按鈕變爲「正在重啓…」。請求被拒時氣泡重新打開並說明原因。
- 文案中英雙語,跟隨應用語言。

它是怎麼重啓的

Host 是桌面殼(Electron main)的子進程,殼一死 Host 就被 disconnect 事件帶走,所以 Host 不可能「殺殼之後再拉起應用」。真正的重啓由 relaunch.mjs 完成:它在殺殼之前就啓動(脫離父進程、無管道),等殼和 Host 都消失後,用雙擊等價的方式(explorer.exe <應用 exe>)把應用拉起來,並用進程表確認它真的活着;失敗會重試,仍失敗就退回直接啓動。

安全性質是一條硬規則:拿不到助手的 ready 標記就絕不殺殼。最差情況是「按鈕報錯、應用原樣」,不會出現「殼被殺掉、應用起不來」。

應用的可執行文件路徑取自運行中 Host 的 process.execPath,沒有寫死安裝目錄;tasklist 裏的鏡像名也從它取 basename。

客戶端會先 GET 同一路由校驗 Host 版本,舊 Host(例如升級前加載的)會拒絕執行,避免用不匹配的兩半走重啓。

安裝與啓用

安裝走本機 profile 下的 bundle 安裝命令:

# 在本機 profile 裏安裝(會 link 當前目錄)
plugin_manager install_bundle D:\path\to\dsh-harness-restart

cordis.patch.yml 會插入一行:

- insert:
    - id: harness-restart
      name: 'dsh-harness-restart'
      config: {}

裝完重開一次應用(Host 側代碼和客戶端 bundle 都在應用啓動時加載)。刷新頁面不夠,因爲客戶端 bundle 是 Host 激活時的內存快照,改 client.js 同樣必須重開應用。

日誌

日誌都在 %TEMP%\dsh-harness-restart\:

文件 內容
restart.log 一次重啓的完整時序:host: assistant ready → host: shell gone → relauncher: shell launch: application processes before=0 → launched through shell; application processes=6
client-probe.log 客戶端掛載時上報的語言來源(active / documentLang / navigatorLanguage),排查文案問題用
launch-N.out.log / launch-N.err.log 直接啓動嘗試的 stdout/stderr(走 explorer 路徑時不會產生)

開發與校驗

npm run check   # node --check 三個入口
npm test        # 無頭 React 替身跑客戶端:註冊、文案、版本門禁、POST、舊版本拒絕

test/smoke-client.mjs 用最小 React 替身和假標題欄 DOM 跑真實的 client.js,不需要瀏覽器。許可爲 MIT。

適用場景與注意

適合在 Windows 桌面端頻繁重啓 DSH 應用、需要一條比手動結束進程更可靠的重啓路徑的人。

幾點必須清楚:

  • 僅 Windows 桌面端可用,其餘環境路由返回 409 desktop-only。
  • 重啓是「停殼 + 拉起」,不走殼的優雅退出流程:進行中的回合會被中斷(會話日誌保留,重開後仍在)。
  • 自動拉起在個別環境裏可能失敗(進程起來、窗口不出現)。日誌裏能看出來,兜底是手動雙擊啓動;後續計劃改走桌面殼自帶的 app.relaunch() 恢復路徑。
  • 插件以當前 dsh 進程權限運行。安裝前應檢查源碼與許可證(MIT),再決定是否在 profile 中啓用。

結尾

這個 bundle 的價值不在於多了一個按鈕,而在於它把「重啓桌面端」這件事放在了標題欄的可達位置,同時用 ready 標記門禁把風險約束在「應用原樣」。目錄頁:https://www.skillhub.cn/plugins/githublmk/dsh-harness-restart ,源碼:https://github.com/githublmk/dsh-harness-restart 。

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

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

小夜