DeepSeek Harness 重启按钮插件

前言

DeepSeek Harness(DSH)桌面端在调试或遇到卡顿时,往往需要手动结束进程再重新打开。重复这一套操作比较麻烦。dsh-restart-button 插件在聊天标题栏右上角加了一个圆形箭头,点击后可直接重启应用;再打一个可选补丁,还能把「重启」加进系统托盘菜单。

插件定位

  • 维护者:CZY1326
  • 功能:在 DeepSeek Harness 客户端提供重启入口,支持顶栏按钮与可选托盘菜单
  • 分类:客户端

核心功能

顶栏重启按钮

按钮位于聊天标题栏右上角、「打开方式」选择器(文件管理器 / git bash)的左侧,尺寸 28×28、图标 15px。它注册在 conversation.session.header.actions 槽位,点击后按顺序尝试两条通道:

顺序 通道 前置条件 行为
1 dsh-app://app/__dsh-restart 打了可选补丁 Electron 调用 app.relaunch(),优雅重启
2 POST /dsh-restart-button/restart 无 派生一个脱离的 shell:等 2 秒 → 按进程映像名结束应用 → 轮询等进程消失 → 重新拉起 exe

第 2 条是保险,保证未打补丁也能用。它不是优雅退出,正在跑的任务会被直接掐断(会话与任务记录都已落盘,重开即可续上)。

安全措施

helper 有三条安全措施:

  1. 启动前先确认 exe 还在:不在就只记日志、什么都不杀,避免「杀完起不来」。
  2. 杀完轮询 tasklist 等映像真正消失再拉起:最多等约 30 秒。
  3. 每一步都写日志到 %TEMP%\dsh-restart-button.log。

可选托盘补丁

补丁直接改打包进 app.asar 的 lib/main.js(Electron 主进程),做两件事:

  1. 托盘菜单在「打开」「退出」之间插入「重启 DeepSeek Harness」(与另外两项同样的格式)。
  2. dsh-app://app/__dsh-restart 路由 → app.relaunch(); quitWithoutConfirmation();。

脚本会自己找到 app.asar(常见安装目录、Programs\*deepseek*,以及正在运行的应用 exe 所在目录);找不到时把 /dsh-restart-button/ping 返回的 asar 传给 --asar 即可。

补丁特性

  • 等长原地补丁:asar 是一个带 JSON 索引的大文件,长度一变后面所有条目都要整体搬家。补丁把插入的字节数从旁边的文档注释里原样抠回来(注释改写到完全相同的宽度),文件长度、索引偏移、其他条目全部不变。
  • 版本相关:脚本内置对 lib/main.js 的 sha256 指纹,只认它写过的那几个版本。版本对不上就拒绝执行(不会写坏文件),此时顶栏按钮照常可用。
  • 可还原:原始字节写在 <app.asar>.dsh-restart-button.bak,清单在同名 .json 里。

打补丁后,应用升级会覆盖 app.asar,托盘那项会消失,需要重新打补丁。

当前支持的版本

应用版本 状态
0.2.1-rc.2 ✅ 已内置指纹
0.2.1-rc.3 ✅ 已内置指纹(lib/main.js 与 rc.2 只差版本号字符串)

其他版本:脚本会打印 sha256,提 issue 附上即可加进来。

自定义安装目录(例如装在 D:\Tools\...)时脚本的自动探测找不到 app.asar,把 /dsh-restart-button/ping 返回的 asar 传给 --asar 即可。

安装与启用

# 推荐:从 npm 装
dsh plugin add @czy1326/dsh-restart-button

# 或者直接从 GitHub 装
dsh plugin add git+https://github.com/CZY1326/dsh-restart-button.git

# GitHub 简写
dsh plugin add github:CZY1326/dsh-restart-button

安装后重启一次应用(或刷新页面)即可看到按钮。

仓库里提交的就是可直接运行的 JS(lib/index.js、lib/client.js),package.json 没有 prepare/postinstall 脚本,所以安装时不需要构建,也不需要给 pnpm 开 allowBuilds。
如果你的网络把 github.com 改写到了镜像/代理而推送拉取失败,把地址写成 git+https://github.com:443/CZY1326/dsh-restart-button.git 可绕过 URL 重写。

桌面端的 profile 由 Electron 应用独占管理,安装插件前请完全退出应用,否则 profile 会被占用。

典型用法

基本重启(顶栏按钮)

  1. 安装插件后重启应用。
  2. 在任意会话的标题栏右上角找到圆形箭头。
  3. 点击后应用会重启。

使用托盘菜单重启(打补丁后)

  1. 关闭应用。
  2. 执行补丁脚本:
node scripts/patch-asar.cjs --dry-run
node scripts/patch-asar.cjs
  1. 重启应用。
  2. 在系统托盘菜单的「打开」「退出」之间,会出现「重启 DeepSeek Harness」选项,点击即可。

还原补丁

node scripts/restore-asar.cjs --check   # 看状态:original / patched / unknown
node scripts/restore-asar.cjs           # 还原(应用需先退出)

实现说明

目录结构:

dsh-restart-button/
├── lib/index.js       宿主半边:注册 /ping 与 /restart 两条路由,派生脱离的重启 shell
├── lib/client.js      界面半边:顶栏圆形箭头(slot: conversation.session.header.actions)
├── cordis.patch.yml   bundle 补丁:把这个包插进 profile 的插件列表
└── scripts/           可选的 asar 补丁与还原
  • 宿主侧不依赖 Electron API,所以「纯插件」也能重启:spawn(cmd.exe, ["/c", helper.cmd], { detached: true, stdio: "ignore" }),helper 先 taskkill /F /IM "<exe>",轮询到映像消失后 start "" "<exe>";它自己的映像名是 cmd.exe,不会被自己杀掉。(注意 cmd.exe 不吃 Node 的 MSVCRT 引号转义:给 spawn 传单个脚本路径而不是带引号的内联命令。)
  • /restart 只接受 POST 且要求 x-dsh-restart: 1 头,避免爬虫或别的标签页误触发。
  • 按钮在非桌面壳(普通浏览器里的 http://127.0.0.1:<port>)不渲染:location.protocol !== "dsh-app:" 时直接返回。

自检

# 宿主是否认出桌面端、重启目标是谁、app.asar 在哪
curl http://127.0.0.1:<port>/dsh-restart-button/ping
# → {"ok":true,"desktop":true,"exe":"…\\DeepSeek Harness.exe","resources":"…","asar":"…\\resources\\app.asar"}

# 只跑「派生 helper」这一段,不杀任何进程,结果写进 %TEMP%\dsh-restart-button-probe.txt
curl -X POST -H "x-dsh-restart: 1" "http://127.0.0.1:<port>/dsh-restart-button/restart?probe=1"

第二条能写出一行 probe exe=… image=…,就说明宿主能正常派生脱离的 helper;真正点按钮时只是把它换成 taskkill + start。

已知限制

  • 托盘那一项只能靠补丁:托盘菜单在 Electron 主进程里,插件运行在宿主进程,够不到。长期正解是给上游提 PR / issue(DeepSeek Harness 桌面端)。
  • 纯插件模式是硬退出,不是优雅退出。
  • 补丁是版本相关的等长改写,不是通用补丁器。

适用场景与注意

适合需要频繁重启 DeepSeek Harness 桌面端、希望减少手动操作的开发与调试场景。

务必注意:插件以当前 DSH 进程权限运行。安装前建议检查源码与许可证(MIT)。

结尾

这个插件在保持简洁的同时提供了实用的重启能力,让开发者能更快速地恢复工作流。更多细节与源码,参见:

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

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

小夜