dsh-continue-guard:一键「继续」与意外中断后的自动续跑

前言

在 DeepSeek Harness(DSH)里跑长任务时,网络掉线、上游把回复截断、代理掐流,或进程被关掉,都会让当前回合停在一半。常见做法是回到输入框手动补一句「继续」,并自己盯着网络何时恢复。dsh-continue-guard 是社区插件,由 LLL-lyh0 维护,在 composer 停靠区增加一颗「继续」按钮,并在 Host 侧判定中断类型、探测连通性、按规则自动续跑;宿主重启后还能根据会话日志接上未关回合。下面介绍它的定位、能力与安装配置方式。

这是什么

插件全名对应仓库 LLL-lyh0/dsh-continue-guard,跑在 DSH 的 profile 里:Host 半身负责判定与投递,Client 半身在输入框下方绘制按钮。它解决两类问题:任务被意外打断时一键以正常用户输入续跑;以及网络恢复或输出截断等场景下的自动续跑,并在 DSH 进程退出后扫描近期会话尝试恢复未完成的回合。

核心功能

一键续跑

按钮常驻在 conversation.composer.dock(显示轮次、步数、token 的那一行)。点击后走输入框真实提交链路:sessions.binding(id).session.beginSubmission(...) 与 session.prompt([{ type: 'text', text }], 'queue', …),与手动敲字回车相同,会以普通用户消息出现在对话里,不伪造消息来源。

仅在客户端拿不到 sessions 服务时,Host 才启用兜底 POST /resume(署名 plugin:dsh-continue-guard)。上游真实报错不会被兜底重试,避免同一句话发两遍。

自动续跑与驱动器唤醒

自动续跑在 Host 侧通过 agent.followup() 既排队下一轮提示词,又唤醒驱动器;仅往日志写 user/message 而循环不醒来,正是该插件要修的问题。没有活跃 Agent 时宿主会返回 no-agent,不会假装成功。

默认自动续跑策略如下(可在配置中调整):

触发 默认自动续跑 说明
网络中断(TRANSPORT / TIMEOUT / 5xx / fetch failed 等) 是 链路恢复后重试相对安全
上游截断(max-tokens) 是 请求成功但未写完
上下文超窗(CONTEXT_WINDOW_EXCEEDED) 否 应先压缩上下文
普通模型/代理错误 否(可开) 与断网、额度耗尽在本地难以区分

网络是否可用不只看 navigator.onLine;Host 对 probeUrls 中的目标做带超时的真实请求,并每 10 秒巡检重试。发送前需 Agent 为 idle、收件箱为空、且满足 minResumeGapMs;连续自动续跑受 maxAutoResumes 限制,用户一旦发言则次数与间隔清零。

宿主重启后的会话恢复

进程退出后内存中的 agent 与中断状态会消失,证据留在会话日志:例如 turn/start 之后没有 turn/end 表示回合未关。启动时会扫描最近 24 小时内有活动的会话(startupResumeWithinMs),最多恢复 startupResumeLimit 个(默认 3),按日志形状决定是否接上;用户主动停止(aborted 且 reason.kind 为 user)、上下文超窗、正常 completed 等情形不会接。判定为可恢复时复用与运行时相同的预算与探测规则,在无活 agent 时用 agents.resume({ resumeSessionId }) 唤醒。

按钮状态

状态 含义
半透明 未检测到中断;点击仍可补发「继续」
蓝色高亮 检测到中断,可一键续跑
转圈 + 倒计时(琥珀) 已排定,若干秒后自动发送
「正在检测网络…」 探测中或未恢复
绿色「已发送」 会话已重新跑起来

手动点击与自动续跑署名不同:前者走用户提交链路;后者署名 { kind: 'plugin:dsh-continue-guard', plugin: 'dsh-continue-guard' },不冒用 user。

安装与启用

从 GitHub 安装(资料推荐方式):

dsh plugin add github:LLL-lyh0/dsh-continue-guard

安装完成后需重启 Harness,bundles 仅在启动时读取一次。行为可在 cordis.patch.yml 的 config 中修改,无需改源码。插件以 peerDependencies 懒加载 @deepseek-ai/dsh-llm(optional);加载失败时退化为更保守的状态机判断,不会导致插件无法挂载。

配置要点

全部键写在 cordis.patch.yml,与 Config 一一对应,写错键会被加载器拒绝:

键 默认 说明
enabled true 总开关
text 继续 手动与自动发送的文本
autoResume true 自动续跑总开关
resumeDelayMs 2000 网络恢复后等待再发送(建议 1000–3000)
maxAutoResumes 3 连续自动续跑上限
autoResumeOnError false 普通错误是否自动续跑
resumeOnTruncation true max-tokens 截断是否自动续跑
probeUrls deepseek / baidu / github 连通性探测目标
probeTimeoutMs 4000 单次探测超时
minResumeGapMs 4000 两次自动续跑最小间隔
verbose false 排查未自动继续时可打开

某些网络环境会拦截默认探测域名,可按环境修改 probeUrls,否则可能长期被判为未联网。

典型用法

1、安装并重启 DSH 后,打开任意会话;composer 停靠区会出现「继续」按钮。

2、任务因断网或截断停住时,按钮高亮;网络恢复后插件会在 resumeDelayMs 左右自动发送配置的 text(默认「继续」),也可随时手动点击。

3、需要只保留手动续跑时,在 cordis.patch.yml 将 autoResume 设为 false。

4、排查行为时开启 verbose,并对照 README 中的验证脚本(仓库内 npm test 聚合 host/client/bundle/mount 与文档项数门禁)。

适用场景与注意

适合经常在 DSH 里跑长链路、且容易遇到网络波动或输出截断的开发者。插件与当前 DSH 进程同权限运行,安装前应阅读仓库源码与 MIT 许可证,确认符合你的安全与合规要求。社区目录站点 skillhub.cn 与 DeepSeek、幻方无官方从属关系,属于「一切皆插件」生态下的独立收录。

不要在本插件包内裸 import '@deepseek-ai/...'(link 安装时易触发 ERR_MODULE_NOT_FOUND);上游维护者已在 index.js 用 loadHarnessModule() 等方式处理,使用者一般只需改 patch 配置。

结尾

dsh-continue-guard 把「补一句继续」和「等网络好了再发」从手工操作收成 composer 里的一颗按钮与 Host 侧的可配置策略,并在进程意外退出后尝试从日志接上未关回合。当前 package 版本为 0.2.0。更多信息见社区目录页 LLL-lyh0/dsh-continue-guard 与 GitHub 仓库 github.com/LLL-lyh0/dsh-continue-guard。

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

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

小夜