A terminal UI (TUI) for DeepSeek Harness.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:huiliyi37/dsh-tianshu-tui
GitHub-sourced plugins run build scripts on your machine at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
中文 | English

dsh-tianshu-tui (@huiliyi37/dsh-tianshu-tui) is the interactive terminal UI plugin for the official DeepSeek Harness. The render core evolved from Tianshu-Tui (Apache-2.0; file-by-file provenance in SOURCE-MAP.md). The UI is a pure presentation layer: every piece of agent state arrives through the session event stream.
Install
This package is not a standalone app. You need the official CLI @deepseek-ai/dsh (0.1.0-rc.6). npm i of this package alone will not run.
1. Prerequisites
Do not type dsh by itself. An older dsh on PATH (for example ~/.local/bin/dsh, where dsh --version is not 0.1.0-rc.6) will hit a local staging tree and fail with ERR_FS_EISDIR / Path is a directory .../@deepseek-ai/dsh. Always use the npx commands below.
2. Add this plugin to the tui profile
npx -y @deepseek-ai/dsh plugin --profile tui add @huiliyi37/dsh-tianshu-tui
pnpm may warn about missing peers; ignore that. Peers come from the official dsh host.
After an npm install, each launch checks npm latest and writes a newer version into the profile, then asks you to restart. Set DSH_TUI_SKIP_UPDATE=1 to skip the check. github: / link: installs are left alone.
You can also install from Git: npx -y @deepseek-ai/dsh plugin --profile tui add github:huiliyi37/dsh-tianshu-tui (the repository ships lib/index.js; no rebuild).
3. Start
npx -y @deepseek-ai/dsh --profile tui
Success looks like a welcome screen branded dsh-tianshu-tui. Quit with Ctrl+Q.
If the official CLI is installed globally and dsh --version is 0.1.0-rc.6, you can use dsh in place of npx -y @deepseek-ai/dsh.
If npx still raises ERR_FS_EISDIR, stale install fallbacks under ~/.dsh/profiles/node_modules are colliding with the official CLI. Use a clean home:
DSH_HOME=/tmp/dsh-tianshu npx -y @deepseek-ai/dsh plugin --profile tui add @huiliyi37/dsh-tianshu-tui
DSH_HOME=/tmp/dsh-tianshu npx -y @deepseek-ai/dsh --profile tui
Do not run tsdown for this package from the DeepSeek Harness workspace root: it rewrites imports to unpublished @deepseek-ai/dsh-root, and loading fails.
The companion vision plugin lives in vision-ask/ if you need image re-interrogation.
Release notes
Current npm latest: @huiliyi37/dsh-tianshu-tui@0.1.1-rc.6 (GitHub Release).
0.1.1-rc.6 (2026-08-14)
On launch the plugin checks npm latest, writes a newer version into the profile, and asks you to restart.
Upgrading from 0.1.0-rc.6: that build has no self-update. Add the plugin once more to pick up the new logic:
npx -y @deepseek-ai/dsh plugin --profile tui add @huiliyi37/dsh-tianshu-tui
npx -y @deepseek-ai/dsh --profile tui
Later releases write themselves into the profile on launch. Restart after you see 插件已更新到 …,请重启 dsh 后生效. Set DSH_TUI_SKIP_UPDATE=1 to skip the check. github: / link: installs are left alone.
This release also includes display-layer fixes already on main:
- New sessions write
meta.cwd, so the Web UI can list TUI sessions - Welcome / status line judge the API key via credentials
- After
/model, the footer glance and vision capability follow the real model Ctrl+Scan restore a session from disk
The first public baseline is recorded in docs/BASELINE-v0.1.0-rc.6.md.
Highlights
- Full session workspace in a terminal — live rendering, append-only scrollback, session restore on startup,
/forkexploration branches,/rewindrollback (session truncation + optional file rollback),/exportto Markdown transcripts, and mid-turn steering (/steer/Ctrl+T). - End-to-end images — paste from clipboard (
Ctrl+V/ terminal-menu paste), render as inline terminal graphics (kitty / iTerm2), deliver through the harness attachment service, and let a vision-capable model actually see them — with an automatic vision bridge that describes the image through a separate vision model when the main model cannot see. - A complete input surface — grok-style slash dropdown menu (fuzzy prefix matching, MRU ordering, ghost previews),
@-path Tab completion and@mentionexpansion, bracketed paste, optional vim keybindings, external editor (Ctrl+E), history search (Ctrl+F) — and a full keymap overlay behindCtrl+.. - In-terminal interaction surfaces — structured question panels (numeric selection, plan-review feedback mode), pending approval cards with inline
diffpreviews, mode cycle (Shift+Tab: normal → plan → always-approve), command palette, and live panels for status / config / skills / tasks / delegation / workflow. - Reasoning made visible — the think channel streams as a live header, folds into a compact scrollback line (
✻ 思考 (3.2s) · 12 行), and expands in place withCtrl+O(competitor-aligned: collapsed by default). - Personalized harness integrations —
/doctorterminal diagnostics,/memoryproject-memory browser,/btwside questions to a background agent,/model+/efforthot-switching that takes effect on the current session immediately. - Auditable by construction — the TUI registers no prompt, tool, or context surface of its own; user input becomes ordinary logged messages, and every rendered state derives from session events.
- Co-evolved with the harness — built in lockstep with harness-side capabilities on the 2026-08-09 baseline snapshot (250+ commits): the image/vision pipeline, DeepSeek Spark model engineering, session persistence and file snapshots, memory, the validation gate and failure routing, code intelligence, and the git tool. See the next section.
Co-evolved harness capabilities (since the 2026-08-09 baseline)
The terminal UI evolved from Tianshu-Tui (Apache-2.0; per-file provenance in SOURCE-MAP.md). This bundle then developed in lockstep with harness-side work on the DeepSeek Harness baseline snapshot snapshots/20260809T140917Z — 250+ commits between 2026-08-10 and 2026-08-13. The capabilities below live in the host harness (separate packages, not shipped in this bundle); the TUI is their primary interactive surface:
- Image pipeline & vision bridge — the
imageContentBlock joins the merge-extensible content vocabulary anddsh-llm-deepseekserializes user image blocks as OpenAI-styleimage_urlcontent parts, so user images reach the wire end-to-end (clipboard → input line → session → model request). Models declaresupportsVision(LlmModelInfo+ llm-deepseek catalog).dsh-vision-bridgecovers text-only main models: atagent/pre-stepit describes image attachments through a separate vision model (visionAutoBridgeauto-selects the first vision-capable model when provider/model are omitted; fallback model + data URL validation; the prompt auto-selects between general structure and OCR-level transcription based on UI/error keywords), injecting the description as a plugin-source user message — Model-visible ⟺ logged; bridge failure degrades to a visible hint, never a failed turn. - DeepSeek Spark aliases — the official API has no
sparkmodel and this host does not register adeepseek-sparkprovider./model spark-flash/spark-promap onto the registereddeepseek-officialroute with wire idsdeepseek-v4-flash/deepseek-v4-pro. - Session persistence & file snapshots —
Session.truncaterewinds the event log and resets derived state; persistence backends gaineddeleteFromplus a truncate coordinator, so rollback survives reload;dsh-fs-snapshotports FileHistory (trackEdit / rewindToBoundary) and snapshots before write-tool execution. TUI surface:/rewind(conversation truncation + optional file rollback). - Memory —
dsh-memory(MemoryService + Markdown file backend, non-git fallback) andtool-memory(memory_save/memory_search+ memory-digest injection) provide cross-session recall. TUI surface:/memory,/remember. - Validation gate & failure routing —
dsh-evidence-gateenforces RED-first verification: obligation state machine, edit/verify counters, TDD gate (enforcemode), probe suggestions with cooldown, and an L2 final-review gate, natively wired intostr_replace_editorand the headless-agent assembly.dsh-agent-routerpredicts step failure from turn history and routes work — verification-subagent dispatch and per-profile tool restriction — with real-turn e2e coverage. - Code intelligence & retrieval —
dsh-semantic-index(BM25 + salience/RRF/vector fusion, incremental updates) exposed as thesemantic_searchtool;dsh-meridiancode index (node:sqlite schema, tree-sitter parsers for TypeScript/Python/Go, graph/impact/flow queries, behavioral signals, background backfill) exposed asrepo_graphand the<codebase-index>digest;dsh-pheromonefile-level pheromones with atomic JSON persistence, surfaced throughfile_infoand the read tool'sfocussemantics. - Git service & tool —
dsh-gitservice seam (GitLocal CLI provider, service-class-as-plugin) plusdsh-tool-git, a single model-facing git tool with an operation discriminator (status / diff / log / commit), assembled in the base bundle.
Features
Session management
| Capability | Description |
|---|---|
/session new|list|switch |
Create, list, and switch sessions; resume replays the full transcript through the same render bridge |
| Restore panel | Recoverable sessions are listed in scrollback at startup |
/fork [directive] · /branch |
Fork the current session (history copied to a new child session) and optionally start it with a directive |
/rewind |
Roll back to a chosen message — conversation truncation and/or file rollback to the pre-boundary snapshot |
/export |
Export the current session transcript to a Markdown file |
/clear |
Clear the scrollback view of the current session |
Input surface
- Slash command menu — typing
/opens a dropdown with fuzzy prefix matching,↑↓/PageUp/PageDownselection,Tabaccept,Entersubmit, MRU ordering, argument-placeholder ghosts, and an input-line ghost preview. - Clipboard & image paste —
Ctrl+Vreads a clipboard image (falling back to text); terminal-menu paste detects images; pasted paths that look like images are loaded as attachments;Alt+W/ vim yank copies selection to the system clipboard via OSC52. - Image submission — attached images show a
📎 N imagesmarker, render inline under the user bubble on submit, and reach the model through the attachment service; the bubble carries a vision hint (forwarded / bridged via a vision model / not sent). Oversized pastes are adaptively compressed before send: 1568px long-edge clamp (PNG keeps transparency), degrading JPEG 0.82 → 0.55 → 1024px + 0.55 until under the provider cap, never upscaling. - Editing — vim keybindings (optional), external editor (
Ctrl+E), Tab file completion,@mentionexpansion, input history, multi-line input, and bracketed paste (multi-line / long pastes land in the input line as one block instead of submitting line by line); the input line is drawn as a full rounded frame. - Image re-interrogation — the companion
@deepseek-ai/dsh-vision-askplugin registers sent images and answers targeted model questions viaask_image(see vision-ask).
Rendering & projection
- Conversation stream — markdown rendering, tool-family coloring with per-tool timing, and parallel tool calls folded into groups.
- Tool cards commit in real time — settled tool results render as scrollback cards consuming the harness presenter intent:
diffresults as structured red/green file diffs (shared with the approval preview),terminalresults with command title + cwd + exit/signal badge, everything else as folding cards. - Reasoning channel — shimmer live header while thinking, folded scrollback line at segment end,
Ctrl+Oexpands the full text in the live area. - Fluency folding — repetitive routine tool traffic collapses under a quiet strategy; compact mode (
/density) keeps header-only lines. - Turn status — braille spinner + phase text status line, workflow-run summaries, delegation tree, task pane, config/skills panels as live-region panels.
- Subagent runs — a live spinner line per run; terminal states commit to scrollback as
✓/✗/◌entries. - Window chrome — welcome page (brand header, friendly short session ids, environment check line), top bar (cwd + git branch + model), and a three-line bottom area: input line (mode-colored bottom edge) → footer (mode badge + key hints) → metrics line (model / token usage / cache hit rate).
- Themes — built-in palettes plus
custom:<name>; auto terminal detection and 16-color fallbacks.
Interaction panels
- Structured questions — numeric selection,
Esccancels, overlap protection; plan-review feedback mode (fto enter,Entersubmits Keep-planning + custom feedback). - Approval cards —
y/N/Ctrl+Csettle pending approvals; inline diff previews when the tool is diffable; blind-approval hint when the diff is invisible; non-current-session requests delegate to the next listener. - Mode cycle —
Shift+Tabcycles normal → plan → always-approve; the plan state drives the footer badge, and always-approve is session-local (resets on switch/exit). - Live panels —
/status(5-domain projection snapshot),/config(settings / permission / credentials),/skillsbrowser,/taskspane,/subagentsdelegation tree,/workflowruns. - Command palette (
Ctrl+P) / keymap (Ctrl+.) / history search (Ctrl+F) overlays.
Models & vision
/model— view and switch the model (default + hot-switch for the current session);spark-flash/spark-proaliases map todeepseek-official+ the official wire idsdeepseek-v4-flash/deepseek-v4-pro./model <provider/model|alias> [off|high|max]sets the reasoning effort in the same command./effort— set the reasoning effort (off/high/max;autoreturns to the model default), hot-switched for the current session.- Vision bridge — vision capability is declared per model (
supportsVision) and drives the bubble hint; when the main model cannot see images, an automatically selected vision model describes them before submission (one-shot path; see Known Limitations). - Vision co-pilot — with the companion
@deepseek-ai/dsh-vision-askplugin (same repository), every sent image is registered under a short id (img_1, …) and the model can re-interrogate it withask_image— targeted questions, different angles, any number of times; repeated same-angle asks hit the per-image description cache. Details and config in the vision-ask README. /mcp— list connected MCP servers and tool counts;tools <name>inspects a server's tool list.
Commands
| Command | What it does |
|---|---|
/session new|list|switch |
Session management |
/fork [directive] · /branch |
Fork the current session, optionally with a starting directive |
/rewind |
Two-phase rollback (message list → granularity) |
/export [path] |
Export the transcript to Markdown |
/clear |
Clear the scrollback view |
/compact |
Compact the session context |
/steer <text> |
Mid-turn steering (correct course without interrupting) |
/model [target] [effort] |
View/switch model (aliases: spark-flash, spark-pro) |
/effort off|high|max|auto |
Set reasoning effort (hot-switched) |
/theme [name] |
Switch theme |
/density |
Toggle compact tool-card rendering |
/status |
Toggle the status panel (5-domain projection snapshot) |
/config |
Toggle the settings panel (settings / permission / credentials) |
/skills |
Toggle the skills browser |
/tasks |
Task pane (background tasks) |
/goal |
Goal management (create / pause / resume / complete / block) |
/subagents |
Delegation tree panel |
/workflow |
Workflow runs panel |
/btw <question> |
Side question to a background agent |
/remember <text> |
Save a memory |
/memory |
Memory browser (list / filter / delete / preview) |
/doctor |
Terminal diagnostics + fix guidance |
/mcp [tools <name>] |
List MCP servers; inspect a server's tools |
Keyboard shortcuts
| Key | Action |
|---|---|
Ctrl+N |
New session |
Ctrl+S |
Restore the most recent session |
Ctrl+Q |
Quit |
Ctrl+P |
Command palette |
Ctrl+. |
Keymap overlay |
Ctrl+F |
History search (n/N to jump) |
Ctrl+O |
Expand/collapse the latest reasoning block |
Ctrl+E |
Open the input line in $EDITOR (configurable via editorKey) |
Ctrl+T |
Mid-turn steering |
Ctrl+V |
Paste clipboard image (falls back to clipboard text) |
Alt+W |
Copy selection to the system clipboard (OSC52) |
Shift+Tab |
Mode cycle: normal → plan → always-approve |
Tab |
@-path completion; accept the slash-menu selection |
↑/↓ |
Input history (selection while the slash menu is open) |
PageUp/PageDown |
Slash menu paging |
Esc |
Close menu/overlay; cancel a pending question |
Assembly
The bundle patch inserts the tui-runner plugin over dsh-base:
- id: tui-runner
name: '@huiliyi37/dsh-tianshu-tui'
TuiRunnerConfig (all optional): stdin/stdout (stream injection, defaults to process streams), initialSessionId, editorKey (default ctrl_e; ctrl+o is reserved for reasoning expansion), vimEnabled (default false), vision (supportsVision / bridgeEnabled / bridgeSource, derived from the vision-bridge plugin), workflowHistoryLimit (default 50).
Service dependencies: sessions/agents/agentDefaultModel required; goals/subagents/memory/compact optional — unassembled services degrade fails-loud with an availability message, never silently.
Verification
NO_COLOR=1 pnpm vitest run packages/tui/tui/tests/
Model Experience
None, as the TUI renders logged session events and forwards ordinary user input; it registers no prompt, tool, or context surface.
KV Cache effect
None directly; user input submitted through the TUI becomes ordinary logged messages whose request effects belong to the session and loop packages.
Known Limitations and Deferred Work
- Image re-interrogation requires the companion plugin — the
ask_imagetool and the session image registry live in@deepseek-ai/dsh-vision-ask(same repository, separate package); the TUI bundle itself does not ship them. Without the plugin, an already-sent image cannot be re-queried and repeated same-angle descriptions re-call the vision model; the vision bridge still covers the one-shot submit-time description path. - app.ts monolith (~2.2k lines) — the pending-state state machines are controller-ized (question/approval), while render composition and key arbitration remain in app.ts; the C4 split plan (pure-function panel segments) keeps advancing.
- Engine I/O file coverage exemptions — terminal-boundary files such as input-line/live-engine sit on the coverage exemption list in vitest.config.ts (
TODO(tui)comments), to be digested gradually as the real composition-test line matures. - Projection models not yet wired — the four pure fold models activity-status/activity-store/turn-summary/summary-state landed with specs, but the App body does not drive them yet. Current state is recorded in docs/projection-layer.md.
License & Provenance
Apache-2.0. The terminal render engine evolved from Tianshu-Tui (Apache-2.0); per-file provenance and modification statements live in SOURCE-MAP.md and NOTICE.
Friends
- dsh-web-ui — Plugin and skin collection for DSH Web UI
- dshfind — Chinese learning and sharing community for DeepSeek Harness
- deepseek-harness-ux — Long agent tasks without transcript clutter: focused progress, auto-folded history
- dsh-TUI — Claude Code-style fullscreen interactive terminal plugin
- DSH-better-sidebar — Full sidebar workbench with third-party tabs, files, terminal, Git, and subagents
- dsh-meme-hub — A tour of playful DSH plugins: 贪玩蓝鲸 / QQ2006 / whale girls / mini-games
Links
More in this category
zhu1090093659/dsh-web-ui★ 1766
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
ccch1mneyyy/dsh-TUI★ 829
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 705
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
omdsh-dev/dsh-at-file★ 117
Codex-style `@file` mentions: search workspace files in the composer and attach their contents to prompts.
Nagi-ovo/dsh-visualize★ 79
In-conversation generative UI: the model renders interactive HTML cards into the chat stream, with streaming preview and sandboxed rendering.
omdsh-dev/dsh-genui★ 72
Interactive UI components rendered inline in replies: layout, charts, forms, quizzes, mermaid, 3D scenes, and an action event loop back to the model.