dsh-hot-restart-row:賬號菜單裏的熱重啓,不殺進程、對話不丟

前言

改 DSH profile 裏的插件行或 config 之後,常見做法是關窗口再開,或裝一個「整窗重開」的 dev 類插件。代價是當前對話上下文可能被中斷,主進程 pid 也會變。下面介紹的是客戶端插件 dsh-hot-restart-row:在賬號菜單「退出登錄」下面多一行「熱重啓」,原地對賬 profile 插件樹並刷新頁面,零依賴。

這是什麼

dsh-hot-restart-row 由維護者 TelethaMithril 發佈,分類爲客戶端。它在側邊欄底部賬號卡彈出的菜單裏,把原來的 設置 / 意見反饋 / 退出登錄 變成四行,第四行是「熱重啓」。

與列表裏同主題的 xiaolu511/dsh-hot-restart(分類 dev)不是一回事:那個是窗口裏的固定按鈕,點一下關掉 DSH 再自動重開,偏冷重啓;本插件不殺進程、不重開窗口,宿主在 Loader 樹裏重放 profile 的 patch(hmr.reconcileProfile()),再讓頁面 location.reload() 一次。DSH 主進程 pid 不變,其它會話不受影響;對話寫在 durable session log 裏,刷新只是重新渲染,當前對話不會丟。

核心功能

菜單裏的落點(DOM 注入)

該菜單是 shell 自帶 UI,Cordis 的 Slot 樹裏沒有對應插槽(側邊欄底部動作位 sidebar.footer.action 與這個彈出菜單不是一處)。客戶端因此用 DOM 注入:找到「退出登錄」那一行 → cloneNode(true) → 改成「熱重啓」文案與圖標 → 插在下一行,以繼承 shell 的行樣式。菜單按需掛載時,用 MutationObserver 盯着 document.body,菜單出現則補回這一行。

可識別的登出文案包括:退出登錄 / 登出 / Sign out / Sign Out / Log out / Logout。找不到則不注入,也不會亂插別處;shell 重做菜單時該行可能靜默消失,需用診斷接口排查。

熱重啓實際做了什麼

DSH 沒有對外「重啓進程」的 API。本按鈕做的是換掉運行時、保留上下文:

  1. 宿主:POST /dsh-hot-restart/restart 後,在 hmr.runExclusive() 裏調用 hmr.reconcileProfile(),把磁盤上的 profile patch 重新對賬進運行中的 Loader 樹(增刪插件行、改 config 可在此生效)。
  2. 客戶端:收到 200 後整頁刷新,重新拉 index.html 與 client bundle。

對賬只管聲明的插件樹,不做模塊級源碼熱替換;源碼監視由 dsh-hmr 等其它能力負責。需要真正冷啓動 Electron 進程時,應使用 xiaolu511/dsh-hot-restart。

HTTP 路由(同源,無額外鑑權)

方法 路徑 作用
GET /dsh-hot-restart/status 診斷 JSON:pid、運行時長、Node/Electron 版本、profile 路徑、活 agent、最近重啓歷史
GET, POST /dsh-hot-restart/restart 觸發熱重啓:先回 200,再後臺對賬
POST /dsh-hot-restart/report 客戶端回執:注入行的 outerHTML 寫入包內 report.json

排查可訪問:http://127.0.0.1:<port>/dsh-hot-restart/status。

實現上爲零依賴純 JS、無構建步驟:index.js(宿主 ES module)與 client.js(客戶端)。對賬須套 runExclusive;響應須先於對賬返回,避免連接斷開導致按鈕誤報失敗。

安裝與啓用

社區目錄見 SkillHub 條目。上架後用戶側安裝命令(以 README 爲準):

dsh plugin --profile desktop add "github:TelethaMithril/dsh-hot-restart-row#main"

在 Harness 內也可用 plugin_manager:install_bundle 的 target 指向本目錄絕對路徑;停用爲 set_bundle,target: dsh-hot-restart-row,enabled: false;卸載爲 remove_bundle,target: dsh-hot-restart-row。安裝爲 pnpm 鏈接,目錄名可能仍爲 dsh-hot-restart,包名爲 dsh-hot-restart-row。

當前資料中的版本爲 0.2.0,許可證 MIT,要求 Node >= 22。插件以當前 DSH 進程權限運行,安裝前應自行查看源碼與許可證。

典型用法

  1. 安裝並啓用插件後,打開側邊欄賬號菜單,在「退出登錄」下方應看到「熱重啓」。
  2. 修改 profile 中插件配置或增減插件行後,點「熱重啓」,等待頁面刷新。
  3. 若菜單裏沒有該行:瀏覽器訪問 /dsh-hot-restart/status 看 pid 與重啓歷史;必要時結合 report.json(由 POST /report 寫入)確認注入是否成功。

改完宿主側 index.js 後,熱重啓即可讓宿主邏輯生效。改完 client.js 後,需手動刷新頁面(如 Ctrl+R)纔會加載新客戶端 bundle。

適用場景與注意

適合:頻繁改 profile 插件樹或 config,希望立刻生效,又不想關窗、不想丟當前對話的桌面端用戶。

不適合:需要殺掉整個 DSH/Electron 進程的冷啓動場景(用 xiaolu511/dsh-hot-restart)。

邊界:某插件加載失敗時,信息進 Host 日誌與 status 歷史,按鈕本身不一定報錯;注入依賴 shell 菜單結構;對賬是盡力而爲。

DSH 生態以「一切皆插件」爲思路;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-hot-restart-row 把「改完插件立刻生效」收進賬號菜單一行:進程不關、對話不丟,用 profile 對賬加頁面刷新完成熱重啓。目錄頁:https://www.skillhub.cn/plugins/TelethaMithril/dsh-hot-restart-row;源碼與說明:https://github.com/TelethaMithril/dsh-hot-restart-row。

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

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

小夜