前言¶
DeepSeek Harness(DSH)的会话日志采用多帧 zstd 存储,第 1 个帧必须只包含 header 那一行,其余每帧独立可解码。DSH 用 assertZstdHeaderFrame 校验,不满足就抛 SessionPersistenceCorruptionError,同时会静默跳过这条日志——表现为迁移完成后,对话在侧边栏里彻底消失,但文件其实完好。
手工改 header 时容易踩两个坑:一是把整份日志一次性重压,会把「头部帧 + 上千个事件帧」塌缩成单个帧,正好触发校验;二是硬编码日志文件名,v0 叫 session.jsonl.zstd,vN(N>0) 叫 session.vN.jsonl.zstd,硬编码 v0 名字的实现,在较新的 DSH 上会一个会话都定位不到。
这是什么¶
dsh-session-mover 是一个 DSH 工作流插件,由维护者 yvban 开发。它把 DSH 会话从一个工作区安全搬到另一个工作区,保留可续聊的完整历史,通过帧级 zstd header rewrite 和字节级验证实现。
核心功能¶
1. 迁移会话¶
在设置 → 会话迁移里选目标工作区、选会话、点一下,就把会话搬过去,归属即时更新、无需重启。
2. 按标题认会话¶
列表显示会话标题(与侧边栏同源),并标出它当前属于哪个分组;支持按标题 / 路径 / ID 过滤。
3. 帧级改写¶
只重压第 1 帧(header,写入新 cwd),body 帧字节原样保留。
4. 字节级校验¶
帧数不变 + 每个 body 帧逐字节比对 + 头部 id/cwd 核对;不做全量解压,大日志也不吃内存。
5. 整目录备份¶
迁移前把整个会话目录 + manifest.json 备份到 <DSH_HOME>/storages/session-mover-backup/<id>/<时间戳>/。
6. 拒绝覆盖¶
目标工作区已有同 id 会话时直接拒绝,不动原会话。
7. 事务性¶
先写临时文件并校验,通过后才 rename;任何一步失败都会清掉半成品。
8. 归属热更新¶
通过官方实体 API(WorkspaceEntity.attachSession / detachSession)更新分组,无需重启。
9. 帧结构修复¶
已经被「整份重压」搞坏、在界面里消失的会话,可以就地修复(修复前自动备份)。
安装与启用¶
# 有 git(标准写法)
dsh plugin --profile <你的 profile> add github:yvban/dsh-session-mover#main
# 没有 git:pnpm 解析 github: 依赖需要 git,可以改用归档 tarball 的 URL
dsh plugin --profile <你的 profile> add https://github.com/yvban/dsh-session-mover/archive/refs/heads/main.tar.gz
<你的 profile> 通常是 web;桌面版是 desktop。如果 PATH 里没有 dsh,用应用自带的 CLI:
& '<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd' plugin --profile desktop add github:yvban/dsh-session-mover#main
装完重启 DSH(客户端面板在启动时加载),然后打开设置 → 会话迁移。
典型用法¶
- 目标工作区:下拉里选一个已注册的工作区。
- 选中会话:列表按创建时间倒序,每行显示标题 / 当前分组 / 原始 cwd / 体积 / 会话 ID。
-打开中的会话不能迁移(日志被写句柄占着)。
- 标了帧结构异常的会话先用「修复帧结构」,修完重启 DSH 就会重新出现。 - 迁移选中会话:完成后归属即时生效,不用重启。
适用场景与注意¶
适合需要在多个工作区之间整理会话、修复被损坏的会话日志、保持会话归属与日志内容一致的场景。
插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。迁移不会改动 defaultWorkspaceId,也不会动别的会话。热更新归属只用到一个非公开方法 workspaceRegistry.indexHeader(),若该方法在某版本不存在,插件会自动退回「直写 workspace.json」并提示需要重启;再不行就只搬文件,重启后手动把会话拖进目标分组。
短结尾¶
dsh-session-mover 通过帧级改写和字节级校验,解决了 DSH 会话迁移中会话静默消失的问题,适合需要安全整理工作区会话的开发者。插件目录:https://www.skillhub.cn/plugins/yvban/dsh-session-mover;源码:https://github.com/yvban/dsh-session-mover