Bundle
dsh-console
Console commands for DeepSeek Harness: web service / SSH tunnel management, one-shot ask, and the dsh-tui launcher.
- Source
- Isanti2016
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 5 days ago
Readme
# dsh-console
Console commands for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness): manage the web service, the SSH tunnel, one-shot questions, and an optional console TUI — straight from the slash-command plane.
## Quick start
```sh
# 1. install the bundle
dsh plugin --profile web add dsh-console
# 2. restart dsh web, then use the commands
/web status
/tunnel status
```
Out of the box, `/web` and `/tunnel status` work with zero config (the plugin auto-detects the running dsh entry). Configure the tunnel host and the console TUI path in the profile's `cordis.patch.yml`:
```yaml
- id: dsh-console
config:
tunnelHost: '192.168.1.100' # your SSH server
tunnelUser: 'root'
tunnelKey: 'C:\\Users\\you\\.ssh\\id_rsa'
consoleCommand: 'python C:\\tools\\dsh-tui\\main.py'
```
Then `dsh plugin --profile web` again + restart, and `/tunnel start` / `/console` are live.
## Commands
| Command | Description |
| --- | --- |
| `/web status` | Is the web UI up? (port + PID) |
| `/web start` | Background-start the web UI (`node <dshBin> web --port <webPort>`) |
| `/web stop` | Stop the web UI process |
| `/web restart` | Restart it |
| `/tunnel status` | Is the SSH tunnel up? |
| `/tunnel start` | Start the SSH tunnel (needs `tunnelHost`) |
| `/tunnel stop` | Stop the tunnel |
| `/ask <问题>` | One-shot question through the headless profile (timeout-bounded) |
| `/console` | Launch the console TUI (needs `consoleCommand`) |
## Configuration
All keys carry sensible defaults; set them in the profile's `cordis.patch.yml` (or a `--patch` overlay), overriding the row this bundle adds:
```yaml
- id: dsh-console
config:
webPort: 3080 # dsh web UI port
dshBin: '' # path to apps/cli/lib/bin.js; empty = auto-detect
tunnelHost: '192.168.1.100'
tunnelUser: 'root'
tunnelKey: 'C:\\Users\\you\\.ssh\\id_rsa'
tunnelLocalPort: 3081
tunnelRemotePort: 3080
askTimeout: 150
consoleCommand: 'python C:\\tools\\dsh-tui\\main.py'
```
| Key | Default | Meaning |
| --- | --- | --- |
| `webPort` | `3080` | The dsh web UI listens on `127.0.0.1:3080` by default; `/web start` spawns it there. |
| `dshBin` | auto | Absolute path to your checkout's `apps/cli/lib/bin.js`. Empty = detected from the running process (`process.argv[1]`), so a from-source `dsh` usually needs no config. |
| `tunnelHost` | `''` | SSH server host. Empty disables `/tunnel start`. |
| `tunnelUser` | `root` | SSH user on the server. |
| `tunnelKey` | `''` | Absolute path to your SSH private key (`-i`). Omit for agent/other auth. |
| `tunnelLocalPort` | `3081` | Local listen port of the tunnel (`127.0.0.1:3081`). |
| `tunnelRemotePort` | `3080` | Remote port the tunnel forwards to (`127.0.0.1:3080` on the server). |
| `askTimeout` | `150` | Seconds before `/ask` is killed. |
| `consoleCommand` | `''` | Shell command launching your console TUI. |
### How the tunnel is wired
```
your machine SSH server (tunnelHost)
127.0.0.1:3081 ──ssh -L──▶ 127.0.0.1:3080
▲ ▲
│ /tunnel start binds here │ dsh web runs here (or any service)
```
`/tunnel start` runs `ssh -N -L <tunnelLocalPort>:127.0.0.1:<tunnelRemotePort> <tunnelUser>@<tunnelHost>` (with `-i <tunnelKey>` when set) as a detached process. `/tunnel stop` finds and kills the listener on `tunnelLocalPort`.
### Typical setups
- **Local launcher (CLI/headless profile)** — manage the web UI from a terminal:
`/web start` → open `http://127.0.0.1:3080`; `/web stop` → stop it.
- **Remote web (this machine reaches another host)** — point `tunnelHost` at the remote, browse `http://127.0.0.1:<tunnelLocalPort>`.
- **In the web profile itself** — `/web status` and `/tunnel status` are safe; `/web stop|restart` kill the process serving the current UI — manage deliberately.
## Security notes
- `/web stop` / `/web restart` kill the process serving the current UI when run from the web profile.
- `/tunnel start` runs `ssh` with your configured key — only configure keys from sources you trust.
- `/ask` runs the headless profile and consumes model quota; results are rendered by the command plane and never enter model history.
## Development
```sh
npm test # node test of the backend primitives (read-only)
pnpm pack # build the installable tarball
```
The bundle has no build step: plain ESM, ships `index.js` + `lib/` + `cordis.patch.yml`.
Install
dsh plugin --profile web add github:Isanti2016/dsh-console
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-console from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.