harryopo/dsh-cloud-workspaces
Cloud workspaces for DeepSeek Harness — pick Cloud (SSH) in the workspace picker and the agent's bash/read/write/edit/glob/grep tools transparently run on your Linux server over SSH. Zero remote install.
Project Overview项目介绍
dsh-cloud-workspaces is a DeepSeek Harness plugin that runs the coding agent on a remote Linux server. It transparently redirects the built-in toolset — bash, read, write, edit, glob, grep, plus ctx.fs and ctx.subprocess — over standard SSH channels (exec, SFTP, PTY), so no remote agent or daemon is installed. A dual-tab workspace picker exposes Local and Cloud (SSH) bindings adopted by the official registry. Use it when source code, data, or production lives on a remote Linux box reachable by SSH. Caveat: hosts and credentials must be configured in the SSH Connections settings card first, and stored passwords are write-only secrets.
dsh-cloud-workspaces 是 DeepSeek Harness 的远程开发插件。它通过标准 SSH(exec、SFTP、PTY)将 ctx.fs、ctx.subprocess 及 bash、read、write、edit、glob、grep 工具透明重定向到远端 Linux 服务器,工作区选择器提供 Local 与 Cloud (SSH) 双标签。适合代码、数据、生产环境部署在远程 Linux 而本地仅跑 DSH 的场景。服务器端无需安装任何组件,依赖标准 sshd。注意事项:需要在 SSH Connections 中先添加并保存主机与凭据;密码字段为只写密文,浏览器无法回读。
请帮我了解并安装插件:【dsh-cloud-workspaces】【https://github.com/harryopo/dsh-cloud-workspaces】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add dsh-cloud-workspaces
把 harryopo/dsh-cloud-workspaces 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-cloud-workspaces
Cloud workspaces for DeepSeek Harness (DSH).
Pick Cloud (SSH) in DSH's workspace picker, and the coding agent works directly on your Linux server: bash, read, write, edit, glob, grep — the entire built-in toolset — transparently execute over SSH. Files, search, editing and terminal all live on the remote box.
Zero install on the server. No vscode-server-style remote agent, no daemon, nothing to download — a standard OpenSSH server is all it takes.
中文文档:README.zh-CN.md
Why
DSH's agent runs on your local machine. When your code, data or production box lives on a remote Linux server, you either SSH in separately or fight with sync tools. Competing remote solutions ship a fat remote component (hundreds of MB) that must be downloaded to the server on first connect.
dsh-cloud-workspaces takes a different route: everything rides standard SSH channels (exec / SFTP / PTY via ssh2). The server needs nothing beyond what it already has.
Features
Cloud workspaces (the headline)
- Dual-tab workspace picker — "Local" and "Cloud (SSH)" tabs; cloud workspaces are adopted by DSH's official workspace registry and show up in every session picker as
host / path. - Transparent toolset redirect — when a session's cwd falls under a cloud placeholder, the plugin replaces the official
ctx.fs(13 file methods) andctx.subprocessseams with SSH-backed implementations. Local sessions are untouched; the seam is swapped per session scope. - Shadow tools with official UI — session-scoped remote
bash/read/write/edit/glob/grepregister in the agent's scope only, and implement the officialpresentCall/presentResultpresenters, so chat rows render as real terminal / read / search cards — expandable, copyable, native.
SSH settings card (in DSH Settings → SSH Connections)
- Host manager — display name, host, port, user; password auth (keyboard-interactive aware — works with PAM/Ubuntu servers that never offer the plain
passwordmethod) or private key (path; ssh-agent fallback). - Connection test — one-click probe with latency; saved credentials are reattached server-side (the browser only ever sees a redacted view).
- Remote directory browser — list, navigate, create and delete folders on the server; then bind any directory as a cloud workspace in one click.
- ProxyJump — jump-host chains, per-hop credentials.
Agent tools
ssh_list/ssh_exec/ssh_ls/ssh_read/ssh_write— explicit remote access from any session (subject to preset scoping).ssh_workspace— create a cloud workspace binding from chat.
Connection layer
- ssh2 connection pooling with keepalive, broken-connection detection and transparent rebuild.
- Per-host latency-tested
testendpoint reused by both the settings card and the picker.
Security
- Hosts are stored in DSH's settings namespace; password fields are write-only secrets — the browser receives a redacted view and can never read stored credentials back.
- Remote sessions are scoped: shadow tools exist only inside sessions bound to a cloud workspace. Local workspaces are never affected.
- Remote file reads are capped; large files stream instead of buffering into memory.
Install
Requires DSH (web profile), Node ≥ 22, and a reachable SSH server.
From npm
dsh plugin --profile web add dsh-cloud-workspaces
From source
git clone https://github.com/harryopo/dsh-cloud-workspaces.git
cd dsh-cloud-workspaces
pnpm install
pnpm build
# link into the DSH web profile (use a junction on Windows if the path has spaces)
dsh plugin --profile web add link:C:\path\to\dsh-cloud-workspaces
Restart dsh web after installing or rebuilding (the host half loads in the Node process).
Usage
- Add a host — Settings → SSH Connections → Add host → fill credentials → Test → Save.
- Bind a cloud workspace — Add workspace → Cloud (SSH) tab → pick host → browse to your project → Use this directory as workspace.
- Open a session on that workspace — the agent now runs entirely on the server. Ask it:
run pwd, then list the files hereand watchbashexecute remotely. - Or drive it explicitly:
use ssh_exec to run docker ps on web-1.
Architecture
DSH host process (Node)
┌────────────────────────────────────────────────────────────┐
│ ctx.fs ────────► fs-ssh adapter ──────┐ │
│ ctx.subprocess ► subprocess-ssh ──────┤ seam swap per │
│ shadow tools ─► session scope ────────┘ session scope │
│ │ │
│ SshEngine (ssh2) ◄──────────────────────┘ │
│ ├─ connection pool / keepalive / rebuild │
│ ├─ exec · SFTP CRUD · PTY │
│ └─ ProxyJump hops │
└──────────────┬─────────────────────────────────────────────┘
│ SSH (exec / sftp / pty) — nothing else
┌──────▼──────┐
│ Linux server │ stock sshd. zero remote install.
└─────────────┘
Browser (dsh web GUI): settings card + cloud-workspace picker
speak to the host over the official Typert remote bridge.
- Host half (
src/, TypeScript):SshEngine,fs-ssh/subprocess-sshadapters, session tool registration, Typert remote endpoints, settings schema. - Client half (
client/, plain ESM React viacreateElement): settings section + dual-tab workspace picker injected through official slots (settings.section,workspace.*). No JSX build step,--dsw-*design tokens only.
Development
pnpm build # tsc d.ts + tsdown bundle
pnpm typecheck # tsc --noEmit
pnpm test # vitest — 100 unit tests
node scripts/e2e-real-server.mjs # 25 E2E tests over a real SSH server (WSL sshd on 127.0.0.1:2223)
Roadmap
- SSH engine: pooling, keepalive, broken-connection rebuild, ProxyJump
- Cloud workspaces: dual-tab picker, placeholder dirs, official adoption
- Transparent
ctx.fs/ctx.subprocessredirect - Shadow tools with official terminal/read cards
- Settings card: hosts, password/key auth (keyboard-interactive), test, remote dir browser
- Background remote jobs (
ctx.jobs) - Remote search tuning (ripgrep detection on the server)
- SSH tunnel (local port forwarding)
- npm first release (
dsh-cloud-workspaces@0.2.1)
Acknowledgements
- DeepSeek Harness — the harness and its official plugin SDK (
@deepseek-ai/dsh-*); this plugin builds only on official npm SDK packages. - dsh-ssh (Apache-2.0) — UI patterns for the settings card and workspace placeholder design.
- ssh2 (MIT) — the SSH transport.
xmanrui/dsh-im
tencent-connect/dsh-qqbot
flymysql/dsh-remote
whiteguo233/dsh-openbiliclaw
hanshanyike/dsh-yolo
omdsh-dev/dsh-lark
AX1202/ax-feishu-bridge