dsh-workspace-status-badge · 工作区状态徽标
把工作区收起后,文件夹名字前的状态一眼可见。
左侧边栏的会话任务自带"进行中 / 已完成"小圆点,但工作区文件夹一旦折叠,点就全藏起来了——本插件把该工作区下的任务状态聚合成一个点,标在折叠文件夹的图标与名称之间。
无需任何配置。
1. 它解决了什么问题
DeepSeek Harness 的左侧边栏按工作区(Workspace)分组展示会话任务,会话行前有状态点:
| 状态 | 颜色 | 含义 |
|---|
| 等待处理 | 琥珀 | 需要你批准 / 审阅计划 / 回答问题 |
| 进行中 | 蓝 | 会话或它的子代理正在运行 |
| 已完成 | 绿 | 跑完了但还没打开看过 |
但状态点只画在会话行上:工作区折叠后,会话行全部隐藏,文件夹行本身只有图标和名字,工作区里有没有任务在跑、有没有等你处理的,完全看不到——每次都得展开一个个工作区去翻。
本插件把状态聚合到工作区这一层:
折叠前(原版) 折叠后(本插件)
████ 工作区A ▾ ████ 工作区A ◉ ← 琥珀:有任务等你
● 任务1(进行中) 工作区B ◦ ← 蓝色:有任务在跑
● 任务2(等待审批)...
状态优先级与单任务行完全一致:等待处理 > 进行中 > 已完成。
2. 功能特性
- ✅ 工作区折叠时,文件夹图标与名称之间显示聚合状态点(与官方状态点同款颜色与"进行中"脉动动画)
- ✅ 工作区有任务在执行时,文件夹图标本身染成淡蓝色(展开、折叠都可见)
- ✅ 悬停显示明细工具提示:「2 个任务等待处理 · 1 个任务进行中 …」
- ✅ 点击状态点 = 点击文件夹行,直接展开/收起该工作区
- ✅ 纯客户端响应式:状态实时跟随(任务开始/结束/等你处理都会即时更新)
- ✅ 子代理也算数:某个会话的子代理还在跑,工作区同样显示"进行中"
- ✅ 未分组(Ungrouped)桶同样支持
- ✅ 语言跟随界面(简体中文 / English)
3. 目录结构
dsh-workspace-status-badge/ # 仓库根 = npm 包根
├── package.json # dsh.bundle.patch(配置补丁层)+ dsh.client(浏览器端声明)
├── cordis.patch.yml # 组合行:加入 web profile 的浏览器插件名册
├── LICENSE # MIT
├── README.md / README.en.md # 双语文档
└── lib/
├── index.js # 宿主半部:刻意空操作(本插件无需任何后端)
└── client.js # 浏览器 bundle:聚合逻辑 + shell.overlay 叠加层
4. 快速开始(GitHub)
dsh plugin --profile web add github:AFAP/dsh-workspace-status-badge
然后重启 dsh web 生效。
安装后插件位于 $DSH_HOME\profiles\web\node_modules\dsh-workspace-status-badge,与源码仓库位置无关。
升级:dsh plugin --profile web update dsh-workspace-status-badge
卸载:dsh plugin --profile web remove dsh-workspace-status-badge
从源码目录手动安装(等价验证用)
dsh plugin --profile web add "D:\path\to\dsh-workspace-status-badge"
验证是否加载成功
左侧边栏任意折叠一个工作区——如果里面有任务,文件夹图标与名称之间就会出现状态点(琥珀 / 蓝 / 绿),悬停可见明细,点击可展开。
5. 使用与状态含义
状态点颜色与官方会话行一致:
| 显示 | 含义(聚合整个工作区的所有会话) |
|---|
| ● 琥珀(等待处理) | 至少一个会话在等待你:批准 / 计划审阅 / 回答问题 |
| ▦ 蓝色脉动(进行中) | 至少一个会话在运行,或有运行中的子代理链 |
| ● 绿色(已完成) | 至少一个会话跑完、你还没打开看过 |
| 不显示 | 该工作区所有会话都空闲(与单任务行隐藏"空闲"点的行为一致) |
- 优先级:等待处理 > 进行中 > 已完成,与官方单任务行完全一致。
- 状态点只在折叠时显示;展开后每个任务自带状态点,不重复显示。
- 子代理会话不单独占一行,但它运行时会算进所属工作区的"进行中"。
6. 已知边界
| 场景 | 表现 |
|---|
| 「单列表」视图(In one list) | 没有工作区文件夹行,不显示状态点(正常) |
| 侧边栏收起成窄条(rail) | 会话树不可见,不显示状态点(正常) |
| 搜索模式 | 树被搜索结果替换,不显示状态点(正常) |
| 极窄窗口 | 状态点跟随折叠文件夹位置,视口内可见 |
工作原理:插件挂载在框架的 shell.overlay 全局面板上,通过语义锚点
[role="treeitem"][aria-expanded] 定位工作区文件夹行(会话行用的是
aria-selected,不会误匹配),按渲染顺序一一对应;用 MutationObserver +
滚动/窗口尺寸监听保持位置实时同步。若 DSH 官方版本改动了行结构与顺序,
行数对不上时插件自动隐藏而不是画错位置。
7. 安全与合规
- 零后端:宿主半部是空模块,不暴露任何 HTTP 路由;
- 只读快照:所有数据来自浏览器端
useSessions / useWorkspaces 框架钩子
(Harness 自己的运行时快照),不读写、不修改任何会话日志或文件;
- 无凭证、无网络:不调用外部接口,不上传任何数据;
- 无配置项:无需提供密钥或路径。
8. FAQ
Q:状态点会不会和官方任务行的点搞混?
A:颜色、形状、动画与官方 StateDot 完全一致("进行中"同样是用 3×3 追逐方格动画),
唯一的区别是它出现在折叠后文件夹的图标与名称之间,语义就是"这堆任务里最要紧的状态"。
Q:为什么展开时不显示?
A:展开后每个任务行自带状态点,文件夹再放一个点是重复信息。设计上只在折叠态显示。
Q:子代理(subagent)会影响状态吗?
A:会。子代理会话不占工作区的一行,但它运行中会把所属工作区标为"进行中"——
与官方会话行把子代理计入状态的逻辑一致。
Q:升级 DSH 后状态点不见了?
A:行结构大改版时插件会自我隐藏(行数对不上即停用)。一般升级无需处理;
若确实不可用,提一个 issue 即可修复。
9. License
MIT © AFAP