Backends de sandbox
Responsabilidad
El agent necesita ejecutar comandos y correr código, pero no puede permitir que comandos arbitrarios caigan directamente en la máquina host. La herramienta de terminal de Hermes soporta 6 backends de ejecución, elegidos según el balance seguridad/aislamiento/coste: Local (directo en host), Docker (aislamiento por contenedor), SSH (máquina remota), Singularity (contenedor HPC), Modal (sandbox en la nube, direct o managed), Daytona (entorno de desarrollo en la nube). Endurecimiento de contenedor + aislamiento por namespace; los comandos peligrosos, además, los intercepta un callback de aprobación.
Archivos clave
cabecera de terminal_tool:1-15— enumera los seis backends local / docker / modal / ssh / singularity / daytonadetección de acceso al host en Docker:260-290—_docker_volume_uses_host_path/_docker_has_host_access(detecta si un bind mount expone rutas del host)import de Singularity / Modal:65-90—_get_scratch_dir(de environments/singularity)environments/singularity.py— directorio scratch de Singularity y caché SIFresolución de modo Modal:77-137—coerce_modal_mode/has_direct_modal_credentials/resolve_modal_backend_state(direct vs managed)_DEFAULT_BROWSER_PROVIDER:12— el provider por defecto es localcallback de aprobación del subagente:75-103—_subagent_auto_deny/_subagent_auto_approve(control de comandos peligrosos ejecutados dentro del sandbox)tools/daemon_pool.py— pool de hilos residente del subagente (aloja la ejecución en sandbox)directorio tools/— terminal / close_terminal / read_terminal / tool_backend_helpers / environments/
Flujo de datos
- El agent decide ejecutar un comando →
tool_call terminal→tools/terminal_tool.py. - Se elige el backend según la configuración del job (local/docker/modal/ssh/singularity/daytona):
local: ejecución directa en host (lo más rápido, por defecto)docker:tools/terminal_tool.py:260detecta si un bind mount expone rutas del host y decide los permisos en consecuenciamodal: víatools/tool_backend_helpers.py:102se resuelve si es direct (credenciales propias del usuario) o managed (gestionadas por el gateway)singularity: víatools/environments/singularity.pyprepara scratch y SIFssh/daytona: entorno remoto / en la nube
- Los comandos peligrosos los intercepta un callback de aprobación: el bucle principal usa aprobación interactiva; los subagentes por defecto auto-deny (
tools/delegate_tool.py:75); cron/batch puede opt-in a auto-approve. - La salida del comando se devuelve al bucle principal; las tareas largas se pueden pasar a background (
tools/daemon_pool.py).
Resumen
La capa de sandbox es «aislamiento de ejecución + control de comandos peligrosos»: 6 backends cubren desde host hasta HPC hasta nube; Docker detecta bind mounts para evitar escalado; Modal distingue credenciales direct/managed; los comandos peligrosos pasan todos por un callback de aprobación. Los subagentes y el cron siguen la ruta no interactiva de auto-deny/auto-approve.