dsh-session-migration:在 DSH 会话头一键迁整段会话与工作区

前言

DeepSeek Harness(DSH)里,一段会话并不只是聊天日志:sessionId 落在 ~/.dsh/sessions/<projectKey(cwd)>/<sessionId>/ 下,日志 frame 1 里又写了一份 cwd,~/.dsh/storages/workspace.json 里的 workspace.sessionIds 再决定它出现在哪个工作区列表。想换目录或合并工作区时,手改文件夹或 registry 很容易撞上三类实际问题:复制而非移动导致重复 sessionId、registry 指向已删除数据使整个工作区打不开、或在 DSH 运行时直接改 workspace.json 被内存中的 registry 覆盖。下面介绍社区插件 dsh-session-migration(维护者 Alvin070911),在会话头提供一个按钮,按 DSH 自身的存储约定做迁移、备份与健康检查。

这是什么

dsh-session-migration 是 DSH 客户端插件:在任意会话头部的 utilities 区出现一个图标按钮(双面板加箭头),打开迁移面板。它把整段会话的 log、header.cwd、工作区归属 一并迁到目标工作区或自定义目录,并附带会话浏览、一键导出备份、工作区健康检查。实现上只调用 DSH 自带服务,遵循「移动而非复制」、只改 frame 1、通过 live workspaceRegistry 写注册表等约定。当前 GitHub 星标为 0;package.json 版本为 0.1.0,许可证 MIT。

生态上,DSH 以「一切皆插件」组织能力;SkillHub 目录页 是社区站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

资料中列出的能力如下,写入正文前已与 README 对齐。

会话迁移

  • 迁到已有工作区,或通过「custom path」浏览/输入任意目录。
  • 先 preflight,再执行;自动备份、字节级校验、失败自动回滚,并输出可复制的手动回滚命令。
  • 可选把源工作区 顶层文件/目录 一并挪到目标;若目标存在同名项则拒绝;源目录保留为空目录,以免同目录下其他会话失效。
  • 当前正在使用的会话不能迁移自身(日志仍被打开,插件会拒绝)。

会话列表与健康检查

  • 列表展示:id、工作目录、日志大小、frame 数、最后写入、当前归属、问题标记。
  • 健康检查覆盖:悬空引用、重复 id、header 与目录不一致、空日志、工作区目录缺失、未注册会话等;其中 dangling-reference 可通过 live registry 一键清理,无需关闭 DSH。

导出备份

将 session 目录复制到你指定的目的地,并附带 migration-export.json 清单,不修改 registry。

安装与启用

安装命令以仓库 README 为准,不要用名称自行拼接 dsh plugin add。

本地目录(自托管常用):

plugin_manager install_bundle  target = C:\path\to\dsh-session-migration

从 GitHub:

plugin_manager install_bundle  target = git+https://github.com/Alvin070911/dsh-session-migration.git

也可在 profile 的 cordis.patch.yml 中自行插入:

- insert:
    - id: session-migration
      name: dsh-session-migration

浏览器端由 dsh.client 声明自动加载。若按钮未出现,刷新页面一次——新装的客户端 bundle 需要页面重新遍历模块图。

插件在 cordis.patch.yml 中支持 config(默认值见下)。数据目录位于 <dshHome>/plugin-data/dsh-session-migration/(pending.json、自动备份、手动导出等)。

- id: session-migration
  name: dsh-session-migration
  config:
    backupBeforeMove: true
    keepBackups: 10
    tryImmediateAttach: true
    pendingApplyDelayMs: 2500
    dshHome: ''
    sessionsRoot: ''

dshHome 默认为 $DSH_HOME,否则 ~/.dsh;sessionsRoot 默认为 <dshHome>/sessions。

安装前建议在 GitHub 仓库 阅读源码与 MIT 许可证。插件以当前 DSH 进程权限访问会话与 registry,仅在可信环境安装。

典型用法

按 README 的可复现流程操作:

  1. 打开任意会话,在头部 utilities 找到迁移图标。
  2. 在左栏选择要迁移的会话(不能选当前正在使用的会话)。
  3. 选择目标工作区,或切换到「custom path」输入/浏览目录。
  4. 阅读 preflight:project-key 变化、目标 session 路径、是否会新建工作区、可选文件迁移的数量与冲突。
  5. 点击「Start migration」,再「Confirm migration」。
  6. 结果按步骤列出:backup → data move → header rewrite → verification → file move → workspace membership。

关于「需要重启」

工作区归属写入可能报告 pending-restart,这是设计行为而非失败:live workspace registry 是启动时从 session header 建的快照,插件无法在运行时原地刷新;运行中手写 workspace.json 属于资料中的 crash mode C。membership 会进入队列 ~/.dsh/plugin-data/dsh-session-migration/pending.json,在下次 DSH 启动后应用并写日志。一般只需重启一次,会话即出现在新工作区;「Pending」页也可尝试更早重试。

安全模型与日志处理(简要)

README 强调的不变量包括:只移动不复制;registry 仅通过 workspaceRegistry 且在数据就位后写入;只改 frame 1 的 cwd;frame 1 之后内容做完整性比对;重复迁到同一目标为 same-target 无操作;失败会回滚数据与 .bak,并打印回滚命令。

另一点对开发者重要:不要用 zlib.zstdDecompressSync(log) 当整文件解压——它通常只返回第一帧 header,误判为空会话可能删掉真实历史。本插件按 RFC 8878 走帧边界(必要时 magic 扫描),分块计帧,仅替换 frame 1。

手动回滚时,须在 DSH 完全退出 后按迁移输出中的命令操作;目录内 session.v4.jsonl.zstd.bak 是改写前的日志,DSH 不会把它当作正式代次。若要撤销排队中的 membership,还需从 pending.json 删除对应项。

适用场景与注意

适合: 需要把某段会话连同 cwd 与工作区归属迁到新目录;希望批量浏览会话、做 registry/磁盘一致性检查;迁前自动备份或单独导出备份。

注意:

  • duplicate-session、cwd-mismatch、id-mismatch、空/缺失日志等需按健康检查说明人工处理,不能一键修。
  • 可选「搬走源目录顶层文件」遇重名会直接拒绝。
  • membership 变更常需一次 DSH 重启才在 UI 中完全体现。

结尾

dsh-session-migration 把「迁 session 目录 + 改 header + 改工作区注册」收成会话头的一个面板,并围绕 DSH 真实的三处绑定关系做了 preflight、备份与回滚。若你在多工作区、多目录间整理会话,可先装 bundle、刷新页面,再用健康检查摸清现场,再做单次迁移。

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

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

小夜