DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

baifagg /

baifagg/dsh-plugin-busy-workspace

Verified

DeepSeek Harness (dsh) Web GUI plugin: highlight running sessions and pin busy workspaces to the top of the sidebar. Theme-adaptive, zero-config.

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@fbd21ac4

dsh-plugin-busy-workspace

Shows which workspace is working, in the sidebar.

A DeepSeek Harness (dsh) Web GUI plugin that highlights running sessions and pins busy workspaces to the top of the sidebar.

License: MIT dsh plugin theme aware


Sidebar with a busy workspace pinned above the rest of the list

The plugin's stylesheet applied to a sidebar-shaped list. The frame, tint, pinning, and settle animation shown are the plugin's own CSS driven by real data-state values; the surrounding list is a fixture, because the sidebar's real contents are per-installation.


The problem

If you run more than one agent at a time, the dsh sidebar becomes a wall of look-alike rows. Every workspace header renders identically, every session row renders identically, and the only signal that something is running is a ten-pixel dot you have to hunt for.

The result is a set of real, recurring failures:

What happens What it costs you
You cannot tell which workspace has an agent mid-task You open workspaces one by one to check, or you interrupt a session that was already working
Busy workspaces drift down the list as you touch others The thing you actually care about is the thing you have to scroll to find
A session finishes and nothing tells you You wait on a task that already ended, or you miss the moment to review its output
The status dot is the only cue, and it is tiny, grey, and low-contrast You cannot read the sidebar from a step back or on a small display

Existing themes and skins restyle the whole interface but none of them answer the one question that matters during parallel work: which one is running right now?

What this plugin does

Three focused changes, all in the sidebar, all driven by the state the Harness already computes.

1. Busy workspaces rise to the top

A workspace containing a running session is lifted above the rest of the list. The move is presentational only — your manually dragged workspace order is never rewritten, so when the last session in a workspace finishes, the list quietly returns to the order you set.

2. Running sessions get a distinct row

The running session row gets an accent frame, a tinted background, an accent-coloured bold title, and a slow breathing bar on its leading edge. The state is readable without reading the title.

3. You see the moment a session finishes

When a session stops running, its row plays one short green settle pulse and then returns to normal. You learn that a task completed without watching it.

Theme-adaptive by design

Every colour is read from the active theme's own tokens. Nothing is hardcoded, which means one stylesheet works across the built-in light and dark themes and across community theme packs (Catppuccin, Nord, Dracula, Tokyo Night, Gruvbox, and any other theme that defines the standard token set).

Role Token
Running accent --dsw-static-deepseek-450
Settle colour --dsw-alias-state-success-primary
Row title --dsw-alias-label-primary
Selected surface --dsw-alias-interactive-bg-hover

The running accent is the exact token the status dot paints its ongoing state with, so the row highlight and the dot read as one signal rather than as two blues that almost match. Sharing the dot's token is also what keeps the plugin inside the theme's own vocabulary: a theme that retunes the dot retunes the highlight with it.

Transparency is composed with color-mix() against the theme's own surface, so the tint sits correctly on light and dark backgrounds alike. In the default themes the token resolves to #5686fe on light and a lighter blue on dark, without the plugin knowing either value.

Hierarchy

The selected row is the user's current position and outranks every status hint. The official selected surface is a roughly 6%-alpha neutral, so the running treatment is deliberately edge-weighted — a leading bar, a thin ring, and a fill held below 6% — and the fill is dropped entirely on a row that is both selected and running, leaving that row's official surface at full strength. Without that ordering a saturated running fill makes the row being worked on look more selected than the row actually selected.

Install

# From your dsh profile directory
cd ~/.dsh/profiles/web
pnpm add github:baifagg/dsh-plugin-busy-workspace

Then register the bundle in that profile's package.json:

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

Restart the Web GUI and reload the page. The sidebar picks it up with no further configuration.

Configuration

