前言¶
在 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 修改)。
典型用法¶
菜单移动¶
- 鼠标移到侧边栏某个对话上,点 … → 移动到。
- 选择目标工作区(列表不含当前所在工作区)。
- 列表刷新后,对话出现在目标工作区下;打开即可在新目录下继续。
拖拽移动¶
把对话拖到目标工作区的文件夹行、任意会话行,或分组内空隙、「展开其余 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 默认能力之外的补充。