DeepSeek Harness Remote Workspace
Travaillez sur un serveur distant comme s'il était local
Connectez un hôte en SSH, choisissez-y un dossier, et travaillez dedans. L'agent lit, écrit, modifie, liste, cherche et exécute des commandes sur la machine distante avec tous les outils qu'il a déjà. La connexion est partagée par toutes les sessions, plusieurs serveurs peuvent être connectés en même temps, et tout s'active depuis Paramètres → Plugins.
Ce que ça fait
- Un dossier distant devient un workspace. Il apparaît dans la barre latérale comme n'importe quel autre, et une session ouverte dedans travaille sur le serveur.
- Tous les outils, pas un sous-ensemble. Lecture et écriture de fichiers,
éditions littérales, listings,
glob/grepet le shell s'exécutent sur la machine distante. - Plusieurs hôtes à la fois. Les profils sont durables et partagés par toutes les sessions : un serveur connecté une fois est disponible partout.
- OpenSSH, ou Tailscale SSH. Vos clés, votre agent et votre
~/.ssh/configfont autorité ; un tailnet peut ajouter un accès par identité.
Prérequis
- dsh installé —
npm install -g @deepseek-ai/dsh, n'importe quel profil. - Node 22.19+ ou 24+ — la plage exigée par le harness lui-même.
- Un client OpenSSH sur la machine qui exécute dsh (
ssh -V). Le client OpenSSH de Windows fonctionne, sans multiplexage de connexion. - Un serveur SSH POSIX (Linux, macOS, BSD). Un serveur Windows OpenSSH est refusé avec un message explicite.
- Authentification par clé recommandée.
sshpassn'est nécessaire que pour un mot de passe. - Optionnel :
ripgrepsur le serveur, pourglobetgrep.
Installer
curl -fsSL https://raw.githubusercontent.com/cmukanisa/dsh-remote-ssh/main/install.sh | sh
Ou depuis un clone : git clone https://github.com/cmukanisa/dsh-remote-ssh && cd dsh-remote-ssh && node install.mjs
Installer active le plugin, et l'installation est transactionnelle
Elle vérifie d'abord tous les prérequis, installe, vérifie, et revient à l'état précédent exact si quoi que ce soit ne passe pas — un plugin à moitié installé laisserait un harness démarrer une composition qui désactive les providers livrés sans enregistrer les remplaçants.
checking
✓ node ·························· v24.14.0 (the harness requires >= 22.19)
✓ ssh ···································· OpenSSH_10.3p1, LibreSSL 3.3.6
✓ tailscale ················ 1.102.3 — the Tailscale SSH transport is available
✓ harness ················································· /Users/you/.dsh
✓ writable ··································· profiles/plugins accepts writes
✓ modules ················· profiles/node_modules/@deepseek-ai/cordis present
installing
✓ copied ········ dsh-remote-ssh → profiles/plugins/dsh-remote-ssh (8 files)
✓ patched ···································· cordis.patch.yml (8 rows)
✓ enabled ····························· settings.yaml remote-ssh.enabled = true
verifying
✓ files ······················································ 12 files in place
✓ composition ·············································· 8 expected rows
✓ setting ····································· remote-ssh.enabled = true
✓ module ············· registry.js imports and exports RemoteRegistry
──────────────────────────────────────────────────────────────────────────────
Done in 0.1s. Reload the harness page, then workspace "+" → "Serveur distant (SSH)".
| Option | Effet |
|---|---|
--keep-off | installer en veille — pour un déploiement où l'activation est auditée séparément |
--enable | activer même si un passage précédent l'avait laissé désactivé |
--link | lier les paquets au lieu de les copier (développement) |
--dry-run | lancer les vérifications, annoncer les changements, ne rien écrire |
--no-color | sortie sans couleur (respecte aussi NO_COLOR) |
--uninstall | retirer les paquets, les lignes de composition et le réglage |
--dsh-home DIR | cibler un autre dossier de harness |
Utiliser
- Rechargez la page du harness.
- Cliquez sur + dans l'en-tête des workspaces de la barre latérale — ou sur le bouton 🖥 en bas de la barre latérale, qui ouvre la même boîte de dialogue.
- Choisissez Serveur distant (SSH).
- Cliquez sur + Serveur et remplissez la connexion : nom, hôte, port, utilisateur, chemin de clé privée, ou un mot de passe.
- Naviguez jusqu'au dossier, puis Utiliser ce dossier.
Le dossier apparaît comme un workspace normal. Les sessions qui y sont ouvertes atteignent le serveur, et le profil reste disponible pour toutes les autres sessions.
L'interface suit la langue de votre navigateur : français, anglais ou chinois.
Tailscale
Deux choses différentes s'appellent « se connecter via Tailscale », et le plugin ne les confond pas.
- OpenSSH sur le tailnet — rien à configurer. Pointez un profil vers un nom
MagicDNS ou une adresse
100.x: le vraisshpasse par WireGuard, avec vos clés et votreknown_hostscomme autorité. tailscale ssh— au choix, par profil. Le client Tailscale enveloppe lesshdu système : résolution MagicDNS, atteignabilité viatailscaled, et clé d'hôte vérifiée auprès du serveur de coordination. L'accès est alors régi par les ACL du tailnet plutôt que par des clés sur disque.
Le formulaire de connexion liste les pairs de votre tailnet ; un clic remplit le nom MagicDNS, l'utilisateur, et le transport quand le pair fait tourner le serveur SSH Tailscale. Un pair signalé hors ligne est nommé avant la tentative, au lieu d'apparaître comme un timeout.
Un travail qui survit au harness
La boucle de l'agent s'exécute dans le harness : le fermer met fin au tour. Ce qui peut continuer, c'est la commande, et tout le secret est de la détacher : le plugin écrit un petit lanceur sur le serveur, le démarre dans sa propre session, et envoie sa sortie dans un fichier de log là-bas.
- Fermez le harness quand vous voulez. Le processus distant continue de tourner.
- Revenez et constatez. Paramètres → Plugins liste chaque exécution avec son état en direct — en cours, terminé avec son code de sortie, ou disparu — et sa dernière sortie.
- Arrêtez-la quand vous voulez. Une entrée active a un bouton Arrêter ; tout le groupe de processus est signalé, donc les enfants aussi.
Rien à configurer : un travail lancé dans un workspace distant est détaché par défaut, et un
enregistrement durable par exécution vit dans $DSH_HOME/remotes-sessions.json, partagé par
toutes les sessions.
Mettre à jour
Relancez l'installeur. Il réécrit son propre bloc de composition, et sa dernière ligne dit laquelle de deux choses le harness en cours a besoin :
- recharger la page quand seule la moitié navigateur a
changé : le bundle est servi depuis des octets que
dsh-client-hmrsurveille, un nouveau bundle est une nouvelle révision ; - redémarrer le harness (
dsh web) quand la moitié hôte (lib/*.js) a changé — le loader ESM de Node garde le module chargé au démarrage — ou quand un paquet a été renommé : le harness indexe ses modules client sur le nom lu au démarrage et continue de servir le nouveau bundle sous l'ancien identifiant, si bien que chaque chargement de page échoue avecloaded without registering. L'installeur détecte les deux cas et le dit.
node install.mjs # ou la commande curl à nouveau
Dépannage
| Symptôme | Cause et correction |
|---|---|
does not answer as a POSIX host | Un serveur SSH Windows. Utilisez un hôte Linux/macOS, ou exposez le sshd WSL de cette machine sur son propre port. |
Permission denied (publickey) | Lancez ssh <hôte> à la main d'abord ; le plugin utilise le même client, le même agent et la même configuration. |
| Clé d'hôte changée | Le plugin refuse, à raison. Retirez la ligne obsolète de known_hosts quand vous êtes sûr. |
glob/grep signalent un programme absent | Installez ripgrep sur le serveur (apt-get install ripgrep, dnf install ripgrep, apk add ripgrep). |
| Un pair du tailnet expire | Tailscale le signale hors ligne ; le formulaire de connexion le dit à l'avance. |
| Le workspace semble vide dans un outil purement local | Cet outil contourne la couche filesystem et voit donc le miroir local vide. Utilisez l'arborescence de fichiers du workspace. |
Failed to load plugins … loaded without registering "…dsh-remote-ssh-ui" après une mise à jour | Le harness en cours garde l'identité de paquet lue au démarrage. Redémarrez dsh web ; recharger la page ne suffit pas. |
Limites à connaître
- Serveurs POSIX uniquement. La machine distante est pilotée avec du shell POSIX ; un serveur Windows OpenSSH est refusé plutôt que de fonctionner à moitié.
- Les commandes distantes ne sont pas confinées. Le bac à sable est un mécanisme du même noyau ; par SSH, les permissions du compte sont la frontière, et aucun fait de sandbox n'est rapporté pour une exécution distante. La barrière filesystem, elle, est appliquée.
globetgrepexigent ripgrep sur le serveur.- Pas de surveillance de fichiers à distance. L'arborescence se rafraîchit à la navigation.
Liens
- Dépôt — code, tickets
- Versions — archive et empreinte
- Contribuer
- Politique de sécurité — ce que garantit le canal SSH, et comment signaler