Skip to content
dsh-market Browse plugins GitHub 中文

JNNarrator/dsh-deckseek

A calmer reading view for DeepSeek Harness with auto-collapsing process, a minimap-style message navigation rail, in-page search, unified failure cards, and generative MCP Apps (SEP-1865) in sandboxed iframes.

Stars ★ 1 Category UI Enhancements Listed 2026-09-07 npm dsh-deckseek

Install

Inside DeepSeek Harness, with dsh-market

dsh plugin --profile web add dshmarket

Or from the command line

dsh plugin --profile web add dsh-deckseek

Installing runs third-party code with your own permissions — it can read your files, use your credentials and reach the network. Review the source first, and pin a commit (github:owner/repo#sha) when you can.

README

English | 中文

🙏 Thanks to the original repository aa2246740/dsh-better-display (MIT) and its authors and contributors.

dsh-deckseek is a fork of aa2246740/dsh-better-display, independently maintained by JNNarrator as a DeepSeek Harness display & interaction enhancement plugin (MIT).

It adds an independent DeckSeek reading tab to DSH: the execution record folds away, the final answer stays in full, and three reading skins are available. It changes presentation and interaction views only — the native Chat / Trajectory tabs, composer, model selector, tools, and approvals all stay exactly as they are.

Screenshots

DeckSeek reading view

The DeckSeek reading view (Soft skin): the execution record folds away and the final answer renders in full — headings, tables, code, formulas and quotes in one column; the toolbar stays pinned at the top (readout plus search / motion / export); the message rail hugs the right edge; spacing above the task bar and composer stays compact — no hollow gaps under long task lists.

The Terminal skin

The Terminal skin (the default): box-character corners on the window, a workspace title bar above, and a standing status line below (RUN / WAIT / IDLE plus 12 turns · last turn 34 steps and ^K commands / ? help); the body opens a turn with a > prompt, keeps one glyph vocabulary (⏺ ⎿ ✻) and spins a braille glyph while work is in flight. Three skins (Terminal rows / Soft cards / Paper typographic flow) share one DOM and change only structure, density and type; colours always come from host theme tokens, so light and dark adapt on their own.

Message navigation rail In-view search
Message navigation rail In-view search
Hovering a mark shows a "Turn N · title" info bubble; clicking scrolls the message into view with a landing flash Live match counts with previous / next navigation; hits scroll precisely into view with a flash
Execution process & tool rows Unified failure cards
Execution process & tool rows Unified failure cards
A folded turn states what it hides (3 tool calls · 1 failed), and expanding it labels each row by family (Ran / Failed…); thinking cards expand Failure reason, exit code and stderr summary, plus an expandable raw record

Three reading skins

Switch from the dedicated DeckSeek page in DSH settings, or press Ctrl/Cmd+K anywhere in the reading view; it takes effect immediately. Terminal is the default.

Skin Direction Good for
Terminal (default) Rows: monospace, a box-character window, a status line, and ANSI role colour plus tool-category colour as the only colour TUI and Claude Code sensibilities; watching work happen
Soft Cards: the answer card uses the host's own elevation (0.5px hairline stroke + soft glow), and the user card derives an identity colour from the brand accent Everyday reading; clear separation between turns
Paper Typographic flow: no containers at all, only a heading hierarchy and article-scale prose rhythm; colour is reserved for failures Long-form reading, export and print

Skins express structure, density, type, and radii only; every colour comes from a host theme token, so dark and light themes adapt automatically and the plugin ships no palette of its own. Switching skins does not change the component tree — one DOM, a different stylesheet; see docs/design/reading-skins.md.

The terminal skin adds box-character corners, an optional screen texture (scanlines / vignette / glow, three levels, off by default), a status line (RUN / WAIT / IDLE, the turn readout, and two panel keys), a Ctrl/Cmd+K command palette and a ? shortcut sheet, j k g G / navigation keys, a workspace title bar, a ▌ caret on the streaming answer, a braille spinner with a per-turn verb and a right-aligned clock in the status line, tool-category colour on the ⏺ marker, a right-aligned number column, a count of what a folded turn hides (39 tool calls · 4 files · 2 failed), a hanging hairline on the closing readout line, a full-width band for the user turn, and a braille dot-matrix mark on the idle screen. The reasoning behind each, with measured parameters, is in terminal-skin-v3.md, terminal-skin-v4.md and terminal-skin-v5.md.

Features

Reading view

  • Live native steps, thinking, and progress during execution; the process folds away on successful completion, leaving the final answer and interactive cards.
  • Every known record kind (system prompts, turn processes, turn stats, …) is adapted; unknown kinds fall back to a copyable raw-record card — DSH is not stable yet, so the fallback stays.
  • Failed tools / commands render as unified error cards: reason, exit code, and an expandable raw record.
  • Long reasoning folds into a fading two-line card that follows along; expanding pauses the follow, which can be resumed.
  • Lossless fidelity: native Markdown, syntax highlighting, math, tables, images, and tool facts render exactly.

Navigation & search

  • Message navigation rail: a minimal right-edge rail of tiny pill marks — one per message you sent, editor-minimap style. It takes no layout space and the reading column stays truly centered; the mark at your reading position widens and highlights, hovering shows a "Turn N · title" info bubble, and clicking scrolls that message into view with a landing flash. Marks compress to fit when turns pile up, so every mark stays visible (hidden on narrow widths).
  • Turn keyboard navigation: Alt+↑ / Alt+↓ jump between your messages using the same positioning logic as the rail.
  • In-view search: covers your questions and the model's answers; live match counts, previous / next navigation, precise scrolling to each hit with a flash; every match block is tinted, character-level hits are painted through the CSS Custom Highlight API, and the current hit is inverted for emphasis.
  • Reading position memory: reopening a session returns to where you stopped, with a brief notice; "Back to latest" jumps to the end at any time.

Export & copy

  • Session export: one click in the reading toolbar downloads the session as Markdown (your questions plus the model's answers in display order, process folded), with a timestamped filename.
  • One-click copy on code blocks; hovering a table in an answer reveals "Copy as CSV" (RFC 4180, quotes and newlines handled).

Interaction & state

  • Status and follow: the reasoning card follows the latest line and rests at the bottom when it ends; while thinking it shows a localized "thinking… {time}" label, and tools show per-family states; scrolling away from the bottom floats a centred "↓ Back to latest" pill with an unread count above the composer; sending or steering a message returns the view to the bottom.
  • Width follows the pane: the reading column fills the conversation pane it is given (a 1100px ceiling exists only for readability) instead of inheriting the native chat column, which is sized for bubbles beside a composer.
  • Motion can be turned off: the toolbar toggle or the system's prefers-reduced-motion stops every animation from one place.
  • Bilingual UI: every reading-view string follows the DSH app language (Chinese / English) with no restart.
  • Adaptive theme and type size: dark / light syncs live with no flash; type follows browser zoom and the host's content font-size setting (skin line heights, leading slots, and block gaps follow it too).

Compatibility

  • Generative MCP Apps (SEP-1865): an mcp-app code block in a reply mounts as a live interactive card inside a sandbox="allow-scripts allow-forms" iframe, talking over JSON-RPC postMessage (ui/initialize, ui/resize, ui/submit, …), with the card height adapting between 60 and 2400px.
  • 306 unit and component tests: covering message projection, the Markdown pipeline, SEP-1865 parsing, adaptive height budgeting, two-line streaming follow and its latency budget, and the search / unread-count / reading-measure / copy / skin-part / caret-hook / stylesheet-contract interactions (colours come from host tokens only, every token reference resolves, every drawn glyph is one cell wide) under happy-dom.

Keyboard shortcuts

Key Action
Alt+↑ / Alt+↓ Jump between your messages (inactive while typing in a field)
Cmd/Ctrl+F Open / close in-view search
Enter / Shift+Enter In search: next / previous match
Esc Close search
← → Home End Switch tabs inside a tool card

Installation

There are two release channels and they are not in sync: npm currently carries 0.6.0, while newer versions ship as GitHub Release tarballs (this repository is at 0.11.0).

0.11.0 and later require DSH ≥ 0.1.7-rc.1: the peer range narrows to >=0.1.7-rc.1 <0.2.0-0, so 0.1.3 is no longer supported — installing on an older host fails the peer check and needs dsh plugin allow-version. Upgrading to 0.11.0 also carries one breaking change: the settings namespace moves from deckseek to dsh-deckseek, so an existing deckseek.skin is no longer read (the skin silently falls back to the default soft card); rename the key to keep your choice. See the CHANGELOG.

# From npm (0.6.0)
dsh plugin --profile web add dsh-deckseek

# Or install the newest release from its tarball
dsh plugin --profile web add ./dsh-deckseek-0.11.0.tgz

--profile takes web, desktop, or headless depending on the host you run. Restart the host after installing.

Listed in:

Development

npm test                                  # 297 tests (node --test + happy-dom)
npx tsc -p tsconfig.json --noEmit         # type check
DSHX_HARNESS=<DSH checkout> npm run build # build lib/ (client + host halves)

If the build fails with Set DSHX_HARNESS to the checkout used for this build. or DSHX externalClientBundle adapter is missing, the devkit (tools/dshx) is not in the checkout DSHX_HARNESS points at — pass both: DSHX_DEVKIT=<checkout that has tools/dshx> DSHX_HARNESS=<target checkout> npm run build.

  • Dependencies come from a DSH checkout, not npm: link development dependencies to a built Harness checkout with node scripts/link-harness-dependencies.mjs <DSH checkout>; do not run pnpm install / pnpm add in this directory.
  • package-lock.json is a best-effort artifact under --legacy-peer-deps semantics: the published @deepseek-ai/dsh-client-ui-settings declares a ^0.0.1-rc.1 peer on @deepseek-ai/dsh-client-ui-primitives, which cannot intersect this plugin's 0.1.x range, so strict resolution always ends in ERESOLVE.
  • Do not run npm ci here — it cannot reproduce a working dependency tree.
  • When verifying a new build locally: with a profile pointing at a tarball through file:, re-running dsh plugin --profile web install after rebuilding that tarball does not update it (it reports Already up to date). Remove <profile>/node_modules/dsh-deckseek, run dsh plugin --profile web install --force, then compare lib/client.js byte for byte.

Other

v0.11.0 · An unofficial DSH display & interaction enhancement plugin. It only changes presentation and interaction views — never the Agent's core execution, SDK, or model credentials.

Content from the project README on GitHub ↗

Comments

Comments live in GitHub Discussions. Sign in with GitHub to post or react.