前言¶
在 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