
PianoPrince/dsh-workspace-mover
dsh-workspace-mover
dsh-workspace-mover is a community DeepSeek Harness plugin. Read the repository README before installing.
Install
npx @deepseek-ai/dsh plugin --profile web add "github:PianoPrince/dsh-workspace-mover"Restart `dsh web` after install. Bundle APIs can change during the developer preview.
README badge
[](https://dshhub.dev/plugins/dsh-workspace-mover)Paste this into your README. The star count updates with every catalog sync.
From the README
Excerpt from PianoPrince/dsh-workspace-mover, cleaned of badges and images.
dsh-workspace-mover
> 非官方项目,由社区成员独立开发和维护。
<b style="font-size: 1.15em;">在侧边栏把会话拖到另一个工作区——真迁移原始档案,而不是复制</b><br /><br />
🌏 中文 · <a href="./README_EN.md">English</a>
📑 目录
✨ 功能一览
DeepSeek Harness 的侧边栏支持工作区内拖拽排序会话,但把会话拖到另一个工作区上会被静默忽略——官方 RPC 只暴露了单工作区内的 insertSessionBefore,没有跨工作区移动接口。本插件补上这块:
- 🖱️ 拖拽交互:把任意空闲会话行拖到目标工作区的标题行,确认框亮出目标路径,一键迁移
- 🚚 真迁移:物理搬移原始
session.jsonl.zstd档案、改写头部cwd、更新工作区注册表——会话 id 与全部历史原样保留,不产生副本、不重新注入上下文、零 token 消耗 - 🏠 工作区搬家向导:项目文件夹被移动/改名后,一键把失效的工作区原地重定向到新位置——工作区 id、标题、排序、归档位全部保持,名下会话连同旧路径的失联散件批量原样迁移;运行中的自动跳过,中断后续跑只补剩余
- 🛟 孤儿会话救援(设置页「会话救援」面板):扫描磁盘上全部会话档案并分类处理——
- 失联(orphaned):项目文件夹被移动/改名/删除导致 cwd 失效、从侧边栏"消失"的会话(官方讨论 #3012 的社区修复),可一键真迁移到任意现有工作区
- 未记账(unregistered):cwd 仍有效但从未被任何工作区记账的会话(bootstrap 只跑一次、agent 内部 fork 不注册等),可原地补挂账
- 幽灵记账(ghosts):注册表有账但磁盘档案已缺失的 id(只读提示)
- 三类全部走同一条备份+回滚管线
- ⏪ 移动历史与撤回:记录最近 100 次跨工作区移动,设置页一键移回原分组,撤回本身同样生成备份并复用回滚保护
- 🏷️ 会话标题优先:确认框、救援列表和最近移动记录都先显示会话标题,找不到标题时显示「未命名会话」
🔬 技术要点
- 常驻会话一致性修复:打开过的会话在宿主内存里有冻结头与持久化写入缓存。直接搬文件会导致它下次对话时把新事件写回旧路径造成历史分叉——本插件迁移后清理陈旧写入状态并刷新注册表索引,宿主自动从新位置重新接管。
- 安全兜底:每次移动前强制字节级备份;改写、搬运、记账任一步失败自动回滚到移动前状态。
- Windows 加固:目录内刚发生文件改名后立刻改目录名会瞬时 EPERM——指数退避重试,仍失败退化为复制+删除。
- 主题自适应 UI:确认框/Toast 全部使用官方
--dsw-alias-*设计令牌,跟随设置里的外观即时切换。 - 零依赖免构建:host 半零 npm 依赖,client 半 source-as-product,无构建产物漂移风险。
- 重定向的剪枝防御:官方工作区实体的每次写入都会按「内存索引中的会话 cwd」剪枝成员名单——搬家向导先把全部受影响会话的三张索引预置成新路径,再经实体的统一写入通道
mutate原地换 path,成员一个不丢。
🚀 安装
dsh plugin --profile web add "github:PianoPrince/dsh-workspace-mover"
# 重启 dsh web 一次
零构建授权:本插件是纯 JavaScript 源码即产物(无 TypeScript、无构建步骤),从 GitHub 安装时不需要
allowBuilds构建授权——pnpm 不会执行任何安装期脚本。
<b>npm 渠道</b>
dsh plugin --profile web add dsh-workspace-mover
<b>本地开发安装</b>
dsh plugin --profile web add "link:E:/path/to/dsh-workspace-mover"
<b>常见问题</b>
| 现象 | 原因与解决 |
|---|---|
| 拖了但没反应 | 只在「分组视图」把会话行投到工作区标题行上才会触发;「扁平列表」视图没有标题行,本插件在该视图不激活 |
| 提示会话正在运行中 | 宿主端校验回合状态;等该会话回合结束再拖即可 |
| 移动失败的 toast | 每次操作前都有字节级备份、失败自动回滚;按 toast 说明处理后重试,详细原因见宿主日志中的 MOVE FAILED 条目 |
| 移动成功但侧边栏没归位 | 插件迁移后会主动重拉一次工作区基线;偶发未生效时手动刷新页面 |
| 有些会话从侧边栏不见了 | 打开 设置 → 会话救援 自动扫描,「失联」「未记账」两类都能一键找回 |
🖼️ 特性巡礼
以下均为真实界面实拍(点击可放大)。
拖拽跨工作区迁移
| 把空闲会话行拖到目标工作区标题行,出现虚线高亮 | 确认框亮出目标工作区路径,一键移动 |
| 设置 → 会话救援:一键找回失联与未记账的会话 | |
工作区搬家向导 · 实测全程
以下为一次真实搬家的完整记录:把 Test1 文件夹改名为 Test2 后,用向导原地修复工作区。
改名前:Test1 分组正常工作 | 改名后侧边栏仍显示旧分组(磁盘上文件夹已不在) |
| 打开设置 → 会话修复:「工作区体检」把分组标为「路径失效」,填入新路径 | 确认框亮出起讫路径与将要迁移的会话数 |
| 搬家完成:分组原地更名为 Test2,会话与历史原样保留 | |
⌨️ 使用
拖拽跨工作区迁移
- 重启后在侧边栏分组视图里,按住任意空闲会话行;
- 拖到目标工作区的标题行(出现虚线高亮)松手;
- 确认框显示目标工作区路径 → 点「移动」;
- 完成 toast 提示;若宿主广播未触发自动刷新,手动刷新页面即可。
运行中的会话会被拒绝(宿主端校验),移动失败自动回滚并在 toast 中说明原因。
会话救援面板
- 重启后打开 设置 → 会话救援,面板自动完成首次扫描;
- 失联行:选目标工作区 → 点「迁移过去」(真迁移,ID 保留);
- 未记账行:点「补挂账」原地挂到路径匹配的工作区;
- 每次操作前后都有备份与回滚保护,结果即时反馈。
工作区搬家向导
- 文件夹被移动/改名后,面板顶部的工作区体检会把对应分组标记为「路径失效」;
- 在该行的输入框填入文件夹现在的完整路径,点「搬家」;
- 确认框亮出旧路径 → 新路径与将要迁移的会话数量,确认后执行;
- 名下会话连同旧路径的失联散件一起原样迁移;正在运行的会话本次跳过,结束后用同样的输入再跑一次即可续跑剩余部分。
🔌 与 DSH 的集成方式
…

