feat(brahman-ssh-multiplex): A6 — sesión SSH multiplexada (russh)

Envuelve russh 0.54 con una API mínima: una SshSession mantiene el
Handle maestro; cada exec() concurrente abre su propio canal en
paralelo sobre la misma conexión TCP (SSH multiplexa canales por
diseño del protocolo).

- SshConfig (host/port/user/auth/keepalive) + SshAuth (Password | Key).
- SshSession::connect — config russh + keepalive + auth password o
  clave privada en disco; verificación de host key TOFU por default.
- SshSession::exec — corre un comando en un canal nuevo, junta
  stdout/stderr/exit_code.
- SshSession es Clone barato (comparte el Handle).

Base de sandokan RemoteEngine y del Linker SSH de matilda.
Compila contra russh 0.54. El test de conexión real requiere un
servidor SSH (fuera del unit test).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-20 15:26:16 +00:00
parent 1e01dc27a5
commit 0e13c35f3e
4 changed files with 717 additions and 4 deletions
+4
View File
@@ -14,6 +14,7 @@ members = [
"crates/protocol/brahman-net",
"crates/protocol/brahman-dht",
"crates/protocol/brahman-card-discovery",
"crates/protocol/brahman-ssh-multiplex",
"crates/protocol/arje-card",
# ============================================================
@@ -263,6 +264,9 @@ libp2p = { version = "0.56", features = ["tokio", "tcp", "noise", "yamux", "macr
libp2p-stream = "=0.4.0-alpha"
libp2p-allow-block-list = "0.6"
# === SSH (brahman-ssh-multiplex, sandokan RemoteEngine, matilda) ===
russh = "0.54"
# === Code parsing (minga) ===
tree-sitter = "0.24"
tree-sitter-rust = "0.23"