lauytgary / dsh_hud_plugin

Listed

DSH Head up display panel

mainOther View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:lauytgary/dsh_hud_plugin

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 3885365Synced Aug 18, 2026

English · 简体中文

dsh-stats-hud

A sci-fi HUD for DeepSeek Harness: the session's stats become game-style level bars in a vertical column fixed to the far right edge of the web UI — without touching the original stats line.

screenshot

Instruments (all-English, LLM terminology)

InstrumentDataFull scalePast full scale
CLOCK badgeLocal time (24h) + DS API PEAK / DS API OFF PEAK ratePeak = Beijing 09:00-12:00 / 14:00-18:00 (auto-converted from local time)PEAK orange tint, OFF-PEAK green tint
STEPS / TURN rolling rowsSteps / turns as odometer drums (like the CONTEXT rows)Drums spin up on mount, roll on change
LLM / TOOLS dual barTwo columns (labels over values), bar segments = raw LLM:TOOLS time ratioNo cap — 2:1 time means 2:1 bar
THROUGHPUT gaugetokens/s (throughput), centered title, combined centered readout (146 tok/s)Redline auto-scales 200→300→400… (arc ticks follow)
CONTEXT USAGE barContext-window usage % with 3 segments: Sys Prompt (gray) / Tools (blue) / Messages (purple) by token ratio0-100%≥80% whole bar turns solid red; hover shows the three token counts
CACHE HIT barCache-hit %0-100%<50% red, <80% yellow, ≥80% green
CONTEXT rolling counterThree odometer rows: CACHE HIT (green) / CACHE MISSED (orange) / OUTPUT (pink)Drums spin up from 0 on mount; digits roll up on increase (carry 9→0), down on decrease

While the agent is running the whole panel breathes and bars pulse.

Hovering the CONTEXT USAGE bar pops up a tooltip with the token breakdown:

hover tooltip

Responsive layout

The HUD adapts to the free space right of the chat column (measured live with a ResizeObserver, so sidebar drags, the details drawer and window resizes all count):

TierCondition (free space)Shows
full≥ 200pxEverything
mini≥ 90pxClock (short PEAK/OFF PEAK badge) + compact rolling rows (Step/Turn/HIT/MISS/OUT)
hidden< 90pxNothing (element stays mounted, display:none)

The mini tier in a narrow window:

mini tier

Requirements

  • DeepSeek Harness dsh (tested on 0.1.0-rc.6, macOS)
  • pnpm (for plugin management)

Install

# from a local checkout
dsh plugin --profile web add /path/to/dsh-stats-hud

# or straight from GitHub
dsh plugin --profile web add https://github.com/lauytgary/dsh_hud

Then restart dsh web (loader entries are scanned at boot) and refresh the page. The package is installed as a link: dependency — after editing lib/client.js locally, only a restart is needed, no reinstall.

The plugin then shows up in Settings → Plugins:

dsh-stats-hud in the plugin list

Uninstall

dsh plugin --profile web remove dsh-stats-hud

How it works

  • Registers into the conversation.composer.dock slot (id dsh-stats-hud, order 1) — only to receive the session-scoped hooks (useSession/useProjection); the panel itself is position: fixed, takes no layout space, and the stock stats line stays untouched.
  • Data comes from the same projections the stock UI uses: useProjection("sessionStats"), useProjection("tokenUsage"), useProjection("contextPressure") and useProjection("contextBreakdown") — zero host-side changes.
  • exports.inject = ["slots"] is mandatory: DSH's ctx is a strict proxy, and accessing an undeclared service throws (cannot get property "locale" without inject).
  • The panel is pointer-events: none (click-through); only the CONTEXT USAGE bar re-enables pointer events so its hover tooltip works.

Files

dsh-stats-hud/
├── package.json          # dsh.bundle (patch layer) + dsh.client (browser entry)
├── cordis.patch.yml      # inserts the plugin into loader entries
└── lib/
    ├── index.js          # host-side no-op (pure browser plugin)
    └── client.js         # browser bundle: HUD components + slot registration

lib/client.js is a hand-written loader bundle (window.__ModuleLoader__.load) — no build step needed.

Tuning

All constants live in lib/client.js:

  • Labels: the L object (all-English LLM terminology)
  • Peak hours: LocalClock's bjMin >= 540 && bjMin < 720 (Beijing 9-12h) and >= 840 && < 1080 (14-18h), with bjMin = ((now.getTime() + 8*3600e3) / 60000) % 1440
  • MissionRolling: rolling drums for steps/turns (no full scale)
  • ChannelBar: segment ratio = llmMs / (llmMs + toolMs) (no cap)
  • SpeedGauge's redline = 200 (initial; while (tps > redline) redline += 100 auto-scales)
  • ContextUsageBar: segment colors and the ≥80% solid-red threshold; the hover tooltip reads systemTokens / toolsTokens / messageTokens from the contextBreakdown projection
  • Rolling counter: DRUM (3× 0-9), DRUM_H = 15 (px per digit), RollingValue's carry/borrow formula and mount spin-up
  • CSS: position:fixed; right:12px; tiers in tierOf(space) (≥200 full / ≥90 mini / else hidden) and the .gsh-root.gsh-* rules

Publishing to npm (optional)

# remove "private": true from package.json, then
npm publish
# users install with:
dsh plugin --profile web add dsh-stats-hud

License

MIT

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

DocumentationDetected

Repository information

Language
JavaScript
License
MIT
Last updated
Aug 18, 2026, 11:12 AM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.