前言¶
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