dsh-restart:为 DeepSeek Harness 桌面版补上标题栏一键重启

前言

在 DeepSeek Harness(DSH)里装插件或改 profile bundle,通常要重启整个桌面进程才会加载新代码。桌面版界面上却没有明显的「重启」入口,常见做法是到托盘退出再重新打开,步骤多,也容易和「关窗口」混淆——主窗口关闭往往只是藏到托盘。

dsh-restart 是社区维护的客户端插件,在 Windows 标题栏「应用 / 编辑」旁增加「重启」按钮,用两次点击触发完整重启,让新装的插件尽快生效。下文介绍它的定位、行为、安装方式与使用时的边界。

这是什么

  • 名称:dsh-restart(仓库 csuwzw/dsh-restart)
  • 维护者:csuwzw
  • 分类:客户端(标题栏 UI + 宿主 API)
  • 许可证:MIT;当前资料中的版本为 1.0.2
  • 平台:仅 Windows 桌面版;README 标明在 DSH 内核 0.2.0-rc.2 上验证通过

插件不改内核:零依赖、无构建步骤,通过 profile bundle 挂载宿主端路由与浏览器端按钮。

核心功能

标题栏两次点击重启

按钮紧挨「应用」「编辑」右侧,样式挂在 preload 菜单条的 shadow DOM 里,与相邻菜单项高度、内边距、hover 一致;界面文案跟随 <html lang>。

  1. 第一次点击:文案变为「确认重启?」;4 秒内不点会自动撤销。
  2. 第二次点击:显示「正在重启…」并禁用;旧实例被结束,新实例自动拉起。

README 描述约 9 秒 后回到可用界面。重启会终止正在运行的任务,因此采用二次确认。

宿主侧重启通路

浏览器通过 POST /api/dsh-restart/restart 触发(需自定义头 x-dsh-restart-action: restart,且仅接受本机回环来源,降低 CSRF 风险)。宿主收到响应后约 300ms 再通过 WMI 启动 restart.ps1,使重启脚本脱离 DSH 的 job object,避免旧进程退出时把子进程一并带走。

脚本使用 conhost.exe --headless 包裹 PowerShell,避免在默认终端为 Windows Terminal 时弹出无法关闭的控制台窗口。步骤写入 $DSH_HOME/logs/dsh-restart-plugin.log;成功判据是新实例的 Host 子进程开始监听,而非固定端口号(桌面版常以 --port 0 启动)。

安装与启用

前置:DeepSeek Harness Windows 桌面版。

方式一:桌面版内置 CLI(推荐)

桌面版可通过 @deepseek-ai/dsh-desktop-host/lib/cli.js 管理 desktop profile。在 cmd 中把安装路径换成本机目录后执行(资料原文示例,固定 v1.0.2 的 codeload 包,不需要本机安装 git):

set ELECTRON_RUN_AS_NODE=1
"C:\D\software\DeepSeek Harness\DeepSeek Harness.exe" --expose-internals ^
  "C:\D\software\DeepSeek Harness\resources\app.asar\dsh\node_modules\@deepseek-ai\dsh-desktop-host\lib\cli.js" ^
  plugin --profile desktop add https://codeload.github.com/csuwzw/dsh-restart/tar.gz/refs/tags/v1.0.2

README 说明:github:csuwzw/dsh-restart 等写法会触发 git ls-remote,在未安装 git 的 Windows 上容易失败;跟最新 main 可用 refs/heads/main 的 codeload URL,但版本不可复现。

装完后仍需 手动重启一次,标题栏按钮才会出现;之后可用按钮完成后续重启。

方式二:设置里的插件管理器

打开 设置 → 插件,在安装框填入仓库地址或本地目录,由应用自己的安装通道处理。

方式三:手工放置

将 package.json、index.js、client.js、restart.ps1、cordis.patch.yml 放到 <DSH_HOME>/profiles/desktop/node_modules/dsh-restart/,在 profile 的 package.json 的 dependencies 加入 "dsh-restart": "1.0.2"(勿用 link:),在 dsh.profile.bundles 末尾追加 "dsh-restart",再重启应用一次。勿在 cordis.patch.yml 重复注册 bundle 已带的 patch,否则会报 duplicate loader entry。

安装后验证

查看 $DSH_HOME/logs/dsh-restart-plugin.log,四步记录齐全且最后一行 verdict=ok,表示链路可用。README 给出的示例行包含 armed、taskkill、launched、verify 等阶段。

典型用法

日常流程:

  1. 在 DSH 中安装或更新其他插件、修改 bundle 列表。
  2. 点击标题栏 重启 → 在 4 秒内再次确认。
  3. 等待按钮进入「正在重启…」及日志中的 verdict=ok,再验证新插件是否加载。

开发插件时,README 提醒:宿主端与客户端 bundle 的改动都要重启 DSH 才生效;未启用客户端 HMR 时,仅刷新页面不会拿到新版 client.js。本地可运行:

node client.test.cjs client.js

对 client.js 做离线自测(资料中称 25 项检查,需 Node ≥ 20)。

适用场景与注意

适合谁

  • 经常在 Windows 桌面版 DSH 里试装、迭代插件的开发者。
  • 希望少走托盘退出路径、用固定 UI 完成重启的用户。

务必知晓

  • 仅 Windows:重启脚本依赖 WMI、conhost.exe、taskkill。
  • 不等待任务收尾:与桌面版缺少可用优雅退出通路一致,重启会强制结束当前任务。
  • 无失败自动重试:旧实例已结束后盲目重试可能产生重复实例。
  • 权限与安全:插件以当前 DSH 进程权限运行;安装前请阅读 源码 与 MIT 许可证,确认接受其通过 WMI 结束进程并拉起新实例的行为。

DSH 生态强调「一切皆插件」;SkillHub 目录页 是社区收录站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-restart 解决的是「装插件必重启、界面却无入口」这一具体缺口:标题栏两次点击、日志可追、重启脚本与 job object 隔离。若你在 Windows 桌面版 DSH 上频繁改插件,可以把它当作固定工具链中的一步。

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

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

Xiaoye