v0.21.6

Hermes Agent v0.21.6


Resumen

v0.21.6 — el primer tag cortado por el nuevo pipeline de releases estables. Publicada el 8 de octubre de 2026. Desde la v2026.9.24 (versión semántica v0.21.5): 8.867 commits sin merge · 8.342 archivos modificados (+772.490 / −225.600) · 2.106 PR fusionados · 3.027 incidencias cerradas, medido en el commit 818c13be1dc4fd28987e1e881a9408224afd4535.

Lo que es distinto aquí no es el contenido, sino cómo se produce el release: es la primera versión cortada por el nuevo pipeline de releases estables, y su forma es «un attempt ref, una imagen Docker probada y un tag de comprobante al publicar». En términos llanos: el propio attempt de release carga con la build y los tests, la imagen se publica solo cuando pasa, y el comprobante de esa publicación queda registrado en el tag — los consumidores posteriores reciben un artefacto ya probado, en lugar de un tag desde el que construyen después.

Este release solo incluye tres cosas: el tag, esta GitHub release y la imagen Docker. La app de escritorio, los paquetes de Termux y la Microsoft Store se quedan en su build actual y se mueven con el próximo release empaquetado.

El comunicado oficial dice explícitamente que las notas completas y curadas llegan con la v0.22.0, que documentará todo desde la v0.21.0 en adelante — destacados, áreas funcionales y créditos completos de contribuidores — y que nada de esta ventana se queda fuera. Hasta entonces, esta página deja constancia de qué es el tag, además de los cambios que ya corren en tu máquina.


Destacados

1. Un pipeline de releases estables cuyo artefacto se probó

Este es el cambio que más fácilmente se pasa por alto y con mayor efecto en cadena. Antes, un tag era el pistoletazo de salida: la imagen, los despliegues alojados y los paquetes de Nix se construían cada uno por su cuenta después. Ahora el orden está invertido — primero un attempt de release, que carga con la build y los tests, luego la imagen Docker cuando pasa, y después un comprobante registrado en el tag. El beneficio práctico: nousresearch/hermes-agent:stable apunta a una imagen que se probó antes de publicarse. Para confirmar qué tienes, mira el digest de la imagen, no la hora de la descarga que recuerdas.

