v0.21.1

Hermes Agent v0.21.1


Visão Geral

v0.21.1 — The Consolidation Release. Lançada em 7 de setembro de 2026. ~5.139 commits · ~4.364 arquivos alterados (+601.014 / −768.419) · ~632 PRs mesclados desde a v0.21.0.

Esta janela não tem um único recurso de destaque — é uma passada de consolidação, e a maior história é invisível: o codebase foi decomposto e enxugado em ~34% das linhas de código-fonte com zero mudança de comportamento (#102117). Em torno dessa limpeza profunda, o trabalho voltado ao usuário se concentra onde usuários avançados realmente sentem: a delegação ficou mais rápida e mais segura (os resultados chegam no instante em que cada subagent termina, e filhos podem devolver processos em segundo plano em execução para você), servidores MCP agora podem autorizar com device codes em máquinas sem browser para abrir, os pins do provider OpenRouter viraram por-model e os seletores de modelo atualizam a cada 20 minutos, o search_files local roda ripgrep nativo até 6× mais rápido, a compaction mantém o cache de prefixo entre rebuilds em sessões de codificação, e o cron parou de deixar ticks silenciosos apagarem a continuity, revelando enfim quando um job disparou tarde.

Este é um patch release: as notas oficiais são breves, e a documentação curada completa chega com a v0.22.0. Esta página cobre as partes mais valiosas da janela.


Destaques

1. A limpeza profunda: −34% de LOC do código-fonte, zero mudança de comportamento

A maior história interna da janela é uma simplificação de todo o codebase (#102117, mesclada em 4 de setembro): 1.063.826 → 698.363 LOC de código-fonte (−34,4%). Todos os god files foram decompostos — 37 arquivos acima de 5.000 linhas viraram 6; o gateway/run.py caiu de 34.847 para 5.512 linhas, e o cli.py, de 22.426 para 4.656; funções acima de 300 linhas caíram de 192 para 2, e a pior complexidade ciclomática, de 1.075 para 84. Os arquivos antigos permanecem como entry points públicos enxutos, e o comportamento é inalterado: os schemas JSON das tools, o texto do system prompt, os defaults de config e os wire formats são byte-idênticos, verificados por execuções de paridade da suíte completa. O que você ganha como usuário é um codebase mais barato para um agente navegar, mais rápido de carregar e mais fácil de manter — sem mudanças de config ou de comando do seu lado.

2. delegate_task: os resultados chegam no instante em que cada filho termina

Fan-outs em segundo plano não esperam mais o subagent mais lento. O delegate_task agora retorna o resultado de cada tarefa por conta própria assim que essa tarefa é concluída, e tarefas que compartilham uma string group opcional por tarefa retornam juntas numa única mensagem (#104299):

{
  "tasks": [
    { "goal": "check api latency", "group": "bench" },
    { "goal": "check db latency",  "group": "bench" },
    { "goal": "scan the changelog" }
  ]
}

As duas tarefas bench reportam numa única mensagem agrupada; a varredura do changelog chega sozinha no instante em que termina — chega de esperar horas para um filho travado liberar os outros resultados. Tarefas sem grupo ocupam cada uma a própria unidade, mas a chamada inteira continua contando como uma única slot contra delegation.max_concurrent_children.

3. Filhos devolvem processos em execução ao pai

Um subagent agora pode transferir um processo em segundo plano de longa duração para você antes de sair: process_manage(action="handoff", session_id=<id>, data="<purpose>") passa a posse ao pai, e o aviso de conclusão cai na sua conversa, com o propósito anexado (#105125). Tudo o que um filho deixar para trás é reportado explicitamente como encerrado no aviso de delegação do pai, em vez de ser morto silenciosamente, e o filho é avisado de antemão que o seu notify=true não é uma promessa — chega de orquestradores esperando horas por uma conclusão que nunca vai chegar.

4. Logins MCP sem browser: device codes

Servidores MCP que suportam RFC 8628 agora podem autorizar a partir de um terminal, sem nenhum listener de callback de browser (#104891) — o fluxo que costumava te obrigar a uma máquina com browser agora funciona em qualquer host headless:

hermes mcp login <server> --flow device

O Hermes descobre o device endpoint anunciado pelo servidor, imprime a URI de verificação e o user code, e faz polling até você aprovar em qualquer device. oauth.flow: device na config do seu servidor MCP torna o device flow o default para login e reauth (browser PKCE continua sendo o default geral; --flow browser sobrepõe a config para um único login). Grants negados ou expirados nunca substituem credenciais existentes.

5. Pins do OpenRouter por modelo + seletores sempre frescos

provider_routing.models.<model-id> agora fixa um conjunto diferente de providers do OpenRouter por modelo, para que as regras de roteamento não possam mais enviar silenciosamente um modelo a um provider que você não escolheu (#104159):

provider_routing:
  sort: price
  models:
    "openai/gpt-6-astra":         { only: [openai] }
    "anthropic/claude-fable-5.1": { only: [anthropic] }

A entrada por-model é aplicada no único ponto de estrangulamento pelo qual todo caminho de requisição já passa, então CLI, gateway, desktop, cron, /model e filhos delegados respeitam a regra. Enquanto isso, o seletor /model deixou de ficar obsoleto: os catálogos agora atualizam a cada 20 minutos (antes, um TTL de 1 hora), e um background loop do gateway os mantém aquecidos mesmo quando ninguém abre o seletor (#101319). O provider Meta Model API agora trata a resposta ao vivo de /v1/models como catálogo autoritativo, excluindo prefixos fora de chat como muse-image-* e muse-voice-* (#101503).

6. Operações locais de arquivo e busca ficaram muito mais rápidas

O search_files num host POSIX local agora roda ripgrep como um subprocess direto, em vez de dois spawns de bash por chamada (#104502): buscas de conteúdo caem de ~85 ms para ~15 ms, e buscas por nome de arquivo, de ~73 ms para ~12 ms (latência de tool 5–6× menor, resultados idênticos; HERMES_NATIVE_FILE_READ=0 restaura o caminho via shell). Duas vitórias companheiras mantêm a conta de tokens baixa em sessões longas de codificação: os rebuilds de compaction agora fixam o snapshot do workspace de codificação por sessão, em vez de re-sondar o git status toda vez, mantendo o cache de prefixo do prompt intacto através das fronteiras de compaction (#104455); e subagents concluídos liberam seus transcripts do heap do pai, com o conteúdo de subagents excluído do índice FTS de trigramas (schema v30) — uma execução com 1.320 filhos deixava antes um heap de 1,9 GB no pai e 1 GB de shadow tables para trás (#102032).

Melhorias

  • Startup: o hermes serve — o comando que o desktop dispara em todo cold start — despacha por um parser enxuto standalone e pula a construção da árvore argparse de ~40 subcomandos (caindo de volta no parser completo para help, flags desconhecidas e roteamento de container) (#101265).
  • Visibilidade do cron: o hermes cron list agora imprime uma linha Dispatch: por job, e o hermes cron status ganhou um aviso de jobs atrasados — assim, uma execução de catch-up após missed fire mostra ⚠ catch-up after missed fire em vez de se passar por um sucesso pontual (#100445).
  • Config de delegação: um filho delegado fixado a um provider/modelo não é mais reroteado silenciosamente pela cadeia de fallback do pai em caso de falha; delegation.fallback_providers dá aos filhos a própria cadeia ([] desativa; ausente herda quando não há pin) (#105347). Filhos também não herdam mais o tier de prompt cache de 1 hora do pai — subagents escrevem no tier de 5 minutos que de fato usam, evitando um preço 2× de escrita de cache por uma retenção que nunca coletam (#104168).
  • Higiene de tokens: o write_file agora sinaliza uma reescrita de arquivo inteiro que em grande parte reenvia o que já está em disco (≥20 mil caracteres, ≥80% de linhas inalteradas), orientando o agente ao patch para edições pequenas — 661 dessas escritas (~24,9M de caracteres, ≈$155 em tokens de saída) foram capturadas numa única execução de refatoração (#103551).
  • Desktop: os timestamps dos transcripts voltaram a ser legíveis nos dois temas, e um novo slider Message Bubble (Settings → Appearance) controla a opacidade da sua bolha, de sólida a apenas contorno (#103146).

Correções

  • As regras de approvals.deny agora são aplicadas dentro de sandboxes Docker/cloud isoladas — antes elas pulavam o fast path do container, então uma lista de negação podia ser contornada com um shell em sandbox até sob --yolo ou approvals.mode: off; o hermes approvals test espelha a ordem corrigida (#103649).
  • Cron: ticks silenciosos de monitor/script-gated não substituem mais o contexto útil de continuity por um stub vazio — a seleção de saída percorre os arquivos do mais novo ao mais antigo e pula documentos vazios/silenciosos, mantendo documentos de erro elegíveis para recuperação (#104877). Os stores de incidentes e de notepads do cron também sobrevivem a upgrades que deixam um módulo de execução antigo em cache (#104939).

Atualização

hermes update

Depois de atualizar, rode hermes doctor para verificar a instalação e reinicie o gateway (hermes gateway) para que as mudanças de plataforma entrem em vigor. O refactor estrutural mantém cada entry point público no lugar, então plugins e configs de terceiros são preservados sem alteração. Para ver o que a próxima atualização vai tocar antes de executá-la: hermes update --plan.

← Hermes Agent Changelog