agent-sdk/hooks.md +10 −10
24 </Step>24 </Step>
25 25
26 <Step title="O SDK coleta hooks registrados">26 <Step title="O SDK coleta hooks registrados">
2727 O SDK verifica se há hooks registrados para esse tipo de evento. Isso inclui hooks de callback que você passa em `options.hooks` e hooks de comando shell de arquivos de configuração quando a entrada [`settingSources`](/pt/agent-sdk/typescript#setting-source) ou [`setting_sources`](/pt/agent-sdk/python#setting-source) correspondente está habilitada, o que é o padrão para opções `query()`. O SDK verifica se há hooks registrados para esse tipo de evento. Isso inclui hooks de callback que você passa em `options.hooks` e hooks de comando shell de arquivos de configuração quando a entrada [`settingSources`](/pt/agent-sdk/typescript#settingsource) ou [`setting_sources`](/pt/agent-sdk/python#settingsource) correspondente está habilitada, o que é o padrão para opções `query()`.
28 </Step>28 </Step>
29 29
30 <Step title="Matchers filtram quais hooks são executados">30 <Step title="Matchers filtram quais hooks são executados">
225 225
226Cada callback de hook recebe três argumentos:226Cada callback de hook recebe três argumentos:
227 227
228228* **Dados de entrada:** um objeto tipado contendo detalhes do evento. Cada tipo de hook tem sua própria forma de entrada (por exemplo, `PreToolUseHookInput` inclui `tool_name` e `tool_input`, enquanto `NotificationHookInput` inclui `message`). Veja as definições de tipo completas nas referências do SDK [TypeScript](/pt/agent-sdk/typescript#hook-input) e [Python](/pt/agent-sdk/python#hook-input).* **Dados de entrada:** um objeto tipado contendo detalhes do evento. Cada tipo de hook tem sua própria forma de entrada (por exemplo, `PreToolUseHookInput` inclui `tool_name` e `tool_input`, enquanto `NotificationHookInput` inclui `message`). Veja as definições de tipo completas nas referências do SDK [TypeScript](/pt/agent-sdk/typescript#hookinput) e [Python](/pt/agent-sdk/python#hookinput).
229 * Todas as entradas de hook compartilham `session_id`, `cwd` e `hook_event_name`.229 * Todas as entradas de hook compartilham `session_id`, `cwd` e `hook_event_name`.
230 * `agent_id` e `agent_type` são preenchidos quando o hook é acionado dentro de um subagente. Em TypeScript, estes estão na entrada de hook base e disponíveis para todos os tipos de hook. Em Python, eles estão em `PreToolUse`, `PostToolUse` e `PostToolUseFailure` apenas.230 * `agent_id` e `agent_type` são preenchidos quando o hook é acionado dentro de um subagente. Em TypeScript, estes estão na entrada de hook base e disponíveis para todos os tipos de hook. Em Python, eles estão em `PreToolUse`, `PostToolUse` e `PostToolUseFailure` apenas.
231* **ID de uso de ferramenta** (`str | None` / `string | undefined`): correlaciona eventos `PreToolUse` e `PostToolUse` para a mesma chamada de ferramenta.231* **ID de uso de ferramenta** (`str | None` / `string | undefined`): correlaciona eventos `PreToolUse` e `PostToolUse` para a mesma chamada de ferramenta.
236Seu callback retorna um objeto com duas categorias de campos:236Seu callback retorna um objeto com duas categorias de campos:
237 237
238* **Campos de nível superior** controlam a conversa: `systemMessage` injeta uma mensagem na conversa visível ao modelo, e `continue` (`continue_` em Python) determina se o agente continua executando após este hook.238* **Campos de nível superior** controlam a conversa: `systemMessage` injeta uma mensagem na conversa visível ao modelo, e `continue` (`continue_` em Python) determina se o agente continua executando após este hook.
239239* **`hookSpecificOutput`** controla a operação atual. Os campos dentro dependem do tipo de evento de hook. Para hooks `PreToolUse`, é aqui que você define `permissionDecision` (`"allow"`, `"deny"` ou `"ask"`), `permissionDecisionReason` e `updatedInput`. No SDK TypeScript, `permissionDecision` também aceita `"defer"` para encerrar a consulta e [retomar depois](/pt/hooks#defer-a-tool-call-for-later); este valor não está disponível no SDK Python. Para hooks `PostToolUse`, você pode definir `additionalContext` para anexar informações ao resultado da ferramenta, ou `updatedToolOutput` para substituir completamente a saída da ferramenta antes de Claude vê-la.* **`hookSpecificOutput`** controla a operação atual. Os campos dentro dependem do tipo de evento de hook. Para hooks `PreToolUse`, é aqui que você define `permissionDecision` (`"allow"`, `"deny"`, `"ask"` ou `"defer"`), `permissionDecisionReason` e `updatedInput`. Retornar `"defer"` encerra a consulta para que você possa [retomá-la depois](/pt/hooks#defer-a-tool-call-for-later). Para hooks `PostToolUse`, você pode definir `additionalContext` para anexar informações ao resultado da ferramenta, ou `updatedToolOutput` para substituir completamente a saída da ferramenta antes de Claude vê-la.
240 240
241241Retorne `{}` para permitir a operação sem alterações. Hooks de callback do SDK usam o mesmo formato de saída JSON que [hooks de comando shell do Claude Code](/pt/hooks#json-output), que documenta cada campo e opção específica do evento. Para as definições de tipo do SDK, veja as referências do SDK [TypeScript](/pt/agent-sdk/typescript#sync-hook-json-output) e [Python](/pt/agent-sdk/python#sync-hook-json-output).Retorne `{}` para permitir a operação sem alterações. Hooks de callback do SDK usam o mesmo formato de saída JSON que [hooks de comando shell do Claude Code](/pt/hooks#json-output), que documenta cada campo e opção específica do evento. Para as definições de tipo do SDK, veja as referências do SDK [TypeScript](/pt/agent-sdk/typescript#synchookjsonoutput) e [Python](/pt/agent-sdk/python#synchookjsonoutput).
242 242
243<Note>243<Note>
244 Quando múltiplos hooks ou regras de permissão se aplicam, **deny** tem prioridade sobre **defer**, que tem prioridade sobre **ask**, que tem prioridade sobre **allow**. Se qualquer hook retornar `deny`, a operação é bloqueada independentemente de outros hooks.244 Quando múltiplos hooks ou regras de permissão se aplicam, **deny** tem prioridade sobre **defer**, que tem prioridade sobre **ask**, que tem prioridade sobre **allow**. Se qualquer hook retornar `deny`, a operação é bloqueada independentemente de outros hooks.
326</CodeGroup>326</CodeGroup>
327 327
328<Note>328<Note>
329329 Ao usar `updatedInput`, você também deve incluir `permissionDecision: 'allow'`. Sempre retorne um novo objeto em vez de mutar o `tool_input` original. Ao usar `updatedInput`, você também deve incluir `permissionDecision: 'allow'` para aprovar automaticamente a entrada modificada ou `permissionDecision: 'ask'` para mostrá-la ao usuário. Com `'defer'`, `updatedInput` é ignorado. Sempre retorne um novo objeto em vez de mutar o `tool_input` original.
330</Note>330</Note>
331 331
332### Adicionar contexto e bloquear uma ferramenta332### Adicionar contexto e bloquear uma ferramenta
489 489
490### Rastrear atividade de subagente490### Rastrear atividade de subagente
491 491
492492Use hooks `SubagentStop` para monitorar quando subagentes terminam seu trabalho. Veja o tipo de entrada completo nas referências do SDK [TypeScript](/pt/agent-sdk/typescript#hook-input) e [Python](/pt/agent-sdk/python#hook-input). Este exemplo registra um resumo cada vez que um subagente é concluído:Use hooks `SubagentStop` para monitorar quando subagentes terminam seu trabalho. Veja o tipo de entrada completo nas referências do SDK [TypeScript](/pt/agent-sdk/typescript#hookinput) e [Python](/pt/agent-sdk/python#hookinput). Este exemplo registra um resumo cada vez que um subagente é concluído:
493 493
494<CodeGroup>494<CodeGroup>
495 ```python Python theme={null}495 ```python Python theme={null}
621 621
622### Encaminhar notificações para Slack622### Encaminhar notificações para Slack
623 623
624624Use hooks `Notification` para receber notificações do sistema do agente e encaminhá-las para serviços externos. Notificações são disparadas para tipos de evento específicos: `permission_prompt` (Claude precisa de permissão), `idle_prompt` (Claude está aguardando entrada), `auth_success` (autenticação concluída) e `elicitation_dialog` (Claude está solicitando ao usuário). Cada notificação inclui um campo `message` com uma descrição legível por humanos e opcionalmente um `title`.Use hooks `Notification` para receber notificações do sistema do agente e encaminhá-las para serviços externos. Notificações são disparadas para tipos de evento específicos: `permission_prompt` (Claude precisa de permissão), `idle_prompt` (Claude está aguardando entrada), `auth_success` (autenticação concluída), `elicitation_dialog` (Claude está solicitando ao usuário), `elicitation_response` (o usuário respondeu a uma elicitação) e `elicitation_complete` (uma elicitação foi fechada). Cada notificação inclui um campo `message` com uma descrição legível por humanos e opcionalmente um `title`.
625 625
626Este exemplo encaminha cada notificação para um canal Slack. Requer uma [URL de webhook de entrada do Slack](https://api.slack.com/messaging/webhooks), que você cria adicionando um app ao seu espaço de trabalho Slack e habilitando webhooks de entrada:626Este exemplo encaminha cada notificação para um canal Slack. Requer uma [URL de webhook de entrada do Slack](https://api.slack.com/messaging/webhooks), que você cria adicionando um app ao seu espaço de trabalho Slack e habilitando webhooks de entrada:
627 627
727* Verifique se seu padrão de matcher corresponde exatamente ao nome da ferramenta727* Verifique se seu padrão de matcher corresponde exatamente ao nome da ferramenta
728* Certifique-se de que o hook está sob o tipo de evento correto em `options.hooks`728* Certifique-se de que o hook está sob o tipo de evento correto em `options.hooks`
729* Para hooks não baseados em ferramentas como `Stop` e `SubagentStop`, matchers correspondem a campos diferentes (veja [padrões de matcher](/pt/hooks#matcher-patterns))729* Para hooks não baseados em ferramentas como `Stop` e `SubagentStop`, matchers correspondem a campos diferentes (veja [padrões de matcher](/pt/hooks#matcher-patterns))
730730* Hooks podem não ser disparados quando o agente atinge o limite [`max_turns`](/pt/agent-sdk/python#claude-agent-options) porque a sessão termina antes que hooks possam ser executados* Hooks podem não ser disparados quando o agente atinge o limite [`max_turns`](/pt/agent-sdk/python#claudeagentoptions) porque a sessão termina antes que hooks possam ser executados
731 731
732### Matcher não filtra como esperado732### Matcher não filtra como esperado
733 733
769 };769 };
770 ```770 ```
771 771
772772* Você também deve retornar `permissionDecision: 'allow'` para que a modificação de entrada tenha efeito* Você também deve retornar `permissionDecision: 'allow'` ou `'ask'` para que a modificação de entrada tenha efeito
773 773
774* Inclua `hookEventName` em `hookSpecificOutput` para identificar qual tipo de hook a saída é774* Inclua `hookEventName` em `hookSpecificOutput` para identificar qual tipo de hook a saída é
775 775
776### Hooks de sessão não disponíveis em Python776### Hooks de sessão não disponíveis em Python
777 777
778778`SessionStart` e `SessionEnd` podem ser registrados como hooks de callback do SDK em TypeScript, mas não estão disponíveis no SDK Python (`HookEvent` os omite). Em Python, eles estão disponíveis apenas como [hooks de comando shell](/pt/hooks#hook-events) definidos em arquivos de configuração (por exemplo, `.claude/settings.json`). Para carregar hooks de comando shell de sua aplicação SDK, inclua a fonte de configuração apropriada com [`setting_sources`](/pt/agent-sdk/python#setting-source) ou [`settingSources`](/pt/agent-sdk/typescript#setting-source):`SessionStart` e `SessionEnd` podem ser registrados como hooks de callback do SDK em TypeScript, mas não estão disponíveis no SDK Python (`HookEvent` os omite). Em Python, eles estão disponíveis apenas como [hooks de comando shell](/pt/hooks#hook-events) definidos em arquivos de configuração (por exemplo, `.claude/settings.json`). Para carregar hooks de comando shell de sua aplicação SDK, inclua a fonte de configuração apropriada com [`setting_sources`](/pt/agent-sdk/python#settingsource) ou [`settingSources`](/pt/agent-sdk/typescript#settingsource):
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}