deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
English | 中文
SSH remote workspaces for DeepSeek Harness: let the agent connect to remote hosts over SSH, browse/read/write remote files, run remote commands, open remote terminals, and show connection status with colored dots in the sidebar — in the spirit of Codex Remote.
Status: the Web UI, SSH directory picker, persisted remote workspaces, transparent SFTP filesystem routing, and OpenSSH command/terminal routing are implemented end to end.
ssh2 connection pool (one per host),
keepalive, exponential-backoff auto-reconnect, connection state machine.FileSystem twelve
primitives (read/write/edit/list/stat) with DSH FS_* error-code alignment.ssh_remote exec runs a shell command on the host.~/.ssh/config (including Include files), then effective HostName/User/
Port/IdentityFile/ProxyJump/ProxyCommand values are resolved with ssh -G.~/.ssh/config, then
press Refresh.read/write/edit and other filesystem
calls use SFTP; bash and terminal processes use the system OpenSSH client.
Local workspaces keep using the original local providers.$DSH_HOME/ssh-remote-workspaces.json.Requires Node 22+, pnpm, DSH 0.1.0-rc.x.
# Option A: npm (once published)
dsh plugin --profile web add dsh-ssh-remote
# Option B: GitHub (no publish needed)
dsh plugin --profile web add 'github:CrazyShout/dsh-ssh-remote'
Restart dsh web afterwards.
In the Web UI:
~/.ssh/config.Harness still stores a local workspace path. The plugin creates a small local
anchor under $DSH_HOME/ssh-workspace-anchors/ and persists its exact mapping
in $DSH_HOME/ssh-workspace-anchors.json. Only that anchor and its descendants
are routed to the corresponding ssh://alias/path; unrelated local paths are
never intercepted.
The lower-level ssh_remote tool remains available for explicit operations:
The agent drives remote hosts through the ssh_remote tool:
ssh_remote { action: "add", uri: "ssh://user@gpu-server:22/home/user/exp" }
ssh_remote { action: "connect", id: "<id>" }
ssh_remote { action: "exec", id: "<id>", command: "nvidia-smi" }
ssh_remote { action: "read", id: "<id>", path: "train.py" }
ssh_remote { action: "write", id: "<id>", path: "notes.txt", content: "..." }
ssh_remote { action: "list" }
path accepts a remote absolute path (/home/user/exp/a.py) or a
workspace-relative path (a.py).
SSH_AUTH_SOCK).IdentityFile entries returned by OpenSSH in order.ProxyJump (including multiple hops) and ProxyCommand streams are opened
by the system OpenSSH client, keeping its Include/wildcard/Match semantics.sftp subsystem
(Subsystem sftp internal-sftp).Add a concrete alias to ~/.ssh/config, verify ssh devbox, then refresh the
SSH Remote plugin panel:
Host devbox
HostName devbox.example.com
User you
IdentityFile ~/.ssh/id_ed25519
ProxyJump bastion
Register a workspace with the alias, not duplicated connection fields:
ssh_remote { action: "add", uri: "ssh://devbox/home/you/project" }
Older ssh-remote.hosts entries remain a read-only compatibility fallback,
but new configuration should live only in OpenSSH config.
ssh executable, so SSH aliases, Include, Match,
ProxyJump, agent forwarding, and host-key policy stay owned by OpenSSH./a/project matches itself
and /a/project/..., but never /a/project-copy.pnpm install
pnpm run build # tsc for host + client
pnpm test
lib/ is committed to git so a git install never ships without built code.
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。