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