前言¶
DeepSeek Harness(DSH)Web 侧边栏里,单个会话行本身会显示状态点:在跑、刚完成、在等你确认或回答。一旦把工作区折叠成文件夹,里面所有会话的状态会一起被藏起来。同时开着多个工作区、几个会话并行时,只能逐个展开去找「哪个跑完了」「哪个在等我点确认」。
dsh-workspace-tree-status 是社区维护者 ramwin 发布的客户端 Web 插件(npm 包名 dsh-workspace-tree-status,当前版本 v0.1.0,MIT 许可证)。它在工作区树每个目录名左侧增加一个聚合状态点,把子工作区里的会话状态向上汇总到父文件夹,折叠状态下也能一眼定位该点开的目录。
这是什么¶
一句话:在 DSH Web 侧边栏工作区树的目录行上,显示与子会话一致的等待 / 刚完成 / 运行中状态点,并按优先级只亮一个。
- 维护者:ramwin
- 分类:客户端(
platform: web) - 目录页:https://www.skillhub.cn/plugins/ramwin/dsh-workspace-tree-status
- 源码与说明:https://github.com/ramwin/dsh-workspace-tree-status
插件只改显示:不拦截点击、不改变展开状态、不写任何会话数据。
核心功能¶
状态点含义¶
| 点 | 含义 | 判定(聚合后优先级从高到低) |
|---|---|---|
| 黄色实心点,呼吸动画 | 有会话等你输入 | pendingInteraction(提问 / 审批 / 计划确认) |
| 绿色实心点 | 有会话刚完成、你还没看 | completionUnread |
| 灰色转圈 | 有会话正在运行 | running |
| 不显示 | 空闲 | 以上都没有 |
一个文件夹同时有多个状态时,只显示优先级最高的一个。
嵌套工作区向上汇总¶
父文件夹会汇总所有嵌套工作区的会话状态。例如路径 /home/wangx/github 的状态会包含 …/个人/life、…/django/django-reference 等子工作区,只按接口路径前缀判定,避免 /a/b 与 /a/bc 误判为父子。
README 中的示意:
工作区树
● github ← 里面有会话刚完成 / 在等你
⠋ django ← 里面有会话在跑
● django-reference ← 等你回答(黄色,最优先)
○ life ← 空闲
不计入聚合的会话¶
归档会话、子代理会话(origin: 'subagent' 或有 parentId)、空白新会话都不计入。不属于任何工作区的会话汇总到「未分组」那一行。
实现方式(与 slot 插件的区别)¶
DSH 侧边栏 sidebar.workspaces 由内置 @deepseek-ai/dsh-client-ui-workspace 占用;工作区 / 文件夹行没有装饰槽(会话行有 sidebar.session.row.leading,目录行没有)。本插件因此采用运行时装饰:
- 订阅
sessions.list、workspaces.list、uiSession.sessionStatus三个快照,算出每个工作区的聚合状态; - 在
data-slot="sidebar.workspaces"区域内找data-row-key="workspace:<id>"的行,插入<span data-dsh-wts>(aria-hidden,pointer-events: none); - 注入仅在
[data-row-key^="workspace:"]下生效的样式,颜色使用主题 token(--dsw-alias-state-warn-primary/-success-primary/-label-tertiary),跟随明暗主题。
插件激活依赖客户端服务:sessions、workspaces、uiSession(在 package.json 的 dsh.client.inject 中声明)。若未来 DSH 改掉 data-slot 或 data-row-key 契约,插件可能退化为没有点,不会影响其它界面。
安装与启用¶
安装前请自行查看 GitHub 源码与 MIT 许可证;插件在 DSH 客户端进程中运行,权限与当前 dsh 进程一致。
从 npm 或 GitHub 安装:
dsh plugin --profile web add dsh-workspace-tree-status
dsh plugin --profile web add github:ramwin/dsh-workspace-tree-status
本地目录开发安装示例(README 原文路径,请换成你的 clone 路径):
dsh plugin --profile web add /home/wangx/github/dsh-workspace-tree-status
装完刷新一次 DSH Web 页面。卸载:
dsh plugin --profile web remove dsh-workspace-tree-status
若要让父目录聚合在缩进层级上清晰可见,把侧边栏切到树形:工作区标题栏右侧「视图选项」→「工作区树」。内置「工作区」平铺模式也会显示每行状态点,但没有父子缩进。
本插件无配置项;想关闭时在「设置 → 插件」里禁用或卸载即可。
典型用法与验证思路¶
日常使用:保持工作区树视图,折叠大目录,通过目录名左侧的点判断是否要展开——黄点优先(等你输入),绿点表示有未读的刚完成会话,灰色转圈表示仍有会话在跑。
作者在 README 中给出的真机验证场景(DSH 0.2.0-rc.2,dsh web + 无头 Chromium)包括:运行中会话时工作区与父目录显示灰色转圈;回合结束后切走会话,工作区与父目录同时变绿;触发 ask_user_question 后切走,工作区与父目录变黄并呼吸闪烁。聚合逻辑另有单测:node --test test/。
调试时可在浏览器控制台执行 document.querySelectorAll('[data-dsh-wts]') 查看注入的状态点节点。
适用场景与注意¶
适合: 经常在同一棵工作区树下挂多个嵌套工作区、并行多个会话的 DSH Web 用户,希望少点「展开文件夹找状态」的操作。
已知限制(README 原文):
- 只装饰侧边栏的工作区行;「全部对话」平铺列表没有父目录,不受影响。
- 一个目录只显示一个点(最高优先级),不显示具体数量。
安全与信任: 社区插件目录(如 skillhub.cn)与 DeepSeek / 幻方无官方从属关系;安装前请阅读仓库代码与许可证,再决定是否加入 --profile web。
结尾¶
dsh-workspace-tree-status 把会话行已有的状态语义搬到工作区树目录行,并用路径前缀把嵌套工作区的状态汇总到父文件夹,解决折叠后「看不见里面谁在等你」的问题。需要细节、Issue 或版本记录时,见 GitHub:https://github.com/ramwin/dsh-workspace-tree-status ;目录条目:https://www.skillhub.cn/plugins/ramwin/dsh-workspace-tree-status 。