lyuksovannyy d1e134196d dsh-remote 0.2.0: agent tools to drive slaves from the master
- remote_devices / remote_exec / remote_file / remote_task tools on the master
  (exec: bash -lc with timeout + output clipping; files: read/write/list;
  task: delegate a prompt to the device's own AI, wait for turn end, return
  its answer; optional permission preset, status/cancel)
- only the master may control devices (allowPeerControl to relay between slaves),
  agentTools.enabled=false opts a device out
- FORGE_CREDENTIALS opt-in pseudo-secret: ships the master's tea logins to a
  slave (tea config + git credential store + identity)
- /dsh-remote/debug/inspect + deploy/session-log.mjs for transcripts
- tests for exec/files/task/forge install
2026-10-11 10:08:04 +00:00

dsh-remote

Remote control for DeepSeek Harness, in the style of Claude Desktop: one master and any number of slaves.

  • Every session on every device. Sessions run on the machine that created them. From any device you can browse all of them, open them, and chat in them; the work still executes on the owning machine.
  • The full remote UI at /r/<device>/. The whole DSH UI of another device is proxied over the link: HTTP, the Remote WebSocket, SSE, plugin bundles and terminals. Slave→slave goes through the master's relay.
  • Plugin and config sync, master → slaves. Slaves get the master's npm/registry bundles, its local link: plugins (packed and shipped over the link) and its cordis.patch.yml. The config lands in a managed bundle layer, so each slave's own cordis.patch.yml still wins and slave-only plugins stay untouched.
  • Opt-in secrets. A credential (OMNI_API_KEY, …) reaches a slave only if three places agree: the master offers it, the master enables it for that device, and the slave accepts it.
  • Devices UI. A sidebar panel lists every device and its sessions (live running state, filter, "New session on "). A "Remote devices" settings page handles pairing, revocation and per-device sync policy. You get a toast when a session on any device finishes.

No dependencies: the WebSocket, the multiplexer and the proxy are plain Node.

 slave (laptop) ──outbound WebSocket /dsh-remote/link──►  master  ◄── slave (ai-pc)
   own sessions + own local plugins                  plugins, config, relay hub

Install

On every machine, register the plugin in the DSH web profile and restart DSH:

# master (this repo as a link: plugin, e.g. in Beast-Workspace)
#   profile package.json  →  "@local/dsh-remote": "link:/path/to/dsh-remote"  + bundle entry
# or use the helper (also creates the node_modules link and a config block):
node deploy/install-local.mjs --role master --name "Pelican-Node"
node deploy/install-local.mjs --role auto   --name "ai-pc"          # on a slave
systemctl --user restart dsh    # or restart `dsh web` however you run it

deploy/dsh-web.user.service is a ready-made systemd user unit for a rootless dsh web (127.0.0.1:3081).

Pair a device

  1. Master: Settings → Remote devices → Create pairing code (single use, valid 15 min).
  2. Slave: Settings → Remote devices → enter the master URL (e.g. http://192.168.0.111:3080 or https://dsh.rizzy.dev) and the code → Pair. Then restart the slave's DSH once: with role: auto it switches from master to slave.

The slave gets its own device key; the master stores only its hash. Revoke cuts the device off immediately: open links close with code 4401 and later connections are refused with 401.

Use it

  • Sidebar → Devices: every device, its sessions grouped by workspace, a running indicator, search. Click a session to open it. A local session opens in place. A remote one opens /r/<device>/#/session/<id>, the full UI of that device, with a "Remote: · back to local" pill in the corner.
  • + New session on a device card creates a session in one of that device's workspaces and opens it.
  • Open DSH ↗ opens a device's whole UI.
  • Toasts: ": '
S
Description
Claude-Desktop-style remote control for DSH: master/slave link, every device's sessions on every device (/r/<device>/), plugin + config sync with opt-in secrets.
Readme
544 KiB
0 Stars 2 Watchers 0 Forks
Languages
JavaScript 97.1%
Shell 2.9%