dsh-restart-wake:让 Agent 安全重启 Harness 并在重启后自动回到原会话

前言

在 DeepSeek Harness(DSH)里改 Host 插件、src/、package.json 或 cordis.patch.yml 之后,必须重启进程才能加载新代码。对智能体开发者来说,理想状态是:模型自己安排重启、重启完成后自己继续验收和干活,而不是让人盯着托盘杀进程再手动打开会话。

在 Harness 进程内部直接起重启脚本,往往会卡在 killing 不回来——Windows Job Object 会在杀 Harness 时连带砍掉子进程。杀完立刻拉起新实例,又可能撞上 Electron 单实例锁,新进程把参数交给正在退出的旧实例后退出。重启若在进程外完成,Host 刚起来时也没有天然通道把「接下来要做什么」塞回原来的 Agent 会话。

下面介绍社区插件 dsh-restart-wake(维护者 zgq0106),它用计划任务在进程树外执行重启、用登记文件 + 启动唤醒器在就绪后投递 prompt,并顺带在重启窗口清理堆积的 dsh-auth-* cookie,缓解反复重启后约 70 次启动即 431 崩溃的问题。插件归类为工作流,在 SkillHub 目录页 可查到条目;目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-restart-wake 是 DSH 的 Host 插件:六个 Agent 工具、一个启动唤醒器、一套参数化的 PowerShell 重启脚本。依赖为零(不引入 npm 包);README 写明在 DSH 0.2.1-rc.5 上实测,package.json 当前版本为 0.1.5,许可证 MIT。

平台分工如下:重启与 cookie 清理仅 Windows(schtasks + PowerShell);唤醒登记、状态查询跨平台。非 Windows 上调用 restart_now 会直接报错,不做破坏性动作。

它怎么绕过三道障碍

障碍 插件侧做法
进程内脚本被 Job Object 连带终止 用 Windows 计划任务在 Harness 进程树外跑 restart-dsh.ps1
单实例锁导致新实例刚起就退出 先杀浏览器主进程再杀子进程,并等待锁释放(默认 3 秒)
重启后会话停在原地 重启前写 wake-pending-<sessionId>.json,启动唤醒器在新 Host 就绪后通过 sessionController.prompt 投递(会 resume 冷会话)

同一时刻只允许一次重启:互斥锁 restart.lock;默认有其他未登记的运行中会话时会拒绝重启(可传 force: true 覆盖)。

核心功能

六个 Agent 工具

调用方不必手填会话 id,工具从执行上下文 exec.agent.id 读取。

工具 作用
restart_now 登记唤醒 → 检查锁与阻塞会话 → 挂计划任务 → 在 delaySeconds(默认 12)秒后重启
wake_register 只登记唤醒,不重启;等别的会话触发重启时把自己叫醒
wake_list 查看待唤醒登记、最近归档、重启锁状态
wake_cancel 取消本会话的唤醒登记
restart_status 自检:exe 路径、脚本与计划任务入口、锁、运行中会话、日志末尾
cookie_status 查看 dsh-auth-* 堆积与清理阈值(431 相关)

插件还在 Host 根作用域通过 ctx.systemPrompt.section() 注入约 300 字的协议说明(何时重启、restart_now 须为本轮最后一步、重启后先 restart_status)。已在预设里写过同样规则时,可在配置里设 promptEnabled: false 关闭。

桌面端每次启动会下发新的 dsh-auth-<authority哈希> cookie,Chromium 只增不减;条数到约 70 时 Cookie 请求头可超过 Node 16 KB 上限,Host 返回 431,外壳报「Web authentication failed」。Cookies 库在运行期被独占,可写窗口只在「浏览器已死、新实例未起」的几秒内——即重启脚本执行时。达到 cookieThreshold(默认 50)时,cookie-cleanup.mjs 只删 dsh-auth-* 一族,不动其它 cookie 与凭据。

安装与启用

在 PowerShell 中执行(命令来自项目 README):

dsh plugin --profile desktop add github:zgq0106/dsh-restart-wake

若 pnpm 不认 github: 前缀:

dsh plugin --profile desktop add "git+https://github.com/zgq0106/dsh-restart-wake.git"

装完后再重启一次 Harness——Host 插件模块按包名缓存,仅启用/禁用不会重读模块。

安装后可在新会话里让 Agent 调用 restart_status。若 exePath 显示不存在,在 profile 的 cordis.patch.yml 里为插件显式指定 exePath(只写要改的字段即可,其余回落默认):

- id: restart-wake
  name: dsh-restart-wake
  config:
    pendingDir: 'D:\dsh-wake'
    delaySeconds: 15

默认登记目录为 ~/.dsh/restart-wake;pendingDir 路径过长(影响计划任务命令行 260 字符上限)时 restart_now 会报错并建议换短路径。

典型用法

Agent 侧可复现的流程(摘自 README):

模型:改完插件配置,需要重启生效。
1. restart_status        → 确认 exeExists / scriptExists 都为 true,没有阻塞会话
2. restart_now({ prompt: "重启完成,读取日志确认 RESULT: OK,然后继续完成 P2.4 连线可视化" })
3. 回复主人:「已安排重启,约 12 秒后回来」,本回合结束
4. 重启后插件自动投递 prompt,会话继续
5. restart_status        → 验收:锁已释放、登记已消费、日志末尾 RESULT: OK

restart_now 必须是该轮对话的最后一步:重启会中断当前回合,未保存输入会丢失。

适用场景与注意

适合谁:经常在 desktop profile 里改 Host/插件配置、希望 Agent 自闭环「改配置 → 重启 → 验收 → 继续任务」的开发者;Windows 桌面端长期开发、需要避免 cookie 431 的用户。

权限与安全:插件以当前 DSH 进程权限运行;安装前应自行查看 GitHub 源码 与 MIT 许可证。README 说明:只投递文本不执行命令;登记 24 小时过期;投递最多 3 次后归档,不无限重试;成功投递不留登记文件;不上传数据、无遥测。

限制摘要:若与其它「启动即投递」插件共用同一 pendingDir,可能重复投递,需配置不同目录。Harness 需能恢复上次窗口(默认行为),自动唤醒才顺畅;否则登记仍在,需主人下次打开会话时补投。多份安装时需改不同的 taskName(默认 DshRestartWake)。

常见返回:blocked(有别会话未登记)、busy(10 分钟内已有重启任务)。故障排查表见项目 README「故障排查」一节。

结尾

dsh-restart-wake 把「进程外重启 + 单实例等待 + 启动唤醒登记」收成一套互斥保护的工作流,让 Agent 在 Windows 桌面端可以相对安全地重启 Host 并回到原会话,同时在重启窗口处理 dsh-auth-* 堆积。

羽毛球分组比赛记分
小程序二维码

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

小夜