前言¶
DSH(DeepSeek Harness)的理念是「一切皆插件」,但桌面端插件受限于 Electron 主进程的权限模型,无法直接拿到退出或重启的原语。官方的托盘退出会弹出原生确认框,而关闭窗口只是把窗口收进托盘,并不会真正退出进程。很多场景下,开发者希望有一个「重启」入口:点击后弹出与托盘退出一致的原生确认,确认后再让旧进程优雅退出、完全停稳,然后重新拉起。
dsh-restart 就是为此而做:在 DSH Desktop 侧边栏底部增加一个「重启」按钮。点击后触发与托盘退出完全相同的原生确认框(「还有对话在运行吗」等判断),确认后走官方 app.relaunch() 原语重启。该插件本身是纯客户端,外壳补丁则通过修改 resources/app.asar 提供重启入口。
核心功能¶
- 在侧边栏底部注册一个「重启」按钮,样式与官方侧边栏底部按钮保持一致。
- 点击按钮后弹出与托盘退出相同的原生确认框,复用官方的
quitConfirmation.confirm()逻辑。 - 确认后调用
app.relaunch()触发重启,并在旧进程退出后再拉起新进程。 - 若补丁未安装,按钮会变为禁用态,并提示「配套的外壳补丁未安装」。
- 外壳补丁通过修改
lib/main.js和lib/preload-app.cjs各一处,新增restartApplication通道与处理逻辑,共 1149 字节。 - 插件本身不依赖
@deepseek-ai/dsh-client-ui-primitives,只使用官方允许的 UI 令牌与样式约定。
安装与启用¶
安装需要两步:先为 DSH Desktop 打补丁,再安装插件。插件目录即仓库根目录。
第 1 步:外壳补丁¶
必须先退出 DSH Desktop(运行中的 Electron 不允许替换 app.asar)。在补丁工具链目录下运行:
powershell -ExecutionPolicy Bypass -File "<本目录>\shell-patch\install.ps1"
脚本会自动探测 DSH 安装目录,检测进程是否已退出,按当前 app.asar 生成补丁版,首次安装时备份原始文件到 resources\app.asar.dsh-restart-backup,然后换上补丁版并校验 SHA256。若自动探测失败,可通过 -AppRoot "D:\你的路径" 显式指定。
第 2 步:安装插件¶
重新启动 DeepSeek Harness 后,在 DSH 里通过 plugin manager 安装插件目录:
<本目录的绝对路径>
安装完成后,侧边栏底部会出现「重启」按钮。
典型用法¶
- 启动 DSH Desktop,侧边栏底部出现「重启」按钮。
- 点击按钮,弹出与托盘退出相同的原生确认框。
- 若点击「取消」,窗口保持正常,之后从托盘退出不会再触发自动重启。
- 若点击确认,旧进程优雅退出、完全停稳,新进程自动拉起。
适用场景与注意事项¶
- 适合需要在桌面端快速重启 DSH Desktop 的开发者与用户,尤其是需要频繁重置环境或清理状态的场景。
- 插件以当前 DSH 进程权限运行,安装前建议检查源码与许可证。
- 本机 Electron fuse
EnableEmbeddedAsarIntegrityValidation当前为 disabled,改 asar 不会触发启动校验;若未来版本打开该 fuse,补丁可能失效。 - DSH 升级会覆盖
resources\app.asar,补丁需要重打(插件本身仍在)。升级后重跑一次install.ps1即可,脚本会自动续期基准。 - 若新版外壳改动了补丁锚点代码形状,
refresh后锚点命中数不为 1,脚本会报错并保持原样,需人工更新patch-asar.mjs里的锚点。 - 想彻底移除:先退出应用,还原外壳(
powershell -ExecutionPolicy Bypass -File shell-patch\restore.ps1),然后在 DSH 里移除插件。
生态背景¶
DSH 是 DeepSeek 推出的「一切皆插件」架构,社区目录(如 SkillHub)是独立站点,与 DeepSeek 或幻方无官方从属关系。本插件属于客户端插件,仅用于桌面端侧边栏 UI 扩展。
总结¶
dsh-restart 通过在 DSH Desktop 外壳上开一个口子,把官方已有的退出确认与重启原语接到侧边栏按钮上,为桌面端提供了一个可靠、一致的重启入口。它不引入新机制,只是复用官方逻辑,并确保补丁失败时按钮自动禁用,不会静默失效。
- 目录页:https://www.skillhub.cn/plugins/JiuRiWu/dsh-restart
- GitHub:https://github.com/JiuRiWu/dsh-restart