Fork of KannaKuron/dsh-better-workspace
给 DeepSeek Harness (DSH) 的侧边栏「工作区」列表装上一套文件夹系统——工作区还是那个工作区(一个目录),但名字里的
/就是层级,让「网页前端」「网页后端」这类工作区可以归到同一个web分组下。
github/ ← 虚拟分组(不是真实目录,纯命名层级)
└─ dsh-plan-plus ← 工作区「github/dsh-plan-plus」
dsh-workspace-plus ← 原有的单层工作区照常工作
codeisland-ask-bridge
dsh-model-config
![]() |
层级树(项目视图) 工作区名称里的 / 即分组:如 github/dsh-plan-plus 自动归入 github 虚拟分组,支持任意多级;单层工作区(如 dsh-workspace-plus)照常显示在根层。重命名工作区后树即时重排——分组只是名字的投影,没有第二份需要同步的数据。 |
点「添加工作区」并选完文件夹后,弹出一个小对话框,一行选择工作区所属分组——直接输入(如 web)、从下拉里选已有层级(datalist 原生补全),留空就是根分组。确认后插件创建工作区并把分组前缀写进名称,树上自然落位。对话空态页的「添加工作区」走的也是这条交互,同样带分组弹窗。
右键任意分组行即可:新增子分组(路径自动带上父分组前缀)、新增子工作区(选完目录后所属分组输入框自动预填)、重命名分组、删除空分组;标题栏不放独立按钮。空分组持久保存在浏览器本地;一旦有工作区落进去,分组就由名称自然派生。
侧栏搜索按钮,按名称即时过滤工作区、独立分组与会话(本地标题过滤);搜索时树自动全部展开。宿主级内容搜索(session.search)计划后续接回。
![]() |
独立分区管理 右键工作区或会话 → 分区,选择已有分区、未分区(项目)或新建分区…。 会话操作只移动当前会话;工作区操作连同该工作区的所有会话一起移动,包括此前单独分区的会话。会话可选择跟随所属工作区来撤销独立分区。 分区为单层结构,工作区与会话共用分区列表。单独分区的会话直接显示在分区下,带所属工作区角标。分区标题可折叠、可拖拽放置。 |
右键工作区或会话 → 分区,选择已有分区、未分区(项目)或新建分区…。会话操作只移动当前会话;工作区操作连同该工作区的所有会话一起移动,包括此前单独分区的会话。会话可选择跟随所属工作区来撤销独立分区。新建时自动移入当前右键对象;右键分区标题也可创建空分区。顶部图标区不提供创建分区或会话分支入口。
分区为单层结构,工作区与会话共用分区列表。单独分区的会话直接显示在分区下,带所属工作区角标。分区标题可折叠;将工作区或会话拖到分区标题即可移动,拖到“项目”即可移回未分区。折叠分区和空分区也能接收,放入后自动展开;置顶、归档和未分组会话也支持拖入分区。最近更新排序下仍可移动分区,显示顺序继续按最近更新排列;搜索时暂停拖拽。
工作区与会话分别按 ID 保存归属,不修改名称、目录或宿主的工作区会话关联。右键分区标题可重命名或删除;删除前会确认,工作区移回“项目”,单独分区的会话恢复跟随所属工作区。分区及折叠状态保存在当前浏览器。分区在工作区树和工作区视图中显示;单列表、时间视图仍平铺会话。原有名称路径分组保留在“项目”区域,独立分区内显示工作区完整名称。
- 按工作区树(默认):名称分组树,保留多级文件夹、单链折叠与外观定制。
- 按工作区:各独立分组与“项目”区域内平铺工作区,使用完整名称;切换视图或跨名称分组重排均不改名。
- 单列表:跨工作区平铺会话,悬浮时显示所属工作区角标;手动顺序沿用宿主工作区与其会话顺序,请在工作区视图中拖拽调整。
- 按时间:跨工作区按「今天 / 昨天 / 近 7 天 / 近 30 天 / 更早」分桶,支持最新 / 最旧在前。
- 排序方式:手动排序 / 最近更新独立于分组方式。最近更新按可见会话时间排列工作区、虚拟分组与组内会话,只改变显示顺序;切回手动恢复宿主原顺序。自动排序、单列表与时间视图关闭重排拖拽,置顶区仍保持最近置顶在前。
- 筛选会话:隐藏已归档(默认) / 全部对话 / 仅显示已归档,统一作用于各视图与搜索。仅归档模式隐藏无匹配会话的工作区和空分组;空态提供「查看全部对话」。归档行带标识,右键或悬浮按钮可取消归档;取消归档后才可打开。旧宿主没有恢复接口时禁用恢复入口。
- 偏好持久化在当前浏览器,旧版项目 / 时间视图与排序偏好继续兼容。
工作区行拖到另一工作区行上/下半即调整顺序(写回宿主序),拖到分组行即移入该分组;会话行同工作区内拖到另一会话上/下半重排,拖到会话子分组行即移动进该分组。拖拽工作区期间,单链合并显示的行临时展开回文件夹树——路径里每一级都是可投放的分组行,松手后自动合并。显示顺序 = 宿主手动序,拖拽结果立即生效(自动排序、单列表、时间模式、归档行与置顶行不参与重排)。
会话行沿用官方状态灯语义:生成中(蓝色运行环)、等待批准 / 计划确认 / 回答(琥珀)、已完成(绿色提醒)、{n} 个子任务运行中(子代理计数);有活动定时任务的会话显示闹钟角标(与官方行一致)。状态呼吸灯(可在设置关闭):被折叠藏起的状态沿层级向外冒泡——工作区/分组行图标按状态色呼吸发光(自定义过文字发光的标题一起呼吸),会话分组行显示呼吸状态灯;运行蓝只在本层呼吸、不外渗。
设置卡里的开关(默认开):一层恰好只有一个子级时合并显示为一行(如 测试层1 挂着 AI交易 → 测试层1/AI交易),出现多个子级时自动还原为树;拖拽工作区期间临时展开,任意一级可投放。
- 会话行:打开 / 重命名 / 分叉 / 归档;每工作区「新会话」(点 + 总是先展开该工作区,让新会话立刻可见);当前会话高亮;未分组会话兜底。
- URL/斜杠标题不拆层:宿主自动生成的会话标题落地时若含
/(如复述了 URL),整串自动包上“”原样显示,绝不解析成层级——只对本次启动后新建的会话生效,并等命名稳定(约 20 秒,让原生 AI 命名先落地)才处理;存量会话与你手动命名的/分组标题永不被改动。引号内(含手动添加)的/永不切分,孤立引号只当普通字符;无引号但含 URL 的旧标题也有平铺兜底。 - 中英双语跟随界面语言;会话行行尾显示相对时间(悬浮时让位)。
右键菜单把操作收进一处:工作区行支持重命名、删除、自定义外观;工作区分组行支持新增子分组、新增子工作区、重命名分组(同步更新组内所有工作区名称)、删除空分组、自定义外观;会话分组支持重命名、自定义外观。
会话右键菜单支持重命名、归档、永久删除、在资源管理器中打开、复制工作目录、复制会话 ID、创建会话分支、置顶、自定义外观和刷新页面。分支创建后自动打开;目录优先取目标会话的 cwd,缺失时使用所属工作区路径,未分组会话也可使用自己的目录。已归档会话提供取消归档、删除、目录和复制操作。
永久删除复用「更好的右键」插件(@baihejiangnan/dsh-session-context-menu)的宿主接口;需要在同一 DSH profile 中启用该插件,否则删除项禁用。删除前会确认,确认后停止运行任务并永久删除会话记录与附件;删除成功后清除本插件的置顶记录并刷新会话列表。目录缺失或宿主缺少对应操作时,相关菜单项会禁用。
将插件安装到 DSH 正在使用的 profile。桌面端通常使用 desktop,Web 版通常使用 web。
# DSH 桌面端
dsh plugin --profile desktop add https://github.com/lsdt45/dsh-workspace-plus.git
# DSH Web
dsh plugin --profile web add https://github.com/lsdt45/dsh-workspace-plus.git安装完成后重启 DSH 即生效。
从 Git 安装的插件可按 profile 更新:
dsh plugin --profile desktop update dsh-workspace-plus如果使用的是 Web profile,将 desktop 替换为 web。更新后重启 DSH。
将路径替换为本地仓库的绝对路径:
dsh plugin --profile desktop add /absolute/path/to/dsh-workspace-plus本地目录会以 link 依赖加入该 profile。修改源码后重启 DSH,即可加载本地版本。Web profile 同理,将 desktop 改为 web。
dsh plugin --profile desktop remove dsh-workspace-plus卸载后重启 DSH。Web profile 请使用 --profile web。
DSH 的侧边栏浏览区是一个公开插槽 sidebar.workspaces(single),官方工作区浏览器是它的占用者;本插件以更低优先级注册同一插槽,整区替换为层级树版本。数据全部来自插槽标准注入(useWorkspaces / useSessions 快照钩子),动作(打开会话、重命名/删除工作区、归档等)也走注入的宿主动作——不碰任何私有 API。
「添加工作区」则落在 dsh 专门为第三方设计的一条缝里:sidebar.workspaces.directoryFlow 与 conversation.hero.workspace.directoryFlow 两个目录流插槽。触发按钮、忙碌语义、错误弹窗全由官方持有;本插件只拥有「触发之后、交付路径之前」的交互——正好用来塞进「选完文件夹 → 弹窗选分组 → 创建 → 改名加前缀」这条链。
视图状态(分组折叠、会话展开、显式空分组)、外观自定义与插件设置都通过 dsh 客户端 store 持久化在浏览器本地(dsh.betterWorkspace.view.v1)。注意:该 store 的 hydration 是整值替换、不合并默认值——升级后如果遇到状态字段缺失,重启前的旧状态按旧结构保留,缺的键自动回退默认。
npm pack # 出 tarball 后可本地安装验证本地验证:把 npm pack 产出的 tarball 装进 web profile 并手动挂载(见上),重启 DSH,验证:层级树渲染、添加工作区弹窗、重命名即时重排、新建分组、卸载后回到原浏览器。






