dsh-harness-restart:给 DSH 桌面端标题栏加一个重启入口

前言

DeepSeek Harness 桌面端在打包成应用后,原生菜单里没有「重启应用与 Host」这一项,只有开发版才有;而插件也无法往 Electron 原生菜单里插项。要做重启,要么手动结束进程再双击启动,要么接受「壳一旦退出,Host 作为它的子进程也会被带走」这个事实。dsh-harness-restart 就是解决这个问题的一个客户端 bundle:它在标题栏菜单条的「更多」启动器后面放一个自带的重启按钮,二次确认后重启应用与 Host。维护者是 githublmk,分类为客户端。

这是什么

一句话定位:给 DeepSeek Harness 桌面端标题栏(caption band)加一个重启控件,点击后经确认重启应用及其 Host。

它解决的问题不是「多一个按钮」,而是打包版桌面端缺失的重启路径,同时保证最差情况下不会把应用搞到起不来(详见下文「它是怎么重启的」)。

界面与触发条件

  • 只在桌面端出现。要求面板导航位于标题栏(dsh-panel-titlebar 把侧栏导航搬进标题条的那种布局),或 [data-windows-menu] 位于顶部。普通浏览器页面(dsh web)不显示——那里的「重启」没有意义。
  • 位置紧跟「更多」启动器([aria-haspopup])右缘 +8px。随侧栏折叠、语言切换、窗口宽度每秒重测;右侧留 168px 给窗口按钮,空间不够时自动隐藏。
  • 交互上,点一下弹出确认气泡(按 Esc 或点空白关闭):

重启应用与 Host?
正在进行的任务会被中断,界面会在几秒后自动恢复。
             [取消] [重启]

确认后按钮变为「正在重启…」。请求被拒时气泡重新打开并说明原因。
- 文案中英双语,跟随应用语言。

它是怎么重启的

Host 是桌面壳(Electron main)的子进程,壳一死 Host 就被 disconnect 事件带走,所以 Host 不可能「杀壳之后再拉起应用」。真正的重启由 relaunch.mjs 完成:它在杀壳之前就启动(脱离父进程、无管道),等壳和 Host 都消失后,用双击等价的方式(explorer.exe <应用 exe>)把应用拉起来,并用进程表确认它真的活着;失败会重试,仍失败就退回直接启动。

安全性质是一条硬规则:拿不到助手的 ready 标记就绝不杀壳。最差情况是「按钮报错、应用原样」,不会出现「壳被杀掉、应用起不来」。

应用的可执行文件路径取自运行中 Host 的 process.execPath,没有写死安装目录;tasklist 里的镜像名也从它取 basename。

客户端会先 GET 同一路由校验 Host 版本,旧 Host(例如升级前加载的)会拒绝执行,避免用不匹配的两半走重启。

安装与启用

安装走本机 profile 下的 bundle 安装命令:

# 在本机 profile 里安装(会 link 当前目录)
plugin_manager install_bundle D:\path\to\dsh-harness-restart

cordis.patch.yml 会插入一行:

- insert:
    - id: harness-restart
      name: 'dsh-harness-restart'
      config: {}

装完重开一次应用(Host 侧代码和客户端 bundle 都在应用启动时加载)。刷新页面不够,因为客户端 bundle 是 Host 激活时的内存快照,改 client.js 同样必须重开应用。

日志

日志都在 %TEMP%\dsh-harness-restart\:

文件 内容
restart.log 一次重启的完整时序:host: assistant ready → host: shell gone → relauncher: shell launch: application processes before=0 → launched through shell; application processes=6
client-probe.log 客户端挂载时上报的语言来源(active / documentLang / navigatorLanguage),排查文案问题用
launch-N.out.log / launch-N.err.log 直接启动尝试的 stdout/stderr(走 explorer 路径时不会产生)

开发与校验

npm run check   # node --check 三个入口
npm test        # 无头 React 替身跑客户端:注册、文案、版本门禁、POST、旧版本拒绝

test/smoke-client.mjs 用最小 React 替身和假标题栏 DOM 跑真实的 client.js,不需要浏览器。许可为 MIT。

适用场景与注意

适合在 Windows 桌面端频繁重启 DSH 应用、需要一条比手动结束进程更可靠的重启路径的人。

几点必须清楚:

  • 仅 Windows 桌面端可用,其余环境路由返回 409 desktop-only。
  • 重启是「停壳 + 拉起」,不走壳的优雅退出流程:进行中的回合会被中断(会话日志保留,重开后仍在)。
  • 自动拉起在个别环境里可能失败(进程起来、窗口不出现)。日志里能看出来,兜底是手动双击启动;后续计划改走桌面壳自带的 app.relaunch() 恢复路径。
  • 插件以当前 dsh 进程权限运行。安装前应检查源码与许可证(MIT),再决定是否在 profile 中启用。

结尾

这个 bundle 的价值不在于多了一个按钮,而在于它把「重启桌面端」这件事放在了标题栏的可达位置,同时用 ready 标记门禁把风险约束在「应用原样」。目录页:https://www.skillhub.cn/plugins/githublmk/dsh-harness-restart ,源码:https://github.com/githublmk/dsh-harness-restart 。

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

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

小夜