前言¶
DeepSeek Harness 的原生侧栏只提供基础的工作区与会话列表,缺乏主题分组与批量操作能力。当会话分散在不同工作区时,查找、归档或整理变得繁琐。dsh-better-workspace 是一个叠加在原生“工作区”区域之上的主题分组插件:它不会替换官方列表,而是在同一区域重新组织显示,并提供宿主没有的批量操作与安全删除。
这是什么¶
dsh-better-workspace 是 DeepSeek Harness 的侧边栏主题分组插件,由 whybebabo 维护。它叠加在原生“工作区”区域之上,不替换官方列表:会话仍由宿主管理,插件只在这块区域上重新组织显示,并补上宿主没有的批量操作与安全删除。
核心功能¶
主题分组¶
每个工作区内部是一棵树,用 emoji 标记的“分组”文件夹收纳会话,另有系统默认分组与「已归档」桶。
- 新建分组:在工作区
⋯菜单或标题栏 + 菜单里的「新建主题并放入…」;也可以把会话拖到目标分组来实现归类。新分组默认排在该工作区分组列表的最上面。 - 新建会话:分组行尾的 + 直接在该分组下新建会话(工作区行尾的 + 则在该工作区新建)。
- 改名:双击分组名直接内联编辑(重名与非法字符会即时提示并禁用保存)。
- 排序:拖动分组行,拖到目标行的上/下半区决定插入位置,拖动时显示插入指示线。
- 只看此分组:分组
⋯菜单里的筛选会同时锁定它所属的工作区——同名分组不会跨工作区串味。 - 删除分组:只清除归属,组内会话回到系统默认分组,不删会话。
每个工作区都有系统默认分组,不能改名或删除,但可以像普通分组一样拖动排序。
筛选与搜索¶
- 工作区下拉筛选
- 面板内本地搜索
- 「只看此分组」
批量操作¶
点标题栏的「选择」进入选择模式,选择模式接管标题栏:退出、已选数量、归档/取消归档/移动/永久删除排成一行原生图标按钮,窄侧栏不折行。
选择混入已归档条目时,归档与移动置灰;混入未归档条目时取消归档置灰;混入未分组会话时移动置灰。工具栏下方直接说明置灰原因,悬停也有提示。暂存中的「新会话」占位行不参与批量选择。「全选」只包含当前显示出来的行:分组头复选框、分组 ⋯ 菜单、工作区 ⋯ 菜单走同一个派生(selectableIds),超过「显示全部 60 条」的分组会提示「已选中 N 条;另有 M 条未显示」,展开后再选即可——不会悄悄把没渲染过的会话带进批量删除。
安全删除¶
DSH 本身没有删除会话的命令,插件自行实现,规则是“宁可拒删”。
删除会移除磁盘上的会话记录,无法恢复(工作区文件本身不受影响)。流程是:调 /delete/preview 拿逐条判定 → 用户在对话框里确认 → 调 /delete/execute 执行。
- 会话正在运行 → 先按官方方式
agent.cancel({kind:'user'})并等待离开 running(上限 3 秒),停不下来就不删。 - 有子智能体会话 → 拦下,请删除主会话(会级联清理并在 preview 中计数)。
- 用户分叉(带
parentSession、origin为空)是顶层会话,可单独删除,不会被当成子智能体。 - 删除当前正在看的会话后,自动切到一个新的空白会话。
与宿主一致¶
状态点、置顶上浮、行内悬浮卡、行尾操作条、定时任务时钟、图标与配色,都对齐宿主自己的实现。
失效保护¶
插件不会接管 DSH 的其余部分:侧栏折叠、窄视口或路由不可达时,面板会完全隐藏并交还原生 UI。
面板渲染在 shell.overlay,用结构选择器定位原生工作区区域,覆盖矩形与该区域自身盒子重合。被覆盖区域加上 inert + aria-hidden,官方弹窗出现时自动释放。
主题数据单独存放¶
分组与归属关系写在 <DSH_HOME>/dsh-better-workspace/topics.v1.json 这个单文件 sidecar 里,可直接备份、可与宿主升级解耦;卸载插件后数据仍在。
写入采用 临时文件 → fsync → rename,并在覆盖前保留 .bak。主文件损坏时自动回退备份并进入只读模式(面板顶部横幅提示);回退期间发生的那次写入不会再拿损坏的主文件覆盖 .bak。主文件与备份同时不可解析时拒绝一切写入(不会用空状态覆盖磁盘),修好文件后只读模式自动解除,无需重启宿主。
| 位置 | 作用 |
|---|---|
<DSH_HOME>/dsh-better-workspace/topics.v1.json |
分组与归属关系(单文件,可直接备份) |
<DSH_HOME>/dsh-better-workspace/topics.v1.json.bak |
上一次成功写入的副本 |
<DSH_HOME>/dsh-better-workspace/topics.v1.json.corrupt-<ts> |
主文件无法解析时保留的损坏副本,供人工抢救 |
<DSH_HOME>/dsh-better-workspace/topics.v1.lock |
跨进程写锁(内容为 <pid>-<随机> 令牌) |
localStorage["dsh-better-workspace:prefs:v1"] |
工作区/分组筛选、折叠、搜索、拖拽顺序 |
安装与启用¶
环境要求¶
- DeepSeek Harness Desktop 或 Web
0.2.1-rc.x,@deepseek-ai/cordis4.0.5; - Node.js ≥ 22.19;
- 本机可用 Git(以
github:方式安装时)。
从 npm 安装(推荐)¶
dsh plugin --profile web add @whybebabo/dsh-better-workspace
DSH 会把插件装进 Web profile,并把 @whybebabo/dsh-better-workspace 注册到 dsh.profile.bundles,不需要克隆仓库、手动安装依赖或构建客户端。
没有全局 dsh 命令时,用 npx 执行:
npx @deepseek-ai/dsh plugin --profile web add @whybebabo/dsh-better-workspace
安装命令需要本机可以使用 Git 与 pnpm;使用 npx 时还需要 Node.js。
Desktop 会修改 desktop profile,装之前建议先备份 cordis.patch.yml / package.json / pnpm-lock.yaml:
dsh plugin --profile desktop add @whybebabo/dsh-better-workspace
从 GitHub 安装¶
不经过 npm,直接从仓库安装某个发布版本:
dsh plugin --profile web add github:whybebabo/dsh-better-workspace#v0.1.3
把 #v0.1.3 换成你要的 tag。这条路径同样需要 Git 与 pnpm,也不需要克隆仓库。
从源码安装¶
需要改代码或跟 main 分支时:
git clone https://github.com/whybebabo/dsh-better-workspace.git
cd dsh-better-workspace
npm install && npm run build
先在不影响现有 profile 的隔离环境里验证一遍:
dsh --profile topic-e2e --from-default-profile web --dump-config
dsh plugin --profile topic-e2e add "link:$(pwd)"
dsh --profile topic-e2e --no-open --port 8791 # 打印带 token 的 URL
确认无误后装到日常使用的 profile:
dsh plugin --profile web add "link:$(pwd)"
以 link: 方式安装时,宿主读取的始终是当前目录的产物:改完代码 npm run build 并重启即可,不必重新 add。
启动或重启 DSH¶
安装后关闭旧的 DSH Web 进程并重新启动:
dsh web
使用 npx 的启动方式:
npx @deepseek-ai/dsh web
打开侧栏,点「工作区」标题旁出现的 ▾,或把鼠标移到「工作区」上——看到工作区下拉与分组树,说明插件已加载。
升级¶
发布新版本后重新执行安装命令并替换版本:
dsh plugin --profile web add @whybebabo/dsh-better-workspace
随后重启 DSH。以源码方式安装的则用:
git pull && npm install && npm run build
卸载¶
dsh plugin --profile web remove @whybebabo/dsh-better-workspace
主题数据保留在 <DSH_HOME>/dsh-better-workspace/,需要清除请手动删除该目录。
典型用法¶
分组操作¶
- 在工作区标题旁的 ▾ 打开下拉菜单,选择「新建主题并放入…」。
- 在弹出的对话框中选择目标分组,或留空让新分组默认出现在顶部。
- 双击分组名进行重命名。
- 拖动分组行到目标位置,上/下半区决定插入位置。
会话归档¶
- 鼠标悬停在会话行尾,点击
⋯菜单里的「归档」。 - 或进入选择模式,勾选多个会话,然后点击标题栏的「归档」按钮。
批量移动¶
- 点击标题栏的「选择」进入选择模式。
- 勾选需要移动的会话。
- 点击标题栏的「移动」按钮,选择目标分组。
安全删除¶
- 进入选择模式,勾选需要删除的会话。
- 点击标题栏的「永久删除」按钮。
- 在弹出的对话框中确认删除(会有预览信息)。
- 确认后插件会逐条执行删除,正在运行或包含子智能体的会话会被拒绝。
适用场景与注意¶
- 适合需要频繁整理会话、按主题分组的 DSH 用户。
- 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
- 主题数据存储在本地,卸载后仍可手动清理。
- 与宿主版本有兼容性要求:DeepSeek Harness Desktop 或 Web
0.2.1-rc.x,@deepseek-ai/cordis4.0.5。
短结尾¶
dsh-better-workspace 在不改变 DSH 原生行为的前提下,为侧栏增加了主题分组、批量操作与安全删除能力。适合需要精细化管理会话的用户。插件目录页与源码仓库见下方链接。