前言¶
在 DeepSeek Harness(DSH)里改插件组合、调 profile 配置,或迭代插件宿主代码时,你常常需要让变更生效。官方桌面版是 Electron 外壳加 host 子进程:插件够不到外壳 IPC 白名单,host 也不能自行退出重启,否则会触发崩溃恢复流程。社区维护者 MerlinShieh 的客户端插件 dsh-plugin-restart-control 在设置页增加 重启 / Restart 分区,提供官方语义下可达成的两档操作——重载内核(HMR 重组插件树)与重启应用(分离助手重启外壳)。下面介绍它做什么、如何安装启用,以及使用时需要留意的边界。
这是什么¶
dsh-plugin-restart-control 是 DSH 的客户端插件,仓库 MerlinShieh/dsh-plugin-restart-control,维护者 MerlinShieh,许可证 MIT。它在 设置 → 重启 / Restart 暴露两个档位,分别对应 DSH 自身使用的两条路径:不重开进程的热重载,以及彻底结束外壳再拉起。
两档操作分别做什么¶
| 档位 | 做什么 | 代价 |
|---|---|---|
| 重载内核 | 让 DSH 的 HMR 重新组合整棵插件树(配置重读、插件重新挂载) | 秒级;进程与窗口保留;换包版本 / 原生模块并不生效 |
| 重启应用 | 分离助手结束外壳进程并重新拉起同一可执行文件 | 更彻底;会中断正在运行的任务;窗口重建 |
重载内核的实现与 dsh-market 做插件启停时相同:向当前 profile 的 cordis.patch.yml 追加或更新一行带时间戳的注释(# dsh-plugin-restart-control: kernel reload marker …),HMR 检测到配置层变化后重组插件树;插件只增删自己的那一行注释,不改动你已有的配置。
重启应用走分离助手:用 process.execPath 以 ELECTRON_RUN_AS_NODE=1 启动助手(不要求系统另装 Node),先结束外壳(外壳退出会断开 host 的 IPC,host 随之优雅关闭),必要时强杀 host,等端口释放后再拉起新实例;全程按 PID 结束进程,避免 taskkill /IM 误伤同名助手。
为什么是这两档而不是「一键 relaunch」¶
官方桌面版里,host 与 Electron 主进程之间的 IPC 是封闭白名单(dsh-desktop-host 的 process.on("message") 只认 shutdown / quit-inspection / update-tasks),白名单外消息会导致主进程直接 SIGTERM。主进程把 host 的主动退出判为失败(dsh desktop host stopped、acknowledged an unrequested shutdown),会弹崩溃恢复对话框。因此插件无法请求外壳执行 app.relaunch(),本插件提供的是在此约束下仍可行的最强两档。
安装与启用¶
dsh plugin add 只把包装进 profile,不会自动写入 profile 的组合包列表。装好后要到 设置 → 插件 打开 dsh-plugin-restart-control 的开关(等价于加入 dsh.profile.bundles),否则不会被加载;官方插件管理器会代做这一步。
方式一:GitHub(推荐)
dsh plugin --profile <profile> add "github:MerlinShieh/dsh-plugin-restart-control"
包会解析为 dsh-plugin-restart-control。README 提到实测 pnpm 约 5 秒完成安装。
方式二:Release tarball(离线 / 内网)
dsh plugin --profile <profile> add https://github.com/MerlinShieh/dsh-plugin-restart-control/releases/download/v0.1.0/dsh-plugin-restart-control-0.1.0.tgz
方式三:官方桌面版
桌面版独占 desktop profile,外部 CLI 会对它报 profile "desktop" is managed exclusively by the Electron application。请在 设置 → 插件 → 添加插件 填入上述任一种安装源,再打开组合包开关。
方式四:本地路径(开发迭代)
pnpm add file:/绝对路径/dsh-plugin/restart-control
file: 安装是快照:改源码后要重新 pnpm add;插件在 node_modules 内不参与 HMR 监视,宿主半区代码改动需要重启应用。
npm 包尚未发布;发布后可用 dsh plugin --profile <profile> add dsh-plugin-restart-control(支持版本范围与 pnpm update)。
典型用法¶
装好后打开 设置 → 重启 / Restart:
- 重载内核:点一下即写入标记行并触发热重载;界面会提示「插件树正在重新组合」。
- 重启应用:点击后进入二次确认(避免误点中断任务);确认后提示「正在重启」,应用回来后本页自动恢复。
- 查看重启日志:助手把步骤写入
$DSH_HOME/dsh-plugin-restart-control/restart.log,设置页可查看尾部;重启失败时这是主要排查依据。
若当前有正在运行的任务,分区顶部会有橙色提示;重启应用会中断它们。
安全与兼容性¶
控制路由只接受:回环(或 webRuntime.trustedHosts 里声明的权威)Host 头;同源浏览器标记(Sec-Fetch-Site 不是 cross-site,Origin 与 Host 一致);content-type: application/json 的 POST,body 上限 64 KiB。这是防 DNS-rebinding / 跨站请求的栅栏,不是身份认证。
peerDependencies 使用范围声明(>=0.1.0-rc.6 <0.3.0-0),在 DSH 0.2.0-rc.2 上通过官方兼容性检查。宿主半区需要 webServer 与 webRuntime;客户端半区需要 slots 与 locale。package.json 中 engines.dsh 为 >=0.2.0-rc.1 <0.3.0-0,Node >=20。
适用场景与注意¶
适合谁:经常在 DSH 里启停插件、改 patch 配置、需要快速让插件树生效的开发者;需要彻底重启 Electron 外壳(例如原生模块或已 import 的 Node 模块问题)时,用「重启应用」。
务必知晓的限制:
- 「重载内核」不等于重启进程:不会重新加载 Node 已 import 的模块,也不解决 native addon 占用;需要时用「重启应用」。
- 「重启应用」按 PID 强制结束外壳,不走
before-quit确认;正在运行的任务会被中断。 - 失败恢复是精简版:助手只写日志,无类似
dsh-market的恢复页;若应用未自动回来,请手动启动并查restart.log。 cordis.patch.yml不存在或为空时,「重载内核」返回patch-missing并保持禁用。
插件在当前 DSH 进程权限下运行;安装前请自行查看仓库源码与 MIT 许可证,确认符合你的环境策略。DSH 生态是「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-plugin-restart-control 把 DSH 设置页补全为可操作的「重载内核 + 重启应用」两档,在官方 IPC 与 host 生命周期约束下给出可复现的路径,并附带任务占用提示、二次确认与重启日志。需要安装源与细节时,见 GitHub 仓库 与 SkillHub 目录页。