dsh-session-merge:用 DSH 写入接口合并与会话追加

前言

在 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 / 幻方无官方从属关系。

典型用法流程

  1. 安装并重启,对目标会话执行 inspect / verify / planCompact。
  2. 按需求选择 forkClone、fullCopy、mixCopy 或 fromJsonl 等写入模式,必要时先 dryRun: true。
  3. surface 接近上限时用 planCompact 算切点,或走分批追加 + autoCompact + 重启循环。
  4. 完成后再次 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
羽毛球分组比赛记分
小程序二维码

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

小夜