DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

yashua233 /

yashua233/dsh-restart

Verified

一键重启 DeepSeek Harness:侧栏按钮、/restart 指令、harness_restart 工具共用同一套重启实现。One-click restart for DeepSeek Harness.

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHubProject homepage
READMESource: main@8fbba31a

dsh-restart

中文 | English

一键重启 DeepSeek Harness —— 侧栏按钮、/restart 指令、harness_restart 工具,三条入口共用同一套实现。重启会中断当前会话,所以每一处都强制先问一次。

安装

# 从 GitHub
dsh plugin --profile desktop add github:<owner>/dsh-restart

# 从 npm(若已发布)
dsh plugin --profile desktop add dsh-restart

# 本地目录(开发或自己改的时候)
dsh plugin --profile desktop add link:/path/to/dsh-restart

desktop 是桌面端默认的 profile 名,web 端通常是 web 或你自定义的名字——用你自己的那个(~/.dsh/profiles/ 下能看到的目录名)。装完重启一次 DeepSeek Harness 生效。

三种用法

入口 怎么用 确认方式
侧栏按钮 点「重启 Harness」 就地展开确认条,点「重启」才动手
指令 /restart --yes 必须带 --yes,不带只提示
工具 harness_restart action=restart confirm=true 必须 confirm: true,否则只返回「需要确认」

侧栏按钮是两段式:第一次点击不重启,按钮原地变成「重启会中断当前会话,确定吗?」+[重启][取消]。这是最容易被误触的入口,所以放在最显眼的位置也加最厚的门。

相关插件

如果还想要「工作结束自动发邮件」,可以配合同一个作者的 dsh-qq-mail-notify:每轮工作真正停下后把摘要发到 QQ 邮箱,某一轮跑太久还会先发一封进度通报。改完它的配置之后,正好点本插件的按钮重启生效。

两个插件互不依赖,单独装任何一个都能正常工作。

重启是怎么做到的

按「最干净的先试,不行再往下退」排了三层:

  1. 桌面运行时服务 —— 如果宿主提供了 desktopRuntime / desktopActions 的 requestRestart,直接交给它,Electron 自己 relaunch。最干净,首选。
  2. 脱离进程树重来 —— 没有运行时服务时,写一个 wscript 脚本用 detached + unref 的方式起出去,再让脚本自己做三件事:按 ExecutablePath 精确匹配同名进程(DeepSeek Harness.exe / DSH Desktop.exe)全部 taskkill,等它们真的消失;如果 resources\app 已解包而 app.asar 还在,先把 asar 改名让位(否则 Electron 仍优先加载 asar);最后拉起一个干净的 GUI。
  3. 都不成立 —— 明确返回失败,让你手动重启,绝不假装成功。

第 2 层有个容易忽略的点:Host 进程本身是 ELECTRON_RUN_AS_NODE 模式跑起来的 DeepSeek Harness.exe,和 GUI 主进程同名同路径。所以重启不能按进程名杀,必须按可执行文件路径精确匹配,否则会误杀同一个 exe 的其它实例。

为什么要写文件再杀进程

杀自己的父进程会连带杀掉自己,所以第 2 层必须先把动作写成一个独立脚本,交给 wscript.exe 以 detached 方式启动——它不在宿主进程树里,宿主被杀时它能活下来继续干活。脚本里同时清掉了 ELECTRON_RUN_AS_NODE 和 DSH_PERMISSION_MODE 两个环境变量,避免新拉起的 GUI 继承了宿主模式变成无界面的哑进程。

HTTP 入口的两道门

侧栏按钮走 POST /dsh-restart/restart,这条路能直接打断整个应用,所以加了两层防护:

  • 同源校验:sec-fetch-site: cross-site 一律 403;Origin 和 Host 不一致也 403(dsh-app://app 是桌面端页面自身的 origin,属于正常情况,放行)。别的网页没法诱导你的浏览器替你重启。
  • 强制确认:请求体没有 confirm: true 直接返回 428 needs_confirmation。界面自己会弹确认框,这条是防止有人绕开界面直接打接口。

日志与排障

每次重启都会写 $DSH_HOME/logs/restart.log,关键几行:

begin exe=...
pids=1234,5678
left=0
asar swap: ok
started
  • left=0 说明旧进程全清干净了;不是 0 说明有进程杀不掉(通常是权限或另一个用户会话里的实例),脚本会放弃启动,避免出现两个实例。
  • asar swap: skipped (no unpacked app or no asar) 是正常情况——没有解包过就没什么要让位的。
  • 想确认宿主的重启能力,用 harness_restart action=status,它会返回当前环境、可用的重启路径和延迟。

配置

字段 默认 说明
enabled true 总开关;关掉后三条入口都不注册
delayMs 1200 从触发到真正动手的缓冲毫秒数,留给工具结果和 HTTP 响应送达客户端

写在 profile 的 cordis.patch.yml 里:

- insert:
    - id: dsh-restart
      name: 'dsh-restart'
      config:
        delayMs: 2000

兼容性

  • 目标宿主:DeepSeek Harness >=0.2.0-rc.1 <0.3.0-0(声明在 dshTarget / dsh.compatibility)。
  • 桌面端依赖 wscript.exe(Windows 自带);web 端如果宿主提供了 desktopRuntime 服务,走第 1 层,不需要 wscript。
  • 只重启同路径的桌面进程。Linux / macOS 上的第 2 层不适用,会落到第 3 层返回「需要手动重启」。

隐私

不联网、不收集任何数据。唯一的副作用是写 $DSH_HOME/logs/restart.log,内容只有进程号、asar 是否让位、启动是否成功这几项,不含任何会话内容。

许可证

MIT,见 LICENSE。

—/ 5

No ratings yet

Verified DSH bundle

Commit 8fbba31a160c

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout