dsh-restart: Add a "Restart" button to the DeepSeek Harness Desktop title bar

前言

在 DeepSeek Harness(DSH)桌面端里改插件、调 Host 或验证 bundle 时,往往需要整进程重新加载:插件脚本、原生菜单和 Host 路由都要走一遍冷启动。Windows 上「应用」菜单里的「退出」只能关进程,没有「退出并立刻再开」的入口;完全手动关窗口再点快捷方式,步骤多且容易漏掉「先保存当前状态」的判断。社区插件 dsh-restart(维护者 mwk719)针对的是这一类操作:在 Windows 桌面端标题栏「应用 / 编辑」同一行追加「重启 / Restart」,点一次先弹确认框,确认后再关闭并重新打开应用,效果接近「退出后重新打开」。

下面按定位、能力、安装用法、实现要点与限制说明;事实以 GitHub 仓库 README 为准。该插件属于社区客户端类插件,与 DeepSeek / 幻方无官方从属关系;DSH 生态里插件目录为独立站点,并非官方应用商店。

这是什么

dsh-restart 给 DeepSeek Harness Desktop(Windows) 的标题栏加一颗「重启」按钮:单击只打开确认对话框,在对话框里确认后,应用关闭并用同一可执行文件再次启动。仓库地址:https://github.com/mwk719/dsh-restart,插件目录页:https://www.skillhub.cn/plugins/mwk719/dsh-restart。许可证为 MIT(README 标明)。

核心功能

  1. 标题栏按钮:装好后重启一次 DSH 桌面端,标题栏「应用 / 编辑」右侧出现「重启」(英文界面为 Restart)。
  2. 两步确认:单击按钮只弹框,不发起重启请求;取消、Esc、点击遮罩均不执行任何操作。
  3. 会话提示:确认框标题为「重启 DeepSeek Harness?」,正文说明会关闭并重新打开,并显示当前正在运行的会话数量(空闲时会说明没有正在运行的会话),便于判断重启是否会中断进行中的回合。
  4. Host 侧保护:实际重启需 Host 接受带 ?force=1 的 POST /dsh-restart/restart;未确认的调用返回 409,不会重启。
  5. 诊断路由(同源、需自定义请求头):GET /dsh-restart/state 返回状态、保护版本、是否桌面端、忙碌会话数、按钮挂载时间、日志路径等;POST /dsh-restart/restart?dry=1 仅说明「若现在确认会如何」,不会重启。
  6. 日志:行为写入 ~/.dsh/dsh-restart.log(弹框、确认、取消、重启及助手进程步骤均有记录)。

插件为零依赖、零构建:Host 端 index.js、浏览器端 client.js、助手 restart-child.mjs 均为手写 ESM,安装后可直接使用,无需 pnpm install 或构建步骤。

安装与启用

先用 DSH CLI 为 desktop profile 添加插件(命令来自 README 原文):

dsh plugin --profile desktop add github:mwk719/dsh-restart

也可以从插件市场(dsh-market)安装。装完后再重启一次 DeepSeek Harness 应用,标题栏才会出现「重启」按钮。

安装前建议自行查看仓库源码与 MIT 许可证;插件在 当前 dsh 进程权限 下运行,重启会结束 Electron 主进程与 Host,属于高影响操作,只应在可信来源安装。

典型用法

  1. 点标题栏「重启」(或 Restart)。
  2. 阅读确认框中的会话数量说明,评估是否会中断正在生成的回答。
  3. 选「取消」则关闭对话框;选「重启应用」则立刻执行重启流程。
  4. 若约 20 秒后应用仍在运行(重启未生效),确认框会改为报错文案并允许重试;细节可查 ~/.dsh/dsh-restart.log。

卸载:设置 → 插件 → dsh-restart → 停用或卸载,按钮随之消失。

为什么放在标题栏而不是「应用」菜单

「应用」菜单是 Electron 主进程里的原生菜单,由 app.asar 内 lib/main.js 的 applicationItems() 构造(最后一项为「退出」)。DSH 插件系统未给该菜单留插槽,桌面端也未把 quit / restart 暴露给网页或插件,因此无法向该菜单追加条目。

本插件改为向桌面端 preload 在页面中创建的 [data-windows-menu] 元素下手:在其 shadow root 内的 [role="menubar"](即「应用 / 编辑」所在行)追加一个按钮,样式与布局与该 row 一致,并随界面语言显示「重启 / Restart」。此处是插件唯一依赖桌面端内部结构的地方:只读 shadow root 并 append 按钮,不修改既有按钮、不拦截事件。若未来桌面端不再提供该元素,插件在 20 秒内找不到目标则不渲染(不报错、不影响其它插件)。

重启如何实现

  • 桌面端 Host 进程即 DeepSeek Harness.exe 以 Node 模式运行(ELECTRON_RUN_AS_NODE=1,由 Electron 主进程 spawn 并带 IPC)。因此在 Host 里 process.execPath 为应用可执行文件,process.ppid 为 Electron 主进程。
  • 确认后,Host 启动 detached 助手进程(restart-child.mjs):助手先结束 Electron 主进程,再结束 Host(释放 HTTP 端口),约 2 秒后用同一可执行文件重新启动。
  • 效果等同手动「退出后重新打开」:插件代码、原生菜单、Host 全部重新加载。实现方式是结束进程再拉起,不是优雅退出;若某次重启后应用未起来,可手动再打开一次(日志中有各步结果)。

代价:正在生成的回答会中断;会话记录、消息与文件在磁盘上,重开后仍在列表中。

适用场景与注意

适合:在 Windows 上频繁验证插件或 Host 变更、需要整应用冷启动而不想反复手动关开窗口的 DSH 桌面用户。

限制(README 明确要求):

  • 仅 Windows 桌面端:macOS 使用原生应用菜单,Linux 桌面端没有该 menubar,其它平台插件不渲染任何 UI。
  • 需要 dsh >= 0.2.0-rc.1(package.json 中 engines.dsh 与 dsh.engines.dsh 一致)。
  • 重启会中断进行中的回合;安全设计上单击绝不直接重启,Host 侧 ?force=1 为第二道闸。

结尾

dsh-restart 用标题栏一颗按钮和双重确认,把 Windows 桌面端「整应用重启」收成可预期的几步操作,并附带会话数提示与 Host 诊断路由。需要安装或源码细节时,可看目录页 https://www.skillhub.cn/plugins/mwk719/dsh-restart 与 GitHub https://github.com/mwk719/dsh-restart。

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

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

Xiaoye