前言¶
DeepSeek Harness(DSH)桌面版是常驻进程:改插件、改配置、内存上涨或偶发卡顿时,往往需要关掉再打开。对正在跑任务的 Agent 来说,这有个结构性矛盾——执行重启的就是 Agent 自己,进程一关,当前会话随之结束,没法在「关自己」的同时把宿主再拉起来。
手动重启 DSH 当然可行,但只适合你在电脑前、且不要求重启后自动接着干。若希望 Agent 在无人值守时排上重启、重启完成后回到原会话继续,就需要把「重启宿主」做成可被工具调用的动作。下面介绍社区插件 dsh-self-restart(维护者 NOOBnoob163,分类:工作流),它面向 Windows 桌面版,用脱离进程的助手关应用、再拉起,并在成功后向原会话投递唤醒消息。
这是什么¶
一句话定位:把「重启 DSH 宿主」做成多个会话可并发复用的动作——一次关、一次拉,排队中的会话各自拿回自己的 reason,各自决定是否续接。
| 项 | 说明 |
|---|---|
| 仓库 | NOOBnoob163/dsh-self-restart |
| 目录页 | SkillHub 插件页 |
| 平台 | 仅 Windows 桌面版(WMI、taskkill / 窗口消息等实现) |
| 许可证 | MIT(见仓库 package.json) |
| 当前版本 | 1.6.0(以仓库 package.json 为准) |
插件以 DSH bundle 形式发布(package.json 含 dsh.bundle.patch 与 cordis.patch.yml)。「重启后醒来」依赖 DSH 自带的 sessionController 正式服务,无需额外实验 bundle。
核心能力¶
两个 Agent 工具¶
| 工具 | 作用 |
|---|---|
restart_self |
排一次延时重启:等会话真正空闲后,由脱离进程的助手关闭 DSH、重新拉起并验证端口;成功后按名单向各会话投递唤醒消息 |
restart_status |
查看待执行重启、忙闲、上次结果、本机重启耗时估计;可从队列「下车」或取消整趟重启 |
典型流程如下:
- Agent 调用
restart_self(可带reason等参数,见仓库 README)。 - 其他会话可在等待期间加入同一趟重启(同一计划最多 8 人,
queueMaxMembers默认 8)。 - 助手在所有人都不忙后执行一次关、一次拉,并验证端口。
- 插件逐条向各会话投递唤醒消息,各会话携带各自的理由独立继续,互不阻塞。
并发复用,而不是各重启各的¶
多个会话可以同时把任务挂到同一次重启上:整台机器只中断一次,唤醒时每人各拿各的 reason;同一趟里 A 可 resume: true、B 可 resume: false,逐人判断。唤醒投递是逐条进行的,投递完成后各会话并行执行,不是「A 跑完再轮到 B」。
两种退出方式不要混用:
| 调用 | 影响 |
|---|---|
restart_status(leave: true) |
只影响当前会话:从叫醒名单移除;若你是最后一人,整趟不发车 |
restart_status(cancel: true) |
作废整趟计划上所有人的待执行重启 |
仅自己不想被叫醒时用 leave;不要用 cancel 误伤其他会话。
空闲判定与等待策略¶
重启前分两段:先等本会话连续静默 idleSeconds(默认 12 秒);再视配置判断其他会话是否在 othersWindowSeconds(默认 120 秒)内仍有活动。本地窗口、IM 私聊(默认 waitForImDirect: true)会视为「有人在用」;IM 群聊默认不算。默认下若私聊会话很多,可能长期等不到空档,这是 README 明确提到的调参点。
默认 maxWaitMinutes: 0 表示一直等(另有 12 小时硬上限);超过 notifyAfterMinutes(默认 20 分钟)仍未发车可触发外部通知钩子(需自行配置 noticeCommand)。另有保险丝进程,降低「关掉了却没人拉起来」的风险。
什么时候不需要它¶
- 只想手动重启一次 → 直接重启 DSH 即可。
- 不跑长任务、不在意会话被打断 → 不必装。
- 非 Windows 桌面版 → 当前实现不可用。
安装与启用¶
插件在当前 DSH 进程权限下运行;安装前请自行审阅仓库源码与 MIT 许可证。社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,安装来源以你信任的仓库为准。
方式一:插件管理(推荐)¶
让 Agent 使用 DSH 自带的 plugin_manager 工具(路径为 bundle 目录的绝对路径):
plugin_manager(action="install_bundle", target="<本目录的绝对路径>")
install_bundle 会完成装包与选中 bundle。README 明确禁止用 shell 手工拷贝目录、手改 profile 的 package.json / cordis.patch.yml 或在 profile 里跑 pnpm 来模拟安装。
方式二:本地开发 workspace 链接¶
在 profile 的 package.json 中登记依赖并选中 bundle:
{
"dependencies": { "dsh-self-restart": "workspace:*" },
"dsh": { "profile": { "bundles": [ "dsh-self-restart" ] } }
}
在 profile 目录安装依赖后重启 DSH;仓库提供 deploy.ps1 用于源码与实际加载位置的同步(Windows 开发场景)。
依赖方面:使用 Node 内置模块;@deepseek-ai/schemastery 由 DSH 宿主提供(peerDependencies)。engines.node 要求 >=22。
配置要点¶
默认值定义在 lib/index.js 的 Config schema;覆盖时在自己的 profile 的 cordis.patch.yml 里写同名 id 的 config:
- id: self-restart
config:
idleSeconds: 12
notifyAfterMinutes: 20
常用项包括:enabled、idleSeconds、othersWindowSeconds、maxWaitMinutes、queueMaxMembers、wakeMessage、waitForImDirect、waitForAllSessions 等;完整表格见 GitHub README「配置」一节。
外部通知不内置渠道,仅在你配置的 noticeCommand 下通过环境变量(如 DSH_SR_EVENT、DSH_SR_TEXT)传递事件;通知失败不影响重启本身。
典型用法(Agent 侧)¶
排重启并说明理由(参数名与可选字段以 README 为准):
restart_self(reason="改完插件要验证")
查看状态、名单与是否仍在队列中:
restart_status()
仅从本趟移除自己:
restart_status(leave: true)
取消整趟(会影响所有排队会话,调用前先 restart_status() 看清名单):
restart_status(cancel: true)
排队时会话标题前会出现 ♻️ 前缀;上次重启失败的会话会短暂显示 ⭕(约 2 小时后消失)。UI 上提供「不等了,立刻重启」(跳过等家务,写 force.flag)与「打断 / ✕」(整趟取消,写 cancel.flag),与 leave / cancel 语义对应关系见 README。
适用场景与注意¶
适合:你不在电脑前,仍希望 Agent 在需要时自行排重启,并在重启后回到原会话继续,而不是停在某个报错状态。
务必记住:
- 仅 Windows 桌面版;换平台需另一套实现。
- 同一趟重启会等所有成员空闲,人越多越难凑空档;误用
cancel会打掉别人的计划。 - 插件执行
noticeCommand时使用 shell,只配置你信任的命令;payload 仅作环境变量,不会被当作命令执行。 - 唤醒消息投递为「至多一次」设计,避免同一重启触发两次续接导致重复劳动。
结尾¶
dsh-self-restart 把「重启宿主」从手工操作变成工作流里的可编排动作,并在 Windows 上兼顾多会话合并重启与醒后续接。细节、边界 case 与状态文件位置见仓库 README。
- 目录页:https://www.skillhub.cn/plugins/NOOBnoob163/dsh-self-restart
- GitHub:https://github.com/NOOBnoob163/dsh-self-restart