Settings persist at $DSH_HOME/busy-workspace/settings.json and are served over GET /busy-workspace/api/settings.

{
  "pinBusyWorkspaces": true,
  "highlightRunningSessions": true,
  "highlightBusyWorkspaceHeaders": true,
  "notifyOnCompletion": true,
  "intensity": 0.6
}
Field Default Effect
pinBusyWorkspaces true Lift workspaces with a running session to the top of the list
highlightRunningSessions true Draw the accent frame, tint, and breathing bar on a running row
highlightBusyWorkspaceHeaders true Tint and accent-bar the header of a busy workspace
notifyOnCompletion true Play the settle pulse when a session stops running
intensity 0.6 Accent strength, 0–1. Scales alpha only; hue always comes from the theme

The Host half is optional. A composition carrying only the client bundle keeps these defaults, which is a fully working configuration.

How it works

The plugin reads data-state from the status dot the Harness already renders on every session row — ongoing, warning, or done. That single attribute is the official contract, and reading it has three consequences worth stating:

  • No second source of truth. The plugin never re-derives activity from the transport, so it cannot disagree with the dot you are looking at.
  • No race with the renderer. Marks are applied as attributes plus CSS. React re-renders overwrite attributes freely and the observer simply re-applies them; DOM order is never touched, so reconciliation is never fought.
  • No layout shift. The running frame is drawn with an inset box-shadow ring rather than a border, because a border would change the row's box size and shift every row below it the moment a session starts.

Workspace lifting uses CSS order on the flex list column. Reordering nodes directly would fight React; an order value is a purely presentational hint the renderer never reads back.

Motion respects prefers-reduced-motion: users who ask for less motion keep every state indication and lose only the movement.

Verification

npm test runs 24 checks over both halves with no browser and no Harness: settings normalisation on the Host side, and the module, selector, styling, and runtime contracts on the client side. The styling checks assert the invariants stated above — no bare hex outside a token fallback, no border on the running row, reduced motion keeps the states — so a regression in the reasoning is caught even when the DOM shape is unchanged.

The client half is also exercised in a real Web GUI: the module is loaded through the official __ModuleLoader__ contract, apply() runs against a stub context, and the observer is driven with real data-state="ongoing" → "done" transitions, asserting that the workspace mark, the row mark, and the settle mark are set and cleared in that order.

Compatibility

Harness DeepSeek Harness 0.1.5-rc and later
Surface Web GUI sidebar (sidebar.workspaces)
Themes Any theme defining the standard --dsw-alias-* tokens
Conflicts None known. The plugin owns one style element and one settings file, and reads no other plugin's state

FAQ

Does it change my workspace order permanently? No. Lifting is purely visual. Your persisted order is never written, so the list returns to your arrangement as soon as the work stops.

What counts as "running"? Exactly what the status dot means by ongoing: the session's turn is in flight. A session waiting on your approval, plan review, or an answer shows the official warning dot and is left alone — that is your cue, not a busy cue.

Will it fight my theme? No. It defines no palette. It consumes your theme's tokens, so it inherits whatever you installed and stays correct when you switch themes.

Does it slow the sidebar down? Marks are recomputed once per animation frame from a batched mutation observer, and only written when a value actually changes. The observer cannot drive itself, because it writes attributes it does not itself observe into a loop.

Keywords

DeepSeek Harness · dsh plugin · dsh-plugin · cordis plugin · DeepSeek Web GUI · sidebar · workspace sidebar · session list · running session indicator · busy workspace · agent activity indicator · parallel agent monitoring · session status dot · pin active workspace · workspace sorting · theme adaptive · --dsw-alias tokens · Catppuccin · Nord · Dracula · Tokyo Night · Gruvbox · productivity · developer tooling

License

MIT © 2026 baifagg

—/ 5

No ratings yet

Verified DSH bundle

Commit fbd21ac45bcb

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout