Hermes ahora te entrega los archivos que su agente crea dentro de los sandboxes remotos

Imagina un viernes por la noche: has metido las manos de Hermes dentro de un sandbox remoto — un entorno en la nube de Modal o la caja de desarrollo SSH de tu empresa — porque quieres un aislamiento limpio que nunca toque los archivos de tu portátil. El agente termina el trabajo, produce un gráfico, un informe, una captura de pantalla de una página web dentro de ese sandbox y adjunta alegremente la ruta del archivo a su respuesta. Tu ventana de chat no muestra nada. La única huella es una línea de log: “Skipping unsafe MEDIA directive path.” El archivo existe — simplemente no puede llegar a ti.
Por qué los archivos solían desaparecer
Para entenderlo, primero tienes que saber cómo te entrega Hermes los archivos. El agente escribe una etiqueta MEDIA:<path> en su respuesta; el gateway la detecta, extrae el archivo y lo envía a tu chat como imagen o adjunto. Esa validación de rutas siempre ha sido solo en el host por diseño — la entrega de medios jamás debe convertirse en un canal para leer archivos arbitrarios del sistema, así que ~/.ssh, los directorios del sistema y los almacenes de credenciales de Hermes están en la denylist y siempre se rechazan.
El problema es precisamente esa parte de “solo en el host”. Cuando tu terminal backend es ssh, Modal, Daytona, Singularity o un sandbox de Vercel, los comandos de terminal del agente se ejecutan en otra máquina — otro sistema de archivos. El archivo que hay detrás de MEDIA: simplemente no está en el host del gateway; la validación falla y el adjunto se descarta como “ruta insegura”. El archivo se generó correctamente; el gateway simplemente no podía alcanzarlo.
La corrección: entrar en el sandbox y traer el archivo de vuelta
El PR #103600, fusionado el 5 de septiembre de 2026 (la mitad saliente del issue #466), cambia eso. La idea es sencilla: cuando la validación en el host falla pero la sesión actual se está ejecutando realmente dentro de un sandbox remoto, el gateway ahora recupera el archivo a través del exec channel y lo somete al flujo de entrega normal.
Funciona en tres capas:
- Transporte (
tools/environments/base.py): cada entorno backend ganó unfetch_file/fetch_realpathuniforme — el archivo se codifica en base64 y se envía de vuelta por el exec channel, con un límite de tamaño dentro del sandbox (head -c max+1, el mismo truco que usatools.image_sourcepara que una secuencia infinita como/dev/zerono pueda inundar la memoria del host), y con marcadores de payload que aíslan el ruido del shell de login. - Disparador (nuevo
gateway/media_fetch.py, ~120 líneas): solo se activa cuando hay un backend remoto activo y la validación en el host ya ha fallado — un backend local nunca toma este camino. - Gancho (
gateway/platforms/base.py::_validated_delivery_path): una adición de tres líneas, el único punto de control compartido por todos los sitios de filtrado de MEDIA — una sola corrección, efectiva en todas partes.
Límites de seguridad: esto no es una puerta trasera a la denylist
Recuperar archivos de un sandbox remoto es exactamente el tipo de función que podría convertirse en una forma de saltarse la denylist, así que la ruta se examina dos veces: primero con la misma denylist del host (prefijos del sistema, directorios tipo ~/.ssh, almacenes de credenciales de Hermes) antes de que se mueva un solo byte, y después de nuevo cuando readlink -f resuelve la ruta real — un symlink que apunte a un archivo de credenciales se rechaza de plano, sin transferir ni un byte. Los archivos que pasan se copian en cache/documents/ (una raíz de entrega de por sí en la allowlist) y luego se validan y entregan exactamente igual que cualquier archivo del host. El límite es de 50MB, en línea con el límite de subida de cada plataforma.
¿Quieres recuperar el comportamiento anterior? Bajo el strict mode HERMES_MEDIA_DELIVERY_STRICT, los archivos remotos no se recuperan nunca — una copia recuperada aterrizaría en una raíz de la allowlist y podría saltarse la compuerta de novedad para la que existe el strict mode, así que el strict mode mantiene las cosas como estaban.
Qué configuraciones se benefician
Cualquier terminal backend remoto — ssh, Modal, Daytona, Singularity, sandbox de Vercel — ahora entrega los archivos que el agente crea allí y referencia con una etiqueta MEDIA:: capturas de un scraper que se ejecuta en el sandbox, gráficos de un script de análisis de datos, informes escritos tras una tarea larga. Cualquier cosa que le hayas pedido al agente que “guarde y te envíe”. Los backends locales se comportan exactamente igual que antes — nunca necesitaron recuperación.
Un límite honesto: los backends que pueden informar de su directorio home remoto (_remote_home, p. ej. ssh, Daytona, Vercel) reciben soporte completo; Modal, Singularity y Docker sin mounts del host no pueden confirmar el home remoto, así que conservan la denylist conservadora de cualquier componente — los archivos bajo prefijos del sistema como /root todavía no se recuperan allí por defecto, salvo que el entorno establezca explícitamente _remote_home para optar por ello.
Qué falta todavía
Esto aterriza solo la mitad “saliente” de #466. El PR excluye deliberadamente: una herramienta principal send_file independiente (la etiqueta MEDIA: existente es la interfaz — peldaño 1 de la footprint ladder), transports nativos por backend e inyección entrante de adjuntos al sandbox (aún abierta en #466). Todo eso sigue la footprint ladder y se publica de forma incremental, no de golpe.
Cómo obtenerlo
No hay un comando nuevo ni una configuración nueva — es una corrección de comportamiento del gateway; se activa al actualizar. El cambio está fusionado en main (2026-09-05) y todavía no está en ninguna etiqueta de release; ejecuta una instalación dev/main para probarlo ahora, o simplemente hermes update cuando llegue la próxima release. Una forma rápida de verificarlo después: dentro de un sandbox remoto, pide al agente que genere una imagen y “te la envíe” — debería llegar; luego crea un symlink que apunte a ~/.ssh y confirma que sigue rechazándose. Las dos revisiones cumpliendo su función.
Para más sobre sandboxes y backends, consulta nuestras guías anteriores sobre contenedores Docker compartidos y terminal backends conectables; el ritmo de publicaciones está en la página de releases.