helays
dsh-web-terminal
DSH 插件:在 DeepSeek Harness Web 界面(对话/轨迹)顶部新增「终端」Tab,内置 xterm.js + node-pty 交互式终端,让你在编码完成后即时在终端执行指令调试。
- Stars
- 1
- Language
- TypeScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
🖥️ dsh-web-terminal
Give your AI coding workbench a real terminal — right inside DeepSeek Harness.
An interactive PTY terminal powered by xterm.js + node-pty, mounted as a third tab (Chat · Trajectory · Terminal) at the top of the web UI. After the model writes code, stay in the conversation and open a shell of your own right next to it — build, commit, test, debug in one click.
English · 中文
Why you'll love it
| The pain 😤 | The fix with dsh-web-terminal ✅ |
|---|---|
| After the model edits code, you copy-paste it back into your own terminal and fumble | Open a real PTY right next to the chat — type a command, run it instantly |
| Everything has to squeeze into the conversation context, doubling tokens and noise | The terminal is fully decoupled from the model / agent — your private shell, zero context cost |
| Switching sessions or refreshing loses your commands and session state | Survives across sessions: switch away / come back / refresh — auto reconnect and replay scrollback |
| Spinning up a throwaway shell for a single command is slow | Persistent process: open once, run many commands on one resident shell (Ctrl+C interrupts, then keep going) |
In one line: put “writing code” and “running code” in the same place — without them interfering.
✨ Highlights
- 🗂️ A dedicated Terminal tab next to Chat & Trajectory — one click to switch.
- 🧯 A real PTY, not a toy:
- Windows uses ConPTY; POSIX uses an interactive shell;
- full
Ctrl+C/Ctrl+Dcontrol keys,resizeauto-fit, color + cursor blink; - persistent session (process stays resident, so you can chain commands without restarting).
- 🔄 Session survival + scrollback replay: tab away and back, even reload the page — it auto-reconnects and replays recent output (the pool lives plugin-side).
- 🚪 Zero conversation pollution: fully independent of the agent stream — no context tokens, no chat-log noise.
- ⚡ Zero config: PowerShell on Windows and bash on POSIX are auto-detected; run multiple terminals side by side and switch each one's shell type (
bash / zsh / pwsh / powershell / cmd / python, …) from a dropdown right in the Terminal tab. - 🗂️ Multi-terminal: open several terminals in one tab, switch with the tab cards, each with its own process.
- ⌨️ Type
/terminalin the composer to jump straight to the terminal (a single-step command, same source as the official/plan) — works even in an empty new session. - 🧩 A pure DSH bundle plugin: install, run, natively integrated with the official UI slots.
🚀 Quick Start
Requires: DeepSeek Harness
0.1.0-rc.6(next channel)webprofile.
Install
# Option 1 — GitHub (recommended, reproducible)
dsh plugin --profile web add dsh-web-terminal@github:helays/dsh-web-terminal#main -w
# Option 2 — from a local dev checkout
cd dsh-web-terminal && dsh plugin --profile web add . -w
⚠️
-wis required: the current dsh profile template is a pnpm workspace root (pnpm-workspace.yamlcontainspackages: [.]); omitting it triggersERR_PNPM_ADDING_TO_ROOT.dsh pluginforwards its remaining args to pnpm verbatim.After installing, restart
dsh web(a changed plugin set / host needs a restart), then refresh the browser.
Usage
- Open any session (once you're inside, you'll see Chat · Trajectory · Terminal at the top).
- Click the Terminal tab, or type
/terminalin the input box. - Run commands directly, for example:
npm run build # build right after the model edits code
git status # see what changed
pytest # run tests
- The tab bar shows connection status; switch back to Chat whenever you like — your terminal and session are still there.
🧩 Tech Stack
| Layer | Choice | Notes |
|---|---|---|
| Front-end terminal | @xterm/xterm + @xterm/addon-fit | Bundled into the client bundle (lib/client.js), registered via __ModuleLoader__.load |
| Back-end PTY | node-pty | Native PTY (Windows ConPTY / POSIX pty), resident process |
| Transport | ws | WebSocket bidirectional byte stream + resize via ctx.webServer |
| UI integration | ctx.slots.inject('conversation.view') | Registers the id:'terminal' tab, mirroring dsh-client-ui-trajectory |
Why a “real” terminal — and how it differs from the built-in dsh-terminal
The built-in ctx.terminals is agent-owned, model-facing, line-oriented, with no browser transport and unavailable on Windows.
Here we instead spawn a shell that belongs entirely to you via node-pty, fully decoupled from the agent session — it is your own terminal.
🔧 Local Development
pnpm install # install deps (types included)
pnpm build # outputs lib/index.js + lib/client.js + lib/client.css
pnpm typecheck # tsc --noEmit type check
- Changing the host half (
src/) requires adsh webrestart; - Changing the client half (
src/client/) just needs a reinstall + page refresh.
❓ FAQ
Q: Does this terminal consume my conversation context? No. It is fully decoupled from the model/agent conversation — nothing is written to context and nothing mixes into the chat log.
Q: Will my session survive a restart/refresh? Yes. The session pool lives plugin-side and survives across sessions and reloads; on reconnect it replays the latest output.
Q: I only want to run a single command — must I open a terminal? Once open the process stays resident, so you can keep operating inside it; switching away and back returns to the same shell.
Q: Can I swap shells?
Yes — per terminal. In the Terminal tab, use the “Terminal type” dropdown (top-right) to pick bash / zsh / pwsh / powershell / cmd / python (from the shells detected on your system); switching restarts that terminal with the new shell. It auto-detects PowerShell on Windows and bash on POSIX by default.
Q: Where do terminals open by default?
In the current conversation's workspace directory (falling back to the dsh web startup directory if unavailable). No configuration needed.