dsh-session-move:在 DSH 工作区间迁移冷会话

前言

DeepSeek Harness (DSH) 的会话数据通常以 JSONL 格式存储在本地文件系统中。在现有的 DSH 环境中,将一个已存在的“冷”会话从当前工作区移动到另一个工作区,同时保留其 SessionId 和完整的事件历史记录,是一个难以直接通过标准接口完成的操作。官方安装的 DSH rc.6 版本尚未内置会话迁移能力。dsh-session-move 插件旨在填补这一空白,提供会话迁移的底层实现。

插件定位

这是一个由 kirkchinese 维护的 DeepSeek Harness 功能插件包。它的核心作用是在两个 DSH 工作区之间移动现有的冷会话,并在迁移过程中保证会话 ID 和历史记录的完整性。该插件的交互目标直接指向 DSH Web 侧边栏中的现有会话标题行。

核心功能

插件通过以下能力实现会话迁移:

  1. 只读检查:提供 ctx.sessionMove.inspect({ sessionId, targetWorkspaceId }) 接口,用于执行 dry-run(试运行)检查。
  2. 侧边栏拖拽:在 DSH Web UI 中,用户可以直接通过拖拽会话标题行来执行移动操作。
  3. RPC 调用:底层通过 workspace.moveSession RPC 完成实际的会话变更提交。

检查能力

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 和事件流,它允许开发者在不丢失上下文的情况下重新组织会话结构。更多详细文档、分发指南和回滚步骤可查阅项目仓库。

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

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

小夜