Hermes Agent v0.21.2
Overview
v0.21.2 — The state.db Patch Release. Publicada el 11 de septiembre de 2026. 947 commits no de merge · 1,869 archivos modificados (+182,504 / −15,564) · 312 PRs fusionados · 140 contribuidores desde v0.21.1.
v0.21.0 reescribió la forma en que el almacenamiento de sesiones gestiona sus conexiones, y parte de esa reescritura dejó el state.db frágil en una parte de las instalaciones: un segundo escritor podía cancelar los bloqueos del primero, una base perfectamente sana podía ser declarada corrupta y una sola fila mala bastaba para tumbar sessions list. v0.21.2 cierra toda esa clase de fallos. Seis PRs suman 44 issues cerrados y recorren capa por capa la propiedad de los bloqueos, la recuperación de WAL, las rutas de lectura y los diagnósticos, de modo que la base o bien funciona o bien falla de forma clara y concreta — nunca en silencio, y nunca llevándose la conversación por delante.
Alrededor de esa campaña, los cuatro días posteriores a v0.21.1 también dejaron un lote de refuerzos en el aislamiento entre profiles, el final de la tormenta de arranques de backends en el escritorio, una caja fuerte de credenciales que el agente puede usar sin ver jamás un secreto, un índice de plugins revisado con SHA fijado y una página Plugins unificada en el escritorio, y un nivel gratuito de Nous con un primer arranque guiado. Esta página recorre la ventana en ese orden.
Highlights
1. La campaña de fiabilidad de state.db: seis PRs, 44 issues cerrados
Cada uno de los modos de fallo que siguen se reprodujo, se corrigió y quedó con una guarda para que la misma forma no pueda volver en silencio.
- Se acabaron los segundos escritores. El gateway del profile escribía el estado de las salas gestionadas en el state.db raíz cada 5 segundos; el dashboard abría un handle de escritura al arrancar; la guarda de ciclo de vida de cron hacía un
open()a pelo contra una base viva, suficiente para cancelar los bloqueos POSIX del gateway; ydoctor --fixhacía checkpoint mientras seguía habiendo un titular vivo. Hoy las salas gestionadas viven enshared-state.db, el dashboard abre primero en solo lectura, la guarda pasa por el registro de conexiones gestionadas ydoctor --fixrechaza cualquier checkpoint que no pueda demostrar seguro (#108076). - Las bases WAL sanas ya no se quedan colgadas. Desaparecen varias formas en las que una base que funcionaba quedaba declarada muerta: un dentry
(deleted)de OpenZFS,close()compitiendo conappend_message, el pool de lectura entregando conexiones en modo journal sin confirmar, undisk I/O errortransitorio en WSL2 que hacía fallarget_sessional primer intento, y el mensaje “state.db locked” que se seguía emitiendo cuando los bloqueos ya se habían liberado (#108082). - Un índice de búsqueda corrupto ya no mata el turno. Antes, los errores que solo afectaban al índice de texto completo se trataban como corrupción de todo el archivo y el sistema fallaba cerrado. Ahora se clasifican como
fts_index: la búsqueda se degrada, el índice se reconstruye más tarde y el transcript queda intacto. El mismo PR hace quedoctordistinga con honestidad la corrupción estructural de la de índice, añade una sonda de escritura FTS que detecta la forma de índice obsoleto en la que todas las comprobaciones pasan pero todas las escrituras fallan, evita que.recoverno arranque por tablas shadow FTS5 huérfanas, recupera bases cuyo header quedó a ceros y devuelve un 503 en el polling de analítica del dashboard en lugar de 520.000 tracebacks al día (#108130). - Una sola fila mala ya no tumba
sessions list, export ni insights. Un timestamp en TEXT o una epoch de1e30hacían caer la lista entera; un marker JSON malformado hacía caerjson_extract; más de 999 ids hacían caer el borrado masivo y el prune. Ahora todos los lectores pasan porcoerce_epoch()— la fila mala se muestra como?con un WARNING que nombra la sesión — además de guardasjson_valid, listas IN troceadas e hidratación por lotes en las exportaciones (#108086). - Las sesiones ya no se atan ni leen la base de otro profile. El arranque del backend del escritorio podía fijar el
state.dbdel profile equivocado en una carrera de override de HERMES_HOME;session_searchcon un ID a pelo escaneaba en silencio todos los profiles y devolvía conversaciones de otros; la guía de recuperación apuntaba al archivo equivocado; y borrar un profile dejaba handles abiertos (WinError 32) (#108074). - Abrir state.db ya no toma un bloqueo de escritura cuando no hay nada que escribir. Un proceso
hermespuntual abriendo detrás de un gateway ocupado se quedaba atascado entre 4 y 20 segundos para luego reportar “database is locked”. Ahora tarda 0.01 segundos (#108067).
Si tu state.db ya se dañó con 0.21.0 o 0.21.1, empieza por aquí:
hermes doctor
hermes sessions recover --inspect-only
2. Aislamiento entre profiles reforzado
v0.21.2 convierte la frontera entre profiles de convención en algo aplicado: los bots de un profile secundario ya no heredan la allow-list del profile por defecto (#107616); los adaptadores ya no envían credenciales al host del profile por defecto (#107617); los servidores MCP por stdio ya no reciben los secretos de la vault del profile por defecto (#107630); la entrega de MEDIA: ya no puede arrastrar el .env / auth.json / state.db de otro profile (#107609); los callbacks de drive de Feishu y las respuestas del webhook /p/<profile>/ se quedan dentro del profile enrutado (#107620, #107626); y un profile secundario ya no recibe el bearer de Nous de un profile hermano (#107611).
Dicho de otro modo, la regla es simple: si un proceso pertenece a un profile, no puede alcanzar los archivos ni los secretos de otro profile, ni hacer peticiones con la identidad de otro.
3. Se acabó la tormenta de arranques de backends en el escritorio
Bot Mode generaba o marcaba un backend por cada profile al arrancar y en cada tick del roster; pasar el ratón por la lista de Bots generaba un backend por fila; y cambiar de profile podía generar primaries duplicados. Ahora la creación y reutilización de backends siguen un ciclo de vida explícito, el renderizado del roster no tiene efectos secundarios y cambiar de profile te deja el mismo primary en lugar de una copia nueva (#108069, #108107, #108118, #108134, #107969, #108112). Lo que notas como usuario es que un arranque en frío del escritorio ya no suena a despegue de ventiladores y a gateway ocupado a la vez.
4. Una caja fuerte de credenciales que el agente no puede ver
El agente ya puede iniciar sesión, pagar y rellenar direcciones desde 1Password, Bitwarden o la vault local de Hermes sin ver jamás el secreto; los códigos de doble factor salen de secretos de autenticador guardados, o se piden en tu propia UI (#106480, #107585). Los plugins privados de git también se instalan con credenciales guardadas (#106981). O dicho de otra forma: los secretos van de la vault directamente al sitio o al repositorio destino, y el agente solo orquesta: ve “hecho” o “falló”, nunca el texto plano.
5. Un catálogo de plugins y una única página Plugins
Los plugins ya tienen un índice revisado con fijado por SHA, con CLI, CI de admisión, documentación y dashboard (#69446). El escritorio estrena una página Plugins que gestiona en un solo sitio los plugins de agente y de escritorio — instalar, navegar el catálogo y fijar por commit sin salir de ella (#107212, #107314, #107321). Radio se publica como plugin opcional del SDK (#107072).
6. Nivel gratuito de Nous y primer arranque guiado
La inferencia y los conectores gratuitos funcionan desde el primer momento, con un login de un solo comando (#105258, #105260), y /login funciona directamente en el chat (#105261); las herramientas de conectores (Gmail, Linear, Notion y otras) se pueden descubrir con tool_search (#106842); y con HERMES_GUEST_ONBOARDING=1 configurado, el primer arranque se convierte en un flujo guiado que deja cuentas, conectores y modelos listos antes de la primera conversación (#107697, #107958, #107985, #108211).
export HERMES_GUEST_ONBOARDING=1
Improvements
v0.21.2 es una versión de parche: los cambios que siguen no son titular, pero pertenecen al mismo trabajo de conseguir que state.db deje de mentir.
- Orden de reconstrucción y publicación: un state.db recién creado ya no publica sus tablas FTS antes de tomar el bloqueo de reconstrucción (#106311).
- Generaciones WAL y salida: los handles que perdieron una generación WAL ya no hacen checkpoint de frames obsoletos al salir (#106315, #106840), y una base que no se puede verificar se deja intacta durante la inicialización del WAL (#106568).
- Cuarentena en lugar de apertura destructiva: una base cuyo header fue sobrescrito se pone en cuarentena junto con su WAL en vez de abrirse de forma destructiva (#106587), y los handles en cuarentena rechazan VACUUM y FTS optimize (#106343, #106349).
Fixes
- Gateway y plataformas: una clave
display:suelta en config.yaml ya no hace caer cada turno (#106305); los mensajes finales de carril en cola que la plataforma rechaza se registran y se reenvían (#106316); un envío de WebSocket atascado ya no bloquea todos los eventos que van detrás (#106581); el primer turno ya no espera a la sonda de la toolchain de Python (#106556); conbots_require_mentionactivado, los bots de Telegram deben ser mencionados con @, lo que corta el ping-pong entre bots (#106534); Matrix renderiza LaTeX (#106515); Signal renderiza tablas Markdown (#106538); las respuestas de WhatsApp conservan la cita en mensajes de ver una sola vez (#106541); las respuestas solo de medios reportan SUCCESS en todas las plataformas (#106557). - Providers y routing:
/modely el enrutado automático auxiliar ya no pueden facturar a un provider que no elegiste (#107366); Hermes nunca cae en silencio a un provider sin credenciales (#107281); los modelos Bedrock Claude/Converse/Mantle sobreviven a/model, al fallback y a la recuperación (#107621, #107658); las Bedrock Guardrails se aplican de verdad (#107815); un 400 de imagen por presupuesto de patch en Codex se reintenta con la imagen reducida (#106525); un provider primario sin permisos más fallback ya no oscilan (#106549); el razonamiento de replay rechazado por Azure Foundry se clasifica y se recorta (#106718); un refresh de OAuth de MCP ya no borra el refresh token (#106185); el cliente de Anthropic envía exactamente una credencial (#107978); DeepSeek V4.1 Flash se suma a los selectores de Nous Portal y OpenRouter (#107489); OpenAI y FAL soportan GPT Image 2.5 (#105988); Opus 5 y Fable 5.1 se suman al selector nativo de Anthropic (#106636). - Bucle del agente y compactación: un callback periódico bloqueado ya no frena el refresco del lease (#106308); un
/steerdentro de un turno se guarda como su propia fila de usuario (#106317, #106344); los rechazos por límite de memoria en inferencia local hacen backoff en vez de compactar el historial (#106307); un desbordamiento de contexto tras un streaming parcial cierra el turno (#106567); las continuaciones por longitud se detienen cuando el texto anterior ya llenó la ventana (#106571); la compactación ya no expira en silencio en los reintentos de aux (#106866); las claves demodel_thresholdspueden cualificarse por provider (#108061); cambiar entre escritorio y TUI ya no reconstruye el system prompt, lo que preserva el prompt cache (#105844); la CLI mantiene un sidecarapi_contentpara que incluso la persistencia temprana conserve la caché (#105842). - CLI, TUI y escritorio:
hermes -z --resumereanuda la sesión (#106313); las teclas extendidas llevan Shift+letra y Cmd+Shift+Z a las terminales (#90674, #105493); los timeouts debrowser_execmatan todo el árbol de procesos (#106589); la comprobación de actualizaciones consulta la API de GitHub una vez al día en lugar de hacer un git fetch cada 30 minutos (#107648);hermes updateexplica el motivo real y ya no se atasca en el fetch (#108053); en el escritorio, el idioma de la UI sobrevive al reinicio de una actualización (#106476), las autorizaciones OAuth caducadas tienen re-login de un clic (#106965), el modo HUD vuelve a mostrar la conversación y siempre devuelve la ventana (#107491, #107423), el backend sale cuando sale su proceso padre del escritorio (#107977), las actualizaciones en Windows dejan de reportar fallos falsos (#106175, #107183), WSLg renderiza sobre GPU de Windows (#106528) y la configuración rápida por QR de Telegram llega portada desde el dashboard (#107242). - Cron y Kanban: un “run now” a destiempo ya no cancela la siguiente ejecución programada (#106306); una ejecución manual asesinada ya no bloquea el siguiente hueco de 5 minutos (#106733); una tarea cambiada de puntual a recurrente sigue disparándose (#106532); las tareas sin modelo fijado ejecutan el modelo capturado en su creación (#106499);
--clone-allya no copia tareas de cron (#106478);kanban promoterechaza una tarea padre sin terminar (#106550);kanban_request_reviewrechaza un reviewer profile desconocido (#106547). - Herramientas y memoria: un servidor MCP por stdio que muere a mitad de llamada ya no reproduce la llamada a la herramienta (#106546); una revisión en segundo plano solo de skills ya no puede borrar entradas de memoria (#106310); las memorias de mem0 ya no pierden turnos largos (#106542);
tool_searchdevuelve vacío antes que cinco herramientas sin relación que comparten una palabra (#106676); el sudo remoto con NOPASSWD ya no pide aprobación (#107939); las lecturas de RSS y Reddit ya no vienen activadas por defecto (#105873). - Mantenimiento: las copias de config.yaml se consolidan en un único directorio acotado
backups/config/(#106388);hermes backupsolo conserva los 3 zips más recientes (#106455);hermes setup --resethace copia de la configuración real (#106453); la retención dedebug shareen la vía de respaldo de dpaste baja a 1 día (#106531).
Upgrade
Las instalaciones existentes se actualizan en el sitio:
hermes update
Instalaciones nuevas:
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
Los despliegues gestionados deberían actualizarse con sus propias herramientas de despliegue usando el nuevo tag.
Si el state.db ya se dañó con 0.21.0 o 0.21.1: ejecuta primero hermes doctor — ahora separa correctamente la corrupción estructural de la de índice — y cuando reconstruir no basta te señala hermes sessions recover --inspect-only (acotado al profile).
El diff completo está en v2026.9.7…v2026.9.11.
← Hermes Agent Changelog