# dsh-workspace-activity [English](README.md) · **简体中文** 侧边栏里,某个工作区只要有会话在运行,就在它的工作区行上显示转圈。 会话行本来就有转圈。这个插件把同样的转圈放到**它上面的工作区行**,这样工作区列表折叠着或者滚走了,也能一眼看出哪个项目在忙,不用展开。 ``` 📁 dsh-workspace ◌ ← 本插件添加 ◌ 处理所有 skill 同步到已同步 刚刚 ``` ## 安装 ```sh dsh plugin --profile 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 或更新版本,不引入额外的运行器。 ```sh 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