dsh-workspace-activity
Verifieddsh-workspace-activity · v0.1.0 · MIT · Web UI
Marks each workspace in the sidebar while one of its sessions is running.
Install
dsh plugin add dsh-workspace-activity Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-workspace-activity
English · 简体中文
侧边栏里,某个工作区只要有会话在运行,就在它的工作区行上显示转圈。
会话行本来就有转圈。这个插件把同样的转圈放到它上面的工作区行,这样工作区列表折叠着或者滚走了,也能一眼看出哪个项目在忙,不用展开。
📁 dsh-workspace ◌ ← 本插件添加
◌ 处理所有 skill 同步到已同步 刚刚
安装
dsh plugin --profile <name> add dsh-workspace-activity
重启 dsh,或刷新页面。本插件是 bundle,因此也能通过插件市场和任何支持 bundle 的客户端安装。
做了什么
现在侧边栏的工作区行没有任何状态指示。本插件用与会话行同一个状态源推导,所以两者是一致的:
- 工作区下至少有一个会话在运行 → 该工作区被标记。
- subagent 会话会跳过。侧边栏把它们折叠进父会话那一行,从不单独画一行,而且它们的 id 不属于任何工作区,所以由它们产生的标记没有可对应的行。
- 被侧边栏当作已归档隐藏的会话会跳过,这与默认视图一致。侧边栏的归档筛选也可以把已归档会话显示出来,而插件看不到当前是哪个设置——
@deepseek-ai/dsh-client-ui-workspace没有把它暴露出来——所以在「显示已归档会话」的筛选下,一个正在运行的已归档会话行可能出现在没有标记的工作区下。 - 状态源优先,会话列表作为兜底,与工作区浏览器自身的优先级一致。
- 标记是行尾的一个转圈,占会话行放时间戳的同一个 16px 槽位,使用产品自身的主题令牌与描边几何。
- 折叠的工作区还会把文件夹图标染成蓝色——与浏览器给「你当前所在的分组」用的同一个蓝。折叠行会隐藏自己的会话,图标必须独自承担状态;展开行已经能看到会话,因此保持浏览器原本的配色。
- 看不见它的用户,通过一段视觉隐藏的描述获得数量与工作区名称。
实现方式
工作区行没有声明任何 slot,因此没有受支持的渲染位置。插件改为贡献一段样式表,装饰侧边栏已经渲染好的那一行。它不向文档写入任何东西、不做任何监听、不追加任何节点:规则作用于该行的尾部伪元素,React 始终拥有这一行。
安装前需要知道的一点:规则定位的是侧边栏的 data-row-key 属性,那是 @deepseek-ai/dsh-client-ui-workspace 的内部细节,而不是公开契约。将来某个版本若改了它,转圈会停止出现,直到插件更新。其余功能不受影响——插件从不改动 DOM,所以选择器失效的后果是「没有指示」,而不是「侧边栏坏掉」。
要求
- Web(或桌面)客户端 —— 这是纯客户端插件,
dsh.client.platform: web。 - 不需要宿主服务、不需要配置、不需要权限。
开发
代码用 TypeScript 写,src/ 是唯一真源,lib/ 是构建产物(同时提交进仓库,见下)。scripts/ 下的脚本同样是 TypeScript,直接靠 Node 的类型擦除运行,需要 Node 22.18 或更新版本,不引入额外的运行器。
npm install
npm run build # tsdown 输出到 lib/,再把客户端半包进模块信封
npm run check # typecheck + lint + format 检查 + build + verify
| 脚本 | 作用 |
|---|---|
build |
产出 lib/index.js 与 lib/client.js。 |
verify |
加载构建出的客户端半,并用真实渲染器渲染它。 |
typecheck |
tsc --noEmit。 |
lint / lint:fix |
Oxlint(开类型感知与 React hooks 规则)。 |
format / format:check |
Prettier。 |
check |
以上全部,按 CI 的顺序执行。 |
build 会在 tsdown 之后跑 scripts/wrap-client.ts:客户端半必须以 window.__ModuleLoader__.load({ id, factory }) 的形式到达浏览器,且 id 等于包名,这个信封由该脚本补上。
lib/ 是特意提交进仓库的,同时本包刻意不声明任何生命周期脚本。pnpm 默认拒绝安装带构建脚本的 git 依赖,除非使用者把它加进 allowBuilds,那会让插件无法直接从仓库安装;没有脚本要跑,add 就只会消费已提交的产物。改动 src/ 之后请跑 npm run build。
verify 并不是侧边栏的模拟。它捕获信封注册的 factory,用桩 context 驱动 apply,再用 react-test-renderer 渲染注册的组件——足以证明信封、注册与组件发布的样式表都是对的。指示器的位置与颜色,仍然只有在真正运行的侧边栏里才能判断。
许可
MIT