Volver a la lista

Blog

Más allá de SSH: por qué WebSocket supera a los protocolos de terminal para agentes de codificación IA

SSH fue diseñado para sesiones interactivas humanas. Los agentes de codificación IA necesitan algo diferente. Aquí explicamos por qué WebSocket es el mejor protocolo para control remoto de agentes.

Publicado Etiquetas: ingeniería / arquitectura / comparativa / seo
Blog

Sigue las novedades de producto e ingeniería de esta categoría.

Ver categoría

Cuando los desarrolladores oyen hablar de controlar Claude Code desde un teléfono, la reacción natural es: "¿Por qué no simplemente hacer SSH a mi Mac?"

Es una pregunta razonable. SSH es probado, seguro, ubicuo. Todos los desarrolladores lo conocen. Hay excelentes clientes SSH para móvil como Termius, Blink Shell y Prompt. ¿Por qué construir algo diferente?

La respuesta no es que SSH sea malo. Es que los agentes de codificación IA tienen patrones de interacción fundamentalmente diferentes a las sesiones interactivas de shell, y esas diferencias se acumulan en una peor experiencia cuando intentas forzar SSH.

La incompatibilidad del modelo de interacción

SSH fue diseñado en 1995 para un modelo específico: un humano se sienta ante un terminal, escribe comandos, lee la salida, escribe más comandos. La sesión es interactiva y síncrona — estás activamente involucrado todo el tiempo.

Los agentes de codificación IA invierten este modelo:

SSH (Shell interactivo)Control de agente IA
Duración de sesiónMinutos a horas de uso activoHoras a días, mayormente monitoreo pasivo
Atención humanaContinuaIntermitente — consultar cuando hay notificación
Patrón de entradaPulsaciones frecuentesPrompts ocasionales + decisiones de aprobación
Patrón de salidaRespuesta a tus comandosStreams autónomos largos que escaneas, no lees
Eventos críticosLos ves porque estás mirandoPodrías perderlos si no estás mirando
Modo de falloLo notas inmediatamenteEl agente podría esperar indefinidamente por aprobación

Las dos últimas filas son el problema. Cuando Claude Code termina una tarea o necesita tu aprobación para una operación peligrosa, SSH no tiene forma de avisarte. Tienes que estar mirando.

Problema 1: Sin notificaciones push

Esta es la mayor brecha. Con un agente de codificación IA, el flujo más valioso es:

  1. Enviar una tarea: "Refactoriza el módulo de pagos para usar la nueva API"
  2. Guardar el teléfono
  3. Recibir notificación cuando Claude termine o necesite entrada
  4. Revisar y continuar

SSH no puede hacer el paso 3. El protocolo SSH no tiene mecanismo para enviar notificaciones push a un dispositivo móvil. La conexión TCP existe solo mientras tu cliente SSH está en primer plano (o usando Mosh, mientras la sesión UDP está viva). Incluso entonces, no hay puente entre "aparecieron datos en el terminal" y "enviar una notificación push a este dispositivo."

Puedes solventarlo con shell scripts que envíen notificaciones vía servicios externos, pero eso es infraestructura frágil que tienes que construir y mantener tú mismo.

Enfoque WebSocket: El servidor monitoriza la salida de Claude Code y los eventos de hooks. Cuando detecta una finalización o solicitud de aprobación, envía un evento estructurado a los clientes conectados. La app iOS los convierte en notificaciones push nativas. Sin polling, sin servicios externos.

Problema 2: Comportamiento en segundo plano de iOS

iOS suspende agresivamente las apps que no están en primer plano. Un cliente SSH que pasa a segundo plano obtiene aproximadamente 30 segundos antes de que iOS suspenda sus conexiones de red. Después:

  • SSH: La conexión cae. Cuando reabres la app, obtienes un error de "broken pipe". Te reconectas, pero has perdido tu posición de scroll y toda la salida que ocurrió mientras estabas fuera.
  • Mosh: Mejor — usa UDP y puede reanudar. Pero igualmente te pierdes todo lo que ocurrió durante la suspensión. Y Mosh no resuelve el problema de notificaciones.

