dsh-restart-desktop
在 Windows 上的 DeepSeek Harness 桌面版侧边栏添加「重启」按钮:结束整个应用进程树并重新打开应用。
安装
dsh plugin --profile web add dsh-restart-desktop
沙箱测试
这个插件还没测过。提交测试 →
README
dsh-restart-desktop
给 DeepSeek Harness 桌面版侧边栏加一个「重启」按钮。
点一下,整个 Electron 应用完全退出,然后自动重新打开——不用去托盘菜单,也不用开终端。



English: [README.md](README.md)
功能
- 一键真重启:整个桌面应用退出后重新拉起,效果等同「托盘退出 + 重新打开」,但只需要点一次。
- 位置自然:侧边栏底部、设置上方多一行「重启」;侧边栏收起成 56px 导轨时变成圆形图标按钮。
- 不该出现时不出现:只有 Host 确认当前是 Windows 桌面版时才渲染;
dsh web或其它平台下按钮自动隐藏。 - 不闪黑框:重启助手是脱离应用进程树的 Node 进程,外加隐藏窗口的 PowerShell 子进程,屏幕上不会闪命令行。
- 失败留证据:每次尝试都追加写入
%TEMP%\dsh-restart-desktop\restart.log,启动后还会校验并在失败时重试。 - 中英双语:界面文案、插件管理器显示用的标题/描述、以及原创图标都已就绪。
环境要求
DeepSeek Harness · 桌面版(Electron),dsh >= 0.2.0-rc.1
操作系统 · Windows 10/11
Node · 20+(仅开发时需要)
这是一个 DSH bundle:一半跑在 Host,一半跑在浏览器。它不是普通 npm 依赖,而是装进 DSH profile 的插件。
安装
从仓库地址安装
把 bundle 写进 profile 的 ~/.dsh/profiles/<profile>/package.json,然后重启应用——保留原有条目,两个列表各加一行即可:
{
"dependencies": {
// ……你原有的条目
"dsh-restart-desktop": "github:StarMoon-win/dsh-restart-plugin"
},
"dsh": {
"profile": {
"bundles": [
// ……你原有的条目
"dsh-restart-desktop"
]
}
}
}
也可以在你的构建里用插件管理器(设置 → 插件)从 GitHub 源安装。新 bundle 会热生效;如果侧边栏还没出现按钮,刷新一下页面。
从本地 checkout 安装
git clone https://github.com/StarMoon-win/dsh-restart-plugin.git
然后把 profile 指向该目录:
"dependencies": {
"dsh-restart-desktop": "link:/absolute/path/to/dsh-restart-plugin"
}
并把 "dsh-restart-desktop" 加进 dsh.profile.bundles,或者用插件管理器安装这个目录。
卸载
从 dsh.profile.bundles(以及 dependencies)里移除 dsh-restart-desktop,重启应用即可。
使用
1. 在侧边栏底部、设置上方找到「重启」。
- 展开状态:图标 +
重启/Restart。 - 收起状态:圆形图标按钮,悬停有原生提示。
2. 点它。页面显示「正在重启…」,约 1 秒后应用退出,随后新实例自动打开。
3. 正在运行的任务会被中断。 没有二次确认——点击本身就是确认。
如果按钮显示「重启失败」,等几秒再试,并查看日志:
%TEMP%\dsh-restart-desktop\restart.log
工作原理
侧边栏按钮 (client.js)
│ GET /dsh-restart-desktop/status → 只有支持时才渲染
│ POST /dsh-restart-desktop/restart → 返回 202,页面随应用一起退出
▼
Host 路由 (index.js)
│ 写 %TEMP%\dsh-restart-desktop\request.json
│ 以 detached 方式启动 helper.mjs(ELECTRON_RUN_AS_NODE=1)
▼
重启助手 (helper.mjs)
1. 等 1.2 秒,让 HTTP 响应先离开 Host
2. 用 Windows PowerShell 按镜像名算出应用进程树
(排除助手自己和 PowerShell 自己)
3. 结束整棵树:主进程、渲染器、GPU、Host,
以及它们启动的工具进程
4. 用干净环境启动同一个可执行文件
5. 4 秒后校验,失败最多重试三次;全程写日志
为什么必须强制结束
桌面外壳把「关闭主窗口」改成了隐藏到托盘,退出前还会向 Host 查询任务并弹确认框;app.asar 里没有任何给插件用的 app.quit() / app.relaunch() 通道(Host 与 Electron 主进程之间只有主进程发起的 quit-inspection / update-tasks 两个消息)。
所以插件能做出的「完全重启」,只能是由应用进程树之外的助手结束整棵树,再重新拉起可执行文件。上面的 helper 做的就是这件事。
安全边界
两条路由只接受本机、本页面的请求:
- 只接受回环地址(
127.0.0.1/::1); - 带
Forwarded、X-Forwarded-For、X-Real-IP的转发请求一律拒绝; Host必须是本机地址(127.0.0.1、localhost、[::1]),顺带挡住 DNS rebinding;- 带
Origin时必须与Host同源; - 桌面文档代理的「回环、无 Host、无 Origin」形态被认可;
- 重启只接受
POST,GET /dsh-restart-desktop/restart固定返回405。
开发
git clone https://github.com/StarMoon-win/dsh-restart-plugin.git cd dsh-restart-plugin node --check index.js node --check client.js node --check helper.mjs node scripts/validate.mjs
scripts/validate.mjs 会在不激活插件的前提下检查清单 exports、语言文件、图标和 patch 文件。
想在不碰应用的情况下试重启助手:写一个请求文件指向无害程序(例如 notepad.exe、镜像名 notepad、延迟 200ms),然后 node helper.mjs <request.json>,日志会显示停止、启动和校验的过程。
修改后如何重新加载
用 link: 装进 profile 的包直接指向你的工作区。Host 代码跨 junction 不会热更新,所以改完 index.js 或 helper.mjs 后:
1. 在设置 → 插件里把 dsh-restart-desktop 关掉再打开,或者
2. 用新的按钮重启应用。
浏览器侧(client.js)会在下一次页面加载时生效。
排错
现象 · 检查
侧边栏没有按钮 · 确认是 desktop profile 且 bundle 在 dsh.profile.bundles 里;在应用源上打开 /dsh-restart-desktop/status,supported 必须为 true。
一直显示「重启失败」 · 看 %TEMP%\dsh-restart-desktop\restart.log。没有 launched pid=… 说明助手没能启动可执行文件。
安装报 timed out waiting for the writer lock · profile 里有残留的 package.json.lock;重启应用让记录的 PID 消失,再装一次。
应用退出了但没重开 · 日志以 FAILED: the application did not come back 结尾。手动打开应用后把日志发出来。
许可证
[MIT](LICENSE) © Star_Moon_win
GitHub Topics
本仓库已经打上这些 Topics:
deepseek-harness · dsh · dsh-plugin · deepseek · cordis · cordis-plugin · electron · desktop · restart · windows
这些词也同步写进了 package.json 的 keywords,方便 npm 和搜索。
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:2,最后更新 2026-10-20