dsh-agent-grid
Manifest valid★ 1Replaces the DeepSeek Harness sidebar with a fixed 2x4 board of eight standing agent seats — each seat shows its own status, latest tool call, reasoning and result; a settings switch restores the stock sidebar.
Eight Standing Seats · 定员八席
其静也专,其动也直 — "Still, it is single-minded; moving, it goes straight." (I Ching, Great Treatise I)
A 2×4 standing-seat board that replaces the DeepSeek Harness sidebar: see what all eight agents are doing, and which one is waiting for you, at a glance.
中文 | English

A real screenshot, not a mock-up: each seat's avatar, status dot and current action (a green dot for the working seat, greyed-out for the two vacant ones). Dynamic text and working directories on the cards are redacted.
What it solves
DSH's sidebar is a session list by default. Once you run one agent per session, what you actually want to know is not "which sessions exist" but "what is each seat doing, and which one is waiting for me" — a list cannot answer that, it only grows longer.
This plugin swaps it for a fixed 2×4 board:
Seat identity is permanent. Sessions are disposable payload.
Each of the eight seats keeps a permanent identity (persona, accent colour, index); real sessions are just replaceable payload mounted on a seat. Adding, removing or reordering sessions never makes a cell change occupant — that is the precondition for "understandable at a glance".
Each seat has its own name and emblem (the Eight Immortals of Chinese lore: Han Zhongli, Lü Dongbin, Tieguai Li, Zhang Guolao, He Xiangu, Lan Caihe, Han Xiangzi, Cao Guojiu), with a hand-drawn pixel avatar (56×24 logical canvas at integer 2× scale). The animation is a finite state machine, not a looping GIF — the figure follows the facts: waiting on you → raises a flag, working → emblem fires, finished-but-unread → settles with an afterglow, otherwise → at rest.
Three orthogonal states
Deliberately not collapsed into one field, because their rates of change and their owners differ completely:
| Dimension | Values | Rate | Owner |
|---|---|---|---|
| Persona | name / emblem / accent | almost never | you |
| Activity | working / resting / awaiting answer / awaiting approval | high | the agent |
| Context | empty / in use / near limit | medium | the system |
Key consequence: "resting" ≠ "vacant". Resting means "has an identity, is ready, is not working"; vacant means "this slot has never been commissioned". A bot can perfectly well be "resting but 87% context-full" — the card must say so, because you need to clear it before assigning the next task.
The seven labels
| Label | Fact it states | Source | Figure |
|---|---|---|---|
| Vacant | no session bound yet | no binding | at rest (grey) |
| Standing by | seated, session still empty | blank | at rest |
| Working | currently running | running | emblem fires |
| To review | a turn ended and you have not looked | unread notice | settles + afterglow |
| Resting | idle, nothing unread | otherwise | at rest |
| Awaiting answer | it asked you a question and is stuck | projection attention=question | raises flag |
| Awaiting approval | an un-reviewed approval is pending | projection attention=approval | raises flag |
Status dots: working green · to-review gold #C9A227 · awaiting cinnabar
#B5453C · vacant / standing by / resting grey
Priority: the two awaiting states outrank everything except vacant; the rest order as working → to-review → standing by → resting.
Why not call it "completed":
completedis not a lifecycle state, it is an unread notice — the host lights it on the true→false edge ofrunning, and it does not judge success (a crashed or interrupted turn lights it too). Calling it "completed" is not merely imprecise, it can be simply wrong. It really only says two things: a turn ended, and you have not looked.Also: the seat you are currently viewing does not light the notice when it finishes — so "to review" always appears on a seat you were not watching. That is exactly what this board is for.
The card shows the process
Not just a status dot. A host-side seat-activity projection supplies each seat's latest slice: tool call → thought (reasoning) → ↳ (tool result) → speech (answer), plus how long since the seat last moved.
So when all eight cards are animating, you can tell what each one is doing — not eight identical spinners.
Vertical space is a hard constraint: eight full cards must fit one screen with no scrollbar. Measured at 164px per full card (4 rows + gaps = 697px against ~750px usable), narrow windows drop secondary rows. Better to hide a row than to show a scrollbar.
The main pane stays stock
The board does not rewrite the conversation area. The main pane remains DSH's stock Conversation; the plugin only injects a seat badge into the conversation header, so you always know which seat you are talking to.
(An earlier version replaced the main pane with a custom detail page — that threw away the stock conversation. Overturned; it was reinventing the wheel.)
Escape hatch
Settings → General → Sidebar: [ Seats │ Default ]
Switching to "Default" works by unregistering, not by hiding a component — once our slot registration is dispose()d, the built-in WorkspaceBrowser returns to the render position automatically. The choice survives page refreshes and host restarts; deployments without a settings service degrade to a local-only switch with an inline notice.
Install
dsh plugin --profile web add dsh-agent-grid
Then refresh. To go back to the stock sidebar: Settings → General → Sidebar → Default.
Intrusiveness
This plugin replaces the host's sidebar.workspaces slot (shadowing the built-in implementation with priority: -1). It patches no host source, but it does change how the sidebar presents itself — the switch above exists precisely as the way back.
Compatibility
- Verified on DSH 0.1.5-rc.2 (
@deepseek-ai/dsh) - Consumes only host design tokens and hard-codes no colours — so any DSH theme can drive it
- Not affiliated with DeepSeek
With a theme
Companion theme dsh-theme-songgrid (Songgrid · rice paper / night ink) was tuned for it: warm paper against the board's grey-scale cards, Ru celadon carrying the interactive states. The two are fully independent — either works alone.
License
MIT
Compatibility
Versions
| Latest version | Published | Size |
|---|---|---|
| 0.1.0 | — | — |
| 0.1.2 | — | — |
| 0.1.3 | — | — |
| 0.1.4 | — | — |
Comments
Loading…
Similar plugins
by Denis-Tang
Live two-column card board of the current session's main and sub agents in the DeepSeek Harness right sidebar (independent fork of agent-trees).
★ 0
MIT
JavaScript
Oct 24, 2026
dsh plugin --profile web add dsh-agent-boardby blockman0321
Floating sidebar overlay for DeepSeek Harness: independently rendered workspace/session browser in the official shell.overlay seat, without touching the official sidebar or grid.
★ 1
MIT
JavaScript
Oct 27, 2026
dsh plugin --profile web add dsh-sidebar-overlayby 863683348
Focus board for DeepSeek Harness agents: durable, model-maintained notes in the session workspace that pin the objective, constraints, and decisions across compaction and sessions, with automatic cont
★ 1
↓ 118/wk
MIT
JavaScript
Sep 11, 2026
dsh plugin --profile web add dsh-plugin-focusby asun-labs
DeepSeek Harness plugin for interactive agent-switch terminals with tab and grid layouts.
★ 0
Apache-2.0
TypeScript
Oct 13, 2026
dsh plugin --profile web add @asun-labs/dsh-plugin-agent-switchby zoe1nan
Live command deck for DeepSeek Harness agent teams: roster telemetry, task board, approvals, write actions, built-in Windows desktop capsule, and phone access.
★ 22
↓ 162/wk
MIT
JavaScript
Oct 21, 2026
dsh plugin --profile web add dsh-cockpitby manny333
Session-scoped checklists for DeepSeek Harness — the agent tracks work as a tree, the model always sees a compact digest, and a read-only sidebar tab mirrors it.
★ 0
MIT
TypeScript
Oct 22, 2026
dsh plugin --profile web add dsh-checklists