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

会话修复 CalamitySpiritKite/dsh-session-fix

DeepSeek Harness
CalamitySpiritKite2 天前有提交已提供中文文档扫描:未发现敏感能力

一键扫描并修复工具调用配对错乱的会话记录

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 1 处,展示前 1 条)
  • 发起网络请求
    client.js:23
    fetch(BASE + url, body === undefined
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 会话修复:一键扫描并修复 tool_use/tool_result 配对的会话记录

README

由 DeepSeek 最新模型翻译生成
dsh-session-fix · 会话修复 修 DSH 里坏掉的会话记录。装好之后在 设置 → 会话修复 里一键扫描、选中、修复,不用退 DSH、不用手工搬文件。 作者:汐(记忆修复师)· 许可:MIT 一、什么时候用它 会话报这种错、从此每轮都失败的时候: messages.3.1: tool_use ids were found without tool_result blocks immediately after: call_xxxxxxxx (INVALID_REQUEST) 或者会话打不开、历史加载失败,但文件还在。 如果你的报告是「凭据失效 / 网络超时 / 版本不兼容 / 配置读不进去」,那不是它,别在这上面花时间。 二、真因 模型的工具调用有一条死规矩: 一条助手消息里声明了几个工具调用,紧随其后就必须有同样数量的工具结果,一一对应,中间不许夹别的东西。 而 DSH 会把助手消息切成若干段。如果一条助手消息里的块顺序是: tool-call + text + tool-call ← 坏 切开之后,文本块夹在了两个调用之间,那条调用的结果就不再是「紧接的下一条」。上游直接拒收。
展开完整文档(README 剩余 1 节)
dsh-session-fix · 会话修复

修 DSH 里坏掉的会话记录。装好之后在 设置 → 会话修复 里一键扫描、选中、修复,不用退 DSH、不用手工搬文件。

作者:汐(记忆修复师)· 许可:MIT

一、什么时候用它

会话报这种错、从此每轮都失败的时候:

messages.3.1: tool_use ids were found without tool_result blocks
immediately after: call_xxxxxxxx (INVALID_REQUEST)

或者会话打不开、历史加载失败,但文件还在。

如果你的报告是「凭据失效 / 网络超时 / 版本不兼容 / 配置读不进去」,那不是它,别在这上面花时间。

二、真因

模型的工具调用有一条死规矩:

一条助手消息里声明了几个工具调用,紧随其后就必须有同样数量的工具结果,一一对应,中间不许夹别的东西。

而 DSH 会把助手消息切成若干段。如果一条助手消息里的块顺序是:

tool-call + text + tool-call ← 坏

切开之后,文本块夹在了两个调用之间,那条调用的结果就不再是「紧接的下一条」。上游直接拒收。

正确顺序是把非调用块放前面:

text + reasoning + tool-call + tool-call ← 好

这个坏结构一旦进了历史,每一轮都会重放它,所以这条会话此后每轮都失败。

三、它到底改什么

只做一件事:

把 assistant/message 里的 text / reasoning 块,挪到所有 tool-call 块前面。

三条不碰:

| 不碰 | 为什么 |
| 不删任何一行 | DSH 校验 seq 连续,删一条整份判损坏 |
| 不改记录类型、不从旧备份「恢复」记录 | 记录类型是契约的一部分,乱改会把结构弄成另一种坏 |
| 不动聊天正文 | user / assistant 的文字一个字节都不改 |

技术细节:

- 会话日志是一串 zstd 帧,DSH 逐帧校验。只重压改过的帧(带 checksum,与 DSH 自身写法一致),没改的帧原样复制 —— 所以帧数和边界不变,这是它还能被读回来的前提。
- 改完立刻从磁盘重读一遍自查:记录数是否没变、seq 是否连续、残留病灶是否 0、调用与结果是否配对完整。任何一项不过就当场回滚。

四、回退

修之前,原文件被改名保留在同目录:

session.v4.jsonl.zstd.before-fix-2026-10-31_20-15-33

想退回去,把它的 .before-fix-<时间戳> 去掉、覆盖回 session.v4.jsonl.zstd 就行。

备份会自己收敛:同一个会话默认只留最近 3 份,更早的自动清掉(可以在插件配置里用 keepBackups 改,最少留 1 份——刚写的那份永远不删)。

清理只认「本会话文件名 + .before-fix-」这一个前缀、只在同一个目录里动手,别的会话的备份和同目录的其它文件一个都不碰。清理失败也不影响修复结果——它只是省磁盘,不该能把活干砸。

五、能修什么 / 修不了什么

这一节是故意写清楚的 —— 免得你装了之后发现「我那个报错它居然不管」。

先说一句最容易被误会的话:用这个插件不需要退出 DSH。
它本来就跑在 DSH 里面;真退了,插件跟着下线,设置页那个按钮也就没了。
你唯一要做的只是切到别的会话,别动正在说话的那一条。

✅ 能修

报 tool_use ids found without tool_result blocks immediately after 的会话,也就是上面第二节说的那一种坏法。

❌ 修不了(别指望它救命)

| 情况 | 为什么 | 怎么办 |
| 会话文件被整个删掉(目录/文件没了) | 没有数据可修 | 先用文件恢复工具(Recuva / Disk Drill / testdisk 之类)把文件捞回来,再交给本插件 |
| seq 已经断档 | 结构性损坏,修了也是坏的 | 插件只报不修,把文件发给作者 |
| 调用与结果配对不上(悬空调用 / 孤立结果) | 同上,缺的那条补不回来 | 同上 |
| 帧解不开(文件被截断) | 文件本身坏了,不是结构问题 | 先备份,再用恢复工具试;本插件不动它 |
| 报错根本不是这一类 | 病因不在会话结构 | 看具体报错排查,别归因到这里 |

⏸ 唯一不能碰的会话

正被打开着的那条。

本插件跑在 DSH 里面,所以不用退出 DSH —— 退出了它自己也死了,那就什么都修不了。

但「正在说话的那条会话」文件还在被宿主追加写入,动它就是拿历史换事故。所以列表里会把它标成 「被占用」,并且不给修复按钮。

要修它,先切到别的会话,再回来。

六、适用版本

- 会话格式 v4(session.v4.jsonl.zstd)
- 需要 Node 内置 zstd 支持:Node ≥ 22.15(桌面版自带的运行时满足)
- 在 DSH 0.2.1-rc 系列上实测

七、安装

本插件是标准的 DSH 插件包(dsh.bundle.patch + dsh.client)。

A. 从 GitHub 装(推荐)

在 profile 目录里(默认 %USERPROFILE%\.dsh\profiles\<profile>)
pnpm add github:CalamitySpiritKite/dsh-session-fix

B. 本地链接(改代码 / 自己用)

git clone https://github.com/CalamitySpiritKite/dsh-session-fix.git
cd <profile 目录>
pnpm add link:<刚 clone 下来的目录绝对路径>

两种方式装完,确认 cordis.patch.yml 里有这一行(多数情况 dsh.bundle.patch 会自动带上;没有就手加):

- id: dsh-session-fix
name: dsh-session-fix

然后重启 DSH,设置页左侧会出现「会话修复」。
卸载:pnpm remove dsh-session-fix,再把 cordis.patch.yml 里那两行删掉,重启。

注意用 pnpm,别用 npm。 不是 npm 装不上 —— npm 也能装 git 依赖;是 DSH 的配置档本身是个 pnpm 工作区,用 npm 装会和它的依赖树打架。装之前还要有 git。

八、自己验一遍(可选)

仓库里带了两个自测脚本,用的是你自己的真实会话文件,全程只读,所有写入都在系统临时目录:

内存里造坏 → 修 → 逐项对照(不写盘)
node tools/selftest.mjs "%USERPROFILE%\.dsh\sessions\<某个>\session.v4.jsonl.zstd"

完整落盘流程:临时目录里复制一份,造坏 → 原子替换 → 验备份 → 验回退
node tools/e2e.mjs "%USERPROFILE%\.dsh\sessions\<某个>\session.v4.jsonl.zstd"

两个都跑出「全部通过」再装,心里就有底了。

九、它会动你的哪些文件

| 文件 | 动作 |
| session.v4.jsonl.zstd | 修复时原子替换(先改名原件,再放新文件) |
| session.v4.jsonl.zstd.before-fix-<时间戳> | 新建,原件备份;同一会话只留最近 3 份,超出自动删 |
| 同目录 *.tmp-<时间戳> | 只在替换过程中短暂存在,失败会清掉 |

不碰:别的会话、记忆、附件、配置、当前打开的会话,以及不属于本会话的备份文件。

十、给踩到的人一句话

会话记录是唯一真源:没有索引、没有副本、没有回收站。它在,你的历史就在;它没了,那段历史与你再无关系。

这个插件能救的是「写坏了的结构」,救不了「已经不存在的文件」。

所以:别在运行中删会话目录,删之前先复制一份。
预览分享卡片长什么样 ↓CalamitySpiritKite/dsh-session-fix
分享 · DeepSeek Harness Hub
CalamitySpiritKite/dsh-session-fix

一键扫描并修复工具调用配对错乱的会话记录

这是你的仓库?认领条目

回到顶部