dsh-restart-planner:把 DSH 宿主重启变成 agent 可调用的工作流

前言

在 DSH(DeepSeek Harness)里做插件或改宿主侧 .js 时,常见提示是「重启后生效」。以往这一步只能等人手动关掉再打开:agent 写完配置、测完逻辑,最后往往只能把「请你重启 DSH」写进回复然后停住。重启本身会结束当前进程,若在同一轮里直接杀宿主,回复还可能没送到用户眼前。

dsh-restart-planner(维护者 7gzgn,社区分类:工作流)面向上述缺口:让 agent 通过工具调用排程一次自重启,先把当前这一轮正常说完,再由独立 helper 停掉宿主、原地拉起、体检并落盘报告。插件零依赖、纯本地、不联网,平时不常驻、不轮询。

这是什么

一句话:给 DSH 用的自重启插件——self_restart 工具 + 可选 CLI dsh-restart-planner,把「杀正在说话的进程」拆成排程、交接、动手三段,避免 helper 和宿主死在同一棵进程树里。

仓库:github.com/7gzgn/dsh-restart-planner(MIT)。目录页:SkillHub - dsh-restart-planner(社区站点,与 DeepSeek / 幻方无官方从属关系)。

当前 package 版本为 0.4.6(以仓库 package.json 为准)。声明的 DSH 兼容区间为 peerDependencies >=0.2.0-rc.2 <0.3.0-0(整个 0.2 线);Windows 桌面端与 dsh web 在 README 中有实测说明,macOS / Linux 代码存在但未在真机验证。

核心机制:三段式排程

下面介绍插件如何把「一次自杀」拆成三个互不相干的阶段。

阶段 执行者 行为
1. 排程 agent / 用户 调用 self_restart(如 action: "schedule")后立即返回,本轮尚未结束,宿主也未被杀
2. 交接 插件(宿主内) 计算要结束的进程与拉起命令,把任务交给进程树外的 helper,并等待其回报
3. 动手 helper(独立进程) 等待 delaySeconds → 等待会话目录静默 → 停止宿主 → 重新拉起 → 体检 → 写报告

关键约束:helper 必须活过它将要杀掉的那棵进程树。Windows 桌面端宿主在 Chromium job object 内,若 helper 也在同一 job,被杀时会一并消失;README 记载需经 explorer.exe 启动 helper(生成 .lnk),拿不到 Explorer 时会降级为普通子进程并在报告中标明。

工具用法

典型排程(装完插件、改代码后重载宿主):

self_restart({ action: "schedule", reason: "装完插件要重载宿主" })

调用后应照常把本轮回复说完;实际重启发生在回复送达之后。下一轮可用:

self_restart({ action: "status" })     // 体检 + 上一次重启结果
self_restart({ action: "cancel" })     // 撤销尚未执行的重启
self_restart({ action: "resume" })     // 手动补投「重启后继续」(启动时未投成时用)

常用可选参数(完整 schema 以工具定义为准):

参数 默认 含义
reason — 写入报告的重启原因
delaySeconds 20 动手前至少等待时间(留出回复送达)
quietSeconds 4 会话目录静默多久视为写盘完成
maxWaitSeconds 180 等待静默的上限
dryRun false 只演算并写 dry-run 报告,不杀不拉、不放 helper
relaunchCommand 自动 宿主由包装脚本启动、自动识别不准时手动指定
confirm false 先通过宿主 user-questions 问用户何时重启
confirmFallback ask-later 无人应答时:ask-later / cancel / now
confirmTimeoutMs 90000 等待用户回答的上限
resume true 重启后自动向原会话排队投递一句「继续」(v0.4.0)
continuePrompt 默认文案 自定义该条继续提示的内容

需要用户选时机时:

self_restart({ action: "schedule", confirm: true, reason: "装完插件要重载" })

用户可选立刻 / 30 秒后 / 60 秒后 / 取消;选「立刻」仍会先说完本轮并等日志落盘(约 3 秒最小窗口)。默认不询问,适合无人值守。confirm 依赖 @deepseek-ai/dsh-base 的 user-questions;若无该服务,结果会标明 no-asker 及采用的 fallback,不会假装已弹窗(v0.4.5 行为)。

