重启后自动识别被中断会话并注入安全继续指令
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ptrel1/dsh-interrupted-resume该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · other
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 25 处,展示前 13 条)
- 读取本地文件lib/index.js:81
if (!existsSync(p)) return { sessions: {} } - 读取本地文件lib/index.js:83
const parsed = JSON.parse(readFileSync(p, 'utf8')) - 读取本地文件lib/index.js:98
if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 }) - 写入本地文件lib/index.js:98
if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 }) - 写入本地文件lib/index.js:100
writeFileSync(tmp, JSON.stringify(ledger, null, 2) + '\n', { encoding: 'utf8', mode: 0o600 }) - 写入本地文件lib/index.js:101
renameSync(tmp, p) - 读取本地文件lib/index.js:111
if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 }) - 写入本地文件lib/index.js:111
if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 }) - 写入本地文件lib/index.js:112
writeFileSync(p, '[' + new Date().toISOString() + '] ' + line + '\n', { flag: 'a', encoding: 'utf8' }) - 读取本地文件lib/index.js:148
if (!existsSync(filePath)) return undefined - 读取本地文件lib/index.js:151
text = zstdDecompressSync(readFileSync(filePath)).toString('utf8') - 写入本地文件lib/index.js:635
mkdirSync(dirname(target), { recursive: true }) - 发起网络请求lib/client.js:59
fetch(API_BASE + '/status', { credentials: 'same-origin', cache: 'no-store' })
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 插件:重启后检测上一轮被强制中断的会话,重新注入一条安全的继续提示词,并附上状态核验说明。
README
由 DeepSeek 最新模型翻译生成dsh-interrupted-resume
DSH 重启后,自动给「被强制中断」的会话发一条安全的继续指令。
定位:轻量化 · 只做重启崩溃这一件事
市面上有更"全能"的同类插件(如 dsh-auto-continue),带错误分类、自适应退避、 GUI 全配置、统计面板等。本插件刻意不做那些,两者是本质不同的定位:
| | 本插件 | 全能型插件 |
| 目标场景 | 仅限「dsh 进程重启 / 崩溃 / 强杀」 | 覆盖各类"非人为中断",含运行期错误、限流、超时等 |
| 触发判据 | turn/end.reason.kind === 'interrupted'——这一个信号 | 多类错误分类 + 启发式判断 |
| 代码量 | 单文件 lib/index.js 约 600 行,零外部依赖 | 通常数千行 + 构建产物 |
| 配置 | 6 个常量,改代码即可 | GUI 面板 |
| 界面 | 一个只读状态卡(只回答"它在不在跑") | 完整设置界面 |
| 行为 | 发一条带核对要求的继续消息,然后收手 | 可循环、可重试、可退避 |
展开完整文档(README 剩余 1 节)
dsh-interrupted-resume
DSH 重启后,自动给「被强制中断」的会话发一条安全的继续指令。
定位:轻量化 · 只做重启崩溃这一件事
市面上有更"全能"的同类插件(如 dsh-auto-continue),带错误分类、自适应退避、 GUI 全配置、统计面板等。本插件刻意不做那些,两者是本质不同的定位:
| | 本插件 | 全能型插件 |
| 目标场景 | 仅限「dsh 进程重启 / 崩溃 / 强杀」 | 覆盖各类"非人为中断",含运行期错误、限流、超时等 |
| 触发判据 | turn/end.reason.kind === 'interrupted'——这一个信号 | 多类错误分类 + 启发式判断 |
| 代码量 | 单文件 lib/index.js 约 600 行,零外部依赖 | 通常数千行 + 构建产物 |
| 配置 | 6 个常量,改代码即可 | GUI 面板 |
| 界面 | 一个只读状态卡(只回答"它在不在跑") | 完整设置界面 |
| 行为 | 发一条带核对要求的继续消息,然后收手 | 可循环、可重试、可退避 |
为什么轻量是有价值的:重启崩溃这个场景的判据是确定且不可伪造的—— interrupted 是 session repair 在冷读时合成的、agent loop 从不实时发出(见实现说明),所以它只意味着"进程没了",不会误判成限流或模型错误。
判据单一 ⇒ 无需错误分类 ⇒ 无需退避策略 ⇒ 无需 GUI。
⚠️ 不要与 dsh-auto-continue 同时安装:两者都会在重启后注入「继续」,会重复续跑。
解决什么问题
dsh 被重启 / 崩溃 / 强杀时,正在跑的 turn 会被中断。重启后那个会话就停在半路,
你得手动进去说一句「继续」——而且因为不知道中断前做到哪一步,很容易重复执行副作用操作。
本插件在启动后自动识别这些会话,注入一条带状态核对要求的继续消息。
判定条件(四层,全满足才续)
| # | 条件 | 理由 |
| 1 | 最近 12 小时内有过人类提示词 | 避免唤醒陈年会话 |
| 2 | 最后一条 turn/end.reason.kind === "interrupted",或该会话有被打断的子代理 | 只认崩溃中断;aborted 是用户主动停止,绝不续。见下方「子代理场景」 |
| 3 | 距中断 ≥ 30 秒(quietMs) | 避开用户重启后立刻打开的会话,防 writer-held 竞争 |
| 4 | 1 小时滑动窗口内自动续 < 30 次(距上次续跑超 1 小时则计数归零) | 防模型反复中断时 token 空转,但不误伤长会话 |
⚠️ 条件 3 不是放弃,而是延后:到点后由调度器重排再扫一轮。
⚠️ 条件 4 的计数是滑动窗口而非永久累计:连续抖动(1 小时内)被限制在 30 次,隔一小时后计数归零、又能续。永久累计会让长会话被历史次数吃掉配额(实测旧规则:同一天第 3 次中断就不再续跑)。
子代理(subagent)场景
派出的子代理随父代理一起被重启终止。实测两种情况,插件都能正确恢复:
| 情况 | 日志形态 | 插件行为 |
| 子代理已完成后重启 | 父 turn 有 open turn | 按 interrupted 续父会话 |
| 子代理运行中被重启 | 父 turn 已 completed(在等子代理),子代理 turn open | ⭐ 按「有中断的子代理」续父会话 |
第二种是 v0.2.1 修的:父代理「派完子代理、等待结果」时自己的 turn 会正常结束,若按「只认自身 interrupted」判定,会整棵子树静默死掉(实测 0 resumed)。
修法:扫描前先按 parentSessionId 聚合「有被打断子代理」的父会话,让父代理醒来自行核对/重派。
为什么续父代理而不是续子代理:父代理是唯一知道「我派了什么」的实体。
实测它醒来第一件事就是核对子代理产出(list_agents + 读文件),然后准确判断「已完成」或「需重派」,从不盲目重做。
注入的消息不是裸「继续」
重启可能发生在副作用操作中途,所以注入文本强制要求先核对状态:
[自动续跑 · 由 dsh 重启触发]
上一轮(turn N)因 dsh 进程重启被强制中断,没有正常结束。
请按以下顺序继续:
1. 先核对当前实际状态(工作区文件、git 状态、后台任务/子进程、已执行的外部操作),确认中断前哪些步骤真的完成了;
2. 从中断处继续推进原任务;
3. 不要去重做可能已产生副作用的操作(写文件、提交、推送、删除、发布、部署等)——若无法确认其是否已执行,先核实再决定;
4. 如果核对后仍然无法判断状态,停止操作并向我报告现状与疑点。
安装
从 npm 安装
dsh plugin --profile web add dsh-interrupted-resume
或本地源码(开发/定制)
dsh plugin --profile web add /path/to/dsh-interrupted-resume
安装后重启 dsh:插件在启动 5 秒后开始首轮扫描。
配置
{
promptWindowMs: 12 * 60 * 60 * 1000, // 候选窗口 startupDelayMs: 5_000, // 启动后延迟多久开始扫 quietMs: 30 * 1000, // 中断后静置多久才续 maxAttemptsPerSession: 30, // 滑动窗口内最多自动续几次(防无限烧 token 的最后一道闸) attemptResetMs: 60 * 60 * 1000, // 距上次续跑超这么久,计数归零 enabled: true, dryRun: false, // true = 只记日志不注入 }
设置页状态卡(只读)
安装后在 设置 → 中断续跑 有一个独立 section,显示:
- 运行状态灯:运行中 / 已停用 / 试运行(dryRun)
- 四个统计:已续跑会话数、候选窗口、静置期、每会话上限
- 已处理会话表(会话 / 次数 / 轮次 / 时间)
- 最近 20 行日志 + 状态目录路径 ⚠️ 纯只读:页面上没有开关和配置项,配置走代码里的 DEFAULTS。
这样界面只回答一个问题——「它在不在跑」。
数据来自 host 半注册的只读端点 GET /api/interrupted-resume/status。
状态与可观测性
所有痕迹写在自己的状态目录(跟随 DSH_HOME):
$DSH_HOME/interrupted-resume/
├── resume.log # 每轮扫描/判定/注入的完整链路 └── ledger.json # 每会话的续跑次数与最后处理的 turn
典型日志:
defer session-xxx: interrupted 12s ago (< quietMs 30s), will retry in 18s
scan done: 1 sessions, 1 in window, 0 resumed, 1 deferred
resumed session-xxx: turn 1, attempt 1
scan done: 1 sessions, 1 in window, 1 resumed
实现要点
- 不能监听 session/event:interrupted 是冷读时由 session repair 合成的, agent loop 从不实时发出它。所以必须启动后主动 list() + inspect()。
- ctx.get("sessionController") 每次现取,不缓存:cordis 服务激活时机不保证早于插件 apply()。
- requestId 可推导(continue-after-interrupted-<sessionId>-<turn>):同会话同轮永远得到同一 id,借用 session/prompt 自身的幂等检查挡重复注入。
- 先写 ledger 再注入:即使注入途中进程再次崩溃,也不会无限重试。
已知限制
- 每个进程生命周期内只处理「启动时能看到的」中断;插件中途热加载不追溯。
- 如果模型在续跑后再次中断,第 2 次仍会续,第 3 次起放弃(maxAttemptsPerSession)。
- lastPromptAt 语义是最后一条人类提示词时间,不是最后活动时间;长期运行但很久没输入的任务可能落在 12h 窗口外。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ptrel1/dsh-interrupted-resume
重启后自动识别被中断会话并注入安全继续指令
相关插件 · 其他
模型破甲清洗YuJunZhiXue/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 14,822已汉化DeepSeek 客户端
73
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 718已汉化DSH
71.2
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,261已汉化DSH
70.7
破甲评测WoYun520/dsh-purge
在本机分离宿主拦截与模型拒绝,做受控红队评测
★ 199已汉化DSH
69.7