前言¶
DeepSeek Harness (DSH) 的会话数据通常以 JSONL 格式存储在本地文件系统中。在现有的 DSH 环境中,将一个已存在的“冷”会话从当前工作区移动到另一个工作区,同时保留其 SessionId 和完整的事件历史记录,是一个难以直接通过标准接口完成的操作。官方安装的 DSH rc.6 版本尚未内置会话迁移能力。dsh-session-move 插件旨在填补这一空白,提供会话迁移的底层实现。
插件定位¶
这是一个由 kirkchinese 维护的 DeepSeek Harness 功能插件包。它的核心作用是在两个 DSH 工作区之间移动现有的冷会话,并在迁移过程中保证会话 ID 和历史记录的完整性。该插件的交互目标直接指向 DSH Web 侧边栏中的现有会话标题行。
核心功能¶
插件通过以下能力实现会话迁移:
- 只读检查:提供
ctx.sessionMove.inspect({ sessionId, targetWorkspaceId })接口,用于执行 dry-run(试运行)检查。 - 侧边栏拖拽:在 DSH Web UI 中,用户可以直接通过拖拽会话标题行来执行移动操作。
- RPC 调用:底层通过
workspace.moveSessionRPC 完成实际的会话变更提交。
检查能力¶
inspect 接口不会修改数据,仅返回以下检查信息:
* 源和目标工作区的身份标识。
* 源和目标 JSONL 文件的存储路径。
* 源和目标文件的不可变头部信息。
* 持久化修订版本号。
* 物理行数和逻辑事件计数。
* 连续序列边界。
* 事件的 SHA-256 哈希值。
* 阻塞条件(如会话处于活跃状态、已归档、目标位置冲突、后端/核心能力不支持等)。
迁移语义¶
一次成功的迁移只会改变会话头部的 cwd(当前工作目录)及其所属的工作区账户。它不会修改 SessionId、创建时间、血缘关系、预设配置、所有逻辑事件以及外部的 dsh-session: 引用。迁移后的会话将在未来工具调用和沙盒策略中归属于目标工作区。
安装与启用¶
安装该插件需要使用已应用特定补丁的 DSH 构建。安装命令如下:
dsh plugin --profile <profile> add dsh-session-move
如果使用打包好的 tarball,可以使用以下命令:
DSH_HOME=<dsh-home> pnpm dsh plugin --profile <profile> add ./dsh-session-move-0.1.0.tgz
安装后建议执行 dsh --profile <profile> --dump-config 确认配置加载正常。
运行环境要求¶
- 依赖包:插件依赖
@deepseek-ai/dsh-base以及dsh-headless或dsh-web-app等主机包。如果配置文件中仅包含@deepseek-ai/dsh-base,插件将因缺少必要的主机层而无法激活。 - 版本要求:需要与 DSH 的核心版本兼容(如
>=0.1.0-rc.5 <0.1.0-rc.7)。
典型用法¶
插件提供了两种主要的操作方式:
1. 代码调用¶
通过编程接口调用只读检查,或通过 RPC 调用执行移动:
// 检查迁移可行性
ctx.sessionMove.inspect({ sessionId, targetWorkspaceId })
// 执行移动(通常由 UI 侧边栏拖拽触发)
workspace.moveSession({ targetWorkspaceId, sessionId, beforeSessionId? })
2. 侧边栏操作¶
在 DSH Web 界面的侧边栏中,选中一个冷会话标题,将其拖拽至目标工作区,系统将自动调用上述 RPC 完成迁移。
适用场景与注意¶
- 适用范围:当前版本仅支持 JSONL 格式的会话和 冷会话(非活跃会话)。SQLite 和 Windows 系统的迁移功能已列入计划但尚未实现。
- 官方版本限制:官方安装的 DSH rc.6 版本未包含迁移或移动能力,仅支持上述
inspect接口的只读功能。要使用拖拽移动功能,必须使用带有补丁的特定构建版本。 - 并发与锁:插件依赖 DSH 的“每个会话/进程一个实时写入者”模型。文件系统锁仅作为纵深防御手段,不用于跨进程的并发事务性写入控制。
- 数据安全:在迁移完成后,插件会验证最终头部、唯一的有效工作区所有者、事件计数和逻辑事件 SHA-256,确认无误后才会删除恢复日志。
总结¶
dsh-session-move 为 DSH 用户提供了在跨工作区管理会话历史时的必要手段。通过保留 SessionId 和事件流,它允许开发者在不丢失上下文的情况下重新组织会话结构。更多详细文档、分发指南和回滚步骤可查阅项目仓库。