dsh-retry: Add a native "Restart DeepSeek Harness" entry to the DSH Desktop

前言

在 Windows 上使用 DeepSeek Harness(DSH)桌面端时,托盘右键和左下角账户菜单里通常只有「打开 / 退出」或「设置 / 退出登录」一类项;打包版主进程里也没有面向普通用户的可点击重启入口。改插件、换 profile、或等 app.asar 补丁重装时,往往需要整进程退出再开,却缺少与官方 UI 同级的操作。社区插件 dsh-retry(维护者 kouzerror)针对的是这一类场景:在托盘、账户菜单和设置页提供统一的优雅重启,并说明补丁与官方 slot 如何分工。

这是什么

dsh-retry 是 DSH 的客户端类插件:在 Windows 桌面端增加原生的 Restart DeepSeek Harness 操作,样式与位置贴近官方菜单;同时在设置里注册「重启与更新」区块,部分能力不依赖对安装目录 app.asar 的改写。仓库:github.com/kouzerror/dsh-retry;社区目录页:skillhub.cn/plugins/kouzerror/dsh-retry。许可证 MIT(见仓库 README)。

三个入口分别在哪

入口 位置 是否依赖核心补丁
系统托盘 右下角托盘图标 → 右键菜单 是(与「打开 / 退出」并列)
账户菜单 左下角头像 → 弹出菜单 是(带刷新图标,与设置等并列)
设置页 设置 → 重启与更新 否(官方 settings.section slot,id dsh-retry)

三个入口最终都调用宿主同源路由 POST /dsh-retry/restart。已装好补丁且 asar 为最新时,走 app.relaunch() 类优雅重启:先正常退出再自动重开,不硬杀进程。补丁尚未装入时,同一路由可返回 202,由 PowerShell helper 完成「结束进程 → 替换 asar → 再拉起 DSH」。

为什么分「补丁半」和「客户端半」

DSH 桌面端的托盘与账户菜单模板写在安装目录 resources/app.asar 内,没有向插件开放的菜单 slot,也没有 quit/restart 类 IPC。因此插件拆成:

  1. host(lib/index.js):提供 /dsh-retry/status、/prepare、/restart、/update 等路由。
  2. client(lib/client.js):经 dsh.client 加载,注册设置页,不依赖补丁即可显示重启与状态面板。
  3. patch(lib/patch.js + scripts/restart-helper.ps1):在内存中改 lib/main.js 与账户菜单 bundle,重建补丁版 asar。

DSH 升级会覆盖 app.asar;自 0.4.0 起,插件在启动约 3 秒后检查补丁,必要时自动重启一次 DSH 完成重装。同一已安装构建最多自动重启 2 次(guard 与桌面端版本、未补丁 asar 大小相关);restart-guard.json 损坏时按 fail-closed 停止自愈。0.5.0 起设置页走官方 slot,即使更新把补丁抹掉,设置页仍可重启;托盘与账户项在补丁自愈后恢复。

安装与启用

方式一:DSH 插件市场。 条目见 awesome-dsh-plugin.com/p/kouzerror/dsh-retry/,或在 DSH 插件市场搜索 dsh-retry。市场按 github:kouzerror/dsh-retry 源码安装,发版后可提示更新。

方式二:本地目录或 Release 的 tgz。 在 profile 目录用 pnpm 安装(与插件管理器同类方式):

cd "$env:USERPROFILE\.dsh\profiles\desktop"
pnpm add file:C:\path\to\dsh-retry
# 或从 Release 安装
pnpm add file:C:\path\to\dsh-retry-0.6.1.tgz

安装后在 DSH 设置 → 插件 中启用 dsh-retry。用 file: 安装时 pnpm 会复制目录而非软链,改源码后需重新安装 bundle 才生效。

首次完整流程建议:

  1. 托盘 → 退出 DeepSeek Harness,再重新打开(不是只刷新窗口)。
  2. 新实例加载 client bundle 后,设置页「重启与更新」应出现。
  3. 同一实例约 3 秒后可能自动重启一次,用于把补丁写入 app.asar;之后托盘与账户菜单项一并出现。

从 0.4.x 升到 0.5.x 或升到 0.6.x 时,README 均要求完整重启 DSH 一次,以便 dsh.client 与 client-modules 重新组合 bundle。

典型用法与自检

从 UI 重启: 任选托盘项、账户菜单项,或设置 → 重启与更新中的按钮。

用 HTTP 看补丁状态(端口为当前 GUI 对应 host 端口):

Invoke-RestMethod http://127.0.0.1:<port>/dsh-retry/status | ConvertTo-Json

关注 patched、mainPatched、accountPatched、missing、writeAccess、autoRestart、foreignPatch 等字段。patched: true 且 missing 为空表示两处菜单补丁已生效;foreignPatch.detected: true 表示 asar 可能被其他同样改 lib/main.js 的插件动过,插件会暂停自动覆盖并在设置页提示。

/dsh-retry/restart 常见响应:

状态码 含义
200 已是最新补丁,写触发文件后优雅重启
202 已暂存补丁,helper 执行杀进程、替换、再拉起
409 15 秒内重复点击或 restart 进行中
503 当前用户无法写入 resources

0.6.0 起,设置页「插件更新」可从 GitHub Releases 拉 tgz、校验 sha256 后安装到 profile,再引导重启生效。

适用场景与注意

  • 适合: 经常在 Windows DSH 桌面端调试插件、依赖 profile 内 client bundle 或需在不丢会话前提下整应用重开的用户。
  • 环境: /dsh-retry/status 返回 not_desktop(409)时,说明非 Windows 桌面宿主,插件不生效。
  • 权限与安全: 插件以当前 DSH 进程用户权限运行,补丁会改写安装目录下的 app.asar(经 helper 与备份策略);安装前应阅读仓库源码与 MIT 许可证,并确认对 resources 有写权限(否则易见 503)。
  • 兼容性: package.json 声明 engines.dsh 为 >=0.2.0-rc.1 <0.3.0-0,node 为 >=22.19.0;与具体 DSH 桌面版本不匹配时以官方文档与仓库 issue 为准。
  • 生态: DSH 社区插件目录(含 skillhub 条目)为独立站点,与 DeepSeek / 幻方无官方从属关系;安装方式以 README 与市场条目为准,勿自行拼接未在资料中出现的 CLI 安装命令。

结尾

dsh-retry 的价值可以概括为:在官方未开放托盘/账户菜单扩展的前提下,用可控的 asar 补丁补上两个原生入口,并用设置页 slot 保留「随时能重启」的兜底;升级 DSH 后靠启动自愈或设置页手动重启即可恢复。进一步了解实现与排障表见 GitHub README;浏览与安装入口见 目录页 与 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye