前言¶
用 DSH 跑多项目时,侧栏里的「工作区」列表会越堆越多:刚发过消息的项目混在十几个工作区中间,要往下翻才能找到;隔一阵子又攒出一批没有会话的空工作区。官方侧栏提供了添加、搜索和视图选项,但工作区之间的顺序既不能拖动,也不能一键清理;想把某个工作区的目录从 D 盘挪到 NAS 上,会话归属还得手动处理,容易掉进「未分组」。
下面介绍 Aeroscis 维护的客户端插件 aeroscis/dsh-workspace-manager。它在侧栏「工作区」标题行加一个图标入口,把顺序调整、置顶、空工作区清理和路径迁移(可连文件夹、连对话一起搬)收进同一个面板,且改动写入 Host 的注册表,其他窗口看到同一顺序。
这是什么¶
一句话定位:DSH Web 侧栏的工作区管理器,npm 包名 @aeroscis/dsh-workspace-manager,维护者 Aeroscis,许可 MIT。
安装后它做三件事:调整工作区顺序(活动自动上浮、置顶、拖拽、一键整理),清理工作区(删除单个工作区、批量移除空工作区),迁移路径(把工作区指到新路径,可以连目录与对话一起搬)。它在 DSH 0.2.1-rc.3 上开发并验证,engines.dsh 声明为 ^0.2.1-rc.3。
插件同时提供 Host 端逻辑和 Web 客户端:Host 负责顺序写入与迁移执行,客户端只负责侧栏里的面板与交互。
核心功能¶
活动自动上浮¶
刚发送过消息的工作区自动升到「第一个非运行工作区」之上。只认用户发出的新消息:打开或浏览会话、助手回复都不触发上浮;正在运行的工作区仍留在上浮后的位置之上。
「活动」取自 DSH 会话列表的 updatedAt(持久化的最后一条人类提示时间),不是当前打开的会话;空白新会话和子代理会话不计入。因此刷新页面后,最近发过消息的工作区仍会被认作活动工作区。顶部开关可关闭此行为,开关保存在浏览器 localStorage。
置顶¶
手动把工作区固定在列表最前,置顶顺序按勾选顺序排列。置顶的工作区在官方侧栏行显示一枚图钉;点这枚图钉即可取消置顶,不必打开面板。悬停时图钉与侧栏官方按钮并排,不遮住它们。置顶列表也存在 localStorage。
拖拽排序¶
每行左侧有汉堡把手,按住上下拖动放到任意位置:拖动时该行跟手抬起、其余行实时让位,松手后滑入新位置;滚轮或贴边会自动滚动,Esc 取消。把手获得焦点后可用 ↑ / ↓ 键微调一行。
一键整理与移除¶
「一键整理」按「置顶 → 运行中 → 最近发送消息 → 其余(按最近会话时间)」重排一次,只在点击时执行,不随状态变化反复跳动。
移除工作区带确认,显示该工作区的会话数,有会话在运行时额外提示。批量「清理空工作区」一次性列出没有会话的工作区,确认后移除。
打开目录与路径迁移¶
行悬停时右侧出现文件夹按钮,在系统文件管理器中打开该工作区目录;宿主没有桌面环境时这个按钮不出现。
「修改路径」对话框填完整新路径:
- 勾选「把文件夹一起搬过去」时由插件执行目录搬移(
rename,跨卷自动退化为复制+删除);不勾选则只改登记,目录原地不动。原目录已不存在的工作区(文件夹被手动挪走或改名)开关自动置灰,此时等于把工作区重绑到新位置的文件夹。 - 旧会话的安顿:
cwd已在新路径的直接挂回(会话 id 不变,日志零复制);其余按官方 fork 种子机制复刻历史迁到新路径,对话保持连续,不会掉进「未分组」;一条都没安顿成功时开一条空会话占位,剩余旧会话归档。 - 迁移前会先中止该工作区活着的会话当前回合;Windows 上目录被终端或编辑器锁住时报「被占用」并提示先关会话/终端再试;搬移失败会回滚目录,不留下半状态。
迁移成功后显示结果卡,写明搬移方式、会话去向、旧会话归档数、排序位是否保持。
面板入口与筛选¶
侧栏「工作区」标题和搜索图标之间多出一个图标按钮,它是标题行里的普通元素,与搜索、视图选项、添加工作区三个按钮在同一条布局里:侧栏滚动、收拢、拖动改宽时一起移动,官方三个按钮的位置不变。标题行窄到放不下第三个按钮时按钮自动隐藏,栏宽变大后再出现。
面板从按钮左边缘向下展开(会盖住一段对话区),按钮保持可见并显示激活态,再点一次、点面板外或按 Esc 收起。面板默认按最长的工作区名定宽,拖右边界可调宽,双击边界恢复默认。顶部筛选框按键实时筛选,只匹配行上显示的名称,不匹配路径;Esc 清空筛选词。每行显示标题、会话数、运行中的会话数。重命名不在面板里,官方侧栏行的「⋮」菜单已有。
安装与启用¶
装进某个 profile:
dsh plugin --profile <name> add @aeroscis/dsh-workspace-manager
改插件本身时可以直接装当前目录,profile 以链接方式引用,改完刷新页面即可:
dsh plugin --profile <name> add ./
安装后刷新 Web 页面加载客户端部分。如果按钮没出现,先看宿主版本是否在 ^0.2.1-rc.3 范围内,或标题行宽度是否已放下第三个按钮。
典型用法¶
日常用的顺序大致是:装好、刷新页面 → 打开面板 → 按需置顶或拖动 → 清理空工作区。
想把目录搬到别处。先点行上的「修改路径」,在对话框里填完整的新路径;要连目录一起搬就勾选「把文件夹一起搬过去」,此时插件会中止该工作区正在跑的会话当前回合,再执行搬移并把旧会话复刻到新路径;不想搬目录只改登记,就不勾选。等结果卡出现,确认搬移方式和会话去向。
只想整理当前列表。直接点「一键整理」,它会按置顶优先、运行中次之、最近发过消息的再次之、其余按最近会话时间重排。若某个项目刚发过消息又想保持手动位置,把顶部「活动自动上浮」开关关掉即可。
开发侧跑测试与发布自检:
npm test # 活动判定、自动上浮的收敛、拖动几何、迁移核心(校验/搬移/种子)
npm run check # 发布形态自检 + 测试 + 打包预览
实现细节(面板入口、顺序写入、自动上浮的两趟规则、拖动几何、测试切块方式)在 docs/DESIGN.md,属内部设计文档,不影响使用。
数据与副作用¶
顺序写入 Host 注册表¶
顺序修改写入 Host 的工作区注册表($DSH_HOME/storages/workspace.json 的 global.workspaceIds),不是只改当前页面,其他窗口看到同一顺序。
偏好留在浏览器本地¶
活动自动上浮开关、置顶列表存在浏览器 localStorage,键为 dsh-workspace-manager:prefs:v1。换浏览器或清缓存后偏好回到默认值(活动自动上浮开启、无置顶)。
移除工作区不删会话¶
移除只删除注册表中的这一项:会话不会被删除,会出现在「未分组」下。重新注册同一路径不会把旧会话接回新工作区,因为会话归属记录在新的工作区 id 上。移除操作没有撤销入口。
路径迁移会换 id¶
路径迁移会让工作区的注册表 id 变化(记录以 realpath 为键,官方没有 setPath)。置顶偏好会在迁移成功后自动把旧 id 换成新 id;迁移后侧边栏出现的才是新节点。迁移依赖宿主的 workspaceRegistry / sessionQuery / agents 等可选服务,宿主缺失时迁移面板会显式报缺失原因,其余功能不受影响。
适用场景与注意¶
适合在 DSH Web 客户端里同时开多个工作区、需要频繁调整列表顺序或整理空目录的使用者;也适合想把工作区目录迁移到别的盘或 NAS、又希望历史对话不中断的场景。
几点注意:
- 插件以当前 dsh 进程的权限运行,会读写工作区注册表、执行目录搬移并中止会话当前回合。安装前应检查源码与
LICENSE(MIT),按需确认目标路径与备份。 - 按钮靠 CSS Modules 生成的类名(
sectionHeader、searchSlot)定位,DSH 改侧栏结构后按钮可能不再出现;engines.dsh声明为^0.2.1-rc.3就是这条限制的体现。 - 只支持当前这版侧栏的分组方式;「按工作区树」分组下,顺序仍按同级工作区的 Host 顺序解释。
- 官方「视图选项 → 最近更新」排的是每个工作区内部的会话,不排工作区本身;工作区顺序始终由 Host 保存的手动顺序决定,所以该选项看起来「没生效」。
- 生态背景:DSH 理念是「一切皆插件」,社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
这个插件的价值在于把侧栏里零散的工作区操作集中成一处:顺序有规则可依,空工作区可以批量清掉,目录搬家时对话还能跟着走。如果你在 Web 端同时维护多个工作区,值得装一个试一下。
- 目录页:https://www.skillhub.cn/plugins/Aeroscis/dsh-workspace-manager
- GitHub:https://github.com/Aeroscis/dsh-workspace-manager