dsh-session-relocate:跨工作区移动 DSH 对话

前言

在 DSH 里,一个对话的日志路径、header 里的 cwd 和工作区注册表里的归属是绑在一起的。换到另一个项目目录继续聊,并不是改个文件夹名就能搞定:路径不一致会被当成损坏日志,同一 id 出现在两处会直接打不开。发行版里也没有现成的 moveSession 一类能力。

dsh-session-relocate(维护者 DDMUC,GitHub 仓库 DDDMUC/dsh-session-relocate)做的是把「改 cwd、搬会话目录、改归属」收成一条可恢复的事务,并在 Web 侧边栏提供菜单和拖拽。下面介绍它解决什么问题、怎么装、怎么用,以及搬「正在回答」的会话时有哪些取舍。

这是什么

一句话:跨工作区搬迁 DSH 会话——日志文件、沙箱根、工具工作目录和注册表归属一起换到目标工作区,搬完后可以接着聊。

  • 分类:客户端(dsh-client-ui-slots 注入 Web UI)
  • 当前包版本:0.2.3(见 npm / 仓库 package.json)
  • 许可证:MIT
  • 引擎要求:DSH >=0.2.0-rc.2;Node >=22.15

社区目录页:skillhub.cn/plugins/DDDMUC/dsh-session-relocate。目录站由社区维护,与 DeepSeek / 幻方无官方从属关系;DSH 生态本身是「一切皆插件」的思路,装插件前建议自行查看源码与许可证——插件以当前 dsh 进程权限运行。

核心功能

单条与会话状态

  • 侧边栏「…」菜单增加 移动到,可选已有工作区,或通过 其它目录… 输入绝对路径(目录会创建并注册为新工作区)。
  • 支持把侧边栏里的对话拖到另一块工作区分组上松手完成搬迁;组内上下拖动仍是官方排序,插件只在指针落在别的分组时接管。
  • 打开着但空闲的会话:搬之前会先 flush、从 live store detach,确认写租约释放后再动文件。
  • 正在回答 / 子代理 / 后台任务中的会话:可走「就地接管」——在写句柄串行链里改 header 的 cwd 并完成文件事务,不打断当前这一轮回答;若设 moveLive: false,则正在跑活的会被拒绝。
  • 若搬的正是当前页面打开的那条对话,需要刷新或跳转后再打开;搬其它对话对当前页无感。

批量与子对话

  • 多选:菜单里点 多选,勾选后底栏 移动;可与 dsh-delete-session 共用同一多选模式(若已安装,其底栏也会出现 移动)。
  • 多选后也可拖拽:抓住已选中的任一行拖到目标工作区,显示「正在移动 x/N…」;失败条目原地保留便于重试。批量时文件事务逐条执行,工作区归属最后一次性写入。
  • 子智能体会话(origin: subagent)默认随父对话一起搬;可在 Plugins → dsh-session-relocate → 配置 关闭「连同子对话一起移动」(浏览器本地配置,默认开启)。

边界情况

  • 会话 cwd 已在目标目录但侧栏显示「未分组」:移动会补写归属(applied: "attached"),不搬字节。
  • 迁移使用暂存区与 ~/.dsh/session-move/ 下的日志;失败可回滚,崩溃后启动或桥接调用会幂等补完。

安装与启用

主机侧是 Node 模块,装完后必须重启 dsh web 才会加载。

1、从 npm 安装:

dsh plugin --profile web add dsh-session-relocate

也可从本地 checkout 目录安装(将路径换成你本地的 dsh-session-relocate 目录):

dsh plugin --profile web add <你 clone 下来的 dsh-session-relocate 目录>

2、重启 dsh web。

3、确认插件在线:侧边栏任意对话的「…」里应有 移动到;或请求状态接口:

curl http://127.0.0.1:3080/api/dsh-session-relocate/status

返回 {"ok":true, ...} 表示桥接正常(默认前缀 /api/dsh-session-relocate,可在 cordis.patch.yml 的 bridgePrefix 修改)。

典型用法

菜单移动

  1. 鼠标移到侧边栏某个对话上,点 … → 移动到。
  2. 选择目标工作区(列表不含当前所在工作区)。
  3. 列表刷新后,对话出现在目标工作区下;打开即可在新目录下继续。

拖拽移动

把对话拖到目标工作区的文件夹行、任意会话行,或分组内空隙、「展开其余 N 个会话」上均可;松手前目标分组会亮蓝框。多选模式下拖未勾选的行只搬该行,拖勾选中的行则整批搬。

配置项(节选)

在 cordis.patch.yml 的 config(profile 层可覆盖)中,常用键如下:

键 默认 含义
moveLive true 正在跑活是否就地接管;false 则拒绝
releaseLive true 打开且空闲是否先释放;false 则拒绝
dragMove true 是否启用侧边栏拖拽;DOM 变更时可关,菜单仍可用

完整表见仓库 README「配置」一节。

适用场景与注意

适合谁: 经常在多个仓库或工作区之间切换,希望把某条长对话连同上下文搬到另一个 cwd,而不是复制粘贴或重开;需要在 Agent 仍在输出时先把会话「挂」到新项目下(接受「本轮工具仍在旧目录、下次打开才在新目录」的行为)。

务必知晓:

  • 正在跑活的那一轮,内存里冻结的 header 不会立刻让工具切到新目录;文件与归属已迁走,下次打开会话才在新路径执行工具。
  • 菜单没有 移动到、或拖拽无反应:先重启 dsh web 并查 status;拖拽可检查 dragMove。
  • 不要手工只改会话目录或只改注册表——与 DSH 存储约定冲突时可能永久打不开;应使用本插件或等价的全流程事务。

结尾

dsh-session-relocate 把跨工作区搬会话做成带崩溃恢复的文件事务,并在 Web 侧用菜单、拖拽和多选批量覆盖日常操作;对 live 会话区分「先释放」与「就地接管」,是 DSH 默认能力之外的补充。

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

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

Xiaoye