dsh-session-attachment-repair:修复因本地附件缺失导致的发消息失败

前言

在 DeepSeek Harness(DSH)里,会话往往「能打开、历史也能看」,但一发送新消息就失败。表面错误常常是兜底的 ... API stream from ... failed,容易误判为网络或通道问题;换模型后才会看到 Attachment object is missing. 这类真实原因。

DSH 每次发消息都会重放整段历史。历史里若引用过图片或文件,而对应内容对象已从本地附件库消失,请求会在准备阶段中断。手工排查还容易踩坑:只改文件不重启服务端、误读多帧 zstd 会话日志、无备份就覆盖不可逆数据。下面介绍社区插件 dsh-session-attachment-repair(维护者 chenkui-luo,分类:工作流),如何把「证明缺失 → 备份 → 替换悬空引用 → 校验 → 重启复验」固定成可审计流程。

这是什么

dsh-session-attachment-repair 同时是 DSH Skill 与 DSH 插件包(npm 名 dsh-plugin-session-attachment-repair)。它专门修复一类故障:会话历史引用的附件对象不在本地 attachment store 中,导致后续请求失败。

数据不出本机:不联网、不上传、不调用模型。插件形态下只做转发,调用仓库内 scripts/repair_session.mjs,与 Skill 共用同一套修复逻辑,避免分叉。

核心功能

经过上面的定位,插件(及同仓库脚本)提供的能力包括:

  1. 扫描与体检:列出受影响的会话,统计悬空附件(图片与文件分别计数);verify 发现悬空附件时以退出码 1 结束,便于脚本判断。
  2. 修复与占位:将悬空附件引用替换为文本占位(界面显示为 [图片已不可用:…] 一类说明);不能恢复已丢失的图片字节——附件库按内容哈希与尺寸校验,原图拷回会被判为损坏。
  3. 备份与回滚:写入前强制同位备份(如 session.v3.jsonl.zstd.bak-<时间戳>);支持从指定备份 restore;写入前后有哈希比对。
  4. 逐节点校验:确认改动仅发生在「悬空附件 → 文本占位」,其余内容不变。
  5. Web 界面:安装插件后,在「设置 → 会话附件修复」中扫描、预览、备份并写入;写入与还原需二次确认。

不适用:网络/代理、鉴权与余额、限流、上下文超长、模型配置错误,以及「对象存在但元数据不匹配」的损坏;若失败来自 DSH 版本升级的破坏性变更,应走升级流程而非本工具。

安装与启用

DSH 主目录默认为用户主目录下的 .dsh,可用环境变量 DSH_HOME 或命令行 --home <目录> 覆盖。

插件方式(Web 宿主)

官方文档给出的安装命令如下:

dsh plugin --profile web add github:chenkui-luo/dsh-session-attachment-repair

刷新页面一次,然后打开「设置 → 会话附件修复」。无 dsh CLI 时,可将仓库放到 <profile>/node_modules/dsh-plugin-session-attachment-repair,并在 <profile>/cordis.patch.yml 增加插件注册项(详见仓库 README)。

Skill 方式

交给 Agent 安装时,可使用仓库地址 https://github.com/chenkui-luo/dsh-session-attachment-repair,或把整个目录放到宿主 skills 根目录(例如 ~/.dsh/skills),目录名需与 SKILL.md 里的 name 一致。无需额外配置或密钥。

环境与权限:需要 Node.js ≥ 22.15(依赖 zlib 的 zstd 同步编解码);需要会话目录读写权限。插件以当前 DSH 进程权限运行,安装前建议自行查看源码与 MIT 许可证。Windows 已在文档中标注实际执行通过;macOS / Linux 文档标注为未验证。修复后需由用户亲自重启服务端,再发一条消息复验,才算真正通过。

典型用法

自然语言(Skill)

例如:

  • 「这个会话发不出消息了,帮我看看是不是附件丢了」
  • 「把所有发不出消息的会话排查一遍」

命令行

主要入口:

node scripts/repair_session.mjs scan                    # 扫描受影响的会话
node scripts/repair_session.mjs verify --session <id>   # 单个会话体检
node scripts/repair_session.mjs repair --session <id>   # 生成修复副本(不写入)
node scripts/repair_session.mjs repair --session <id> --apply   # 备份并写入
node scripts/repair_session.mjs restore --session <id> --backup <备份文件>
node scripts/repair_session.mjs self-test               # 编解码与备份链路自检

扫描与体检可加 --json 输出结构化结果。自检与回归测试:

node scripts/repair_session.mjs self-test
node tests/run_tests.mjs

适用场景与注意

适合:本地 DSH 用户、长期保留带图/带文件附件的会话,且已确认失败与「Attachment object is missing」或同类悬空引用有关。

务必注意:

  • 会修改会话日志;虽有备份,仍应把备份当作唯一回滚依据。
  • 只改磁盘不重启时,已打开会话可能仍留在服务端内存,复验会得到假阴性。
  • 会话日志为多帧 zstd 首尾相接,不要用「一次性解码」误判文件内容。
  • DSH 升级后若日志或附件库布局变化,脚本约定可能需要同步更新。

结尾

dsh-session-attachment-repair 把「附件对象已从本地库消失」这一类会话故障,收成可扫描、可备份、可校验、可回滚的工作流;插件侧与 Skill 共用同一脚本,避免两套逻辑。社区目录页与源码:

  • 目录页:https://www.skillhub.cn/plugins/chenkui-luo/dsh-session-attachment-repair
  • GitHub:https://github.com/chenkui-luo/dsh-session-attachment-repair

DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye