Skip to main content

Eventos de streaming no SDK do Copilot

Eventos de sessão de referência emitidos pelo SDK do Copilot e os campos de dados que cada evento contém.

Quem pode usar esse recurso?

SDK do GitHub Copilot está disponível com todos os Copilot planos.

Observação

          SDK do Copilot está atualmente em versão prévia técnica. A funcionalidade e a disponibilidade estão sujeitas a alterações.

Cada ação que o Copilot agente executa, pensando, escrevendo código, executando ferramentas, é emitida como um evento de sessão que você pode assinar. Este artigo é uma referência de nível de campo para cada tipo de evento para que você saiba exatamente quais dados esperar.

Quando streaming: true é definido em uma sessão, o SDK emite eventos efêmeros em tempo real (deltas, atualizações de progresso) junto com eventos persistentes (mensagens completas, resultados da ferramenta). Todos os eventos compartilham um envelope comum e carregam uma data carga cuja forma depende do evento type. Para obter um diagrama de sequência do fluxo de eventos completo, consulte o github/copilot-sdk repositório.

ConceitoDescrição
          **Evento efêmero** | Transitório; transmitido em tempo real, mas **não** persistido no log de sessão. Não reproduzido na retomada da sessão. |

| Evento persistente | Salvo no log de eventos da sessão no disco. Reiniciado ao retomar uma sessão. | | Evento Delta | Uma parte efêmera de streaming (texto ou raciocínio). Acumule deltas para construir o conteúdo completo. | | ** parentId Cadeia** | Cada evento em parentId aponta para o evento anterior, formando uma lista encadeada que você pode percorrer. |

Envelope de evento

Cada evento de sessão, independentemente do tipo, inclui estes campos:

CampoTipoDescrição
id
          `string` (UUID v4) | Identificador de evento exclusivo |

| timestamp | string (ISO 8601) | Quando o evento foi criado | | parentId | string \| null | ID do evento anterior na cadeia; null para o primeiro evento | | ephemeral | boolean? | true para eventos transitórios; ausente ou false para eventos persistentes | | type | string | Discriminador de tipo de evento (confira tabelas abaixo) | | data | object | Carga útil específica do evento |

Inscrevendo-se para eventos

// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

Para obter exemplos em Python, Go e .NET, consulte o github/copilot-sdk repositório.

Dica

          **Python/Go:** Esses SDKs usam uma única `Data` classe/struct com todos os campos possíveis como opcionais/anuláveis. Somente os campos listados nas tabelas abaixo são preenchidos para cada tipo de evento– o restante será `None` / `nil`.
          **.NET:** O SDK do .NET usa classes de dados separadas e fortemente tipadas por evento (por exemplo, `AssistantMessageDeltaData`), portanto, somente os campos relevantes existem em cada tipo.
          **TypeScript:** O SDK do TypeScript usa uma união discriminada — quando você faz a correspondência em `event.type`, o payload `data` é restringido automaticamente à forma correta.

Eventos do assistente

Esses eventos acompanham o ciclo de vida de resposta do agente, desde o início da vez até os fragmentos de streaming até a mensagem final.

assistant.turn_start

Emitido quando o agente começa a processar uma etapa da conversa.

Campo de dadosTipoObrigatórioDescrição
turnIdstringIdentificador de turno (normalmente um número de turno em cadeia de caracteres)
interactionIdstring
Identificador de interação para correlação de telemetria

assistant.intent

Efêmero. Breve descrição do que o agente está fazendo no momento, atualizada conforme funciona.

Campo de dadosTipoObrigatórioDescrição
intentstringIntenção legível por humanos (por exemplo, "Explorando a base de código")

assistant.reasoning

Conclua o bloco de pensamento estendido do modelo. Emitido após a conclusão do raciocínio.

Campo de dadosTipoObrigatórioDescrição
reasoningIdstringIdentificador exclusivo para esse bloco de raciocínio
contentstringO texto de pensamento estendido completo

assistant.reasoning_delta

Efêmero. Bloco incremental do pensamento estendido do modelo, transmitido em tempo real.

Campo de dadosTipoObrigatórioDescrição
reasoningIdstringCorresponde ao evento correspondente assistant.reasoning
deltaContentstringParte de texto a ser acrescentada ao conteúdo de raciocínio

assistant.message

Resposta completa do assistente virtual para esta chamada LLM. Pode incluir solicitações de invocação de ferramentas.

Campo de dadosTipoObrigatórioDescrição
messageIdstringIdentificador exclusivo para esta mensagem
contentstringResposta de texto do assistente
toolRequestsToolRequest[]
Chamadas de ferramenta que o assistente deseja fazer (veja abaixo)
reasoningOpaquestring
Pensamento estendido criptografado (modelos antropáticos); associado à sessão
reasoningTextstring
Texto claro de raciocínio a partir de pensamento aprofundado
encryptedContentstring
Conteúdo de raciocínio criptografado (modelos OpenAI); associado à sessão
phasestring
Fase de geração (por exemplo, "thinking" vs "response")
outputTokensnumber
Contagem real de tokens de saída na resposta da API
interactionIdstring
Identificador de interação para telemetria
parentToolCallIdstring
Definir quando essa mensagem se origina de um subagente
          **
          `ToolRequest` Campos:**
CampoTipoObrigatórioDescrição
toolCallIdstringIdentificação única para esta chamada de método
namestringNome da ferramenta (por exemplo, "bash", "edit", "grep")
argumentsobject
Argumentos analisados para a ferramenta
type"function" | "custom"
Tipo de chamada; é definido como "function" caso esteja ausente

assistant.message_delta

Efêmero. Porção incremental da resposta de texto do assistente, transmitida em tempo real.

Campo de dadosTipoObrigatórioDescrição
messageIdstringCorresponde ao evento correspondente assistant.message
deltaContentstringParte de texto a ser acrescentada à mensagem
parentToolCallIdstring
Defina quando se originar de um subagente

assistant.turn_end

Emitido quando o agente conclui um turno (todas as execuções de ferramentas são concluídas, resposta final fornecida).

Campo de dadosTipoObrigatórioDescrição
turnIdstringCorresponde ao evento correspondente assistant.turn_start

assistant.usage

Efêmero. Informações de uso e custo de token para uma chamada de API individual.

Campo de dadosTipoObrigatórioDescrição
modelstringIdentificador de modelo (por exemplo, "gpt-4.1")
inputTokensnumber
Tokens de entrada consumidos
outputTokensnumber
Tokens de saída produzidos
cacheReadTokensnumber
Tokens lidos do cache de mensagens de prompt
cacheWriteTokensnumber
Tokens gravados no cache de prompt
costnumber
Custo do multiplicador de modelo para cobrança
durationnumber
Duração da chamada à API em milissegundos
initiatorstring
O que originou esta chamada (por exemplo, "sub-agent"); ausente se iniciada pelo usuário
apiCallIdstring
ID de conclusão do provedor (por exemplo, chatcmpl-abc123)
providerCallIdstring
          GitHub ID de rastreamento de solicitação (`x-github-request-id`) |

| parentToolCallId | string | | Definir quando o uso se origina de um subagente | | quotaSnapshots | Record<string, QuotaSnapshot> | | Uso de recursos por cota, chaveado pelo identificador de cota | | copilotUsage | CopilotUsage | | Detalhamento do custo detalhado do token da API |

assistant.streaming_delta

Efêmero. Indicador de progresso de rede de baixo nível – total de bytes recebidos da resposta da API de streaming.

Campo de dadosTipoObrigatórioDescrição
totalResponseSizeBytesnumberBytes cumulativos recebidos até agora

Eventos de execução de ferramentas

Esses eventos acompanham o ciclo de vida completo de cada invocação de ferramenta, desde o modelo que solicita uma chamada de ferramenta até a execução até a conclusão.

tool.execution_start

Emitido quando uma ferramenta começa a ser executada.

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringIdentificador exclusivo para esta chamada de ferramenta
toolNamestringNome da ferramenta (por exemplo, "bash", , "edit") "grep"
argumentsobject
Argumentos analisados passados para a ferramenta
mcpServerNamestring
Nome do servidor MCP, quando a ferramenta é fornecida por um servidor MCP
mcpToolNamestring
Nome da ferramenta original no servidor MCP
parentToolCallIdstring
Definir quando invocado por um subagente

tool.execution_partial_result

Efêmero. Saída incremental de uma ferramenta em execução (por exemplo, saída de bash em streaming).

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringCorresponde ao correspondente tool.execution_start
partialOutputstringBloco de saída incremental

tool.execution_progress

Efêmero. Status de progresso legível por humanos de uma ferramenta em execução (por exemplo, notificações de progresso do servidor MCP).

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringCorresponde ao correspondente tool.execution_start
progressMessagestringMensagem de status de progresso

tool.execution_complete

Emitido quando uma ferramenta termina de executar— com êxito ou com um erro.

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringCorresponde ao correspondente tool.execution_start
successbooleanSe a execução foi bem-sucedida
modelstring
Modelo que gerou essa chamada de ferramenta
interactionIdstring
Identificador de interação
isUserRequestedboolean
          `true` quando o usuário solicitou explicitamente essa chamada de ferramenta |

| result | Result | | Apresentar sobre o sucesso (veja abaixo) | | error | { message, code? } | | Exibido em caso de falha | | toolTelemetry | object | | Telemetria específica da ferramenta | | parentToolCallId | string | | Definir quando invocado por um subagente |

          **
          `Result` Campos:**
CampoTipoObrigatórioDescrição
contentstringResultado conciso enviado para a LLM (pode ser truncado para eficiência de token)
detailedContentstring
Resultado completo para exibição, preservando conteúdo completo como difusões
contentsContentBlock[]
Blocos de conteúdo estruturados (texto, terminal, imagem, áudio, recurso)

tool.user_requested

Emitido quando o usuário solicita explicitamente uma invocação de ferramenta (em vez do modelo optando por chamar uma).

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringIdentificador exclusivo para esta chamada de ferramenta
toolNamestringNome da ferramenta que o usuário deseja invocar
argumentsobject
Argumentos para a invocação

Eventos de ciclo de vida da sessão

session.idle

Efêmero. O agente concluiu todo o processamento e está pronto para a próxima mensagem. Esse é o sinal de que uma curva está totalmente concluída.

Campo de dadosTipoObrigatórioDescrição
backgroundTasksBackgroundTasks
Agentes/shells em segundo plano ainda em execução quando o agente ficou ocioso

session.error

Ocorreu um erro durante o processamento da sessão.

Campo de dadosTipoObrigatórioDescrição
errorTypestringCategoria de erro (por exemplo, "authentication", "quota", "rate_limit")
messagestringMensagem de erro legível por humanos
stackstring
Rastreamento de pilha de erros
statusCodenumber
Código de status HTTP da solicitação upstream
providerCallIdstring
          GitHub Solicitação de ID de rastreamento para correlação de log no lado do servidor |

session.compaction_start

A compactação da janela de contexto começou. A carga de dados está vazia ({}).

session.compaction_complete

Compactação da janela de contexto concluída.

Campo de dadosTipoObrigatórioDescrição
successbooleanSe a compactação foi bem-sucedida
errorstring
Mensagem de erro se a compactação falhou
preCompactionTokensnumber
Tokens anteriores à compactação
postCompactionTokensnumber
Tokens após a compactação
preCompactionMessagesLengthnumber
Contagem de mensagens antes da compactação
messagesRemovednumber
Mensagens removidas
tokensRemovednumber
Tokens removidos
summaryContentstring
Resumo do histórico compactado gerado por LLM
checkpointNumbernumber
Número de captura de ponto de verificação criado para recuperação
checkpointPathstring
Caminho do arquivo onde o ponto de verificação foi armazenado
compactionTokensUsed{ input, output, cachedInput }
Uso de token para a chamada LLM de compactação
requestIdstring
          GitHub ID de rastreamento de solicitação para a chamada de compactação |

session.title_changed

Efêmero. O título gerado automaticamente da sessão foi atualizado.

Campo de dadosTipoObrigatórioDescrição
titlestringNovo título da sessão

session.context_changed

O diretório de trabalho ou o contexto do repositório da sessão foi alterado.

Campo de dadosTipoObrigatórioDescrição
cwdstringDiretório de trabalho atual
gitRootstring
Raiz do repositório Git
repositorystring
Repositório em "owner/name" formato
branchstring
Branch atual do Git

session.usage_info

Efêmero. Instantâneo de utilização da janela de contexto.

Campo de dadosTipoObrigatórioDescrição
tokenLimitnumberTokens máximos para a janela de contexto do modelo
currentTokensnumberTokens atuais na janela de contexto
messagesLengthnumberContagem de mensagens atual na conversa

session.task_complete

O agente concluiu sua tarefa atribuída.

Campo de dadosTipoObrigatórioDescrição
summarystring
Resumo da tarefa concluída

session.shutdown

A sessão foi encerrada.

Campo de dadosTipoObrigatórioDescrição
shutdownType"routine" | "error"Desligamento normal ou falha
errorReasonstring
Descrição do erro quando shutdownType é "error"
totalPremiumRequestsnumberTotal de solicitações de API Premium usadas
totalApiDurationMsnumberTempo de chamada da API cumulativa em milissegundos
sessionStartTimenumberTimestamp Unix (ms) quando a sessão começou
codeChanges{ linesAdded, linesRemoved, filesModified }Métricas agregadas de alteração de código
modelMetricsRecord<string, ModelMetric>Detalhamento de uso por modelo
currentModelstring
Modelo selecionado durante o desligamento

Eventos de permissão e de interação do usuário

Esses eventos são emitidos quando o agente precisa de aprovação ou entrada do usuário antes de continuar.

permission.requested

Efêmero. O agente precisa de permissão para executar uma ação (executar um comando, gravar um arquivo etc.).

Campo de dadosTipoObrigatórioDescrição
requestIdstringUse isso para responder via session.respondToPermission()
permissionRequestPermissionRequestDetalhes da permissão que está sendo solicitada

A permissionRequest é uma união discriminada de kind:

kindCampos de chaveDescrição
"shell"
          `fullCommandText`, `intention`, , `commands[]``possiblePaths[]` | Executar um comando de shell |

| "write" | fileName, diff, , intention``newFileContents? | Gravar/modificar um arquivo | | "read" | path, intention | Ler um arquivo ou diretório | | "mcp" | serverName, toolName, toolTitle, , args?``readOnly | Chamar uma ferramenta MCP | | "url" | url, intention | Recuperar uma URL | | "memory" | subject fact citations | Armazenar uma memória | | "custom-tool" | toolName toolDescription args? | Chamar uma ferramenta personalizada |

Todas as kind variantes também incluem uma vinculação opcional toolCallId de volta à chamada de ferramenta que disparou a solicitação.

permission.completed

Efêmero. Uma solicitação de permissão foi resolvida.

Campo de dadosTipoObrigatórioDescrição
requestIdstringCorresponde ao correspondente permission.requested
result.kindstringUm de: "approved", "denied-by-rules", "denied-interactively-by-user", "denied-no-approval-rule-and-could-not-request-from-user", "denied-by-content-exclusion-policy"

user_input.requested

Efêmero. O agente está fazendo uma pergunta ao usuário.

Campo de dadosTipoObrigatórioDescrição
requestIdstringUse isso para responder via session.respondToUserInput()
questionstringA pergunta a ser apresentada ao usuário
choicesstring[]
Opções predefinidas para o usuário
allowFreeformboolean
Se a entrada de texto de forma livre é permitida

user_input.completed

Efêmero. Uma solicitação de entrada do usuário foi resolvida.

Campo de dadosTipoObrigatórioDescrição
requestIdstringCorresponde ao correspondente user_input.requested

elicitation.requested

Efêmero. O agente precisa de entrada estruturada de dados do usuário (protocolo de elicitação MCP).

Campo de dadosTipoObrigatórioDescrição
requestIdstringUse isso para responder via session.respondToElicitation()
messagestringDescrição de quais informações são necessárias
mode"form"
Modo de elicitação (no momento, somente "form")
requestedSchema{ type: "object", properties, required? }Esquema JSON que descreve os campos de formulário

elicitation.completed

Efêmero. Uma solicitação de elicitação foi resolvida.

Campo de dadosTipoObrigatórioDescrição
requestIdstringCorresponde ao correspondente elicitation.requested

Eventos de subagente e habilidade

subagent.started

Um agente personalizado foi invocado como um subagente.

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringChamada de ferramenta-mãe que gerou este subagente
agentNamestringNome interno do subagente
agentDisplayNamestringNome de exibição legível por humanos
agentDescriptionstringDescrição do que o subagente faz

subagent.completed

Um subagente concluiu com sucesso.

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringCorresponde ao correspondente subagent.started
agentNamestringNome interno
agentDisplayNamestringNome de exibição

subagent.failed

Um subagente encontrou um erro.

Campo de dadosTipoObrigatórioDescrição
toolCallIdstringCorresponde ao correspondente subagent.started
agentNamestringNome interno
agentDisplayNamestringNome de exibição
errorstringMensagem de erro

subagent.selected

Um agente personalizado foi selecionado (inferido) para lidar com a solicitação atual.

Campo de dadosTipoObrigatórioDescrição
agentNamestringNome interno do agente selecionado
agentDisplayNamestringNome de exibição
toolsstring[] | nullNomes de ferramentas disponíveis para este agente; null para todas as ferramentas

subagent.deselected

Um agente personalizado foi desselecionado, retornando ao agente padrão. O conteúdo da resposta estará vazio ({}).

skill.invoked

Uma habilidade foi ativada para a conversa atual.

Campo de dadosTipoObrigatórioDescrição
namestringNome da habilidade
pathstringCaminho do arquivo para a definição de SKILL.md
contentstringConteúdo completo da competência injetado na conversa
allowedToolsstring[]
Ferramentas aprovadas automaticamente enquanto essa habilidade está ativa
pluginNamestring
Plugin da skill de origem
pluginVersionstring
Versão do plug-in

Outros eventos

abort

O turno atual foi abortado.

Campo de dadosTipoObrigatórioDescrição
reasonstringPor que a curva foi abortada (por exemplo, "user initiated")

user.message

O usuário enviou uma mensagem. Gravado na linha do tempo da sessão.

Campo de dadosTipoObrigatórioDescrição
contentstringO texto da mensagem do usuário
transformedContentstring
Versão transformada após o pré-processamento
attachmentsAttachment[]
Anexos de arquivo, diretório, seleção, blob ou GitHub referência
sourcestring
Identificador de origem da mensagem
agentModestring
Modo de agente: "interactive", , "plan", "autopilot"ou "shell"
interactionIdstring
Identificador de interação

system.message

Um prompt do sistema ou do desenvolvedor foi injetado na conversa.

Campo de dadosTipoObrigatórioDescrição
contentstringO texto do prompt
role"system" | "developer"Função de mensagem
namestring
Identificador de origem
metadata{ promptVersion?, variables? }
Metadados do modelo de prompt

external_tool.requested

Efêmero. O agente deseja invocar uma ferramenta externa (uma fornecida pelo consumidor do SDK).

Campo de dadosTipoObrigatórioDescrição
requestIdstringUse isso para responder via session.respondToExternalTool()
sessionIdstringSessão à qual esta solicitação pertence
toolCallIdstringID de chamada de ferramenta para essa invocação
toolNamestringNome da ferramenta externa
argumentsobject
Argumentos para a ferramenta

external_tool.completed

Efêmero. Uma solicitação de ferramenta externa foi resolvida.

Campo de dadosTipoObrigatórioDescrição
requestIdstringCorresponde ao correspondente external_tool.requested

exit_plan_mode.requested

Efêmero. O agente criou um plano e deseja sair do modo de plano.

Campo de dadosTipoObrigatórioDescrição
requestIdstringUse isso para responder via session.respondToExitPlanMode()
summarystringResumo do plano
planContentstringConteúdo completo do arquivo de plano
actionsstring[]Ações de usuário disponíveis (por exemplo, aprovar, editar, rejeitar)
recommendedActionstringAção sugerida

exit_plan_mode.completed

Efêmero. Uma solicitação de modo de plano de saída foi resolvida.

Campo de dadosTipoObrigatórioDescrição
requestIdstringCorresponde ao correspondente exit_plan_mode.requested

command.queued

Efêmero. Um comando colocado na fila para execução.

Campo de dadosTipoObrigatórioDescrição
requestIdstringUse isso para responder via session.respondToQueuedCommand()
commandstringO texto do comando de barra (por exemplo, /help, /clear)

command.completed

Efêmero. Um comando enfileirado foi resolvido.

Campo de dadosTipoObrigatórioDescrição
requestIdstringCorresponde ao correspondente command.queued

Referência rápida: fluxo de agentes em turnos

Uma curva agente típica emite eventos nesta ordem:

assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval (ephemeral)
│   ├── permission.completed  → Approval result (ephemeral)
│   ├── tool.execution_start  → Tool begins
│   ├── tool.execution_partial_result  → Streaming tool output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)

Todos os tipos de evento em um relance

Tipo de eventoEfêmeroCategoriaCampos de dados chave
assistant.turn_start
Assistente
          `turnId`, `interactionId?` |

| assistant.intent | ✅ | Assistente | intent | | assistant.reasoning | | Assistente | reasoningId, content | | assistant.reasoning_delta | ✅ | Assistente | reasoningId, deltaContent | | assistant.streaming_delta | ✅ | Assistente | totalResponseSizeBytes | | assistant.message | | Assistente | messageId, content, toolRequests?, , outputTokens?``phase? | | assistant.message_delta | ✅ | Assistente | messageId deltaContent parentToolCallId? | | assistant.turn_end | | Assistente | turnId | | assistant.usage | ✅ | Assistente | model, inputTokens?, outputTokens?, , cost?``duration? | | tool.user_requested | | Tool | toolCallId toolName arguments? | | tool.execution_start | | Tool | toolCallId, toolName, , arguments?``mcpServerName? | | tool.execution_partial_result | ✅ | Tool | toolCallId, partialOutput | | tool.execution_progress | ✅ | Tool | toolCallId, progressMessage | | tool.execution_complete | | Tool | toolCallId, success, , result?``error? | | session.idle | ✅ | Sessão | backgroundTasks? | | session.error | | Sessão | errorType message statusCode? | | session.compaction_start | | Sessão | (vazio) | | session.compaction_complete | | Sessão | success preCompactionTokens? summaryContent? | | session.title_changed | ✅ | Sessão | title | | session.context_changed | | Sessão | cwd, gitRoot?, , repository?``branch? | | session.usage_info | ✅ | Sessão | tokenLimit currentTokens messagesLength | | session.task_complete | | Sessão | summary? | | session.shutdown | | Sessão | shutdownType codeChanges modelMetrics | | permission.requested | ✅ | Permissão | requestId, permissionRequest | | permission.completed | ✅ | Permissão | requestId, result.kind | | user_input.requested | ✅ | Entrada do usuário | requestId question choices? | | user_input.completed | ✅ | Entrada do usuário | requestId | | elicitation.requested | ✅ | Entrada do usuário | requestId message requestedSchema | | elicitation.completed | ✅ | Entrada do usuário | requestId | | subagent.started | | Subagente | toolCallId agentName agentDisplayName | | subagent.completed | | Sub-Agente | toolCallId agentName agentDisplayName | | subagent.failed | | Sub-Agente | toolCallId agentName error | | subagent.selected | | Subagente | agentName agentDisplayName tools | | subagent.deselected | | Subagente | (vazio) | | skill.invoked | | Habilidade | name, path, , content``allowedTools? | | abort | | Controle | reason | | user.message | | Usuário | content attachments? agentMode? | | system.message | | System | content, role | | external_tool.requested | ✅ | Ferramenta Externa | requestId toolName arguments? | | external_tool.completed | ✅ | Ferramenta Externa | requestId | | command.queued | ✅ | Command | requestId, command | | command.completed | ✅ | Command | requestId | | exit_plan_mode.requested | ✅ | Modo Planejamento | requestId, summary, , planContent``actions | | exit_plan_mode.completed | ✅ | Modo Planejamento | requestId |