重启后自动继续(v0.4.0)

排程时会将会话 id 写入 $DSH_HOME/dsh-restart-planner/resume.json。新进程启动后,插件通过 ctx.sessionController.prompt 以 mode: 'queue' 向原会话投递继续提示;仅投递成功才清除标记。全局可用 resumeAfterRestart: false 关闭;单次可用 resume: false。

README 说明:0.2.x 的 Agent 不再提供 agent.followup,故采用 sessionController.prompt 作为当前正门。

不带工具的 CLI

在 DSH 终端或系统 shell 中可执行(Node >= 18):

dsh-restart-planner status
dsh-restart-planner resolve
dsh-restart-planner schedule --reason "改完代码" --delay 20
dsh-restart-planner schedule --dry-run
dsh-restart-planner cancel

从 DSH 自带终端运行时,插件会沿父进程识别宿主;从无关终端或宿主形态特殊时,使用 --caller-pid <宿主 pid> 指明目标。

安全边界与报告

下列机制写在代码分支里,而非仅文档描述:

  • delaySeconds 与「会话静默」尽量保证本轮内容与落盘;maxWaitSeconds 避免无限等待。
  • 用户已手动退出应用时,不再擅自拉起。
  • cancel 可随时撤销(helper 约每 400ms 检查)。
  • dryRun 不释放真实 helper。
  • helper 计算 kill 列表时排除自身子树;只结束宿主进程树内进程。
  • v0.2.0:无明确 targetPid / callerPid 时 helper 拒绝动手;真实重启前需在状态目录写入授权文件 .allow-real-restart(经 Explorer 启动的 helper 不继承调用方环境变量,故用文件而非环境变量传递授权)。
  • 状态目录落在系统临时目录时,scheduleRestart 直接拒绝,避免测试误伤真宿主。

重启结果与过程写入 ~/.dsh/dsh-restart-planner/last.json。status 会渲染为可读摘要;字段包括 state(如 ok、canceled、dry-run、error 等)、reason、targetPid、relaunchCommand、newPid、idleMs、downtimeMs、killList 等。

插件平时静默;若本进程在约 10 分钟内刚被该插件重启过,系统提示中会补一句提醒 agent 核对结果并汇报。

安装与启用

已抓取资料中的 README 未给出形如 dsh plugin add … 的固定安装命令。请以 SkillHub 目录页 与 GitHub 仓库 当前说明为准,按 DSH「一切皆插件」的常规方式安装。装好后仍需一次宿主加载;此后同类「装完要重载」场景可由本插件排程,而不必每次依赖人工重启。

插件以当前 DSH 进程权限运行,安装前请自行查看源码与 MIT 许可证,确认进程结束与拉起命令符合你的环境预期。

适用场景与注意

适合:agent 在无人值守流程中安装/更新插件、修改宿主侧 JS 后需要重载;需要 dryRun 先看会杀谁、用什么命令拉起;需要在重启后自动 queue 一条继续提示接回中断会话。

注意(README 诚实清单):

  • 停止方式为强制结束进程树,不是桌面端托盘/对话框的优雅退出;末尾极短窗口的写入无法绝对保证。
  • 桌面端窗口会短暂消失再出现;会话选择依赖浏览器本地存储,回来仍是同一会话。
  • 重复 schedule 会覆盖上一次排程,不排队。
  • Windows 侧依赖系统 PowerShell 5.1,不需管理员与计划任务;macOS / Linux 未真机验证。

与「网页角按钮 / 设置页开关」类给人点的重启插件不冲突:那些面向用户点击,本插件面向 agent 工具调用。

结尾

dsh-restart-planner 把「请你关掉 DSH 再打开」从对话里的死胡同,收成可排程、可取消、可审计的一次工具调用,并在 v0.4.x 起支持重启后向原会话排队继续。查阅安装与更新请以社区目录与仓库为准:

  • 目录页:https://www.skillhub.cn/plugins/7gzgn/dsh-restart-planner
  • GitHub:https://github.com/7gzgn/dsh-restart-planner
羽毛球分组比赛记分
小程序二维码

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

小夜