前言¶
在 DeepSeek Harness(DSH)里装插件或改 profile 后,往往需要让桌面进程重新跑一遍配置。官方打包版桌面应用本身几乎没有「重启自身」的入口:托盘菜单只有 Open 和 Quit;代码里虽有 Restart App and Host,但被 development = !app.isPackaged 挡在开发构建之外;关窗口只会缩到托盘而不是退出。常见做法是托盘 Quit → 再找图标启动。下面介绍社区插件 dsh-restart-button(维护者 FIZMIE,分类:客户端),在侧栏品牌行增加刷新按钮,并暴露 HTTP 路由,供智能体或脚本触发重启。
这是什么¶
dsh-restart-button 面向 DeepSeek Harness 桌面版:侧栏 DeepSeek Harness 字标右侧多一个小刷新按钮,点击确认后整应用重启;同时挂载 POST /dsh-restart-button/restart,智能体可在不点 UI 的情况下请求重启。
- 目录页:skillhub.cn/plugins/FIZMIE/dsh-restart-button
- 源码与说明:github.com/FIZMIE/dsh-restart-button(MIT,package 版本 1.0.0)
DSH 生态是「一切皆插件」;SkillHub 等社区目录与 DeepSeek / 幻方无官方从属关系,本文仅依据上述仓库 README 与 package 信息。
环境与前提¶
| 项 | 要求 |
|---|---|
| 操作系统 | Windows(重启 worker 使用 WMI、wscript.exe 与 Win32 前台激活) |
| 宿主 | DeepSeek Harness 桌面构建 0.2.0-rc.2 |
| Profile 补丁 | 必须 — 见下文安装步骤 1;不做则插件能装、HTTP 可用,但按钮不会出现 |
Node 引擎要求 >=22.6(见 package.json)。
核心功能¶
- 侧栏品牌行按钮 — 刷新图标紧挨字标。确认后窗口消失、进程重启、窗口回到前台并刷新页面。
- HTTP 路由 — 前缀
/dsh-restart-button,供脚本或 Agent 调用。 - 诊断与日志 —
GET /status、GET /health;重启过程写入$DSH_HOME/.dsh-restart-button/restart.log。
侧栏 brand 行在 Cordis 里是 single 槽位:dsh-client-ui-slots 对同一 single 槽第二次注册会 throw。因此需先禁用官方占位的 @deepseek-ai/dsh-client-ui-brand-official;本插件会重绘官方字标,标题外观保持不变。
安装与启用¶
1. 追加 profile 补丁(必须先做)¶
把下面片段追加到 $DSH_HOME/profiles/<profile>/cordis.patch.yml(完整说明见仓库 install/profile-patch.yml):
- id: ui-brand-official
name: "@deepseek-ai/dsh-client-ui-brand-official"
disabled: true
ui-brand-official 为 @deepseek-ai/dsh-web-app/cordis.patch.yml 中声明的行 id。
2. 安装插件 bundle¶
DSH 插件即 profile bundle,任选其一(README 原文):
# 从 Git 仓库
dsh plugin --profile desktop add git+https://github.com/FIZMIE/dsh-restart-button.git
# 从本地目录
dsh plugin --profile desktop add C:\path\to\dsh-restart-button
3. 刷新页面¶
客户端变更由 dsh-client-modules 热更新,浏览器刷新即可,无需先重启进程;按钮应出现在字标右侧。
HTTP API 与典型用法¶
路由均挂在宿主 Web 服务下:
| Method | Path | 用途 |
|---|---|---|
GET |
/dsh-restart-button/status |
进程身份、可执行路径、是否可重启 |
GET |
/dsh-restart-button/health |
bootId 与 uptime;浏览器侧轮询以感知新进程 |
POST |
/dsh-restart-button/restart |
调度重启,在应用退出前返回 202 |
POST /restart 仅接受 loopback 来源,且请求须带应用自身 origin,或本地 token(写入 $DSH_HOME/.dsh-restart-button/token)。Agent 常用 token 头:
$token = (Get-Content "$env:DSH_HOME\.dsh-restart-button\token" -Raw).Trim()
Invoke-RestMethod -Method Post -Uri "http://127.0.0.1:19387/dsh-restart-button/restart" `
-Headers @{ 'X-DSH-Restart-Token' = $token }
(端口 19387 为 README 示例;以你当前 DSH 宿主实际监听为准。)
实现要点(为何需要独立 worker)¶
桌面壳(Electron main)以 ELECTRON_RUN_AS_NODE=1 拉起 DSH 宿主与插件子进程;插件无法调用 app.relaunch(),现有 IPC 也只有 ready,没有「请重启」消息,因此重启必须由进程树外的 helper 完成。
早期 helper 作为应用子进程,随应用 Job 对象一并被销毁。当前做法是通过 WMI Win32_Process.Create 复制自身,父进程变为 WmiPrvSE.exe,再在旧进程退出后 relaunch 并前台化窗口;并用 wscript.exe + .vbs 无窗启动 worker。README 还记录了 Windows 上 ELECTRON_RUN_AS_NODE、windowsHide、detached 等与 GUI .spawn 相关的坑,以及以 Web 端口再次响应 作为「重启完成」判据。日志与重试上限(5 次)见 $DSH_HOME/.dsh-restart-button/restart.log。
适用场景与注意¶
适合:在 Windows 上使用 DSH 桌面版,频繁改插件或 profile、希望一键或自动化重启,而不是每次走托盘 Quit。
务必注意:
- 插件在当前 DSH 进程权限下运行;安装前请自行审阅 源码与 MIT 许可证。
- 非 Windows 或未打 profile 补丁时,能力会与 README 描述不一致(例如无按钮)。
- 撤销 brand 补丁可恢复官方
@deepseek-ai/dsh-client-ui-brand-official(见仓库install/profile-patch.yml中的 revert 说明)。
结尾¶
dsh-restart-button 补上打包桌面版缺少的自重启入口:侧栏一点即重启,再配合 token 化的 POST /restart 给 Agent 用。安装顺序是 profile 补丁 → dsh plugin add → 刷新页面。