2. Tres grupos de correcciones de seguridad (destacados por separado en este release)

  • Endurecimiento de la autenticación del dashboard (PRs #133367, #133369, #133370, más el session takeover #130685). Cuatro problemas reportados juntos por Tenable Research (TRA-725 … TRA-728): un X-Forwarded-For falsificado podía reiniciar el límite de intentos del login por contraseña y saltarse el tope por IP; las solicitudes de login no autenticadas podían escribir valores sin límite en el log de auditoría; las rutas públicas /auth/ no tenían límite de tamaño del cuerpo de la solicitud; el inicio de sesión nativo podía enviar códigos de login a una redirección que no era de loopback, lo que permitía el session takeover.
  • Endurecimiento del filtro git del repositorio (#130661). Las llamadas automáticas a git (instantáneas del workspace de la sesión, worktrees de subagentes, kanban, limpieza de worktrees, hermes -w) podían ser secuestradas por programas de filtro clean / smudge / process definidos en la propia configuración de un repositorio no fiable, antes de tu primer prompt.
  • Endurecimiento del remitente en el gateway de correo (#125212, #124322). Un nombre para mostrar entre comillas en la cabecera From podía manipularse para parecer un remitente incluido en la lista de permitidos, dejando que el mensaje de un atacante superara la allowlist de correo.

3. Voz: los turnos hablados tienen su propio modelo, y el escritorio recibe un segundo modo

  • Un modelo de voz dedicado: el nuevo slot auxiliary.voice_chat (provider / model / reasoning_effort) solo sustituye el modelo que responde al turno hablado; escribir sigue usando el modelo de la sesión. Se aplica a la voz de CLI/TUI, a la conversación de voz del escritorio y a las notas de voz en las plataformas de mensajería, con el uso registrado bajo voice_chat. Configúralo en Ajustes → Modelos → Modelos auxiliares en el escritorio, o bajo hermes model → Modelos auxiliares.
  • Los turnos de voz vienen con el razonamiento desactivado por defecto, incluido cuando el slot se queda en auto y responde el modelo de la sesión; un modelo que no puede desactivar el razonamiento baja a su nivel más bajo aceptado, y una negativa en tiempo de ejecución se recuerda.
  • Modo full-duplex del escritorio: voice.voice_chat_mode: gpt-live sustituye toda la cadena STT → turno → TTS por un único modelo de voz full-duplex que gestiona él mismo las interrupciones y el ruido de fondo, no tiene herramientas y delega cada petición real al modelo de la sesión. Necesita una key directa de OpenAI (voice.gpt_live.api_key / OPENAI_API_KEY / VOICE_TOOLS_OPENAI_KEY) y factura la capa de voz a 0,05 $ por minuto de tiempo de sesión (el tiempo en reposo cuenta). Solo para el escritorio; /voice de CLI/TUI se queda en el bucle encadenado.

4. Una sola puerta para el enrutado de imágenes: imágenes MCP, capturas de computer_use, capturas del navegador

  • El ImageContent de una herramienta MCP antes solo volvía como MEDIA:/path, así que ni siquiera un modelo capaz de visión recibía píxeles (un servidor cua-driver en crudo no podía ver la pantalla en absoluto). Cuando la ruta activa acepta imágenes dentro de los resultados de herramienta, el handler del registro devuelve ahora un sobre multimodal: la imagen viene de la propia escritura en caché de esta llamada, se recodifica, se ajusta a vision.embed_target_bytes (256 KiB por defecto, acotado 64 KiB–4 MiB) y a un techo de 1.568 px, como máximo 4 por resultado, mientras la mitad de texto conserva sus rutas MEDIA:.
  • tools.vision_tools._native_tool_result_images(provider, model, cfg) es ahora la única puerta, compartida por vision_analyze, las capturas del navegador, las capturas de computer_use y las imágenes de MCP. Las capturas de computer_use antes ignoraban agent.image_input_mode y se enviaban en nativo incluso en modelos solo de texto.
  • Conlleva dos comportamientos de seguridad: se eliminan los caracteres TAG invisibles (U+E0000–U+E007F) de los resultados MCP (las secuencias de tag de emoji de banderas regionales legítimas se conservan), y se muestra el _meta del fabricante mientras se descartan las claves bajo prefijos reservados del protocolo (modelcontextprotocol, mcp).

5. /yolo ahora viaja con la sesión; un reinicio ya no lo descarta en silencio

/yolo antes solo cambiaba un conjunto en memoria dentro de tools.approval, así que cualquier reinicio del gateway devolvía ese chat en silencio a las aprobaciones manuales mientras el usuario seguía creyendo que las estaba saltando. El flag ahora vive en la entrada de enrutado del chat (SessionEntry.yolo, persistido en gateway_routing), cada turno rearma el flag en vivo desde la entrada resuelta, y se conserva a través de las compactaciones y los repoints de binding. Al mismo tiempo, /new, /resume, /branch y el auto-reset borran ambas copias, la persistida y la de memoria — un reinicio nunca puede revivir un bypass que quitaste. La antigua afirmación de la documentación de que /yolo define HERMES_YOLO_MODE se corrigió: esa variable de entorno es una vía de activación aparte.

6. También en la ventana (nombrados por el comunicado oficial, todavía sin cubrir aquí)

Transcripción en vivo mientras hablas en CLI, TUI y escritorio; modelos favoritos y fijados en la parte superior del selector del escritorio, un chip de uso antes de que una suscripción toque su límite, y providers con límite de velocidad que explican por qué y hasta cuándo; modelos locales en hermes model más llama.cpp CUDA en Linux x64 y arm64; paquetes de idioma por capas conectables en core, escritorio y TUI; un hermes status con el resumen primero; un selector de alcance del diff en el panel de revisión (Uncommitted / Branch / Last turn); avisos de cron, doctor y canal de inicio cuando el almacén de cron deja de ser escribible; activate.fish; una definición unificada del flujo de trabajo de Kanban; y GPT-6.1 Sol más Claude Sonnet 5.5 / Haiku 5.5 en los catálogos.

Mejoras

  • La resolución de nombres de plugins se redujo a un único resolutor (_find_plugin_entry): key canónica o nombre de manifest, luego un leaf desnudo único, y después el nombre de catálogo resuelto a través del propio registro del instalador (.install-metadata.json) — y falla ante la ambigüedad en lugar de adivinar. Las entradas cuyo nombre de catálogo difiere del de su manifest (17 de 484, p. ej. hermes-memory-wiki → memory-wiki, touchdesigner → td) ya funcionan con enable / disable / show / capabilities / update / remove. En el escritorio, encender un paquete de dos mitades pasó de tres pasos a un solo interruptor.
  • Desarrollo de plugins de escritorio: un checkout con symlink (ln -s ~/src/my-plugin ~/.hermes/plugins/my-plugin) ahora se reconoce y controla su mitad de escritorio, la copia se resincroniza ante cualquier diferencia de bytes y vigila el archivo de origen para la recarga en caliente, y hermes plugins doctor <id> nombra una copia obsoleta y cómo refrescarla.
  • Ambos se fusionaron después de cortarse este tag, así que son solo de main: las instalaciones por git que siguen main los tienen; las instalaciones sobre el tag (imágenes Docker incluidas) los recibirán con el próximo tag.

Actualización

# CLI (instalaciones por git)
hermes update

# Docker / Hermes Cloud
# nousresearch/hermes-agent:stable (o :latest)

# App de escritorio y Termux
# sin cambios en este release; se mueven con el próximo release empaquetado

Después de actualizar, dedica un minuto a confirmar qué obtuviste realmente: hermes version (las instalaciones por git también informan la distancia hasta el tag y el commit corto), y el digest de la imagen si usas Docker.

← Hermes Agent Changelog