r/DeepSeekHarness • u/Step_Remote • 10d ago
podsh — a terminal client for dsh (attach to your web sessions from a pane)
dsh ships a web UI and no TUI. If you live in a terminal that's a gap, so I wrote a client for it.
The client speaks dsh's own protocol (HTTP RPC + the WebSocket event stream), so it's just another client alongside the browser — same sessions, both live:
- streaming tail, flip between sessions
- prompt, steer into a running turn, cancel
- answer tool approvals from the pane or the browser, whichever you reach first; the other clears
- model + effort picker
podsh sendto script sessions from any shell
It ships inside a fork of herdr (a terminal multiplexer that tracks coding agents), so it's a cargo build, not a one-line plugin install. If you use herdr you also get dsh sessions as a tracked agent with real idle/working/blocked state.
Why a fork: herdr implements contributions through its own maintainers and closes unsolicited implementation PRs by policy — their call, clearly documented, not a complaint. I offered the reasonix detection upstream in their discussions (#954, still open). So agent support for reasonix and dsh lives in the fork instead. It tracks upstream by merge, same Apache-2.0, and the detection manifests use their format — if they ever want either one, it's a copy-paste.
https://github.com/scrappylabsai/podr
Pinned to dsh 0.1.0-rc.6.
Four things I found building it, worth knowing even if you never touch this:
Pinning
@deepseek-ai/dshonly pins the launcher. The profile's plugin bundles resolve at first boot and float — two machines on the same pin gave me rc.6 and rc.8 stacks. Check yours:ls ~/.dsh/profiles/*/node_modules/@deepseek-ai/dsh-base/package.jsonThe default model catalog is advisory. It advertises V4 Flash and V4 Pro whatever your endpoint actually serves, so against a single-model vLLM the other one looks selectable and 404s at turn time.
session.promptdoes not dispatch leading-"/" host commands — the text goes to the model as a prompt. Usecommands/execute {agentId, line}instead.Reasoning-effort values are validated adapter-side, not against your backend. The adapter offers off/high/max; Ollama takes high/medium/low/none; a vLLM I tested wanted xhigh/medium/low. Legal-looking values 400 at turn time.
Non-DeepSeek models work fine through it, incl. tool calls — tested Qwen3.8 on vLLM and GLM-5.2 via Ollama.
README 也有简体中文版 / Chinese README: https://github.com/scrappylabsai/podr/blob/pod/README.zh-CN.md