Esta es una restricción fundamental de iOS, no un bug de los clientes SSH. Apple no permite conexiones de red arbitrarias en segundo plano por razones de batería.

Enfoque WebSocket: El servidor almacena en buffer la salida del terminal independientemente del estado de conexión del cliente. Cuando la app iOS vuelve a primer plano, se reconecta automáticamente y realiza una hidratación de estado multi-etapa — refrescando a 0.2s, 0.7s y 1.5s tras la reconexión para capturar el estado actual completo. Mientras tanto, los eventos críticos (finalización de tareas, errores) se entregan como notificaciones push incluso cuando la app está suspendida.

Problema 3: Gestión del estado de sesión

Los agentes de codificación IA a menudo ejecutan múltiples tareas en paralelo. Podrías tener:

  • Sesión A: refactorizando el módulo de autenticación
  • Sesión B: escribiendo tests para la capa API
  • Sesión C: arreglando un bug en producción

Con SSH, gestionar esto implica:

  1. SSH a tu Mac
  2. Adjuntarse manualmente a la sesión tmux correcta: tmux attach -t session-a
  3. Comprobar estado, desadjuntarse: Ctrl+B, D
  4. Adjuntarse a la siguiente sesión: tmux attach -t session-b
  5. Repetir

Funciona, pero es manual y propenso a errores en un teclado de teléfono.

Enfoque WebSocket: El servidor expone la gestión de sesiones como comandos estructurados. La app iOS muestra una lista de sesiones activas con sus estados actuales. Toca para cambiar. Crea nuevas sesiones con un selector de rutas que navega el sistema de archivos de tu Mac. Elimina sesiones con un deslizamiento. El servidor gestiona toda la orquestación de tmux.

Problema 4: Semántica de eventos del agente

SSH transporta bytes crudos. No entiende qué está pasando en el terminal. No sabe la diferencia entre Claude pensando, Claude escribiendo código, Claude esperando aprobación o Claude terminando una tarea.

Claude Code tiene un sistema de hooks que ejecuta shell scripts en eventos específicos: inicio de tarea, finalización de tarea, eventos de notificación. Estos hooks son cómo el servidor aprende sobre las transiciones de estado del agente.

Limitación de SSH: No hay forma limpia de enrutar estos eventos de hooks a través de una sesión SSH. Necesitarías un canal separado (otra conexión SSH, un servicio webhook, algo) ejecutándose junto a tu sesión de terminal.

Enfoque WebSocket: El servidor recibe eventos de hooks vía HTTP POST desde los scripts hook de Claude Code. Los analiza, los deduplica (con una ventana de 3 segundos para evitar alertas duplicadas), y los envía a la app iOS por la misma conexión WebSocket que transporta los datos del terminal. Una conexión, múltiples tipos de datos.

Problema 5: Autenticación y control de acceso

La autenticación SSH es potente pero compleja para casos de uso móvil:

  • La gestión de claves en iOS es incómoda
  • Necesitas configurar sshd en tu Mac
  • El reenvío de puertos a través de NAT requiere configuración adicional
  • Exponer SSH a internet exige una configuración de seguridad cuidadosa

Enfoque WebSocket: Tactic Remote usa autenticación por clave API sobre WebSocket. Para conexiones LAN, la clave API es opcional (tu red doméstica es el límite de confianza). Para conexiones Cloudflare Tunnel, la clave API es obligatoria. La app Mac genera una clave aleatoria de 32 caracteres y la transfiere vía código QR — sin gestión de archivos de claves, sin configuración de sshd.

