前言¶
在 DeepSeek Harness(DSH)里,对话挂在工作区上。换一个项目目录往往意味着要在新工作区重新开线程,标题、工具调用记录和 token 统计很难整体带过去。手动导出再粘贴既费事,也容易丢上下文。
下面介绍的 dsh-session-transfer(维护者 xiaolin233-ctrl)是 DSH 插件包:在侧栏会话菜单里增加「转移到其他工作区…」,把选定对话按官方持久化 API 重放到目标工作区,而不是改写源日志文件。
这是什么¶
- 定位:在工作区之间迁移会话,保留完整事件历史与会话标题。
- 包名 / 版本:
dsh-session-transfer1.1.0(MIT)。 - 环境:DSH 须支持 Host + Web 客户端插件包;Node.js ≥ 22.5。
- 目录页:skillhub.cn 条目(社区目录,与 DeepSeek / 幻方无官方从属关系)。
- 源码:GitHub 仓库。
仓库即插件包:无构建步骤、无运行时依赖;改 impl.js 后刷新页面即可验证(Host 侧每次请求热加载)。
核心功能¶
侧栏入口与转移结果¶
在侧栏某条对话的「⋯」菜单中出现 转移到其他工作区…。选择目标工作区并确认后,该对话在目标侧完整出现:标题、工具调用、token 用量等随事件日志保留,可照常打开并继续。
可选行为(对话框内勾选):
- 保留原工作区的对话:默认不勾;原对话会归档(仅从分组表面隐藏,可在「已归档」恢复),不删除数据。
- 源工作区有多条对话时,可 同时转移该工作区全部对话:逐个复制,子代理会话自动跳过。
如何保证不损坏对话¶
会话在磁盘上是只追加的事件日志(session.v4.jsonl.zstd)。插件不改写已有字节,经 sessionPersistence 重放:
- 读源会话完整日志(活会话先
sessions.flush();存储落后内存时回退内存日志)。 - 校验
seq从 0 连续;正在回答的活会话会拒绝,避免复制半截回合。 - 在目标工作区用新 id
create:header 字段(version/createdAt/isSeeded/delegationDepth/agentPreset/parentSession等)原样复制,仅cwd指向目标工作区。 - 按每批 500 条
append全部事件后flush()。 - 写后重新读取核对条数、
seq连续性与末条seq;不一致则verify-failed,不冒充成功。 attachSession挂到目标工作区;sessionProjectionCache.coldSnapshot补投影缓存(否则侧栏可能显示「未命名对话」)。- 默认归档源会话;勾选保留则不动源会话。
投递标记:原样复制 session-log-deepseek/delivery-accepted 会导致副本 id 与 header 不一致。插件只改写本会话自身产生的事件(seq >= inheritedEventCount)中的投递标记为新 id;从父会话继承的前缀保持原样。
拒绝与批量错误码¶
- 子代理会话(
header.origin === 'subagent')单独转移会被拒绝,避免孤儿会话。 - 需格式迁移的旧会话会先拒绝(
format-migration-required)。 - 批量转移时单条失败放在
results[]单项里,不抛 HTTP 错误,其它会话可继续成功。
安装与启用¶
- 将仓库放到本机任意目录(路径可含空格)。
- 在 DSH 会话里安装本地插件包,target 指向含
package.json的仓库根目录:
plugin_manager action: install_bundle target: <仓库绝对路径>
装完后 application 应为 applied、warnings 为空;插件列表中出现 dsh-session-transfer(enabled / active)。
- 刷新浏览器页面以加载 Web 客户端半边(Host 半边安装后即生效,无需重启 DSH)。
卸载:
plugin_manager action: remove_bundle target: dsh-session-transfer
安装前建议阅读仓库源码与 MIT 许可证;插件以当前 DSH 进程权限访问会话存储与工作区。
典型用法¶
- 侧栏将鼠标移到目标对话上,打开「⋯」→ 转移到其他工作区…。
- 选择目标工作区,按需勾选「保留原工作区的对话」或「同时转移该工作区全部对话」。
- 点 转移;完成后可点 打开新会话 进入副本。
Host 侧主要路由(供集成或排查参考):
GET /dsh-session-transfer/state?sessionId=…:工作区列表与当前会话状态。POST /dsh-session-transfer/transfer,body 含sessionIds、targetWorkspaceId、keepOriginal等。
适用场景与注意¶
适合:多工作区切换时想把整条对话(含历史与标题)迁到另一目录;需要归档源会话、在目标工作区无缝续聊。
注意:
- 源会话正在回答时需等本轮结束(
session-running)。 - 读源失败、日志不连续(
read-failed/log-corrupt)不会写入任何副本。 - 写入或校验失败可能留下
partialSessionId,需在存储中自行清理;原会话通常未被改动。 - 附件在全局存储,不随会话目录迁移;事件中的引用按 DSH 现有机制保留。
仓库自检插件曾在 Host 进程内验证无种子会话(26 条事件)与种子会话(1250 条事件、inheritedEventCount = 1248)等用例,核对 cwd、header 字段、事件序列与侧栏标题等行为。
结尾¶
dsh-session-transfer 用官方持久化重放实现工作区间对话迁移,侧重完整性与写后校验,而不是手工复制侧栏文本。需要安装包或源码时,可访问 社区目录页 与 GitHub 仓库。