dsh-remote-local-plugin
Verifieddsh-remote-local-plugin · v0.8.10 · MIT · Web UI
DSH remote-development local plugin: host registry, SSH tunnels, remote workspace/session discovery, an authenticated Connection RPC surface, agent tools, and a Settings page.
Install
dsh plugin add dsh-remote-local-plugin Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-remote-local-plugin
Remote development that appears as ordinary local sessions.
Supported environment
This plugin targets the official DSH Desktop application. Tested/supported versions:
- DSH Desktop
0.2.1-rc.2 - Plugin
0.8.10 - Remote DSH
0.2.1-rc.2 - Remote Node.js
22.19+on Linux/macOS
Other DSH GUI plugins, forks, modified clients, and other DSH versions have not been tested. The package dependency range is permissive for installation only; it is not a support guarantee.
What it does
- Durable host registry at
$DSH_HOME/remote/hosts.json(mode0600). - SSH discovery of the remote agent's private state file.
- Plugin-owned provisioning: uploads the bundled
dsh-remote-agenttarball, installs pnpm/DSH when missing, starts remotedsh web, waits for it, and connects. No separate installer command. - One loopback SSH tunnel per host, health checks, exponential backoff, manual reconnect.
- Default direct key mode: the resolved local key is copied into the remote service environment.
- Optional reverse SSH forward and local model credential proxy for key-local deployments.
- Native session mirror: remote workspaces/sessions become local workspaces and Sessions in the ordinary sidebar. A small custom Agent façade routes prompts and cancellation to the remote agent while the normal Conversation UI renders the mirrored events.
+ 新会话creates the remote session, creates its local mirror, and opens it throughuiWorkspace.openSession— not a popup.- Sidebar + menu to create a workspace locally (native flow) or on a connected remote host.
- SSH-backed remote workspace file listing/preview.
- Automatic remote Node.js discovery/install (nvm, Volta, fnm, Bun, asdf, mise, Nix, Homebrew, login shell; verified Node tarball fallback).
- Chinese / English client copy follows the DSH locale service.
- Remote SSH PTY terminals for mirror Sessions; local Sessions keep the local terminal.
- Remote approval questions bridged into the normal local approval UI.
- Model tools for every operation.
- Authenticated host API at
/api/dsh-remotethrough DSH Connection's Fetch route.
Install
From the DSH plugin page
After the npm package is published, use Plugins → Add plugin and enter:
dsh-remote-local-plugin
The package bundles the remote agent asset and the terminal-controller fork. Restart DSH after the plugin page asks for it.
From a source checkout
cd ../..
./scripts/install-local.sh # desktop profile
./scripts/install-local.sh --profile web
The installer creates one tarball containing the terminal-controller fork; restart DSH after it finishes.
Use
- Settings → 远程开发
- Enter an SSH target (
my-host) and click 保存并连接. - Wait for
已连接(first use installs the remote side). - Use Workspaces + to create a workspace; local folders use the native picker, remote folders use the SSH browser.
- Create a session from the workspace row or Settings. The mirrored session opens in the normal Conversation UI.
- Continue prompting. Workspace files and New terminal follow the selected Session.
Boundaries
- The remote browser UI is intentionally not exposed by default; the remote API-remotes carrier is disabled so approvals reach the native local UI.
- Sessions over
mirrorMaxEventsare not mirrored. - On plugin restart, old mirrors are archived and recreated.
Tools
remote_hosts_list, remote_host_add, remote_host_connect, remote_host_provision,
remote_workspace_add, remote_workspaces_list, remote_session_create, remote_sessions_list,
remote_session_prompt, remote_session_snapshot, remote_session_cancel.
Configuration
See cordis.patch.yml and
examples/local-plugin.patch.yml.
Security
The token stays local and is never returned to the browser. The browser uses DSH's authenticated
/api route. By default the model key is written to the remote service environment; set
credentialProxy: true to keep it local and inject it through the reverse-tunnel proxy. See the
root README.