前言¶
在 DeepSeek Harness(DSH)里开发插件或调试界面时,经常需要刷新页面或重启应用。桌面版按 ⌘R 在焦点落在输入框时有时不生效,且位置不固定;菜单里的「重启应用与 Host」入口较深。这个插件就在界面左上角「收起侧边栏」按钮旁边,加入「刷新界面」和「重启应用」两个按钮,位置会跟随侧栏的展开/收起与窗口大小自动调整。
是什么¶
dsh-refresh-restart 是一个给 DeepSeek Harness 桌面界面增加快捷操作的工具插件。它维护者为 hulibuld,分类属于客户端插件。核心价值是在左上角固定位置提供「刷新」和「重启」两个按钮,方便开发与日常使用。
核心功能¶
- 刷新界面:等价于在界面里按
⌘R。只重新加载界面层,宿主后台的生成任务继续运行,正在生成的回答不会被中断。插件代码改动后刷新即可看到效果。 - 重启应用:点击后弹出二次确认,关闭窗口,几秒后自动重新打开应用。会话与工作区保持不变,等同于菜单里的「重启应用与 Host」。
- 取消保护:如果重启时应用中有任务在跑,DSH 会再弹一个「关闭应用会中断当前正在进行的任务」的提示;点「取消」则本次重启作废,应用不受影响。
兼容性¶
- macOS 桌面版:刷新和重启均可用。
- Windows 桌面版:刷新和重启均可用(使用 PowerShell 助手处理退出与重开)。
- Linux 桌面版:刷新和重启均可用(使用
SIGTERM退出,重开 AppImage 或可执行文件)。 - 浏览器(
dsh web):仅支持刷新界面,重启需要手动操作。
安装与启用¶
方式零:一行命令(推荐)
# 走 npm,获取最新版本
dsh plugin add dsh-refresh-restart
或者直接安装 GitHub Release 预打包的 tgz:
dsh plugin add https://github.com/hulibuld/dsh-refresh-restart/releases/download/v0.2.1/dsh-refresh-restart-0.2.1.tgz
装完后重启 DSH,左上角即会出现两个按钮。
方式一:插件市场 / 插件管理器
如果 DSH 已安装插件市场,在插件管理器中搜索 dsh-refresh-restart 并安装即可。
方式二:手动安装到 profile
git clone https://github.com/hulibuld/dsh-refresh-restart.git
cd dsh-refresh-restart
假设 DSH 的 profile 目录为 <profile>(例如 desktop),执行以下步骤:
- 在
<DSH_HOME>/profiles/<profile>/node_modules/下建立软链,指向仓库目录:
ln -s /path/to/dsh-refresh-restart <DSH_HOME>/profiles/<profile>/node_modules/dsh-refresh-restart
- 在
<DSH_HOME>/profiles/<profile>/package.json的dependencies里加入:
"dsh-refresh-restart": "link:/path/to/dsh-refresh-restart"
- 在同一个文件的
dsh.profile.bundles数组中加入:
"dsh-refresh-restart"
- 重启 DSH。按钮出现在左上角;若未出现,刷新一下页面即可。
卸载时删除上述 1–3 步加入的内容并重启 DSH。
配置¶
在 cordis.patch.yml 中可调整以下参数(也可写在 profile 的插件配置里):
| 配置项 | 默认值 | 说明 |
|---|---|---|
quitTimeoutMs |
20000 |
等应用自行退出的上限。超时按「用户取消」处理,不会强制终止 |
openDelayMs |
800 |
确认进程消失后,隔多久重新打开应用 |
appPath |
空 | 留空则自动推断应用路径:macOS 查找 .app,Windows 使用 exe,Linux 优先 APPIMAGE。更换安装位置或使用绿色版时可填写绝对路径 |
forceKill |
false |
超时后是否强制终止应用。默认关闭;只有应用确实卡死且能接受丢失未保存草稿时才开启 |
实现方式¶
插件采用纯本地实现,无运行时依赖,无需构建步骤:
index.js:宿主端,导出配置与 apply 函数,注册status和restart两个路由。client.js:浏览器端,手写__ModuleLoader__模块,注册shell.overlay插槽组件。lib/platform.js:平台识别,判断是否支持重启,生成退出与重开计划及助手脚本源码。lib/restart.js:重启服务,持有 token,将助手写入临时目录并 detached 拉起。lib/routes.js:路由封装,校验方法、仅 loopback、action token 与 JSON 响应。cordis.patch.yml:bundle 补丁,将插件注入宿主。test/:使用node --test的回归测试。
重启之所以复杂,是因为桌面版是 Electron 应用,宿主只是它的子进程。若只杀宿主,窗口会保留但界面不再响应。因此插件会生成一个脱离宿主的助手,先请应用自行退出,确认进程消失后再重新打开。不同平台的退出与重开命令不同,均已实现。
安全与隐私¶
- 所有路由仅监听
127.0.0.1,并校验Host头,防止 DNS rebinding 攻击。 - 重启请求为 POST,必须携带
status响应中的随机 token(x-dsh-refresh-restart-key头),跨站Origin会被拒绝。 - 助手脚本写入临时目录,权限为
0700,仅执行退出、等待、必要时强杀与重开。 - 不联网、不收集任何数据、不读取会话内容;只使用
process.execPath、process.platform等运行时信息。
排障¶
- 按钮未出现:插件清单只在启动时读取,请确认 profile 的
package.json中dsh.profile.bundles包含dsh-refresh-restart,然后重启应用。 - 窗口关闭后未重新打开:查看临时目录中的日志文件(Windows 为
%TEMP%\dsh-refresh-restart-<时间>.log,macOS/Linux 为$TMPDIR/dsh-refresh-restart-<时间>.log)。成功时会写relaunched ok, new pid=…,失败时会写relaunch failed: no new process appeared。如果日志停在helper start,可能是安全软件拦截,请将 DSH 加入白名单再试。 - 提示「关闭应用会中断当前正在进行的任务」:点「取消」即可,本次重启作废;如想重启请先等待任务结束。
- 提示「已取消重启」:说明应用未成功退出,一切照常。如果反复出现且确实需要强杀,可将
forceKill设为true。 - 提示「没找到应用位置」:自动推断失败,请在配置中填写
appPath(macOS 填.app,Windows 填 exe,Linux 填 AppImage)。
生态背景¶
DeepSeek Harness 的理念是「一切皆插件」,社区插件目录由独立站点维护,与 DeepSeek / 幻方无官方从属关系。本插件为社区维护的非官方工具,仅供本地使用。
总结¶
这个插件通过在界面左上角提供「刷新」和「重启」两个按钮,解决了在 DSH 中刷新页面与重启应用不便的问题。它实现了跨平台的桌面重启逻辑,并内置二次确认与取消保护,避免误操作。如果你经常调试界面或频繁重启应用,这个插件可以提升日常使用的效率。