前言¶
DSH 的插件在宿主啓動時構建。安裝、更新或卸載插件後,界面不會自動變化,必須重啓 DSH。手動重啓的麻煩在於:要麼在進程管理器裏查找 PID,要麼看着終端閃一個黑框,而且如果此時 Agent 正在跑任務,重啓會直接中斷它。
dsh-plugin-restart-prompt 把這條鏈路收成一張卡片:插件變動後提示「重啓 DSH」,一鍵完成靜默重啓(全程無命令提示符窗口),同一張卡片上還能展開「查看變動」,看這次到底改了什麼。
它是什麼¶
dsh-plugin-restart-prompt 是一個運行在 DSH 桌面端的插件,由 x3416067-bit 維護。它監聽 profile 的插件清單與依賴樹變化,變化穩定約 0.7 秒後在右下角彈出提示卡片。插件通過 VBScript + WMI + taskkill 實現靜默重啓,全程無控制台窗口,僅 Windows 可用。
核心功能¶
插件變動觸發卡片提示
插件只對「插件身份」變化做出反應,不關心配置項修改。觸發條件包括:
package.json:dependencies與dsh.profile.bundles變化cordis.yml/cordis.patch.yml:插件條目結構(id/name行)變化pnpm-lock.yaml:按文件修改時間 / 大小變化判斷node_modules:頂層包清單變化,忽略.開頭的緩存目錄
改推理等級、切模型、調主題等只寫 config 段的設置不會觸發提示。
查看變動詳情
點擊「查看變動」展開面板,展示本次變動前後的差異:
- 行級差異(
+/−/ 上下文),上下各留 2 行,單文件上限 400 行,其餘折成「… 跳過 N 行」 - 依賴版本變化(
a 1.0.0 → 1.1.0) dsh.profile.bundles增刪node_modules裏新增 / 移除的包pnpm-lock.yaml只標註「依賴鎖已變化」,不做行級對比
差異來源是本次變動前後的 package.json、cordis.yml、cordis.patch.yml、pnpm-workspace.yaml 快照,cordis 層只保留 id / name 條目行,不貼 config。
靜默重啓
當 DSH 處於空閒狀態,點擊「重啓 DSH」直接派發重啓,卡片變爲「正在重啓 DSH…」。
當 DSH 正在運行 Agent 任務時,點擊「重啓 DSH」先彈出確認框「DSH 正在工作 / 正在進行的任務會被中斷」,確認按鈕爲紅色高亮。只有點「是」才執行重啓。
點擊「稍後」收起卡片,下一次變動會重新提示。
安裝與啓用¶
安裝命令:
dsh plugin --profile desktop add dsh-plugin-restart-prompt
裝好後重啓 DSH 一次,插件開始工作。此後每次插件變動都由它提示重啓。
本地開發(把源碼目錄 link 進去,改完即生效):
cd ~/.dsh/profiles/desktop
# package.json: dependencies 增加 "dsh-plugin-restart-prompt": "link:/path/to/dsh-plugin-restart-prompt"
# dsh.profile.bundles 末尾增加 "dsh-plugin-restart-prompt"
pnpm install
重啓實現原理¶
重啓鏈路用 VBScript + WMI + taskkill,依賴 wscript.exe 與 System32\taskkill.exe。
兩段 VBScript 由 wscript.exe 承載(GUI 子系統,啓動時不分配控制台):
' launcher.vbs
Set svc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
rv = svc.Create("""C:\Windows\System32\wscript.exe"" //B //Nologo ""...\relaunch.vbs""")
WScript.Quit rv
' relaunch.vbs
WScript.Sleep 700
Set sh = CreateObject("WScript.Shell")
sh.Run """C:\Windows\System32\taskkill.exe"" /F /T /IM ""<外殼進程名>""", 0, True
WScript.Sleep 1800
sh.Run """<DSH 外殼 exe>""", 1, False
關鍵決策:
- 用
wscript.exe而不是powershell.exe/cmd.exe,避免先搶一個控制台窗口閃一下 - 用 WMI
Win32_Process.Create派生,宿主被殺時 detached 子進程會被連帶終止 - 一切走絕對路徑,避免
spawn失敗 - 失敗要能看見:派發失敗或 20 秒內未生效,卡片顯示紅色錯誤與「重試」,結果追加到
$DSH_HOME/dsh-plugin-restart/relaunch.log
接口¶
| 方法 | 路徑 | 說明 |
|---|---|---|
| GET | /dsh-restart-prompt/state.json |
{needRestart, busy, workingAgents, changes, changedAt, restartRequested} |
| GET | /dsh-restart-prompt/changes.json |
{ok, at, changes, sections, profileDir},變動詳情(只讀) |
| POST | /dsh-restart-prompt/restart.json |
派發重啓(僅迴環 Host / 同源 Origin,否則 403) |
| POST | /dsh-restart-prompt/dismiss.json |
收起當前提示 |
| GET | /dsh-restart-prompt/client.js |
客戶端腳本 |
客戶端注入走兩條通道:桌面端 webserver/index-inject 內聯行、Web 形態 webServer.tapIndex。
隱私¶
只讀 profile 目錄下 4 個小配置文件的文本與 node_modules 的目錄名,用於本地差異展示;不讀取會話內容,不上傳任何數據,不發起外部網絡請求。
適用場景¶
適合需要頻繁安裝/更新/卸載 DSH 插件的場景,尤其是桌面端開發環境。插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。
短結尾¶
dsh-plugin-restart-prompt 把「檢測插件變動 + 一鍵靜默重啓 + 查看變動詳情」整合到一張卡片,減少手動操作與任務中斷風險。更多信息見:
- 目錄頁:https://www.skillhub.cn/plugins/x3416067-bit/dsh-plugin-restart-prompt
- GitHub:https://github.com/x3416067-bit/dsh-plugin-restart-prompt