v0.21.6

Hermes Agent v0.21.6


Visão Geral

v0.21.6 — a primeira tag produzida pelo novo pipeline de releases estáveis. Lançada em 8 de outubro de 2026. Desde a v2026.9.24 (versão semântica v0.21.5): 8.867 commits não-merge · 8.342 arquivos alterados (+772.490 / −225.600) · 2.106 PRs mesclados · 3.027 issues fechadas, medidos no commit 818c13be1dc4fd28987e1e881a9408224afd4535.

O que é diferente aqui não é o conteúdo, mas como a release é produzida: esta é a primeira versão gerada pelo novo pipeline de releases estáveis, e o seu formato é “uma ref de tentativa, uma imagem Docker testada e uma tag de recibo na publicação”. Em palavras simples: a própria tentativa de release carrega o build e os testes, a imagem só é publicada depois de passar, e o recibo dessa publicação fica registrado na tag — os consumidores downstream recebem um artefato que foi testado, em vez de uma tag que eles constroem depois.

Apenas três coisas são entregues com esta release: a tag, esta GitHub release e a imagem Docker. O desktop app, os pacotes do Termux e a Microsoft Store ficam no build atual e se movem junto com a próxima release empacotada.

O texto oficial é explícito de que as notas curadas completas chegam com a v0.22.0, que vai documentar tudo a partir da v0.21.0 — destaques, áreas de funcionalidade e créditos completos de contribuidores — e que nada desta janela é deixado de fora. Até lá, esta página registra o que é a tag, além das mudanças que já estão rodando na sua máquina.


Destaques

1. Um pipeline de releases estáveis cujo artefato foi testado

Esta é a mudança mais fácil de passar batido e com o maior efeito downstream. Uma tag costumava ser o tiro de largada: a imagem, as implantações hospedadas e os pacotes Nix cada um se construía depois. A ordem agora está invertida — uma tentativa de release primeiro, carregando o build e os testes, depois a imagem Docker quando ela passa, depois um recibo registrado na tag. O benefício prático: nousresearch/hermes-agent:stable aponta para uma imagem que foi testada antes da publicação. Para confirmar o que você tem, olhe o digest da imagem, não o horário do pull que você lembra.

