Hermes Desktop fecha o ciclo: o navegador integrado chega e o agente finalmente consegue ler a página que abriu

Em 5 de agosto de 2026, o Hermes Agent juntou duas atualizações consecutivas que preenchem o último blind spot do desktop:
- PR #77705 — o navegador integrado e a preview rail viraram abas reais da layout tree
- PR #79482 — uma nova ferramenta
read_previewpermite que o agente leia o conteúdo da página atualmente aberta no navegador integrado
Em uma frase: o agente sempre conseguiu “abrir” uma página web, mas não conseguia ver a página que abria — agora ele consegue ler. Para quem desenvolve com o Hermes Desktop, isso completa o ciclo de “gerar UI → abrir preview → inspecionar o resultado → corrigir você mesmo”.
Este artigo não repete as notas dos PRs. Ele mergulha nos detalhes técnicos das duas mudanças, nos trade-offs de design por trás delas e em como usá-las na prática.
Contexto: o agente abria páginas “no escuro”
Uma olhada rápida na evolução das ferramentas torna óbvio o valor desses dois PRs:
- 22 de julho (PR #69519):
open_preview(url[, label])efocus_pane(...)foram lançados. Pela primeira vez, o agente podia abrir ativamente uma URL, um servidor de desenvolvimento localhost ou um arquivo local no painel de preview do desktop. Mas repare: ele só conseguia abrir — o conteúdo da página era uma caixa-preta. - Mais ou menos na mesma época,
read_terminal/close_terminalpermitiam que o agente lesse o que era exibido no painel do terminal embutido — mas o lado web nunca ganhou sua contraparte de “leitura”. - 5 de agosto: os dois PRs chegaram juntos — o refactor da aba do navegador mais a ferramenta
read_preview.
Nas palavras do próprio mantenedor: open_preview abria uma página e read_terminal lia o terminal, mas “o que esta página diz?” não tinha resposta. read_preview fecha essa lacuna.
Atualização 1: o navegador integrado vira uma aba de primeira classe
Antes do PR #77705, a preview rail do desktop era uma cidadã de segunda classe na UI:
- Ela renderizava sua própria barra de abas separada, com altura diferente, menu de fechar próprio e capitalização própria nos rótulos
- Tinha comportamento próprio de ⌘W, soldado à zona do file browser (o ⌘J arrastava a preview junto)
- Os toggles de Console/DevTools ficavam pendurados na titlebar, e o estado deles era dirigido por click handlers — fechar a janela do DevTools diretamente deixava o botão preso em “ligado”
O refactor a traz completamente para dentro da layout tree:
- As abas de preview agora são tiles da layout tree:
$previewTabsespelha as contribuições de painel pela mesma sessãopaneMirrorque os route tiles usam. Barra de abas, arrastar, empilhar, dividir, verbos de fechar compartilhados, ⌘W simples — o que a área principal tem, a preview também ganha. - Abas de URL são intituladas “Browser” — a aba nomeia a superfície, não a página. Semântica mais limpa.
- ⌘W / ⌃Tab agora funcionam nas zonas de preview e de página: antes, ⌘W sobre uma preview isolada esvaziava o chat principal. Corrigido.
- Arrastes de sessão podem agora cair nas zonas de preview/página — a assimetria do drag-in acabou.
- O estado do DevTools é dirigido por eventos: o glyph é dirigido pelos eventos
devtools-opened/closedda webview, então fechar a janela do DevTools diretamente não deixa mais um estado “ligado” obsoleto. - Bônus: as chaves i18n duplicadas e todo o código independente da rail foram deletados — redução líquida de código.
Nota técnica: a própria barra de abas foi abstraída em um conjunto de primitivas compartilhadas (PaneTabStrip, PaneStripGlyph/PaneStripTool, paneTabCloseItems), com os glyphs contribuídos como dados, do mesmo jeito que as ferramentas da titlebar. Tipos futuros de preview ganham a experiência unificada de abas de graça.
Atualização 2: read_preview — os olhos do agente
O PR #79482 é o núcleo funcional: uma nova ferramenta read_preview que espelha o read_terminal de ponta a ponta. Nenhuma maquinaria nova — apenas um segundo consumidor da forma existente:
Camada de tool (tools/read_preview_tool.py):
- Restrita ao desktop via
check_fnemHERMES_DESKTOP— pegada zero no schema fora da GUI, exatamente como as outras ferramentas de painel do desktop - Leituras em janelas com
start/count(offsets de caracteres): páginas longas paginam em vez de inundar a janela de contexto
Ponte do gateway:
preview.read.request/preview.read.respondpela mesma ponte de prompt bloqueante doterminal.read- Timeout de 45s,
allow_expirede.expireno timeout — uma resposta atrasada do renderer resolve silenciosamente em vez de gerar erro
Renderer (preview-reader.ts):
- O painel de URL registra um leitor de páginas: webview
executeJavaScript→ title + innerText visível readActivePreviewresolve a aba ativa, limitando uma leitura única a 24k chars- Abas de arquivo/artifact respondem com a identidade mais um ponteiro para a ferramenta mais adequada (
read_fileou a própria conversa) — sem round-trip pela webview para conteúdo para o qual o agente já tem uma ferramenta melhor
O teste manual do PR é um cenário de aceitação vívido: abra o Reddit no Browser e pergunte “qual é o post mais votado?” — o agente chama read_preview e responde a partir da página.
Como usar na prática
1. Ciclo de autoverificação para desenvolvimento local
O caso mais prático: você está rodando um app React/Vue em localhost:3000 e pediu ao agente para alterar um componente. Agora ele consegue:
open_preview(localhost:3000) # open the preview
# …edit code, restart the dev server…
read_preview() # read the page's current content and verify the change
Antes, o agente alterava código “no escuro”. Agora ele pode reler o que a página realmente renderiza e confirmar a correção por conta própria.
2. Pesquisa web com segurança de contexto
Depois de abrir um artigo longo ou uma página de docs, o agente a lê com paginação start/count, trazendo para o contexto apenas os parágrafos de que precisa — muito mais barato do que despejar a página inteira.
3. Combinando com os Artifacts da v0.20
Se você usa as previews de Artifacts em sandbox do Hermes v0.20, agora você pode fazer o agente ler o conteúdo realmente renderizado dos apps HTML gerados — transformando “gerar → preview → revisão humana” em “gerar → preview → ler → revisar”.
4. Limites e fronteiras (vale a pena saber)
- Somente desktop: o
read_previewexiste apenas no Hermes Desktop (restrito aHERMES_DESKTOP); o CLI, a TUI e as plataformas de mensageria não o têm. O mesmo vale paraopen_preview/focus_pane. - Somente texto visível: ele retorna title + innerText — não a árvore DOM, não um screenshot. Para “ver” a aparência de uma página, você ainda precisa de ferramentas de screenshot/visão.
- Semântica de aba ativa: ele lê a aba atualmente ativa — com várias abas abertas, preste atenção em qual página o agente está lendo.
- 24k char cap: leituras únicas são limitadas; páginas longas precisam de paginação.
O que isso significa para desenvolvedores
Dois PRs — “um refactor de UI e uma ferramenta” — mas juntos marcam um ponto de virada no modelo de interação:
Antes, o fluxo do agente no desktop era “eu gero, você olha”. Ele produzia HTML ou abria uma página e esperava o feedback humano. Agora vira “eu gero, eu abro, eu leio, eu corrijo” — um loop autônomo. O read_terminal cobria o terminal; o read_preview cobre a web; combinados com as ferramentas de arquivo existentes, o “sensorium” do agente no Hermes Desktop está praticamente completo.
O próximo passo natural (e o que a comunidade está de olho): combinar read_preview com visão, para que o agente não apenas leia texto, mas realmente veja o resultado renderizado — ponto em que “ler uma página web” se torna indistinguível de um humano dirigindo um navegador.
Como experimentar
- Atualize para o build desktop mais recente:
hermes update(ou instale do zero pelo guia de instalação) - No Hermes Desktop, peça ao agente para
open_previewuma URL - Pergunte “o que esta página diz?” — veja-o chamar
read_previewpara responder
Para mais capacidades do desktop, veja a documentação do Hermes Desktop e, para a atualização mais ampla da v0.20, nosso mergulho profundo no release Herald.