Skip to content

dsh-workspace-activity

Verified

dsh-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