---
title: "Como saber quando o Claude Code, o Codex ou o OpenCode estão esperando por você"
description: "Quais hooks do Claude Code, Codex, OpenCode e Hermes indicam que o agente espera por você, quais ignorar e como escrever um hook que custe pouco ao agente."
author: "Foxl Team"
date_published: "2026-10-23"
date_modified: "2026-10-23"
canonical_url: "https://foxl.ai/pt/blog/coding-agent-waiting-for-input"
markdown_url: "https://foxl.ai/pt/blog/coding-agent-waiting-for-input/index.md"
image: "https://foxl.ai/blog/coding-agent-waiting-for-input-cover.png"
social_image: "https://foxl.ai/blog/social/coding-agent-waiting-for-input.png"
content_type: "Deep dive"
topics: ["Claude Code","Codex","Hooks","Coding agents","Notifications"]
products: ["Foxl Code"]
---

<!-- Generated by scripts/blog-publishing.mjs; do not edit. -->

# Como saber quando o Claude Code, o Codex ou o OpenCode estão esperando por você

> O Claude Code avisa que está esperando por meio de três hooks: PreToolUse no AskUserQuestion, uma Notification do tipo permission\_prompt e um Stop cuja última mensagem termina com uma pergunta. Ignore o idle\_prompt, que chega depois de qualquer resposta que ninguém responde. Este é o mapa que o Foxl Code usa para os terminais remotos do Claude Code, Codex, OpenCode e Hermes, o que cada CLI não consegue relatar e como escrever um hook que custe pouco ao agente e nunca fale com o modelo por acidente.

