dsh-workspace-tree-status:工作区树目录行的聚合会话状态点

前言

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,目录行没有)。本插件因此采用运行时装饰:

  1. 订阅 sessions.list、workspaces.list、uiSession.sessionStatus 三个快照,算出每个工作区的聚合状态;
  2. 在 data-slot="sidebar.workspaces" 区域内找 data-row-key="workspace:<id>" 的行,插入 <span data-dsh-wts>(aria-hidden,pointer-events: none);
  3. 注入仅在 [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 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye