# dsh-continue English: [README.md](../README.md) `dsh-continue` 是 DeepSeek Harness 中按需启用的安全无人值守续行插件。它组合提供下游重试后的确定性恢复、精确 `(provider, model, error-code)` 自适应网络学习、单任务配置注入,以及对唯一推荐项、二选一继续提示、有效 Plan Mode 退出和窄范围纯文本继续的受限自动化。它适合希望瞬时中断和日常低风险问题不再要求人工盯守每一步的项目。 0.2.x 还包含 `/continue status`、`/continue explain`、暂停/恢复控制、持久化活动与学习事件、带任务级降级的项目级决策记忆、已验证的人工决策来源、仅建议不自动生效的继续模式候选、可配置重试预算和 fail-closed 安全边界。单任务 session 覆盖优先于插件默认配置;未知、歧义、危险或未验证的输入会交回官方 UI。学习默认关闭,Continue 不会调用大模型猜测问题或错误含义。 所有可执行能力均**默认关闭**。仅安装不会改变任务交互、重试、学习或审批行为。 ## Continue 与同类插件的差异 如果主要问题是任务级恢复和安全地无人值守处理日常问题,应选择 `dsh-continue`。下面的项目在重试或继续方面有重叠,但解决的是不同层次的问题。 | 同类插件 | 主要关注点 | Continue 增加的能力或明确不做的事 | | --- | --- | --- | | [`@syncended/dsh-retry`](https://www.npmjs.com/package/@syncended/dsh-retry) | 通用/瞬时模型错误重试、provider 过滤、指数退避和 `Retry-After` | Continue 是任务级续行层:先下放请求恢复,再处理已配置的网络失败、推荐问题、二选一继续和 Plan Mode 转换;不替代通用模型错误重试。 | | [`dsh-client-auto-continue`](https://www.npmjs.com/package/dsh-client-auto-continue) / [`dsh-auto-continue`](https://github.com/HsiangNianian/dsh-auto-continue) | Web UI 中断后发送配置好的“继续”消息,并提供自适应退避、循环检测和幂等护栏 | Continue 使用确定性的 DSH 事件和结构化状态,不盲目发送通用用户消息,并增加精确路由学习、已验证决策记忆、推荐答案、Plan Mode 处理和 fail-closed 风险边界。 | | [`@linxin666/dsh-chat-recovery`](https://www.npmjs.com/package/@linxin666/dsh-chat-recovery) | 在 Web UI 手动编辑上一条消息、Fork session 并重试失败回合 | Continue 只自动处理符合条件的恢复和决策,不改写历史或 Fork;歧义或危险场景仍交回用户。 | | [`@deepseek-ai/dsh-llm-retry`](https://www.npmjs.com/package/@deepseek-ai/dsh-llm-retry) | 官方的精确 provider agent-loop 重试、持久化重试事件和 bounded/always 策略 | Continue 先让底层重试路径处理,只有它放弃后才处理更高层的网络/决策流程;增加任务策略、学习和安全控制,不重复写入 provider 重试事件。 | 以上是能力范围对比,不代表推荐或背书;具体行为应以各项目当前版本为准。Continue 不会批准特权或不可逆操作,也不会调用大模型猜测问题或错误含义。 `dsh-camel` 与 Continue 是互补关系,不是这里的同类对比对象:项目同时需要 Camel 的免费模型 `RATE_LIMIT` 保护和 Continue 的非限流网络恢复/安全无人值守决策时,可以一起安装。默认情况下,Camel 负责限流,Continue 负责 `TIMEOUT`、`TRANSPORT` 和 `SERVER` 恢复。 ## 安装 包发布到 npm 后,将其加入 profile: ```sh dsh plugin --profile add dsh-continue ``` 它可与 `dsh-camel` 同时安装。基础插件不依赖 `commands`、`settings`、`systemPrompt` 或 Plan Mode 服务;某个可选服务缺失时,只禁用对应集成,不影响其他能力加载。 ## 快速启用与 preset 使用任务命令写入一次性覆盖: ```text /continue preset recommended /continue preset resilient /continue preset unattended-safe ``` preset 只是普通的任务 patch,绝不会开启学习。 | Preset | 开启内容 | | --- | --- | | `recommended` | 唯一、明确推荐项的自动选择 | | `resilient` | 瞬态网络恢复和推荐项自动选择 | | `unattended-safe` | `resilient` 加二元继续确认、有效 Plan Mode 退出和窄范围普通文本续行 | 也可按最小范围显式开启: ```text /continue set {"network":{"enabled":true},"recommended":{"enabled":true}} /continue set {"continuation":{"enabled":true,"autoConfirmContinue":true}} ``` ## 配置与单任务注入 优先级固定为: ```text 任务 session override > 插件全局 defaults > 内置值 ``` 在 `cordis.patch.yml` 的插件行设置全局默认值: ```yaml - id: continue config: defaults: network: enabled: true mode: bounded maxRetries: 5 recommended: enabled: true continuation: enabled: false ``` launcher、preset 或其他插件可向单次任务注入独立策略: ```ts ctx.continue.setTaskConfig(agent, { network: { enabled: true }, recommended: { enabled: true }, }) ``` patch 会被复制并写为 version-1 `continue/config` 事件,可在 resume 后恢复并被 fork 继承。`null` 用于清除覆盖。旧 version-1 配置和控制事件仍支持回放。 所有输入都经过 schema 与运行时双重校验。未知字段、非法 bounded 重试策略、不安全计数、超大本地 timer delay、小于 1 的乘数,以及重叠的肯定/否定标签都会被拒绝。 ## 命令与控制 `commands` 可选服务存在时注册: ```text /continue status /continue set /continue off /continue reset /continue preset /continue pause [] /continue resume /continue explain /continue learn |forget > ``` `pause` 会停止本插件负责的等待、普通文本 steer、结构化自动回答与 Plan Mode 自动批准;`resume` 恢复仍符合策略的自动化。`status` 输出最终策略、暂停状态、学习解析结果、实际存储范围和最近活动。`explain` 解释最近一次自动、下放或阻断决策。`off` 写入显式 false 开关;与 `reset` 不同,它不会重新继承已开启的全局默认值。 ## 网络恢复与 Camel 共存 内置网络码为 `TIMEOUT`、`TRANSPORT`、`SERVER`。`RATE_LIMIT` 被刻意排除并交由 `dsh-camel`。Continue 只有在任务或全局策略显式将 `RATE_LIMIT` 加到 `network.codes` 时才处理它;该配置会写入职责重叠告警,因此同一错误码应只配置一个重试 owner。 分类顺序是确定性的: 1. 未被 Continue 显式认领的 `RATE_LIMIT` 下放给 Camel; 2. 明确配置的网络错误码为 transient; 3. 明确配置的永久错误码,其后是永久 HTTP status; 4. 明确配置的可重试 HTTP status; 5. 可选 message-pattern fallback(永久模式优先于可重试模式); 6. 未知失败原样下放。 匹配到 transient 后,Continue 会先给下游中间件(包括 `dsh-llm-retry` 与 Camel)恢复机会。下游已返回 `{ kind: 'retry' }` 时,Continue 原样返回,且不会新增 retry 事件。否则会写标准 `llm/retry` 与 `llm/retry-started`,使用 `policyKey: "dsh-continue:network:v1"`,等待后再重试。 网络恢复开启后的默认退避为 2 秒、乘数 2、本地上限 60 秒、`mode: unlimited`。如需限制,使用 `mode: bounded` 与 `maxRetries`。`respectRetryAfter=true` 时有效的 provider `Retry-After` 优先,仅受 Harness/Node 单 timer 上限 `2147483647ms` 约束。取消、卸载、`pause` 或不再符合条件的策略变更都会停止等待;已经持久化的等待保留原截止时间,避免重复调度。 ### 自适应网络学习 网络自适应在 `learning.network` 下配置。若 `network.enabled=true` 且没有显式配置学习频率或延迟控制,则使用安全自适应默认值:增长比 `2`、下降比 `0.75`、恢复成功次数 `3`、状态 TTL `7d`。显式的 `learning.enabled=false` 或 `learning.network.enabled=false` 会关闭它,且任务级设置优先于全局设置。 学习到的 delay 严格按 `(provider, model, error-code)` 三元组隔离。provider/model 路由不可验证(包括 model 缺失)时,Continue 安全退化到静态退避,且不读取、不写入学习状态。 只有同一 turn、step、provider、model 的持久化 `assistant/message` 到达后,才会立即记录一次恢复成功。最新的 `continue/network-learning` 快照具有唯一权威性:若它损坏或过期,Continue 只记录一次警告并使用静态退避,绝不会复活更旧的学习 delay。 ## 自动决策与安全边界 `recommended.enabled=true` 只会选择唯一以 `(Recommended)` 或 `(推荐)` 结尾的选项。默认 `onMissingRecommendation: ask`;`first` 仅适用于可互换的低风险选项,`stop` 则在缺少推荐时让无人值守流程明确失败。 同时启用 `continuation.enabled=true` 和 `autoConfirmContinue=true` 后,只处理恰有一个肯定标签、一个否定标签的单选二元继续/停止问题。`autoApprovePlan=true` 只会经由官方状态迁移退出活跃 Plan Mode,且计划必须有非空 `#` 标题。普通文本续行还要求 `plainTextFallback=true`、当前 turn 命中白名单模式、且不命中风险模式;默认每个 turn 最多 steer 一次。 以下任一情况都会 fail closed 回到官方 UI:调用 agent 不是可验证的 live root、turn/问题结构不完整、选择存在歧义、问题为多选或自由文本、达到次数上限,或任一文本命中风险边界。插件从不批准 `approval/request`、沙箱或权限提升、凭据、付款、对外发送、发布/部署、生产操作或不可逆操作,也不会编造业务数据。 ## 受控学习与项目存储 学习默认关闭。`/continue learn on` 会开启任务学习总开关和决策学习;如果网络恢复也已开启、但不希望网络自适应,应明确设置 `learning.network.enabled=false`。 决策记忆只面向精确、合格、可验证的人工选择,记录确认数与冲突,受 TTL 和最大使用次数限制。Harness 原始 `tools/post-execute` hook 不提供可信的“真实人工确认”来源,因此单独使用时会 fail closed。宿主 UI 可以提供实现导出接口 `ContinueManualDecisionSource` 的 `continueManualDecisionSource` 服务;只有其 `verify(exec, result)` 明确认证的结果才会训练。验证器必须依赖可信的 UI 侧状态,不能只检查答案结构。验证器缺失、拒绝或抛错时均不训练,插件自身生成的答案还会被独立排除。 将 `learning.decisions.scope` 设为 `project` 可使用可选 peer `@deepseek-ai/dsh-settings`。插件每个 runtime 只注册一次 settings namespace,并在不同 agent 间复用。项目标识会散列处理;settings 缺失、只读、无效或写入失败时会退化为 task scope,并在状态中显示原因。project scope 的 `/continue learn forget` 只有空快照成功写入后才报告成功;写入失败则命令返回 error,状态显示 `projectForget.state: "failed"`,当前运行期会 fail-closed 阻断旧项目记忆,但不宣称删除能跨重启生效。 续行模式候选始终仅建议。使用 `/continue learn candidates` 查看;只有 `/continue learn approve ` 才会将合格候选加入当前任务的普通文本模式。批准不会绕过风险边界。 ## 事件、迁移与示例 公开 session 事件均为追加式且带版本: | 事件 | 用途 | | --- | --- | | `continue/config` | 任务覆盖或重置 | | `continue/control` | pause 或 resume | | `continue/network-learning` | 自适应网络快照 | | `continue/decision-learning` | 任务决策记忆快照 | | `continue/pattern-candidate` | 仅建议候选的生命周期 | | `continue/activity` | 最近的自动、下放、阻断、取消或学习活动 | version 1 config/control 事件会持续回放。由早期版本迁移时可保留已有任务事件、升级包,然后显式开启新能力。不要同时让 Camel 和 Continue 认领 `RATE_LIMIT`。现有全局 profile 建议先用 `recommended`,再用 `resilient`;只有审查过项目特定的提问与风险模式后再开启 `unattended-safe`。 以下是 project 决策 scope、但关闭网络自适应的单任务示例: ```text /continue set {"network":{"enabled":true},"learning":{"enabled":true,"network":{"enabled":false},"decisions":{"enabled":true,"scope":"project","minConfirmations":2,"ttlMs":2592000000,"maxUses":50}}} ```