dsh-hot-restart-row:账号菜单里的热重启,不杀进程、对话不丢

前言

改 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。本按钮做的是换掉运行时、保留上下文:

  1. 宿主:POST /dsh-hot-restart/restart 后,在 hmr.runExclusive() 里调用 hmr.reconcileProfile(),把磁盘上的 profile patch 重新对账进运行中的 Loader 树(增删插件行、改 config 可在此生效)。
  2. 客户端:收到 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 进程权限运行,安装前应自行查看源码与许可证。

典型用法

  1. 安装并启用插件后,打开侧边栏账号菜单,在「退出登录」下方应看到「热重启」。
  2. 修改 profile 中插件配置或增减插件行后,点「热重启」,等待页面刷新。
  3. 若菜单里没有该行:浏览器访问 /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。

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

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

小夜