DSH 插件變動後提示「重啓 DSH」

前言

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

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

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

小夜