前言¶
改 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。本按鈕做的是換掉運行時、保留上下文:
- 宿主:
POST /dsh-hot-restart/restart後,在hmr.runExclusive()裏調用hmr.reconcileProfile(),把磁盤上的 profile patch 重新對賬進運行中的 Loader 樹(增刪插件行、改config可在此生效)。 - 客戶端:收到 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 進程權限運行,安裝前應自行查看源碼與許可證。
典型用法¶
- 安裝並啓用插件後,打開側邊欄賬號菜單,在「退出登錄」下方應看到「熱重啓」。
- 修改 profile 中插件配置或增減插件行後,點「熱重啓」,等待頁面刷新。
- 若菜單裏沒有該行:瀏覽器訪問
/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。