dsh-tps
tingod2006/dsh-tps
Live tokens-per-second readout for the current session, docked to the sidebar or draggable as a floating card, with the placement chosen at the card's top-right corner.
Установка
dsh plugin --profile web add github:tingod2006/dsh-tpsREADME
dsh-tps
A live tokens-per-second card for the current DeepSeek Harness session. It docks into the left sidebar, or floats as a draggable card — switch with the toggle at the card's top-right corner.
What it shows
- Live t/s — throughput of the streaming assistant output, computed from real
agent/assistant-streamdeltas (a sliding window, with a denominator floor so bursty chunks cannot spike the number). - Average t/s — session-wide average since the first token; toggle 实时 / 平均 (live / average) with the segmented control in the card header.
- Sparkline — the last 40 samples, drawn with the card's own accent colour.
- Current task name — left-aligned above the speed, following the card's selected session and remaining visible when collapsed. Long names use an ellipsis with the full name on hover; untitled sessions show their short ID.
- Session list — every session with a reading, titled and followed by the
workspace it lives in, e.g.
dsh-tps (dsh-tps). Click a row to switch the card to that session; the click does not touch your current page.
Dock left or float
The two buttons at the card's top-right choose the placement:
- 左侧 (left) — dock into the sidebar footer slot. The card follows the sidebar: if the slot disappears (narrow window, collapsed sidebar), it falls back to the floating position instead of vanishing.
- 悬浮 (float) — stay pinned as a floating card at the bottom-right corner.
The choice is remembered in localStorage, as are the floating position, the
collapsed state and the mode (live/average).
Dragging
In floating mode the whole card is a drag handle — header, number, sparkline,
empty space. Only the buttons, the segmented controls and the session rows opt
out, because those are click targets. Drags are tracked on document, so the
card keeps following the pointer even when it leaves the card, and a drag never
fires the click that would toggle the card.
Install
dsh plugin add TINGOD2006/dsh-tps
Then restart the harness service (the card appears in the sidebar once the plugin is loaded). No build step, no dependencies.
How it works
lib/tracker.jskeeps a per-session sliding window fed byagent/assistant-streamdeltas andsession/event(turn boundaries, cache-hit usage totals).lib/index.jssubscribes to those events, exposesGET /dsh-tps/state.jsonandGET /dsh-tps/widget.js, and injects the card through both supported paths: the structuredwebserver/index-injecttable (used by the Electron desktop shell) andctx.webServer.tapIndex()(used when the Host rendersindex.htmlitself, e.g.dsh web).lib/widget.jsis served from disk on every request, so editing it and reloading the page is enough — no restart. A⟳hint appears when the page is still running an older copy of the widget than the one on disk.
Chunks arriving in the same millisecond share one sample, retaining their full token count during bursts. The event stream also sweeps expired trackers at most once a minute, even without an open widget. State and update-check requests time out after 5 seconds, including response-body reads; polling then retries normally and slows to a 5-second interval after three consecutive failures.
Tests
npm test
Covers the window denominator floor, idle decay, in-flight step readings, block-end fallback, cache-hit accounting, burst aggregation and tracker cleanup. Widget tests run the injected script with a lightweight DOM and a virtual clock to verify timeout recovery, failure backoff, visibility changes and update checks. No real waiting, network or external dependencies are needed.
License
MIT
Похожие плагины
DeepSeek-Balance-Whale-Widget
meteornox/deepseek-balance-whale-widget
dsh-context
bowenliang123/dsh-context
dsh-cost-meter
han-1413141/dsh-cost-meter
dsh-damage-pulse
wssfk12138/dsh-damage-pulse