dsh-restart
给 DeepSeek Harness(DSH)加一个重启按钮:点一下就把整个应用重启,回到原来的工作区。
简介
DSH 桌面版(Electron 外壳 + 它管理的服务端进程)没有提供任何界面内的重启入口:改完插件的服务端代码后,只能退出托盘再从快捷方式重新打开。本插件补上这个入口——一个直接落在窗口标题栏的重启按钮。
插件是普通 DSH 插件包,安装在你的 DSH profile 里(desktop 或 web),不修改 DSH 自身文件。按钮只有一个,没有「关闭」。
┌─────────────────────────────── 标题栏 ───────────────────────────────┐
│ 应用 编辑 [ ↻ ] — ❐ ✕ │
└──────────────────────────────────────────────────────────────────────┘
↑ 本插件 ↑ 系统原生按钮
功能特性
- 标题栏重启按钮:位于标题栏最右侧、系统窗口控制按钮(— ❐ ✕)的左边,点击即重启整个应用。
- 只有重启,没有关闭:不会误触退出,也不会触发外壳的崩溃恢复对话框。
- 按钮总在:没有桌面标题栏的环境(例如浏览器里的
dsh web、macOS 桌面)自动回退到会话头部工具区,渲染同一个按钮,两种位置互斥。 - 重启期间有反馈:先出现整屏「DSH 正在重启…」提示,再整体退出并自动重新打开;失败时弹出错误气泡并给出日志位置。
- 零第三方依赖:不使用运行时依赖,不联网下载任何东西。
安装
插件托管在 GitHub(kee0012/dsh-restart,未发布到 npm),DSH 支持以 git 依赖方式直接安装:
# 从 GitHub 安装(推荐,日常使用;拉取默认分支最新提交)
dsh plugin --profile desktop add github:kee0012/dsh-restart
安装后需要重启 DSH,新的服务端代码与 client bundle 才会生效。
卸载:dsh plugin --profile desktop remove dsh-restart,然后重启 DSH。
使用
- 安装并重启 DSH 后,标题栏右侧会出现一个环形箭头按钮(标题栏不可用时则在会话头部)。
- 悬停可见提示「立即重启 DeepSeek Harness(当前运行中的任务会中断)」。
- 点击 → 出现「DSH 正在重启…」整屏提示 → 应用整体退出并自动重新打开 → 回到原来的工作区。
- 若应用没有自动回来,按提示手动启动 DSH 即可;具体原因记录在日志里(见下一节)。
配置
无需配置,安装后即可使用。按钮位置按系统原生窗口按钮的宽度自动计算(见「已知限制」)。
兼容性
- Profile:
desktop(桌面版,按钮落在窗口标题栏)与web(dsh web,按钮落在会话头部工具区)。 - 操作系统:Windows 桌面版为主要目标;macOS 桌面与
dsh web走同构的 POSIX 路径。 - 运行环境:Windows 需要 PowerShell 5.1+(系统自带)。不依赖 Node 之外的任何运行时。
实现方式
插件注册一个同源 HTTP 路由,由一段临时脚本在应用外部重启整个应用;脚本经 .NET 进程接口创建并 detached 脱离 DSH 的进程树(否则它会随被关闭的进程一起消失),关闭旧实例、等端口释放后重新拉起应用,并在任务结束时删除自己。脚本内含宿主的环境变量快照,因此只写在当前用户的临时目录、任务结束即自删;同目录还有一份诊断日志,仅在排查「点了没反应」时才有用。
「应用是否已经在运行」不靠进程名或父子关系判断,而是认它的窗口:枚举顶层窗口,只有属于本应用、可见、没有 owner、且窗口类名恰为 Chrome_WidgetWin_1 的才算一个实例。原因是打包后的 CLI 会在应用退出后留下一个没有窗口的 dsh-desktop-host 孤儿进程(父进程已死,于是它看起来也像「树根」),按进程关系判断会把它当成正在运行的应用,于是旧实例被关掉后再也不会有新的被拉起来。窗口探测失败时只记日志并照常拉起,绝不把「探测不出来」当成「已经在运行」。
已知限制
- 重启是整应用级的:所有窗口与未保存的输入都会一起消失(这是桌面版外壳的设计使然——只重启服务端会被判成崩溃)。
- 服务端代码不热重载:修改插件
src/后需要重新构建并重启 DSH,改动才生效。 - 标题栏按钮的位置按原生窗口按钮的宽度估算;若系统使用超大字号或非默认 DPI 缩放导致原生按钮变宽,按钮可能与其重叠或留缝。
- macOS 桌面的按钮落位与 Windows 相同,但重启路径(终止进程后重新打开应用)尚未在真机验证。
- Windows 依赖 PowerShell;它不可用时插件会退回到较弱的启动方式,重启可能失败(日志里有记录)。
- 助手脚本先用进程外的 .NET 进程接口拉起,且必须回报一次「我已就位」宿主才继续:脚本第一句会写一个就绪标记,宿主等到标记才去关闭应用。若助手没能起来,宿主会直接放弃这次重启并留下日志,而不会先把应用关掉——「关了却回不来」正是这条就绪握手机制要防的事。
- 与社区插件
PangXitong/dsh-restart-button同时安装会出现两个重启入口,建议只保留一个。
反馈与贡献
发现了 bug 或有功能建议,欢迎在 Issues 中反馈。提 PR 前请先跑通通用的构建与检查命令。
从源码构建
npm run bundle # src/ → lib/(零依赖,仅用 Node 内置模块)
npm run gates # 产物一致性门禁
npm test # 单元与集成测试
npm run test:e2e # 助手脚本自删与重拉(会真的起进程,但不动正在运行的应用)
npm run test:sim # 启动握手离线取证:只报 pid 而不真启动的 launcher 必须被判失败
src/ 是唯一的手写来源,lib/ 由构建脚本生成,请不要手改 lib/。
许可证
MIT。重启按钮的落位思路参考了社区插件 PangXitong/dsh-restart-button 的公开实现(Apache-2.0);本仓库为独立重写,只保留重启功能。
No comments yet. Be the first to write one.