2. Três grupos de correções de segurança (destacados separadamente nesta release)

  • Endurecimento da autenticação do dashboard (PRs #133367, #133369, #133370, além do session takeover #130685). Quatro problemas relatados juntos pela Tenable Research (TRA-725 … TRA-728): um X-Forwarded-For forjado podia zerar o rate limit de login por senha e driblar o limite por IP; pedidos de login não autenticados podiam gravar valores ilimitados no log de auditoria; as rotas públicas /auth/ não tinham limite de tamanho do corpo da requisição; e o login nativo podia enviar códigos de login para um redirect que não fosse loopback, permitindo session takeover.
  • Endurecimento dos filtros git do repositório (#130661). Chamadas git automáticas (snapshots do workspace da sessão, worktrees de subagent, kanban, limpeza de worktree, hermes -w) podiam ser sequestradas por programas de filtro clean / smudge / process definidos no próprio config de um repositório não confiável, antes mesmo do seu primeiro prompt.
  • Endurecimento do remetente do gateway de e-mail (#125212, #124322). Um display name entre aspas no cabeçalho From podia ser forjado para parecer um remetente allowlisted, deixando a mensagem de um atacante passar pela allowlist de e-mail.

3. Voz: turnos falados ganham o seu próprio modelo, e o Desktop ganha um segundo modo

  • Um modelo de voz dedicado: o novo slot auxiliary.voice_chat (provider / model / reasoning_effort) substitui apenas o modelo que responde ao turno falado; digitar continua usando o modelo da sessão. Aplica-se à voz do CLI/TUI, à conversa por voz do Desktop e às notas de voz nas plataformas de mensagens, com o uso registrado sob voice_chat. Configure-o em Settings → Models → Auxiliary models no Desktop, ou sob hermes model → Auxiliary models.
  • Os turnos de voz ficam com o raciocínio desligado por padrão, inclusive quando o slot fica em auto e o modelo da sessão responde; um modelo que não consegue desligar o raciocínio cai para o seu nível aceito mais baixo, e uma recusa em tempo de execução é memorizada.
  • Modo full-duplex do Desktop: voice.voice_chat_mode: gpt-live substitui toda a cadeia STT → turno → TTS por um único modelo de voz full-duplex que lida sozinho com interrupções e ruído de fundo, não tem tools e delega todo pedido real ao modelo da sessão. Ele precisa de uma chave direta da OpenAI (voice.gpt_live.api_key / OPENAI_API_KEY / VOICE_TOOLS_OPENAI_KEY) e cobra a camada de voz a $0,05 por minuto de tempo de sessão (tempo ocioso conta). Só no Desktop; o /voice do CLI/TUI continua no loop encadeado.

4. Um único portão para o roteamento de imagens: imagens MCP, capturas do computer_use, capturas de tela do navegador

  • O ImageContent de uma tool MCP antes voltava apenas como MEDIA:/path, então até um modelo com visão não recebia nenhum pixel (um servidor cua-driver cru não conseguia ver a tela de jeito nenhum). Quando a rota ativa aceita imagens dentro de resultados de tool, o handler do registry agora devolve um envelope multimodal: a imagem vem da própria gravação de cache desta chamada, é recodificada, dimensionada para vision.embed_target_bytes (256 KiB por padrão, limitado a 64 KiB–4 MiB) e um teto de 1568 px, no máximo 4 por resultado, enquanto a metade texto mantém os seus caminhos MEDIA:.
  • tools.vision_tools._native_tool_result_images(provider, model, cfg) agora é o único portão, compartilhado por vision_analyze, capturas de tela do navegador, capturas do computer_use e imagens MCP. As capturas do computer_use antes ignoravam o agent.image_input_mode e iam pelo caminho nativo até em modelos somente texto.
  • Dois comportamentos de segurança vêm junto: caracteres TAG invisíveis (U+E0000–U+E007F) são removidos dos resultados MCP (sequências legítimas de emoji tag de bandeira regional são preservadas), e o _meta do fornecedor é exposto enquanto chaves sob prefixos reservados do protocolo (modelcontextprotocol, mcp) são descartadas.

5. O /yolo agora viaja com a sessão; um restart não o descarta mais em silêncio

O /yolo antes virava apenas um conjunto em memória dentro de tools.approval, então qualquer restart do gateway devolvia aquele chat silenciosamente para as aprovações manuais enquanto o usuário ainda acreditava que ele as estava ignorando. A flag agora vive na entrada de roteamento do chat (SessionEntry.yolo, persistida em gateway_routing), todo turno rearma a flag ao vivo a partir da entrada resolvida, e ela é carregada através de compactação e de repontos de binding. Ao mesmo tempo, /new, /resume, /branch e auto-reset limpam tanto a cópia persistida quanto a em memória — um restart nunca pode reviver um bypass que você descartou. A antiga afirmação da doc de que o /yolo define HERMES_YOLO_MODE foi corrigida: essa variável de ambiente é um caminho de ativação separado.

6. Também na janela (nomeado pelo texto oficial, ainda não coberto aqui)

Transcrição ao vivo enquanto você fala no CLI, na TUI e no Desktop; modelos favoritos e fixados no topo do seletor do Desktop, um chip de uso antes de uma assinatura bater no limite, e providers com rate limit que dizem o porquê e até quando; modelos locais no hermes model mais llama.cpp CUDA em Linux x64 e arm64; pacotes de idioma em camadas plugáveis por todo o core, Desktop e TUI; um hermes status que começa pelo resumo; um seletor de escopo de diff no painel de review (Uncommitted / Branch / Last turn); avisos de cron, doctor e home-channel quando o store do cron fica não gravável; activate.fish; uma definição unificada de fluxo de trabalho no Kanban; e GPT-6.1 Sol mais Claude Sonnet 5.5 / Haiku 5.5 nos catálogos.

Melhorias

  • A resolução de nomes de plugins foi fundida em um único resolvedor (_find_plugin_entry): chave canônica ou nome do manifest, depois um leaf nu único, depois o nome do catálogo resolvido pelo próprio registro do instalador (.install-metadata.json) — e ele falha na ambiguidade em vez de adivinhar. Entradas cujo nome de catálogo difere do nome do manifest (17 de 484, por exemplo hermes-memory-wiki → memory-wiki, touchdesigner → td) agora funcionam com enable / disable / show / capabilities / update / remove. No Desktop, ligar um pacote de duas metades passou de três passos para um switch.
  • Desenvolvimento de plugins do Desktop: um checkout com symlink (ln -s ~/src/my-plugin ~/.hermes/plugins/my-plugin) agora é reconhecido e aciona a sua metade desktop, a cópia ressincroniza com qualquer diferença de byte e observa o arquivo de origem para hot reload, e hermes plugins doctor <id> nomeia uma cópia desatualizada e como atualizá-la.
  • Ambos foram mesclados depois que esta tag foi gerada, então são exclusivos da main: instalações via git que acompanham a main já os têm; instalações na tag (imagens Docker incluídas) os recebem com a próxima tag.

Atualização

# CLI (instalações via git)
hermes update

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

# Desktop app e Termux
# inalterados nesta release; eles se movem com a próxima release empacotada

Depois de atualizar, gaste um minuto confirmando o que você realmente recebeu: hermes version (instalações via git também reportam a distância até a tag e o commit curto), e o digest da imagem se você estiver no Docker.

← Hermes Agent Changelog