🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话自动续接 tmt-homelab/dsh-session-auto-resume

DeepSeek Harness
tmt-homelab17 天前有提交已提供中文文档扫描:含敏感能力

重启后自动恢复被中断的智能体会话与目标

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/20 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add tmt-homelab/dsh-session-auto-resume
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/20·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 17 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 34 处,展示前 33 条)
  • 写入本地文件
    index.js:78
    mkdirSync(dirname(logPath), { recursive: true })
  • 写入本地文件
    index.js:79
    appendFileSync(logPath, `${line}\n`)
  • 读取本地文件
    selftest.mjs:151
    check('writeLog creates dir + appends', writeLog(logPath, 'one') === true && writeLog(logPath, 'two') === true && readFileSync(logPath, 'utf8') === 'o
  • 写入本地文件
    selftest.mjs:153
    writeFileSync(blocker, 'not a dir')
  • 删除本地文件递归
    selftest.mjs:155
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    selftest.mjs:197
    if (existsSync(logPath)) {
  • 读取本地文件
    selftest.mjs:198
    const text = readFileSync(logPath, 'utf8')
  • 读取本地文件
    selftest.mjs:204
    return existsSync(logPath) ? readFileSync(logPath, 'utf8') : ''
  • 读取本地文件
    selftest.mjs:204
    return existsSync(logPath) ? readFileSync(logPath, 'utf8') : ''
  • 删除本地文件递归
    selftest.mjs:228
    rmSync(dir, { recursive: true, force: true })
  • 删除本地文件递归
    selftest.mjs:263
    rmSync(dir, { recursive: true, force: true })
  • 删除本地文件递归
    selftest.mjs:280
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    selftest.mjs:300
    const text = existsSync(logPath) ? readFileSync(logPath, 'utf8') : ''
  • 删除本地文件递归
    selftest.mjs:306
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    verify-d1.mjs:43
    const lines = (p) => (existsSync(p) ? readFileSync(p, 'utf8').split('\n').filter(Boolean) : [])
  • 读取本地文件
    verify-d1.mjs:43
    const lines = (p) => (existsSync(p) ? readFileSync(p, 'utf8').split('\n').filter(Boolean) : [])
  • 读取本地文件
    verify-d1.mjs:81
    const workspaces = readdirSync(SESSIONS).filter((d) => d.startsWith('--'))
  • 读取本地文件
    verify-d1.mjs:87
    entries = readdirSync(dir)
  • 读取本地文件
    verify-d1.mjs:93
    if (!existsSync(f)) continue
  • 执行外部命令固定命令
    verify-d1.mjs:95
    const log = execFileSync('zstd', ['-dc', f], { maxBuffer: 512 * 1024 * 1024 }).toString()
  • 执行外部命令固定命令
    verify-d1.mjs:113
    const log = execFileSync('zstd', ['-dc', file], { maxBuffer: 512 * 1024 * 1024 }).toString()
  • 写入本地文件
    verify-d1.test.mjs:44
    mkdirSync(dirname(file), { recursive: true })
  • 执行外部命令固定命令
    verify-d1.test.mjs:45
    execFileSync('zstd', ['-f', '-o', file], { input: text })
  • 写入本地文件
    verify-d1.test.mjs:52
    mkdirSync(logs, { recursive: true })
  • 写入本地文件
    verify-d1.test.mjs:62
    writeFileSync(join(logs, 'session-auto-resume.log'), resumeLines.join('\n') + '\n')
  • 写入本地文件
    verify-d1.test.mjs:67
    if (exitLines.length) writeFileSync(join(logs, 'host-exit.log'), exitLines.join('\n') + '\n')
  • 执行外部命令来自配置/变量
    verify-d1.test.mjs:83
    const r = spawnSync(process.execPath, [probe], {
  • 删除本地文件递归
    verify-d1.test.mjs:100
    rmSync(home, { recursive: true, force: true })
  • 删除本地文件递归
    verify-d1.test.mjs:108
    rmSync(home, { recursive: true, force: true })
  • 删除本地文件递归
    verify-d1.test.mjs:116
    rmSync(home, { recursive: true, force: true })
  • 删除本地文件递归
    verify-d1.test.mjs:124
    rmSync(home, { recursive: true, force: true })
  • 删除本地文件递归
    verify-d1.test.mjs:132
    rmSync(home, { recursive: true, force: true })
  • 删除本地文件递归
    verify-d1.test.mjs:140
    rmSync(home, { recursive: true, force: true })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 插件:应用关闭后自动恢复中断的会话

README

由 DeepSeek 最新模型翻译生成
dsh-session-auto-resume 一个 DeepSeek Harness 插件,自动恢复因应用关闭而中断的智能体会话。DSH 宿主重新启动后,插件从持久化状态中找出关闭时仍在工作的会话,无需人工介入即可恢复: - 带有活跃目标的会话会被显式恢复,目标重新激活——之后内置的 goal-round-driver 自动继续消耗轮次预算。(该驱动器刻意「从不自行恢复工作」;本插件执行驱动器所需的显式恢复。) - 没有目标、停在轮次中途的会话会被检测出来,并记录一条可直接运行的恢复命令——只提示,绝不自动执行。 - 正常结束的会话、过期(>48 小时)的会话、仍在运行的会话、以及子代理持有的会话一律跳过。每次启动有恢复上限。目标状态转换失败时按失败处理(fail-closed)。激活过程永不抛异常。 为什么需要它 桌面宿主在退出时会检查活跃工作,但没有启动恢复路径:无论哪种关闭方式(崩溃、SIGTERM、主动退出/重载),中断的会话都会一直中断,直到有人发现。本插件在应用包之外补上这个缺口,因此应用更新后依然有效。 实机验证 针对一次真实的「关闭再重启」循环做了测试(经操作者批准,向运行中的宿主发送 SIGTERM;随后重启应用): - 一个未预先编排的中断目标会话(不是特意植入的,操作者也不知情)在启动时被自动恢复,目标重新激活;随后轮次驱动器继续推进该会话。
展开完整文档(README 剩余 1 节)
dsh-session-auto-resume

一个 DeepSeek Harness 插件,自动恢复因应用关闭而中断的智能体会话。DSH 宿主重新启动后,插件从持久化状态中找出关闭时仍在工作的会话,无需人工介入即可恢复:

- 带有活跃目标的会话会被显式恢复,目标重新激活——之后内置的 goal-round-driver 自动继续消耗轮次预算。(该驱动器刻意「从不自行恢复工作」;本插件执行驱动器所需的显式恢复。)
- 没有目标、停在轮次中途的会话会被检测出来,并记录一条可直接运行的恢复命令——只提示,绝不自动执行。
- 正常结束的会话、过期(>48 小时)的会话、仍在运行的会话、以及子代理持有的会话一律跳过。每次启动有恢复上限。目标状态转换失败时按失败处理(fail-closed)。激活过程永不抛异常。

为什么需要它

桌面宿主在退出时会检查活跃工作,但没有启动恢复路径:无论哪种关闭方式(崩溃、SIGTERM、主动退出/重载),中断的会话都会一直中断,直到有人发现。本插件在应用包之外补上这个缺口,因此应用更新后依然有效。

实机验证

针对一次真实的「关闭再重启」循环做了测试(经操作者批准,向运行中的宿主发送 SIGTERM;随后重启应用):

- 一个未预先编排的中断目标会话(不是特意植入的,操作者也不知情)在启动时被自动恢复,目标重新激活;随后轮次驱动器继续推进该会话。
- 一个持有活跃目标的会话在没有任何人工消息的情况下,自动进入下一轮继续执行。
- 轮次预算正确递增;一个仍在运行的会话被正确跳过;一次扫描中正确排除了 489 个子代理持有的会话。

随附的 verify-d1.mjs 把今后任何一次关闭变成一条命令即可得出的结论:PASS(退出码 0)/ FAIL(退出码 1,指出失败的检查项并附证据尾部)/ VOID(退出码 2,插件激活后没有记录到关闭事件)。它自带的 fixture 自测(verify-d1.test.mjs)针对合成的证据树覆盖了每条判定路径。

设计说明

- 策略明确且克制:只有持久化的目标阶段 active 会自动恢复;paused/blocked 的目标属于人为设定的状态,绝不重新激活;非目标会话只做提示。插件安装本身就是一次性授权。
- 恢复流程与 harness 自身的恢复流程一致(agents.resume({resumeSessionId, agentOptions, setup}) + goals.resume(agent, {id, revision})),包括绑定默认模型——恢复时若不绑定模型,产生的轮次会失败,报错 prompt variable "{{model}}" has no value(智能体循环从 agent.options 绑定该变量)。本插件会完成绑定;如果绑不上,会打印醒目的 resume-no-model 日志。
- 绝不手动追加会话日志。 会话日志的追加约定要求 headerSeq 必须引用更早的请求或 header,冷日志标记因此不安全;检测结果改记在插件自己的日志里。
- 处处 fail-closed:目标恢复在预算耗尽或阶段转换非法时直接抛错(捕获、记录、绝不重试);启动扫描、分类、日志、恢复各自都有防护,插件故障不会阻塞宿主启动。

安装(作为本地配置档插件)

1. 把本包复制到 ~/.dsh/plugins/dsh-session-auto-resume。
2. 链接进配置档的依赖,并加入配置档的 dsh.profile.bundles 列表:

"dependencies": { "@local/dsh-session-auto-resume": "link:/Users/you/.dsh/plugins/dsh-session-auto-resume" },
"dsh": { "profile": { "bundles": [ "@local/dsh-session-auto-resume" ] } }

3. 包自带的 cordis.patch.yml 携带必需的 insert 行(只加 bundles 列表条目会被静默跳过)。它默认 dryRun: true —— 首次启动只记录 would-resume 决策、不实际执行;对照你正在跑的会话核对这些决策,再把 dryRun 设为 false。
4. 重启应用。证据落在 ~/.dsh/logs/session-auto-resume.log(每次激活记 ARMED,每次启动记一条 pass-done)。

测试

node selftest.mjs # classification truth table, fake-ctx passes, mutation checks
node verify-d1.test.mjs # proves verify-d1 on every verdict path (synthetic fixtures)

状态

- Selftest:在应用运行时(ELECTRON_RUN_AS_NODE)下全部通过。
- 实弹验证:完整跑通一次真实的闭包恢复;过程中发现并修复一个缺陷(即上面的模型绑定)。
- 已知限制:会话按创建时间只匹配最近 30 个已持久化会话(配置项 scanLimit),且该机制只在启动时挂载(插件文件改动不会热重载)。

与 DeepSeek 无关联。MIT 许可。已作为 discussion 提交上游 —— 本仓库是参考实现。
预览分享卡片长什么样 ↓tmt-homelab/dsh-session-auto-resume
分享 · DeepSeek Harness Hub
tmt-homelab/dsh-session-auto-resume

重启后自动恢复被中断的智能体会话与目标

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部