前言¶
在 DeepSeek Harness(DSH)里做 agent 开发,上下文往往散在多个会话里:误开新窗口、并行两条对话线、fork 出去又希望并回一条时间线。想「把几段历史拼成一个会话」时,直接在磁盘上拼接 session.v4.jsonl.zstd 一类文件,DSH 通常打不开——压缩节点里的 shadowedRange / shadowedSeqs 仍指向旧 seq、seq 需从 0 密集递增、surface 折叠与工具调用的 callId 跨会话也对不齐。
社区插件 dsh-session-merge(维护者 HCQM,分类:记忆)走另一条路:通过 DSH 自带的会话写入能力做合并或追加,README 明确说明不会在磁盘上直接改会话文件;写入前有多层校验,目标是合并后仍能被 DSH 正常 open。
这是什么¶
dsh-session-merge 是面向 DSH 桌面端的会话合并/救援工具,npm 包名 dsh-session-merge,当前版本 0.6.0(见仓库 package.json),许可证 MIT。插件在 DSH 里显示为「会话合并」,peer 依赖 @deepseek-ai/dsh >=0.2.1-rc.5 <0.3.0-0,README 写明在 DSH 0.2.1-rc.5 桌面端(Electron)实测,会话格式为 v4(session.v4.jsonl.zstd)。
定位上作者强调:来自「误开新会话、想把两段合回去」的真实需求,不是通用日常插件;保证事件不删(/compact 也只是生成摘要,原文仍在会话里),代价是会话 surface 变大。
核心功能¶
下面介绍单一工具 session_merge_build 的几种用法(共 11 种模式,可独立调用;细节见仓库 FEATURES.md / API.md)。
只读:先看清结构再动手¶
装好后建议先跑三个只读动作,不写任何数据:
session_merge_build({ inspect: true, targetId: "<会话id>" }) // 事件 / turn / surface 体积 / 压缩节点
session_merge_build({ verify: true, targetId: "<会话id>" }) // 官方 persistence.open 能否通过
session_merge_build({ planCompact: true, targetId: "<会话id>" }) // 按 turn 边界算切点与每段体积
写入:合并与追加¶
| 能力 | 作用(据 README) |
|---|---|
forkClone |
官方 sessions.fork 克隆,保留压缩节点 |
fullCopy |
多源全类型复制,按 assistant 回复去重 |
mixCopy |
按时间窗混合,byteBudget 到量停止 |
fromJsonl |
按区间写 JSONL,自动补 turn 边界与 seq 偏移 |
copySequential |
单源直线复制,重映射 seq 引用 |
makeRoot |
把因父会话删除等导致的断链会话改造成合法根 |
autoCompact / autoCompactAfter |
触发压缩(spawn 脚本走 RPC);写入后可按阈值自动压 |
所有写入模式均支持 dryRun。
三层校验¶
README 将校验分为三层:写入前 validate-full.mjs 轻量预检;写入后或排障时用 deep-validate.mjs 六层深度校验;需要与 DSH 完全一致结论时用 verify(调 persistence.open)。命令行可独立跑:
node bin/validate.mjs <会话id前缀|目录|文件> [--json] [--no-replay] [--strict-replay]
node bin/validate.mjs --all
包内还提供 bin 命令 dsh-session-validate(指向 ./bin/validate.mjs)。
硬约束与分批写入¶
单次模型请求上限 1,048,576 tokens;README 实测反推 surface 约 3.8 字节/token,并建议可见 surface 安全线约 ≤3.4 MB(再大 /compact 可能发不出去)。历史过大时需分批:追加一批(例如 surface ≤ 2.4 MB)→ autoCompact → 重启 DSH(压缩后会话被 agent 占用写句柄,插件无法释放,压缩后须重启才能继续追加)→ 再追加 → 最后 verify。
示例(README):
session_merge_build({ mixCopy: true, sources: ["<源>"], targetId: "<目标>", byteBudget: 2400000 })
session_merge_build({ autoCompact: true, targetId: "<目标>" })
安装与启用¶
安装命令以 README 为准:
dsh plugin --profile desktop add dsh-session-merge
重启 DSH 后,在插件列表中应出现「会话合并」。插件声明权限为:读取会话列表与事件;写入、折叠、克隆会话(见 package.json 的 dsh.permissions)。
DSH 生态是「一切皆插件」;社区目录页(如 SkillHub)与 GitHub 仓库由维护者发布,与 DeepSeek / 幻方无官方从属关系。
典型用法流程¶
- 安装并重启,对目标会话执行
inspect/verify/planCompact。 - 按需求选择
forkClone、fullCopy、mixCopy或fromJsonl等写入模式,必要时先dryRun: true。 - surface 接近上限时用
planCompact算切点,或走分批追加 +autoCompact+ 重启循环。 - 完成后再次
verify,确认 DSH 能打开。
跨会话搬运时 README 列出的已知损失包括:空回复唤醒记录可能被去重跳过、未闭合 turn、孤儿工具调用、部分 inbox 事件等;并行会话的时间戳会保留真实交错,不会强行改成单线叙事。
适用场景与注意¶
适合:一次性把多段 DSH 会话合成一条可检索时间线;修复 parentSession 错误导致打不开的会话(makeRoot);极端情况下按排障手册做分段压缩救援(非主路径)。
不适合:当作日常记忆系统——长期应依赖记忆库(记忆卡 / memory_recall 等);也不是为了省 token(合并只会增大 surface)。
安全:插件以当前 DSH 进程权限读写会话数据。安装前请阅读 GitHub 仓库 源码与 MIT 许可证,确认符合你的环境策略。
结尾¶
dsh-session-merge 解决的是「多会话历史如何合法并入一条 DSH 会话」——不靠手拼文件,而靠 DSH 写入接口与校验链保证可打开、可继续 /compact。
- 目录页:https://www.skillhub.cn/plugins/HCQM/dsh-session-merge
- 源码与文档:https://github.com/HCQM/dsh-session-merge