DeepSeek Harness 跨工作区迁移:Session 与 Registry 恢复

作者
DeepSeekAgent.io 编辑部
发布
更新

DeepSeek Harness v0.2.1-rc.3 的社区案例展示了一条完整的 Session 迁移故障链:用户在界面中把大型会话从 Workspace A 移到 Workspace B,迁移过程被中断,源位置与目标位置随后出现相同 Session ID 的两个副本。目标副本已经位于 B 的存储路径,Header 中的 cwd 却仍指向 A;下一次启动时,Workspace Registry 无法为这条记录建立一致身份,依赖 Registry 的服务也随之停在 pending。

这个案例值得单独分析,因为它把“历史会话不显示”追溯到了生产端。此前的恢复思路主要关注读取器如何跳过异常记录,这次则能看到异常记录如何由一次未完成的跨工作区移动产生。

一次移动包含哪些状态

表面上,移动 Session 只是从菜单里选择另一个 Workspace。持久化层至少要同步处理四类状态:

  1. Session 事件文件或压缩产物;
  2. Session Header 中的 cwd、ID 与格式版本;
  3. 源 Workspace 和目标 Workspace 的索引关系;
  4. Workspace Registry 及其依赖服务看到的最终归属。

这些写入如果分别完成,就会出现中间状态。社区案例中的目标副本只有 3035 条事件记录,源副本有 3045 条,说明复制在尾部完成前中断。与此同时,目标路径已经建立,Header 和 Registry 仍停留在旧归属。磁盘上因此同时存在“更短的新位置副本”和“更完整的旧位置副本”。

为什么一个坏副本会拖住八个服务

DSH 会校验 Session 的存储身份。路径表示它属于 Workspace B,Header 的 cwd 却表示它属于 Workspace A,同一个 Session ID 还在两个位置出现。assertStoredIdentity 拒绝这种组合后,Workspace Registry 无法完成初始化。

社区报告列出的连锁影响涉及 Session controller、Schedule、Workspace controller、UI deliverables、Task board、Git graph、Archive 等八类服务。它们并非同时发生八个独立故障,而是共享的 Registry 前置条件一直没有满足。界面可能因此持续加载,后台服务则保持 pending。

这类症状很容易被误判为“工作区坏了”或“升级后会话没了”。更准确的诊断路径是先确认 Registry 为何没有 ready,再检查是否存在重复 ID、路径与 Header 分歧,以及事件记录长度不同的副本。

恢复时先找事件记录的超集

恢复目标是保住最完整的 Session 历史,同时重新建立唯一身份。推荐顺序如下:

  1. 完全退出 DSH,复制完整数据目录与两个 Workspace,保留原始时间戳;
  2. 按 Session ID 找到所有副本,只读比较 Header、事件条数、尾部记录和附件引用;
  3. 确定哪一份是事件记录的超集,不能只根据修改时间或所在目录判断;
  4. 在备份上验证超集副本能否完整解析,再决定它最终属于哪个 Workspace;
  5. 将多余副本移入隔离目录,保留回滚条件,避免直接删除;
  6. 统一最终存储路径、Header cwd 与 Registry 归属,然后重启并核对八类依赖服务;
  7. 打开 Session,检查最新消息、附件、压缩记录、任务板与继续对话能力。

如果两个副本各自拥有对方没有的事件,不能按“文件更大”简单覆盖。需要先确认事件序列是否拥有共同前缀,再判断能否合并;否则应保留两份证据并等待上游提供恢复工具。

迁移操作需要事务边界

可靠的跨工作区移动可以采用“准备—验证—切换—清理”的流程:

  • 准备:在目标位置写入临时副本,并记录迁移标记;
  • 验证:核对事件数量、内容哈希、Header 与附件引用;
  • 切换:以一次可恢复的 Registry 更新改变唯一归属;
  • 清理:确认新位置可读后再处理旧副本并移除迁移标记。

应用重新启动时,如果发现迁移标记,可以继续、回滚或展示恢复入口。它不应把半成品当成正式 Session,也不应让单条异常阻塞整个 Registry。读取端仍然需要 per-artifact isolation:一条记录无法归属时,其他 Workspace 和 Session 应继续加载。

这与历史会话不可见的排查与恢复形成前后两部分:前者解释列表如何容错,本篇解释不一致副本如何生成。对经常移动大型 Session 的用户,最实用的预防措施是让工作区保持稳定、迁移前备份,并在移动完成前避免退出或强制结束 Desktop。

参考资料

常见问题

同一个 Session 出现两个副本时,应该保留目标目录里的那个吗?

不能只看目录。应比较事件序列、Header、附件引用与尾部记录,优先保护内容完整且能通过解析验证的副本。

Workspace 一直加载是否代表所有会话都损坏了?

不代表。一个身份冲突的 Session 就可能阻断 Registry 初始化。隔离异常记录后,其余会话可能仍然完整。

可以直接修改 Header 里的 cwd 吗?

先做完整备份并核对 Registry、存储路径和重复 ID。只改 cwd 可能留下第二个同 ID 副本,无法消除身份冲突。