편집자 노트

tomowang/dsh-tui

An open-source terminal front door for DeepSeek Harness (dsh).

이것은 DeepSeek Harness(DSH) 플러그인입니다. 이 사이트는 GitHub README, 설치 정보, 유지보수 상태, 공개 보안 시그널을 모아 보여줍니다.

업스트림에서 중국어 README를 제공하지 않아 저장소 원본 내용을 표시합니다.

dsh-tui

An open-source terminal front door for DeepSeek Harness (dsh).

@tomowang/dsh-tui is an out-of-tree mode bundle: it stacks on @deepseek-ai/dsh-base exactly like the shipped dsh-web-app and dsh-headless bundles do, but drives the agent from your terminal instead of a browser. The package is both a Cordis plugin (terminal input and presentation) and a dsh bundle (dsh.bundle.patch in package.json points at cordis.patch.yml); everything else — model adapters, tools, session persistence, sandbox and approval policy — stays in dsh-base and remains patchable underneath.

dsh-tui session in a terminal, showing the startup banner, injected context, and tool calls

Screencast

If the player above doesn't render, watch/download it directly: assets/screencast.mp4

How it works

  • The TUI renders only from the durable session log: it replays agent.session.events on startup and follows session/event live, so --resume shows the exact history the log carries — the harness's "model-visible ⟺ logged" invariant does the heavy lifting.
  • Line input maps to the agent inbox: agent.followup() while idle, agent.steer() while a turn is running, Ctrl+C cancels the running turn.
  • tui-startup parses this app's flags (everything after the launcher's own) through dsh-cmdline and publishes them as an ordinary Cordis service; the runner row reads them via the bundle patch, mirroring dsh-headless.
  • Both stdin and stdout must be real TTYs; the plugin fails loud instead of degrading, so pipes keep using dsh --profile headless.

Features

  • Status bar — session id, active LLM provider/model, current agent preset, live run state with spinner, and queued-message count.
  • Stats line — turn/step counts, LLM/tool wall time, TTFT and decode tok/s, cache-hit %, billed tokens, and a compact context-usage summary; sections hide themselves until there's data.
  • /model provider management — switch the active model, and add, edit, or delete custom LLM providers (route, base URL, API key, model discovery) without leaving the terminal.
  • Agent presets — start a fresh session on a given preset with --agent-preset, or browse and switch presets from /presets (fixed once the session's first turn has run).
  • Session inspectors/trajectory for a turn/step event ledger with a detail view and filtering, /context for a context-window usage breakdown, /plugins for the loaded Cordis plugin tree and fiber state.
  • Permission preset cyclingShift+Tab cycles read-only / workspace-write / danger-full-access / custom, shown live in the prompt area.
  • Manual compaction/compact summarizes and compacts session history on demand.
  • Persisted prompt history — submitted lines are saved across processes and /clear, recalled with /.
  • Readline-style input — word/line motion, kill/yank-style deletes, multi-line drafts, and shell-like double-press Ctrl+C/Ctrl+D to exit.
  • Every overlay degrades to a plain notice instead of failing the whole TUI when its backing service isn't mounted in a given profile.

Install

Requires Node ^22.19 || >=24 and a DEEPSEEK_API_KEY.

# 1. Install the dsh launcher
npm install -g @deepseek-ai/dsh

# 2. Create the profile and install this bundle into it
dsh plugin --profile tui add @tomowang/dsh-tui

# 3. Declare the bundle stack in the profile manifest
#    ($DSH_HOME/profiles/tui/package.json)
#    "dsh": { "profile": { "bundles": [
#      "@deepseek-ai/dsh-base",
#      "@tomowang/dsh-tui"
#    ] } }

# 4. Run
dsh --profile tui
dsh --profile tui --resume <sessionId>           # reopen a persisted session
dsh --profile tui --agent-preset <presetId>      # start a fresh session on a given preset
dsh --profile tui --dump-config                  # inspect the composed plugin tree

Any row --dump-config prints — the model adapter, tool set, sandbox policy, this TUI's own config — can be overridden from the profile's cordis.patch.yml without touching this package. --agent-preset is a dsh-launcher flag (parsed by tui-startup, not --dump-config above) that only applies to a fresh session; it's ignored together with --resume, and is a no-op with a startup notice on profiles that don't mount dsh-agent-presets.

Terminal commands

InputEffect
any textfollow-up while idle, steering while a turn runs
/modelmanage LLM provider profiles: switch model, add/edit/delete a custom provider
/presetsview and switch agent presets (fixed once the session's first turn has run)
/trajectorybrowse the turn/step event ledger with a detail inspector and filter
/contextshow context-window usage as a bar-chart breakdown
/pluginsshow the loaded Cordis plugin tree and fiber state
/compactsummarize and compact session history
/statussession id, run state, logged event count
/clearflush the current session and start a new one
/exit, /quitcancel, wait for idle, flush the session, exit

Keyboard shortcuts

KeyEffect
Ctrl+Ccancel a running turn; on an idle empty line, press twice within 2s to exit
Ctrl+Dforward-delete; on an idle empty line, press twice within 2s to exit
Shift+Tabcycle the permission preset (read-only / workspace-write / danger-full-access / custom)
Tabin /command mode, autocomplete the highlighted command
/ , Ctrl+P / Ctrl+Nrecall prompt history, or move within a multi-line draft
Shift+Enter, Alt+Enter, trailing \ + Enterinsert a newline instead of submitting
Home/Ctrl+A, End/Ctrl+E, Ctrl+B/Ctrl+F/arrowsreadline-style character and line motion
Alt+Left/Alt+Right, Ctrl+Left/Ctrl+Rightmove by word
Ctrl+K/Ctrl+U, Ctrl+W/Alt+Backspace, Alt+Dkill to line end/start, kill word back/forward

Develop

pnpm install
pnpm run build        # tsc → lib/
pnpm run typecheck
pnpm run lint
pnpm run test

To try a local checkout inside a profile, point the profile's dependency at this directory (dsh plugin --profile tui add /path/to/dsh-tui) and rebuild before each run — profiles load the built lib/ under plain Node.

Releasing

CHANGELOG.md and GitHub Release notes are generated from Conventional Commits via git-cliff. To cut a release: bump version in package.json, run pnpm run changelog, commit as chore(release): vX.Y.Z, then git tag vX.Y.Z && git push && git push --tags. The tag push triggers CI to build, create the GitHub Release, and publish to npm. See AGENTS.md for the full flow.

License

MIT

REPOSITORY SIGNALS

보안 및 설치 증거

이 점수는 공개 저장소 메타데이터와 이 사이트에 등록된 설치 증거에만 기반하며, 코드 보안 감사와 다릅니다.

출처 추적 가능

공개 플러그인 카탈로그에서 왔으며, 공개 GitHub 저장소로 연결됩니다.

라이선스

저장소가 MIT 라이선스를 선언했습니다.

유지보수 활동

최근 180일 내 코드 업데이트가 있습니다.

설치 증거

재현 가능한 정확한 설치 메타데이터가 아직 등록되지 않았습니다. 저장소 설명에 따라 직접 확인하세요.

설치 라이프사이클 스크립트

prepare이(가) 감지되었습니다. 설치 전에 스크립트를 검토하세요.

주의 사항lifecycle-scripts