Install
Inside DeepSeek Harness, with dsh-market
dsh plugin --profile web add dshmarket
Or from the command line
dsh plugin --profile web add @huiliyi37/dsh-tianshu-tui
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

dsh-tianshu-tui (@huiliyi37/dsh-tianshu-tui) is the interactive terminal UI plugin for the official DeepSeek Harness. The render core is a self-built minimal ANSI engine (evolved from the author's own open-source Tianshu-Tui, Apache-2.0; file-by-file provenance in SOURCE-MAP.md), keeping rendering lightweight and non-intrusive. The UI is a pure presentation layer: every piece of agent state arrives through the session event stream. On top of it, the plugin adds harness-level engineering niceties such as image & vision bridging, smart code retrieval, and memory with cross-session recall.
[!WARNING] Ecosystem boundary: this plugin belongs to the official DeepSeek Harness ecosystem (
@deepseek-ai/*scope) — its peerDependencies and imports all point at@deepseek-ai/*. Do not assemble it into an oh-my-tianshu (@huiliyi37scope, CLI@huiliyi37/dsh-tianshu) tui profile. oh-my-tianshu ships its own official TUI,@huiliyi37/dsh-tui: the two share 109 of 117 TUI source files but live in different ecosystems. Mixing them makes the plugin resolve@deepseek-ai/*at runtime through stale symlinks under~/.dsh/profiles/node_modulespointing at the globally installed official dsh — a fragile cross-ecosystem coupling.
Documentation
| Doc | What it covers |
|---|---|
| Getting started | Install, launch, and troubleshooting |
| Interaction | Full keymap and command reference |
| Configuration | Assembly options, env vars, runtime config |
| Architecture | Layers, data flow, design decisions |
| Themes | The 16 built-in palettes and custom themes |
| Plugin ecosystem | Companion plugins and extension points |
| VS Code | Running inside VS Code |
| ADAPTER.md | TUI ↔ harness boundary contract |
| Contributing | PR guidelines and the verification matrix |
| Developing | Structure, build, release |
Install
This package is not a standalone app. You need the official CLI @deepseek-ai/dsh (0.1.0-rc.7). 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.7) 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@0.1.0-rc.7 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@0.1.0-rc.7 plugin --profile tui add github:huiliyi37/dsh-tianshu-tui (the repository ships lib/index.js; no rebuild).
3. Start
npx -y @deepseek-ai/dsh@0.1.0-rc.7 --profile tui
Success looks like a welcome screen branded dsh-tianshu-tui. Quit with Ctrl+Q or /exit.
If the official CLI is installed globally and dsh --version is 0.1.0-rc.7, 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@0.1.0-rc.7 plugin --profile tui add @huiliyi37/dsh-tianshu-tui
DSH_HOME=/tmp/dsh-tianshu npx -y @deepseek-ai/dsh@0.1.0-rc.7 --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.
Coexisting with other distributions
This plugin runs on top of the official DeepSeek Harness (@deepseek-ai/dsh) and uses the
official home ~/.dsh. The standalone integrated distribution oh-my-tianshu (formerly
tianshu-public, @huiliyi37/dsh-tianshu, a full harness with its own tianshu CLI) is a
separate distribution line that uses its own $DSH_HOME (~/.dsh-tianshu once the
default-home isolation lands) — the two homes are isolated, so both can be installed side
by side without conflicts (sessions / profiles / settings stay separate). To coexist, set
export DSH_HOME=~/.dsh-tianshu on the tianshu side.
Naming memo (avoid confusion):
| Name | What it is |
|---|---|
dsh-tianshu-tui (this plugin) |
The TUI plugin for the official dsh (this repo) |
oh-my-tianshu / @huiliyi37/oh-my-tianshu (formerly tianshu-public) |
Standalone integrated distribution with its own CLI (oh-my-tianshu) |
Tianshu-Tui (upstream) |
Apache-2.0 source of this plugin's render core |
Renamed on 2026-08-16: the former
@huiliyi37/dsh-tianshu(commandtianshu) is now uniformly@huiliyi37/oh-my-tianshu(commandoh-my-tianshu), matching the repo name; the old package is deprecated — migrate your install.
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.2-rc.10 (GitHub Release).
0.1.2-rc.10 (2026-08-16)
One-step updates + Windows/PowerShell compatibility + command-input tolerance.
- Auto-restart after update (#34) — once the startup self-update lands, the process restarts automatically (only when the session hasn't started working; otherwise it just prompts and never interrupts).
/restartrestarts the process in place (no more/exit+ manual relaunch) - Package-manager-aware self-update — profiles managed by pnpm/npm/yarn each use their own installer; no more hardcoded
pnpm add(npm/yarn users no longer get a straypnpm-lock.yaml) /helpfixed (#36) — it used to fail withcannot get property "tui" without inject; now it lists every command via the command factory deps- Tab command menu (#31 follow-up) — with an empty input, Tab pops the full command menu; Enter runs the selected command directly (
/model/theme/sessionopen their pickers) — no need to type the command name (Claude Code style) - Windows/PowerShell compatibility — Ctrl+C interrupt no longer loses the input box (0x03 byte + SIGINT double-trigger dedup, dual SIGINT registration, exit-time terminal restore)
/-prefixed path tolerance —/src/main.ts,~/xxx, Windows drive paths (C:\...) are no longer mistaken for slash commands and rejected as "unknown command"- Interrupt recovery hardening — abort now force-releases full-screen overlays (command palette/search etc.), so the input rail always comes back next frame; regression tests added for input-box visibility after interrupt
Users already on 0.1.x-rc.6 pick this up on the next launch. Restart after you see 插件已更新到 …,请重启 dsh 后生效 (or the new version restarts automatically; /restart works too).
0.1.2-rc.9 (2026-08-16)
Interaction overhaul: Esc interrupt + double-Esc rewind, session tab bar, cost summary, live theme preview.
- Dual Esc semantics (aligned with Claude Code) — a single
Escinterrupts an in-flight reply (same path as Ctrl+C, 80ms debounce); when idle,Esc+Esc(1s window) opens the rewind panel - Rewind timeline UI — the message list is now a timeline: type marks (❯ user / ✦ assistant) + relative time + turn separators + a scroll window that follows the selection (older messages reachable)
- Session tab bar — with multiple sessions, a persistent tab row sits above the input rail (current marked ●, narrow widths fold into
+N);Ctrl+Xcycles,Alt+1~Alt+9jumps /costsession cost summary — usage accumulates per model, printing per-model detail (input/cache-read/write/output/reasoning) plus a total $ estimate- Live theme preview — the
/themepicker switches the theme as you move ↑/↓, Enter settles, Esc restores - Engineering: the
libbundle is rebuilt and tracked with this release
Users already on 0.1.x-rc.6 pick this up on the next launch. Restart after you see 插件已更新到 …,请重启 dsh 后生效.
0.1.2-rc.8 (2026-08-16)
Interactive pickers, Claude Code benchmark improvements, workflow observation surface, and an audit fix.
- Interactive pickers (#31) —
/theme,/model,/sessionwith no arguments now open a picker: ↑/↓ (or j/k) to select, PageUp/PageDown to page, Enter to confirm, Esc to close, with the current value marked ●; the model list comes from the llm directory, and argument forms are unchanged - Cost and context watermark — the footer now shows a $ cost estimate (built-in flash/pro pricing table; unknown models are not guessed) and prefixes ⚠ to the context usage segment at ≥95%
- Git dirty indicator — footer shows
●N(uncommitted-file count, refreshed at turn boundaries) /helpcommand — a registry-driven list of every command (/help <cmd>for one entry's detail)- Manual tool-card expansion — Enter on an empty input toggles the last in-flight tool card, expanding its argument JSON
- Workflow panel observation surface — running time now renders real elapsed (was a raw timestamp), meta is completed (run name/description/phase count), and
workflow/lognarration lines appear in the expanded view - Audit fix (#30) —
dsh.runtime: "host"declared and all 4 subprocess calls converted to fixed-argv forms (execSync → execFileSync) - Engineering: the
libbundle is rebuilt and tracked with this release
Users already on 0.1.x-rc.6 pick this up on the next launch. Restart after you see 插件已更新到 …,请重启 dsh 后生效.
0.1.2-rc.7 (2026-08-15)
A functionality-audit overhaul: the vision bridge is detectable, missing services no longer fail silently, and the projection layer now powers a per-turn summary line; platform degradations are all visible.
- When the primary model cannot see images and no
visionconfig was injected, the TUI now auto-detects a hostvisionBridgeservice (contract in the Assembly section) - Missing goal/subagent plugins no longer prevent the entire TUI from silently never starting (goals/subagents are optional services now)
- The
/tasks/subagents/workflow/status/config/skillspanels and plan mode echo a ⚠ warning when their backing service is absent, instead of going blank without a word /clearactually clears the screen (it previously only reset the internal buffer); theCtrl+.keymap panel is complete at 20 entries and a narrow-width overflow is fixed- Projection layer wired: a dim
turn N · 读X 改Y · elapsedsummary line lands at turn end, and/statusgains a session-totals section that works even without the host projection service - Platform degradations are now visible: missing clipboard-image toolchain, external-editor spawn failure, OSC52-incapable terminals, and self-update failures all produce an explicit notice
- Fixes: pending approvals/questions settle correctly on session switch and exit; fiber remount no longer throws DUPLICATE_PROVIDER (composition tests guard both)
- Engineering: two-stage build (tsc → tsdown, no more stale-artifact repackaging), a typecheck gate, CI, and vision-ask realigned to the rc.6 type surface
Users already on 0.1.x-rc.6 pick this up on the next launch. Restart after you see 插件已更新到 …,请重启 dsh 后生效.
0.1.2-rc.6 (2026-08-14)
Quitting restores the terminal cursor and gives the TTY back to the shell. New /exit command.
Ctrl+Q//exitshow the hardware cursor again and exit the host so the shell can take the TTY (#22)- The TUI no longer hangs silently when launcher host services are missing
- Full-screen overlays are no longer overwritten by streamed output; Esc/Ctrl+C closes the command palette without committing
- Idle empty Ctrl+C requires a double-press to quit; the waiting hint no longer fires after a completed turn
Users already on 0.1.1-rc.6 pick this up on the next launch. Restart after you see 插件已更新到 …,请重启 dsh 后生效.
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.7: that build has no self-update. Add the plugin once more to pick up the new logic:
npx -y @deepseek-ai/dsh@0.1.0-rc.7 plugin --profile tui add @huiliyi37/dsh-tianshu-tui
npx -y @deepseek-ai/dsh@0.1.0-rc.7 --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.7.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; a non-aborted turn with tool calls ends with a dim summary line (
turn N · 读X 改Y · elapsed) in the scrollback. - 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(goal/todos/plan projection snapshot; the subagent domains surface under/subagents),/config(settings / permission / credentials),/skillsbrowser,/taskspane,/subagentsdelegation tree,/workflowruns. When a panel's backing host service is not assembled, a⚠warning is echoed instead of a silently blank panel. - 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, auto-refreshed from the llm catalog) 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). Bridge availability comes from the assembly layer (vision.bridgeEnabled) or from a host vision-bridge plugin providing thevisionBridgeservice — the TUI probes service presence before submitting images; with neither, images are not sent and a warning is shown. - 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 (goal/todos/plan projections + session totals) |
/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 (same as /exit) |
Ctrl+P |
Command palette |
Ctrl+. |
Keymap overlay |
Ctrl+F |
History search (n/N next, p/P previous) |
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+C |
Interrupt the in-flight turn (double-press on idle empty input exits) |
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 |
a |
Approval card: allow this session (always-approve + settle the current request) |
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; when omitted, supportsVision auto-refreshes from the llm catalog and bridgeEnabled is auto-probed from the presence of the host visionBridge service — a vision-bridge plugin should provide it), workflowHistoryLimit (default 50).
Service dependencies: sessions/agents/agentDefaultModel required (mandatory inject); goals/subagents/memory/compact/tasks/skills/sessionProjections/workflowEngine/planMode optional — when unassembled, the affected commands and panels degrade fails-loud with an availability message, never silently, and never block TUI startup.
Verification
npm test
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 (~3.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.
- Projection layer partially wired — of the four pure fold models, turn-summary (turn/end summary line) and summary-state (the
/statussession-totals section, which keeps working even when the host projection bus is absent) are wired; activity-status/activity-store stay deliberately unwired (the statusline is a self-contained projection, so replacing it buys nothing; activity-store has no current consumer). 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
| Project | About |
|---|---|
| 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: third-party tabs, files/terminal/Git/subagents |
| DSH Desktop | Community desktop client for DeepSeek Harness (Electron; Windows x64 / macOS Apple Silicon installers) — download and run, no Node.js/pnpm setup. Ships a managed local Harness host with its plugin system, plus iOS/Android remote control to dispatch tasks and track agent progress. Community project, unaffiliated with DeepSeek (MIT) |
| dsh-meme-hub | A tour of playful DSH plugins (28 projects, with screenshots) |
| dsh-whale-report | Turns sessions, tokens, cost, tool calls, risks and anomalies into Agent reports you can actually read |