13520rygvv/dsh-restart-button

13520rygvv/dsh-restart-button

从三处重启 DeepSeek Harness 桌面端:设置里的按钮、账号菜单「退出登录」上方的一项、以及可自定义的快捷键;有运行中的任务时会先确认。仅支持 Windows 桌面版。

UI 增强deepseek-harnessdsh-desktop

DSH 重启按钮(dsh-restart-button)

给 DeepSeek Harness 桌面版 的本地插件:在「设置 → 通用」里加一个一键重启按钮,并把同一动作做成可自定义的快捷键。不用再右键托盘图标退出、再手动启动。

仅支持 Windows 桌面版。原理依赖 Electron 主进程 + Host 进程的父子关系,Web/CLI 部署不适用。

功能

  • 设置里的重启按钮:设置 → 通用 → 「重启 DeepSeek Harness」→ 点「重启」,约 2 秒窗口关闭并自动重新打开。
  • 快捷键:默认 Ctrl+Alt+R(仅桌面端默认绑定),在 设置 → 通用 → 键盘快捷键 里可以改成任意组合(支持单键/双键)。
  • 左下角账号菜单:点左下角头像 → 弹窗里在「退出登录」上方多一项「重启」(官方菜单没有插件扩展位,这一项是克隆官方菜单行实现的,见「已知限制」)。
  • 有任务时会先问:仅当真的有进行中的任务(agent 正在生成/工具在跑、排队的用户消息、后台 job、挂起的定时任务)时,才会弹出确认卡片(Esc 取消);空闲时一键直接走。
  • 优雅重启:结束的是 Electron 外壳,宿主进程会因 IPC 断开自行完成关闭(会话日志正常落盘),然后重新启动应用。
  • 重启顺带安装已下载的更新:DSH 的应用内更新由 electron-updater 下载到本地缓存;如果缓存里的安装包比当前版本新,点重启会先静默安装它再启动,不会出现「更新下载好了但装不上、得手动跑安装器」的情况。

安装

这是 DSH 的本地插件包(dsh.bundle),把整个目录放在任意位置,然后用 DSH 的插件管理器安装:

plugin_manager install_bundle  target = <本目录的绝对路径>

或在会话里让 DSH 的 agent 帮你装(对它说「装一下这个本地插件」)。安装会写入 desktop profile 的 bundle 列表,插件对所有会话生效并随应用启动加载。

使用

操作 · 位置 重启按钮 · 设置 → 通用(在「当前版本」上方) 账号菜单入口 · 左下角头像 → 账户弹窗 → 「退出登录」上方 改快捷键 · 设置 → 通用 → 键盘快捷键 → 「重启 DeepSeek Harness」→ 点键位重新录制 查看诊断日志 · 插件目录下的 launch.log(重启脚本每一步)、orchestrator.log(交接记录)、blocked.json(最近一次被拦截的原因)

实现原理

页面(设置行 / 快捷键)
   └─ POST /api/dsh-restart            ← 走 DSH 自带的 /api 鉴权载体
        └─ 宿主插件:判断是否有任务 → 需要确认就先回 needs-confirmation
             └─ spawn + await launch.ps1        (同步等交接完成)
                  └─ WMI Win32_Process.Create   (让重启脚本独立于宿主存活)
                       └─ restart.ps1:更新缓存里有比当前版本新的安装包?
                            → 是:静默运行它(/S --updated)并启动应用
                            → 否:结束 Electron 主进程
                                 → Host 感知 IPC 断开,自行优雅退出(会话落盘)
                                 → Start-Process 重新启动 DeepSeek Harness.exe

几个关键点:

  • 宿主进程用 detached: true 拉起的 PowerShell 会直接退出且不执行脚本(实测),所以改用 WMI 创建独立进程;
  • 判断「是否有任务」不能用 agent.inbox.nextStep:系统通知(例如权限变更提示)会滞留在 idle 会话里,导致永远误报;
  • 快捷键默认值只声明桌面端:Web 端的 page.refresh(刷新页面)已占用 primary+alt+KeyR。
  • 更新安装包存放在 %LOCALAPPDATA%\@deepseek-aidsh-desktop-updater\installer.exe;插件读取 resources\app.asar 里的版本号与它比较,只有安装包版本更高才执行安装。安装器若触发 UAC 会弹出授权框。

