前言¶
在 DeepSeek Harness(DSH)里,插件生态强调“一切皆插件”。DSH Web GUI 的侧边栏会话按工作区组织,会话历史又会绑定到对应工作区目录。
dsh-session-mover 针对的是跨工作区整理会话的场景:把一个已有完整历史的会话行拖到另一个工作区标题行上,让目标工作区获得同历史的新会话,原会话归档。
这是什么¶
dsh-session-mover 是一个 DSH 插件,维护者为 baisama-cloud,许可证为 MIT。
它把“跨工作区移动会话”做成一次拖拽操作:移动采用目标工作区克隆 + 原会话归档语义。
核心功能¶
- 直接在会话列表里拖动,无需额外面板或按钮。
- 支持工作区组内会话、跨工作区会话,以及「未分组」会话拖入工作区。
- 移动后底部弹出结果提示;如果拖的是当前打开的会话,会自动跳转到新副本。
- 同工作区内拖动仍走官方重排逻辑,两者互不干扰。
- 失败时给出可见的红色提示,不会无声失败。
工作原理¶
官方侧边栏的会话行本身可拖拽。会话行被拖起时,会把会话 ID 写入 dataTransfer:
setData("text/plain", id)
插件在 document 层监听 drop,使用语义属性(role="treeitem" 和 aria-expanded,而非样式类)定位光标下的工作区标题行,并按树中顺序映射到对应工作区。
命中后,客户端调用宿主能力。资料中给出的宿主入口包括:
POST /session-mover/move-session
动态插件方式下,宿主也提供:
harness.handle('move-session')
宿主侧按资料描述执行以下步骤:
1、sessionQuery.readSession 读取源会话完整日志。
2、sessions.create 在目标工作区创建携带完整历史的新会话,保持创建时间与 agent 预设,cwd 设为目标工作区路径。
3、sessions.flush 持久化。
4、workspace.attachSession 将新会话归属到目标工作区。
5、workspaceRegistry.archiveSession 归档源会话。
安装与启用¶
资料未给出完整的 DSH 插件添加/启用命令,下面只列已给出的分发与配置示例。
克隆到本地后,使用 npm pack 生成插件包:
# 生成 dsh-session-mover-0.1.0.tgz
npm pack
如果需要把它加入 DSH 插件列表,cordis.patch.yml 中已有如下声明示例:
- insert:
- id: dsh-session-mover
name: 'dsh-session-mover'
package.json 中声明的主入口为 lib/index.js,客户端 bundle 为 lib/client.js,并声明 engines.node 为 >=20。
典型用法¶
1、在侧边栏会话列表里按住要移动的会话行。
2、拖到另一个工作区的标题行(带文件夹图标的行)上松手。
3、原会话从旧工作区消失(归档),目标工作区出现同历史的新会话,底部提示移动结果。
如果当前打开的正是被移动的会话,插件会自动跳转到新副本。
适用场景与注意¶
适合需要把已有会话历史整理到不同工作区的 DSH 使用者,尤其是希望保留完整上下文、避免重新粘贴或复制会话内容的场景。
使用前注意以下几点:
- 插件会以当前 DSH 进程的权限运行;安装前应检查源码、依赖和 MIT 许可证。
- 移动会产生新的会话 ID;原会话归档隐藏,但日志与记录保留,可被
workspaceRegistry查询。 - 会话所属工作区由会话的
cwd(工作目录)决定。 - 由于平台约束(会话日志默认
zstd压缩、会话头不可变、存储层无迁移 API),无法保留原会话 ID 原地搬家。 - 子代理(
subagent)会话与空白占位会话不作为可拖拽项。 - 在平面列表模式(”In one list”)下没有工作区标题行,拖放无效。
结尾¶
dsh-session-mover 的价值,是把跨工作区整理会话历史的操作收敛为一次拖拽,同时保留完整历史并归档原会话。
GitHub 仓库:
https://github.com/baisama-cloud/dsh-session-mover
目录页 URL 未在已核实资料中给出,这里不做推断。