中文EN

dsh-plugin-busy-workspace

ui已测通过npmMIT

把含“需要注意的会话”的工作区按紧急度排到侧栏会话列表最前——待你处理优先,其次运行中,再次完成未读,最后刚读过的——并为这些行画状态竖条、着色底与着色标题,一次运行结束时播放一次收敛动效。所有颜色都取自当前主题自身的变量;决定完成会话置顶时长的三个窗口都是可配置项。

下载量 / Downloads
1,196
依赖体积 / node_modules
0.17 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-plugin-busy-workspace

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-plugin-busy-workspace

在侧栏里指出哪个工作区正在干活。

DeepSeek Harness(dsh)Web 界面插件:高亮正在工作的会话,并把有任务在跑的工作区置顶到侧栏最前。

![License: MIT](LICENSE)

![dsh plugin](https://github.com/topics/dsh-plugin)

![theme aware](#配色跟随主题)


解决的痛点

同时跑多个 agent 的时候,dsh 侧栏会变成一堵长得一模一样的墙。每个工作区标题长得一样,每条会话行长得一样,唯一能说明"有东西在跑"的信号,是一个十个像素、还灰扑扑的小圆点。

于是就出现了这些反复发生的问题:

现象 · 代价

看不出哪个工作区里有 agent 正在执行 · 只能逐个点开工作区确认,或者误打断一个本来跑得好好的会话

你一动别的工作区,忙碌的那个就沉到列表下面 · 你真正关心的那个,恰恰是需要滚动才能找到的

会话跑完了没有任何提示 · 你一直在等一个早就结束的任务,或者错过了查看产出的时机

状态点又小又灰、对比度低,是唯一的线索 · 退后一步、或者屏幕小一点,就完全读不出来

现有的主题和皮肤会把整个界面重新配色,但没有一个回答并行工作时最关键的那个问题:现在到底哪一个在跑?

插件做了什么

这个插件回答两个不同的问题:现在有什么在动,以及我刚才开的东西去哪了。把这两个问题混在一起,正是它早期版本最要命的缺陷——详见下面"完成后仍然留得住"。

一、按紧急度浮到最前

带活跃会话的工作区升到列表顶部,并且按紧急度排序:等你处理的排最前,其次运行中,再次已完成(未读),最后是已查看。所以同时有三个工作区在动时,第一个永远是那个卡在你这儿的。

位置变化只是视觉上的——你手动拖拽的工作区顺序不会被改写,工作停下来后列表会安静地恢复成你排好的样子。

二、五个注意力阶段,五种视觉分量

会话行按「注意力阶段」着色,每一种颜色都直接取该状态点自身绘制时用的变量,所以行和点永远不可能各说各话:

阶段 · 何时进入 · 颜色 · 是否置顶

待处理 · warning:等你审批 / 审计划 / 回答 · 琥珀 · 是,最高

运行中 · ongoing,且最近有活动 · 蓝 · 是

已完成(未读) · done:跑完了,你还没打开过 · 绿 · 是,保留 8 小时

已查看 · 你打开看过,结论已读 · 绿,褪色 · 是,选中时一直留,离开后 15 分钟

已中断 · 自称运行,但已静默超过 6 小时 · 红 · 否,只标记

每行获得:左缘一条 3px 实心色条、同色系淡底与描边环、加重着色的标题。只有"运行中"会动;其余阶段都是静止的——一条会搏动的红行读起来像警报,而不是报告。

三种"等你处理"共用琥珀一色,靠文字区分。 官方把等待分成审批、审计划、回答三类;它们都是"卡在你这儿",再拆三种色相只会让人重新学一遍。所以插件直接复用官方写在该行上的词——徽标会写「待审批」「计划待审」或「待回答」,而不是笼统的"待处理"。同理,子智能体不是一个颜色,而是一个计数:官方把"3 个子智能体运行中"渲染成隐藏标签,插件把它变成运行行上的小胶囊「3 子智能体」。

三、完成后仍然留得住(这是早期版本最大的错)

官方的 done 语义是 completionUnread——完成但你没打开过,而这个标记在你点开那条会话的瞬间就被清除。于是天真的读法会造成一个荒谬的结果:你正因为想看结果而点开它,它却恰好在这个时候从置顶区消失,你正在读的那一行跳走了。

插件的做法是:置顶要衰减,不能瞬断。

  • 打开一条完成会话,只会把它从"未读"变成"已查看",它继续留在置顶区;
  • 只要你还停在那一行,它就一直留着——无论你读多久;
  • 等你切到别的会话,才开始计 15 分钟,然后才释放。
  • 从未打开的完成会保留 8 小时——够你离座吃饭再回来,但昨天以前的活儿不会再来打扰你。

刷新页面不会丢。 这些不需要持久化:官方自己就存着"你看过没有"。重载后仍未打开的完成依旧是 done,按年龄继续保留;已经看过的是 idle,安静待在原地。

四、会话跑完的那一刻你看得见

会话停止运行时,那一行会播一次短促的绿色收敛脉冲,然后恢复正常。任务完成时你会知道,不必一直盯着。

配色跟随主题

所有颜色都取自当前主题自己的 --dsw-alias- / --dsw-static- 变量,没有任何硬编码色值。这意味着同一份样式表可以同时适配内置的明暗主题,以及社区主题包(Catppuccin、Nord、Dracula、Tokyo Night、Gruvbox,以及任何定义了标准变量集的主题)。

用途 · 取用变量

运行中(同 ongoing 状态点) · --dsw-static-deepseek-450

待处理(同 warning 状态点) · --dsw-alias-state-warn-primary

已完成 / 已查看(同 done 状态点) · --dsw-alias-state-success-primary

已中断 · --dsw-alias-state-error-primary

选中(独立第 5 色系,紫罗兰) · 由 --bw-running 与 --bw-interrupted 混合

行标题 · --dsw-alias-label-primary

每个阶段声明一次 --bw-tone,其余规则统一写在这个变量上,所以五种状态分量不会各自漂移。共用一个状态点的变量也意味着插件留在主题自己的词汇表里:主题调整了状态点,高亮会跟着一起调。

"已查看"用的是同一个绿色,只是把 --bw-fade 调到 0.42——它不是另一种状态,而是同一种完成正在退场。

透明度用 color-mix() 与主题自身的表面色合成,所以浅色和深色背景下色块都落在正确的位置。默认主题里运行态变量在浅色下解析为 #5686fe、在深色下解析为更亮的蓝,而插件并不知道这两个值。

选中是独立的一族,不借用任何状态色

这是修掉"选中的行和运行中的行长得一样"的关键。 之前选中行保留官方那层 6% 中性底,但描边环仍用状态色;而状态色同时还染着竖条和标题——于是一行"既被选中又在跑"在三个通道上全是蓝的,看起来就只是又一个运行行。

现在选中走自己的色系,而且和四个状态是同一种处理方式:一个饱和色相铺成淡色底(权重完全相同,都是 --bw-fill-alpha),描边环用同一色相的加深版。区别只在色相本身。状态仍由左缘竖条与标题色承载——那本来就是这两个元素的职责。效果是:

行 · 表面 · 描边环 · 左缘竖条

在跑 · 已选中 · 紫 9.6% · 紫 · 蓝

在跑 · 未选中 · 蓝 9.6% · 蓝 · 蓝

空闲 · 已选中 · 紫 9.6% · 紫 · 无

选中的外观因此与底下是什么状态无关:无论运行、等待、完成还是普通会话,被选中就得到同一套紫色。实测色值:选中 rgb(126,92,187)(紫罗兰),与运行 rgb(77,107,254) 色距 84、与待处理 191、与已完成 163、与已中断 157——四态都拉得很开。

为什么是"混"出来的紫? 因为 Harness 的调色板只有六个色相族(amber / blue / deepseek / green / neutral / red),四个状态已经占掉四个,没有第五个色相可用;而 --dsw-alias-brand-primary 解析为近黑/近白,不是色相。于是选中由主题自己的两个亮色 token(运行蓝 + 失败红)按约 2:1 混出紫罗兰:它按构造就不等于任何四态色相,同时仍然跟着主题走,而不是钉死一个写死的色值。

想换成别的色相,覆写 --bw-selection 与 --bw-selection-ring 两个变量即可,不必动任何规则:

--bw-selection: #d946a8;              /* 换成任何你喜欢的色相 */
--bw-selection-ring: color-mix(in srgb, var(--bw-selection) 52%, transparent);

觉得选中还不够醒目,把 --bw-selection 的混合比例调浓,或在选中规则里把 --bw-fill-alpha 的倍数从 100% 提高即可(默认与状态行同权重,所以不会盖过状态)。

填充刻意只做衬托:真正承载信号的是有形状的东西——3px 实心竖条,和工作区标题上写明状态的胶囊徽标。旧版把"运行中"主要表达为蓝色标题,可官方行标题本来就是蓝的,那个信号等于不存在。

安装

dsh plugin --profile web add dsh-plugin-busy-workspace

就这一条命令。插件已发布到 npm;不会触发任何构建——lib/ 是随包发布好的产物,没有运行时依赖,唯一的官方包是 profile 本来就提供的 peer。

不想走 npm 也可以,同一个包能从仓库或 Release 页上的预构建 tarball 装:

dsh plugin --profile web add github:baifagg/dsh-plugin-busy-workspace
dsh plugin --profile web add https://github.com/baifagg/dsh-plugin-busy-workspace/releases/latest/download/dsh-plugin-busy-workspace.tgz

两种方式都需要把 bundle 列进该 profile 的 package.json:

{
  "dsh": {
    "profile": {
      "bundles": [
        "...",
        "dsh-plugin-busy-workspace"
      ]
    }
  }
}

dsh plugin add 会替你写好这一项;如果你是手工 pnpm add 的,就自己补上。之后重启 Web 界面并刷新页面,侧栏即生效,无需其他配置。

导入插件之前,Harness 会先校验本插件声明的版本范围(见[兼容性](#兼容性))。被拒绝的版本会被跳过并报告,不会出现"加载了一半"的状态。

配置

配置持久化在 $DSH_HOME/busy-workspace/settings.json,通过 GET /busy-workspace/api/settings 提供。

{
  "pinBusyWorkspaces": true,
  "highlightRunningSessions": true,
  "highlightBusyWorkspaceHeaders": true,
  "notifyOnCompletion": true,
  "intensity": 0.6
}

字段 · 默认 · 作用

pinBusyWorkspaces · true · 把带活跃会话的工作区按紧急度提到列表最前

highlightRunningSessions · true · 为各阶段的会话行绘制对应的色条、底色与着色标题

highlightBusyWorkspaceHeaders · true · 为活跃工作区的标题行加上同色系底色、竖条与状态徽标

notifyOnCompletion · true · 会话停止运行时播放收敛脉冲

intensity · 0.6 · 强调强度,0–1。只缩放透明度,色相始终来自主题

unreadHoldMinutes · 480 · 未打开的完成保留多久(8 小时)。范围 0–10080

seenHoldMinutes · 15 · 打开过、且你已移开的完成,再保留多久。范围 0–1440

staleRunMinutes · 360 · 自称运行但静默多久后判为已中断(6 小时)。范围 30–10080

后三个是保留策略,做成可调字段而不是常量,因为它们描述的是工作节奏、不是事实。把它们调到 0 就等于让"完成"完全不留痕;把 unreadHoldMinutes 调到 10080 就是留一星期。

Host 侧是可选的。只挂载客户端 bundle 的组合会使用上述默认值,这本身就是一套完整可用的配置。

实现原理

插件读取 Harness 已经渲染在每条会话行上的状态点的 data-state 属性。这个属性就是官方

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:3,最后更新 2026-10-11

链接

GitHub · Homepage · npm

同类插件