文件结构

文件 · 作用 index.js · 宿主半边:/api/dsh-restart 路由、任务检测、启动重启编排脚本 client.js · 页面半边:设置行、确认卡片、快捷键命令、文案字典 launch.ps1 · 编排器:用 WMI 创建真正执行重启的脚本(宿主退出后仍存活) restart.ps1 · 真正重启:校验进程路径 → 检查更新缓存(有更新的安装包则静默安装)→ 结束主进程 → 等待宿主优雅退出 → 启动应用 cordis.patch.yml · 插件加载条目 locale/*.json · 插件管理页显示用的标题/描述 icon.svg · 插件图标

已知限制

  • 仅 Windows 桌面版;重启时没有「你确定要退出吗」的原生对话框(有任务时由插件自己的卡片确认)。
  • 依赖系统自带的 WMI 与 PowerShell 7(没有 PowerShell 7 时回退到 Windows PowerShell)。
  • 重启会中断正在生成的任务(确认卡片里会说明)。
  • 账号菜单那一项依赖官方 DOM:DSH 的账户弹窗是硬编码菜单、没有插件扩展位,插件是克隆「退出登录」那一行(保留原生样式、图标位、悬停)后替换文案/图标/点击实现的。DSH 改版后该行可能不再出现,另外两个入口不受影响;届时告诉项目维护者适配即可。

更新记录

每次迭代、修复都会在这里记一条;提交号可在 GitHub 提交历史里对应查看。

2026-10-23

初版(`6516780`)

  • 设置 → 通用 增加「重启 DeepSeek Harness」按钮。
  • 重启链路:结束 Electron 外壳 → 宿主因 IPC 断开自行优雅退出(会话日志落盘)→ 重新启动应用;执行重启的进程由 WMI 独立创建,不随宿主退出而中断。
  • 有任务时先确认:判断依据是真实工作(运行中的 agent、排队的用户消息、运行中/正在停止的后台任务、挂起的定时任务),空闲时一键直接重启。

账号菜单入口(`cf26aa6`)

  • 左下角头像弹窗在「退出登录」上方增加「重启」。官方菜单没有插件扩展位,这一项是克隆官方「退出登录」行(沿用原生样式、图标位、悬停)后替换文案/图标/点击实现的,DSH 改版后可能失效,见「已知限制」。
  • 同时补充 README 的三入口说明与兼容性说明。

快捷键修复(`4f8ea5c`)

  • 修复:某些启动顺序下「重启 DeepSeek Harness」没有出现在 设置 → 通用 → 键盘快捷键 列表里。原因是客户端比快捷键服务先激活导致注册被跳过;改为等待服务就绪后再注册。
  • 清理了排查用的临时诊断代码。

文档(`458d949`)

  • 补充「关于上传」一节,说明本仓库由 AI 助手代为创建、提交和推送。

2026-10-24

重启顺带安装更新(`87934ac`)

  • 重启前检查 electron-updater 的缓存(%LOCALAPPDATA%\@deepseek-aidsh-desktop-updater\installer.exe),读取 resources\app.asar 里的运行版本来比较;更新包版本更高时静默运行安装包(/S --updated)并重新启动,否则照旧重启。
  • 这样应用内更新下载完成后点重启就会装上,不再卡在「下载成功但装不上、得手动跑安装器」。
  • 顺手清理了排查期间留下的临时诊断代码(host-report.log 已加入忽略列表)。

早期开发中的两个问题(发布仓库前已修)

  • 用 detached 方式拉起 PowerShell 会让脚本直接退出、什么都不执行;改为由编排脚本通过 WMI 创建独立进程来执行重启。
  • 判断「是否有任务」时曾把 idle 会话 inbox 里滞留的系统通知(例如权限变更提示)算作任务,导致空闲时误报;改为只看真正会打断的工作。

关于上传

本仓库不是仓库主人手动创建/上传的:代码由仓库主人在 DSH(DeepSeek Harness)会话中与 AI 助手协作完成,仓库创建、提交、推送以及临时访问令牌的创建与删除,全部由该 AI 助手代为自动执行(主人只授权了 GitHub 登录会话并选择了公开可见性)。因此提交历史里的自动化痕迹(单次批量提交、临时 PAT)是预期现象。