Este es un modelo de seguridad deliberadamente más simple. Intercambia la flexibilidad de SSH por facilidad de configuración. Si necesitas las garantías de seguridad de la autenticación por clave pública SSH, SSH es la herramienta correcta — pero probablemente para un caso de uso diferente.

Cuándo SSH sigue siendo mejor

SSH gana cuando:

  • Gestionas muchos servidores — SSH es el protocolo estándar para acceso a servidores. Un cliente, muchos hosts.
  • Necesitas transferencia de archivos — SFTP/SCP están integrados en SSH. Tactic Remote no hace transferencia de archivos.
  • Usas herramientas que no son Claude — SSH es agnóstico respecto al agente. Funciona con cualquier aplicación de terminal.
  • Necesitas reenvío de puertos — los túneles SSH están probados en batalla para proxying de servicios.
  • Tus requisitos de compliance exigen SSH — algunas organizaciones requieren SSH para auditoría y control de acceso.

La arquitectura en la práctica

Así se ve la arquitectura WebSocket para Tactic Remote:

iPhone App                    Mac Server                    Claude Code
    │                             │                              │
    │  WebSocket (ws:// o wss://) │                              │
    │◄───────────────────────────►│  tmux send-keys              │
    │  • Terminal I/O             │─────────────────────────────►│
    │  • Comandos de sesión       │  tmux capture-pane           │
    │  • Flujo de eventos         │◄─────────────────────────────│
    │                             │                              │
    │  Notificación push          │  HTTP POST /hook             │
    │◄────────────────────────────│◄─────────────────────────────│
    │  (vía evento WebSocket)     │  (scripts hook de Claude Code│
    │                             │                              │

El servidor se sitúa entre el teléfono y Claude Code, añadiendo:

  • Semántica de eventos (bytes crudos del terminal se convierten en eventos estructurados)
  • Gestión de sesiones (un servidor, muchas sesiones tmux)
  • Resiliencia de reconexión (estado almacenado en buffer, hidratación automática)
  • Enrutamiento de notificaciones (eventos hook se convierten en notificaciones push)

SSH te daría la conexión de terminal cruda (las flechas superiores), pero nada de la inteligencia intermedia.

¿Y Mosh?

Mosh (Mobile Shell) es la sugerencia más común para mejorar SSH en móvil. Usa UDP en lugar de TCP, lo que ayuda con:

  • Roaming de red (cambiar entre WiFi y datos móviles)
  • Persistencia de conexión (el servidor mantiene estado incluso cuando el cliente se desconecta)
  • Echo local (feedback de pulsaciones instantáneo independiente de la latencia)

Mosh mejora genuinamente la experiencia SSH en móvil. Pero sigue sin resolver los problemas fundamentales:

  • Sin notificaciones push
  • Sin conocimiento de eventos del agente
  • Sin gestión de sesiones estructurada
  • Sigue sujeto a la suspensión en segundo plano de iOS (aunque la recuperación es más rápida)

Si estás comprometido con herramientas basadas en SSH, Blink Shell con Mosh es la mejor opción en iOS. Es una buena herramienta que resuelve un problema diferente.

Conclusión

La pregunta no es "¿SSH o WebSocket?" como comparación abstracta de protocolos. Es "¿qué modelo de interacción necesita tu flujo de trabajo?"

Si gestionas servidores y ejecutas comandos interactivos, SSH es el protocolo correcto con décadas de fiabilidad probada.

Si controlas un agente IA que se ejecuta autónomamente, necesita tu atención de forma intermitente y se beneficia de notificaciones push y manejo estructurado de eventos, una arquitectura WebSocket diseñada a propósito resuelve problemas que SSH no puede — no porque SSH tenga defectos, sino porque fue diseñado para una era diferente de interacción humano-computadora.

Prueba Tactic Remote

Controla tus agentes de programación desde el móvil

Conéctate a Claude Code, Codex y otros agentes en tu Mac, Windows o Linux. Consulta el progreso y envía la siguiente instrucción desde el iPhone o iPad.