dsh-session-mover:在 DSH Web GUI 中把会话拖到其他工作区

前言

在 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 未在已核实资料中给出,这里不做推断。

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

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

Xiaoye