- Author: Foxl Team
- Published: 2026-10-23
- Last reviewed: 2026-10-23
- Reading time: 14 minutes
- Canonical HTML: [https://foxl.ai/pt/blog/coding-agent-waiting-for-input](<https://foxl.ai/pt/blog/coding-agent-waiting-for-input>)

![Uma janela de terminal desenhada à mão, com o cursor embaixo de um ponto de interrogação; uma linha que sai da janela termina num anzol que fisgou um celular mostrando um sino.](<https://foxl.ai/blog/coding-agent-waiting-for-input-cover.png>)

Os hooks do Claude Code executam um comando que você configura quando um determinado evento acontece, e três deles avisam que ele está esperando por você. Um hook `PreToolUse` na ferramenta `AskUserQuestion` dispara quando ele abre a caixa de diálogo de pergunta. Um hook `Notification` do tipo `permission_prompt` dispara quando uma caixa de diálogo de permissão está aberta há alguns segundos. Um hook `Stop` dispara no fim de cada resposta e traz o texto da resposta em `last_assistant_message`, então você pode verificar se ela terminou com uma pergunta. Ignore o `idle_prompt`: ele chega cerca de um minuto depois de qualquer resposta após a qual ninguém digitou nada, não só depois de uma pergunta.

O Foxl Code, que roda agentes de programação em terminais remotos, usa exatamente esses três para marcar um terminal remoto do Claude Code como esperando pelo usuário. Desde a v0.9.3-beta.5, o mesmo comando de relato também lê o Codex, o OpenCode e o Hermes pelos hooks e plugins de cada um. A seguir estão o mapa de cada CLI, as armadilhas de cada uma e como escrever o hook para que ele custe o mínimo possível ao agente e nunca vaze texto para o contexto do modelo. Nenhum terminal ativo na nuvem relatou uma pergunta ainda; a última seção diz o que ainda não foi verificado.

## Por que não dá para ver que um agente num terminal está esperando?

Quem roda agentes em terminais remotos pode ter vários abertos ao mesmo tempo e não estar olhando para nenhum. Em 21/10/2026, um terminal remoto do Claude Code fez uma pergunta de sim ou não e ficou parado no prompt enquanto a própria API do Foxl dizia que nenhuma tarefa estava esperando por ninguém. A barra lateral do Foxl Code, a lista "Requer sua atenção", com as tarefas que esperam por uma pessoa, e o app do celular ficaram todos em silêncio. Antes desta mudança, nada no Foxl Code prestava atenção a esse momento.

Ler a tela parece a solução, mas quebra fácil. Para quem lê de fora, as telas de pensando, de terminado e de perguntando diferem por poucos caracteres do próprio desenho da CLI, e qualquer versão pode redesenhá-las. Quando atualizamos certa vez as versões das CLIs que distribuímos, as novas versões desenhavam uma primeira tela diferente da que a nossa verificação de entrada esperava, e os terminais remotos do Codex e do OpenCode ignoraram em silêncio tudo o que era digitado por dez dias. Um hook é a declaração da própria CLI sobre o que acabou de acontecer, com um payload documentado, então é isso que escutamos.

## Quais hooks do Claude Code querem dizer "estou esperando por você"?

As nossas imagens na nuvem fixam o Claude Code 2.1.296. Onde um detalhe abaixo está marcado como lido do pacote, ele vem do pacote npm dessa versão, não de um terminal em execução.

| hook | o que significa | tratamos como |
| --- | --- | --- |
| `PreToolUse`, matcher `AskUserQuestion` | a caixa de diálogo de pergunta está prestes a abrir; `tool_input` traz as perguntas e as opções | uma pergunta, com as suas opções |
| `Notification`, matcher `permission_prompt` | uma caixa de diálogo de permissão está aberta há cerca de seis segundos sem nenhuma tecla (lido do pacote) | um pedido de permissão |
| `Stop` | a resposta terminou; `last_assistant_message` é o texto dela | uma pergunta se o texto termina com `?`; caso contrário, o fim de uma rodada |
| `UserPromptSubmit`, `PostToolUse`, `PostToolUseFailure`, `SessionEnd` | a pessoa digitou, a ferramenta aprovada rodou ou falhou, a CLI foi encerrada | respondida |
| `Notification`, tipo `idle_prompt` | "Claude finished responding about 60 seconds ago and you haven't typed since" | ignorado |

A linha do `idle_prompt` é onde a maioria das configurações erra. A mensagem dele parece ser exatamente o que você quer, mas ele vem depois de qualquer resposta após a qual ninguém digitou nada, então tratá-lo como pergunta dispara um alerta depois de quase toda rodada (no caso do Foxl, uma entrada em "Requer sua atenção" e uma notificação no celular). Registramos o hook `Notification` só com o matcher `permission_prompt`, e o script confere o tipo de novo. No teste do `Stop`, removemos espaços em branco no fim, ênfase de Markdown, crases, colchetes e parênteses de fechamento e aspas antes de olhar, e aceitamos o `？` de largura total que os métodos de entrada CJK digitam.

A documentação atual do Claude Code também lista um evento `PermissionRequest` dedicado e mais tipos de notificação do que esses. Não verificamos se a 2.1.296 tem o evento mais novo. O `permission_prompt` ainda está na lista atual, e a espera de seis segundos dele filtra uma caixa de diálogo que alguém responde na frente da tela. Adicione os hooks ao arquivo de configuração do Claude Code no nível do usuário, depois de quaisquer hooks já configurados para o mesmo evento, para que os hooks existentes continuem rodando:

```
{
  "hooks": {
    "PreToolUse": [{ "matcher": "AskUserQuestion",
      "hooks": [{ "type": "command", "command": "report-prompt", "timeout": 10 }] }],
    "Notification": [{ "matcher": "permission_prompt",
      "hooks": [{ "type": "command", "command": "report-prompt", "timeout": 10 }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "report-prompt", "timeout": 10 }] }]
  }
}
```

Todos eles chamam um único script pequeno, o comando de relato (`report-prompt` acima), que lê a credencial da tarefa do ambiente. Os eventos que indicam que a pessoa respondeu, o `UserPromptSubmit` e os demais (os eventos de fechamento), são registrados do mesmo jeito, atrás de uma proteção descrita abaixo.

## Como escrever um hook que custe o mínimo possível ao agente?

Um hook de relato roda dentro do próprio loop do agente, então qualquer erro nele vira problema do agente. Chegamos a cinco regras, cada uma tirada da documentação ou do pacote 2.1.296:

- **Não imprima nada no stdout.** Na maioria dos eventos, o Claude Code só registra em log o stdout de um hook, mas no `UserPromptSubmit` e em alguns outros "o Claude Code adiciona o stdout em texto simples como contexto que o Claude pode ver e usar". Uma linha de status de um script de relato viraria parte do prompt.
- **Sempre saia com 0.** O código de saída 2 bloqueia a ação nos eventos que podem bloquear, e qualquer outro código diferente de zero mostra um aviso de erro. No nosso script, uma falha de rede custa uma linha no stderr e nada mais.
- **Rode de forma síncrona, com um timeout curto.** Os hooks podem rodar com `"async": true`, mas a versão fixada imprime uma linha no terminal cada vez que um hook assíncrono termina, o que vira ruído quando os hooks rodam depois de cada chamada de ferramenta. Os nossos hooks são síncronos com `timeout: 10`, e o script dá três segundos à sua solicitação e sai sozinho um instante depois. No Claude Code, o custo real é uma inicialização do Node.js e uma solicitação no fim de cada resposta, no máximo uns três segundos quando o servidor do Foxl está inacessível.
- **Filtre os eventos frequentes no shell.** O `PostToolUse` dispara a cada chamada de ferramenta. O comando de relato cria um arquivo marcador quando relata uma pergunta aberta. Os hooks de fechamento só iniciam o Node.js quando esse arquivo existe e, caso contrário, esvaziam o stdin para que a CLI nunca veja um pipe quebrado:```
  if [ -e /tmp/foxl-agent-prompt/open ]; then exec report-prompt; else cat >/dev/null; fi
  ```Enquanto nada está aberto, isso é um `test -e` por chamada de ferramenta.
- **Mantenha a credencial fora da linha de comando.** O hook herda o ambiente da CLI, então o token é lido de uma variável de ambiente e nunca aparece no `ps`.

## Como o Codex, o OpenCode e o Hermes dizem isso?

Cada CLI tem o seu próprio ponto de extensão; lemos cada um na versão que as nossas imagens fixam. O Codex tem um mecanismo de hooks que aceita o formato de hooks do Claude Code. O OpenCode e o Hermes (a CLI de agente da Nous Research) não rodam hooks de shell na sua interface de terminal; eles carregam plugins, e os nossos plugins entregam ao mesmo comando de relato um evento normalizado. O Kiro, a CLI de programação da AWS, não tem nenhum evento para escutar.

| CLI (versão fixada) | pergunta | respondida | não relatado |
| --- | --- | --- | --- |
| Codex 0.162.1, um `hooks.json` no nível do sistema | `PermissionRequest`; `Stop` cujo `last_assistant_message` termina com `?` | `UserPromptSubmit`, `PostToolUse`, `Interrupt`, `SessionEnd` | a caixa de diálogo de pergunta do modo Plan |
| OpenCode 1.19.0, um plugin de servidor | `question.asked`, `permission.asked`; `session.status` idle com uma resposta que termina em `?` | `question.replied` ou `rejected`, `permission.replied`, `session.status` busy | - |
| Hermes 0.19.0, um plugin Python | `pre_tool_call` para `clarify`, `pre_approval_request`, `post_llm_call` terminando em `?` | `post_tool_call` para `clarify`, `post_approval_response`, `pre_llm_call`, um `on_session_end` interrompido | - |
| Kiro 2.29.1 | nada | - | tudo: nenhum evento de pergunta ou de aprovação, e o `Stop` dele não traz o texto da resposta |

**Codex.** O Codex revisa os hooks da sua própria configuração antes de executá-los: hooks novos ou alterados "são marcados para revisão e ignorados até serem considerados confiáveis". Um hook gerenciado, definido na configuração no nível do sistema, é confiável por política, então instalamos os nossos assim. O próprio comando de relato só é instalado nos terminais em que o Foxl Code pediu relatos de perguntas. Medido na 0.162.1, o `codex exec` não interativo também roda os hooks gerenciados e imprime duas linhas sobre eles na saída a cada chamada de ferramenta, então desativamos os hooks nas execuções que o Foxl Code inicia com `codex exec`. Pelo código-fonte da 0.162.1, a interface de terminal do Codex exibe qualquer hook que rode por mais de 300 ms, então o comando de relato decide se há uma pergunta, escreve o seu arquivo marcador e passa a solicitação de rede para uma cópia de si mesmo desacoplada.

A caixa de diálogo de pergunta do modo Plan do Codex não é relatada de propósito, porque o hook `PreToolUse` dela dispara antes de o Codex decidir se a pergunta é permitida, e fora do modo Plan o Codex a recusa. Medido na 0.162.1, o hook disparou com a pergunta e então o Codex respondeu "request\_user\_input is unavailable in Default mode". Os terminais do Foxl Code começam no modo Default, então relatar esse hook mandaria para o seu celular uma pergunta que nunca foi feita a ninguém. A contrapartida é que um terminal do Codex no modo Plan não leva a sua caixa de diálogo de pergunta para "Requer sua atenção".

**OpenCode.** O nosso plugin escuta o barramento de eventos do OpenCode. Os eventos de pergunta não estão na lista de eventos da documentação de plugins do OpenCode; eles estão no código-fonte do schema da v1.19.0, que é o que lemos. Um status idle encerra uma rodada, e a rodada conta como pergunta quando a última resposta termina com `?`. Enquanto uma caixa de diálogo de pergunta ou de permissão está aberta, as mudanças de status são ignoradas, então o agente ficar busy ou idle em volta da caixa de diálogo não a fecha. Os eventos da sessão de um subagente são ignorados.

**Hermes.** Apesar do nome, o `on_session_end` do Hermes dispara no fim de toda rodada na 0.19.0, logo depois da resposta. Quando o nosso plugin o tratava como fechamento, ele retirava a pergunta que a rodada tinha acabado de fazer: 7 de 12 perguntas foram fechadas na hora, e em 1 de 12 a pergunta chegou ao servidor depois do próprio fechamento, então ficou aberta sem nada que a fechasse. Agora só o fim de uma sessão interrompida conta como fechamento, e os relatos saem um de cada vez, na ordem em que o Hermes os gerou.

**Kiro** não é coberto, porque os hooks dele não têm evento de pergunta nem de aprovação, e o payload de stop não traz o texto da resposta. Um hook não conseguiria nem abrir uma pergunta nem distinguir uma pergunta de uma resposta. O único sinal é um arquivo de sessão interno num formato não publicado, e escolhemos não interpretá-lo.

## O que acontece quando o Foxl fica sabendo?

Cada relato vai para um único endpoint no servidor do Foxl Code, autenticado com a credencial da própria tarefa, e abre ou fecha uma entrada na mesma lista "Requer sua atenção" que guarda as outras perguntas dos agentes. A tarefa é marcada como aguardando a sua resposta, como na figura.

![A página Trabalho do Foxl Code. Na coluna “Needs you”, um cartão diz “Claude Code is asking” com uma pergunta de sim ou não sobre um job que falha de propósito e uma caixa de resposta com “Send”. Um segundo cartão diz “Claude Code is asking” com uma pergunta e três opções listadas, seguidas de “Answer this in the terminal.” e um botão “Show terminal”. Na coluna “In flight”, duas tarefas dizem “Waiting for your answer”.](<https://foxl.ai/blog/coding-agent-waiting-for-input-needs-you.webp>)

_Figura 1. A página Trabalho do Foxl Code na versão do pull request, com perguntas de exemplo. Uma pergunta dentro de uma resposta pode ser respondida aqui; uma caixa de diálogo é respondida no terminal._

Uma pergunta no fim de uma resposta pode ser respondida em "Requer sua atenção" ou pelo celular. O Foxl digita a resposta no terminal daquela tarefa como uma linha e envia a tecla Enter separadamente um segundo depois, porque um único bloco que inclui o Enter é tratado como colagem e nunca é enviado. Para uma caixa de diálogo de pergunta ou de permissão, o Foxl nunca tenta adivinhar as teclas que a interface do terminal espera. Em vez disso, o cartão dela em "Requer sua atenção" lista as opções, diz para responder no terminal e tem um botão que abre o terminal. Responder no terminal fecha o cartão pelos mesmos hooks.

O celular só é notificado sobre perguntas que podem passar despercebidas. Uma caixa de diálogo de pergunta ou de permissão que continua aberta 15 segundos depois de o Foxl saber dela envia uma notificação, já que uma pessoa olhando o terminal responde em poucos segundos. Uma caixa de diálogo de permissão do Claude Code é relatada cerca de seis segundos depois de abrir, então a notificação dela chega por volta dos 21 segundos. Uma resposta que termina com uma pergunta aparece em "Requer sua atenção", mas não é anunciada, já que muitas respostas terminam com uma. A pergunta de 21/10/2026 era desse tipo, então agora ela apareceria em "Requer sua atenção" e na tarefa, e ainda assim não faria o celular tocar.

![Um fluxo da esquerda para a direita. Quatro CLIs, Claude Code, Codex, OpenCode e Hermes, relatam cada uma pelo seu próprio hook ou plugin a um único comando pequeno dentro da máquina do agente. O comando abre ou fecha uma pergunta no servidor do Foxl Code com a credencial da tarefa. O servidor a mostra em Requer sua atenção e na tarefa, e só notifica o celular se uma caixa de diálogo continuar aberta 15 segundos depois do relato.](<https://foxl.ai/blog/coding-agent-waiting-for-input-flow.png>)

_Figura 2. Quatro CLIs relatam por um único comando; o celular só fica sabendo de uma caixa de diálogo quando ninguém a respondeu 15 segundos depois do relato._

## O que ainda não foi verificado?

Nos nossos testes, o comando de relato real rodou com os payloads de cada CLI fixada, os plugins rodaram no Node.js e no Python com os formatos de evento fixados, e o endpoint do servidor rodou numa cópia local do runtime da Cloudflare. O que ainda não aconteceu:

- **Uma pergunta ao vivo de um terminal real na nuvem.** Em 23/10/2026, a tabela de produção não tinha nenhuma pergunta vinda de um, então a verificação de ponta a ponta num terminal ativo ainda está pendente.
- **O Claude Code executando esses hooks.** Os detalhes do Claude Code, incluindo a espera de seis segundos e a linha do hook assíncrono, foram lidos do pacote 2.1.296, não vistos num terminal em execução. Temos um teste que roda essa versão com esses hooks; ele ainda não foi executado.
- **Os terminais das outras CLIs.** Vários detalhes do Codex, do OpenCode e do Hermes foram lidos do código-fonte, incluindo que o OpenCode entrega os eventos de pergunta com exatamente esses nomes; só o `codex exec` foi executado.

Se você roda agentes nos seus próprios terminais, a tabela de hooks do Claude Code é a parte para copiar. Ligue os três hooks ao que quer que chegue até você, ignore o `idle_prompt`, não imprima nada, saia com 0 e espere alguns segundos antes de enviar um alerta. Sobre o lado do terminal do Foxl Code, o nosso artigo sobre [por que cada tecla digitada chegou a ir para a máquina errada](<https://foxl.ai/blog/a-citation-is-not-a-measurement>) (em inglês) explica como o que você digita chega a um agente remoto.

## Referências e leituras complementares

1. [Claude Code: referência de hooks](<https://code.claude.com/docs/en/hooks>) - Documentation
2. [Codex: hooks](<https://learn.chatgpt.com/docs/hooks>) - Documentation
3. [OpenCode: plugins](<https://opencode.ai/docs/plugins/>) - Documentation
4. [Hermes Agent (Nous Research)](<https://github.com/NousResearch/hermes-agent>) - Reference
5. [Versão Foxl v0.9.3-beta.5](<https://github.com/foxl-ai/foxl/releases/tag/v0.9.3-beta.5>) - Release