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

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

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

小夜