Skip to main content

Streaming de eventos en el SDK de Copilot

Los eventos de sesión de referencia emitidos por SDK de Copilot y los campos de datos que cada evento contiene.

¿Quién puede utilizar esta característica?

SDK de GitHub Copilot está disponible con todos los Copilot planes.

Nota:

          SDK de Copilot actualmente está en Versión preliminar técnica. La funcionalidad y la disponibilidad están sujetas a cambios.

Cada acción que toma el Copilot agente , pensando, escribiendo código, ejecutando herramientas, se emite como un evento de sesión al que puede suscribirse. Este artículo es una referencia de nivel de campo para cada tipo de evento para saber exactamente qué datos esperar.

Cuando streaming: true se establece en una sesión, el SDK emite eventos efímeros en tiempo real (deltas, actualizaciones de progreso) junto con eventos persistentes (mensajes completos, resultados de la herramienta). Todos los eventos comparten un sobre común y llevan una data carga cuya forma depende del evento type. Para obtener un diagrama de secuencia del flujo de eventos completo, consulte el github/copilot-sdk repositorio.

ConceptoDescripción
          **Evento efímero** | Transitorio; se transmite en tiempo real, pero **no** se conserva en el registro de sesión. No se reproduce al reanudar la sesión. |

| Evento persistente | Guardado en el registro de eventos de sesión en el disco. Se reproduce al reanudar una sesión. | | Evento Delta | Un fragmento de streaming efímero (texto o razonamiento). Acumula deltas para compilar el contenido completo. | | ** parentId cadena** | Cada evento parentId apunta al evento anterior, formando una lista enlazada que se puede recorrer. |

Contenedor de eventos

Cada evento de sesión, independientemente del tipo, incluye estos campos:

CampoTipoDescripción
id
          `string` (UUID v4) | Identificador de evento único |

| timestamp | string (ISO 8601) | Cuándo se creó el evento | | parentId | string \| null | Id. del evento anterior de la cadena; null para el primer evento | | ephemeral | boolean? | true para eventos transitorios; ausente o false para eventos persistentes | | type | string | Discriminador de tipo de evento (consulte las tablas siguientes) | | data | object | Carga específica del evento |

Suscribirse a 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 obtener ejemplos en Python, Go y .NET, consulte el github/copilot-sdk repositorio.

Sugerencia

          **Python/Go:** Estos SDK usan una sola `Data` clase o estructura con todos los campos posibles como opcionales o que aceptan valores NULL. Solo los campos enumerados en las tablas siguientes se rellenan para cada tipo de evento; el resto será `None` / `nil`.
          **.NET:** El SDK de .NET usa clases de datos independientes y fuertemente tipadas por evento (por ejemplo, `AssistantMessageDeltaData`), por lo que solo existen los campos pertinentes en cada tipo.
          **TypeScript:** El SDK de TypeScript usa una unión discriminada; cuando coincide con `event.type`, la `data` carga útil se limita automáticamente a la forma correcta.

Eventos del asistente

Estos eventos realizan un seguimiento del ciclo de vida de respuesta del agente, desde el inicio del turno mediante fragmentos transmitidos en streaming hasta el mensaje final.

assistant.turn_start

Se genera cuando el agente inicia a procesar un turno.

Campo de datosTipoObligatorioDescripción
turnIdstringIdentificador de turno (normalmente un número de turno con cadena)
interactionIdstring
Identificador de interacción para la correlación de telemetría

assistant.intent

Efímero. Descripción breve de lo que el agente está haciendo actualmente, actualizado a medida que funciona.

Campo de datosTipoObligatorioDescripción
intentstringIntención legible para personas (por ejemplo, "Exploración del código base")

assistant.reasoning

Bloque de pensamiento extendido completo del modelo. Emitido después de finalizar el razonamiento.

Campo de datosTipoObligatorioDescripción
reasoningIdstringIdentificador único de este bloque de razonamiento
contentstringTexto completo de pensamiento avanzado

assistant.reasoning_delta

Efímero. Fragmento incremental del pensamiento extendido del modelo, transmitido en tiempo real.

Campo de datosTipoObligatorioDescripción
reasoningIdstringCoincide con el evento correspondiente assistant.reasoning .
deltaContentstringFragmento de texto que se va a anexar al contenido de razonamiento

assistant.message

La respuesta completa del asistente para esta llamada de LLM. Puede incluir solicitudes de invocación de herramientas.

Campo de datosTipoObligatorioDescripción
messageIdstringIdentificador único de este mensaje
contentstringRespuesta de texto del asistente
toolRequestsToolRequest[]
Llamadas a herramientas que el asistente desea realizar (ver abajo)
reasoningOpaquestring
Pensamiento extendido cifrado (modelos antrópicos); vinculado a sesión
reasoningTextstring
Texto de razonamiento legible a partir del pensamiento ampliado
encryptedContentstring
Contenido de razonamiento cifrado (modelos de OpenAI); vinculado a la sesión
phasestring
La fase de generación (por ejemplo, "thinking" frente a "response")
outputTokensnumber
Recuento real de tokens de salida de la respuesta de la API
interactionIdstring
Identificador de interacción para la telemetría
parentToolCallIdstring
Establecer cuándo se origina este mensaje desde un subagente
          **
          `ToolRequest` campos:**
CampoTipoObligatorioDescripción
toolCallIdstringIdentificador único para esta llamada de herramienta
namestringNombre de la herramienta (por ejemplo, "bash", "edit", "grep")
argumentsobject
Argumentos analizados para la herramienta
type"function" | "custom"
Tipo de llamada; el valor predeterminado es "function" cuando está ausente.

assistant.message_delta

Efímero. Fragmento incremental de la respuesta de texto del asistente, transmitido en tiempo real.

Campo de datosTipoObligatorioDescripción
messageIdstringCoincide con el evento correspondiente assistant.message .
deltaContentstringFragmento de texto que se va a anexar al mensaje
parentToolCallIdstring
Se establece al originar por un subagente

assistant.turn_end

Se genera cuando el agente finaliza un turno (todas las ejecuciones de herramientas se completan y se entrega la respuesta final).

Campo de datosTipoObligatorioDescripción
turnIdstringCoincide con el evento correspondiente assistant.turn_start .

assistant.usage

Efímero. Información de costos y uso de tokens para una llamada API individual.

Campo de datosTipoObligatorioDescripción
modelstringIdentificador de modelo (por ejemplo, "gpt-4.1")
inputTokensnumber
Tokens de entrada consumidos
outputTokensnumber
Tokens de salida generados
cacheReadTokensnumber
Tokens leídos de la caché de prompt
cacheWriteTokensnumber
Tokens escritos para solicitar caché
costnumber
Coste del multiplicador de modelos para la facturación
durationnumber
Duración de la llamada API en milisegundos
initiatorstring
Lo que desencadenó esta llamada (por ejemplo, "sub-agent") estará ausente si es iniciado por el usuario
apiCallIdstring
Identificador de finalización del proveedor (por ejemplo, chatcmpl-abc123)
providerCallIdstring
          GitHub id. de seguimiento de solicitudes (`x-github-request-id`) |

| parentToolCallId | string | | Establecer cuándo se origina el uso desde un subagente | | quotaSnapshots | Record<string, QuotaSnapshot> | | Uso de recursos por cuota, con clave según el identificador de cuota | | copilotUsage | CopilotUsage | | Desglose de costos de tokens detallados de la API |

assistant.streaming_delta

Efímero. Indicador de progreso de red de bajo nivel: bytes totales recibidos de la respuesta de la API de streaming.

Campo de datosTipoObligatorioDescripción
totalResponseSizeBytesnumberBytes acumulados recibidos hasta ahora

Eventos de ejecución de herramientas

Estos eventos realizan un seguimiento del ciclo de vida completo de cada invocación de herramienta, desde el modelo que solicita una llamada de herramienta a través de la ejecución hasta la finalización.

tool.execution_start

Se genera cuando una herramienta comienza a ejecutarse.

Campo de datosTipoObligatorioDescripción
toolCallIdstringIdentificador único de esta llamada de herramienta
toolNamestringNombre de la herramienta (por ejemplo, "bash", "edit", "grep")
argumentsobject
Argumentos analizados pasados a la herramienta
mcpServerNamestring
Nombre del servidor MCP, cuando un servidor MCP proporciona la herramienta
mcpToolNamestring
Nombre de la herramienta original en el servidor MCP
parentToolCallIdstring
Establecer cuando lo invoca un subagente

tool.execution_partial_result

Efímero. Salida incremental de una herramienta en ejecución (por ejemplo, salida de Bash en transmisión).

Campo de datosTipoObligatorioDescripción
toolCallIdstringCoincide con el correspondiente tool.execution_start
partialOutputstringFragmento de salida incremental

tool.execution_progress

Efímero. Estado de progreso de una herramienta en ejecución legible para humanos (por ejemplo, notificaciones de progreso del servidor MCP).

Campo de datosTipoObligatorioDescripción
toolCallIdstringCoincide con el elemento correspondiente tool.execution_start
progressMessagestringMensaje de estado de progreso

tool.execution_complete

Se genera cuando una herramienta termina de ejecutarse correctamente o con un error.

Campo de datosTipoObligatorioDescripción
toolCallIdstringCoincide con el elemento correspondiente tool.execution_start
successbooleanSi la ejecución se realizó correctamente
modelstring
Modelo que generó esta invocación de herramienta
interactionIdstring
Identificador de interacción
isUserRequestedboolean
          `true` cuando el usuario solicitó explícitamente el uso de esta herramienta |

| result | Result | | Mostrar en caso de éxito (consulte a continuación) | | error | { message, code? } | | Presente en caso de error | | toolTelemetry | object | | Telemetría específica de la herramienta | | parentToolCallId | string | | Establecer cuando lo invoca un subagente |

          **
          `Result` campos:**
CampoTipoObligatorioDescripción
contentstringResultado conciso enviado al LLM (podría truncarse para la eficacia del uso de tokens)
detailedContentstring
Resultado completo para mostrar, conservando contenido completo como diferencias
contentsContentBlock[]
Bloques de contenido estructurados (texto, terminal, imagen, audio, recurso)

tool.user_requested

Se activa cuando el usuario solicita explícitamente una invocación de herramienta, en lugar de que el modelo decida llamarla.

Campo de datosTipoObligatorioDescripción
toolCallIdstringIdentificador único de esta llamada de herramienta
toolNamestringNombre de la herramienta que el usuario quiere invocar
argumentsobject
Argumentos para la invocación

Eventos del ciclo de vida de la sesión

session.idle

Efímero. El agente ha terminado todo el procesamiento y está listo para el siguiente mensaje. Esta es la señal de que un giro está completamente completo.

Campo de datosTipoObligatorioDescripción
backgroundTasksBackgroundTasks
Los agentes o shells en segundo plano siguen ejecutándose cuando el agente queda inactivo

session.error

Error durante el procesamiento de la sesión.

Campo de datosTipoObligatorioDescripción
errorTypestringCategoría de error (por ejemplo, "authentication", "quota", "rate_limit")
messagestringMensaje de error legible por humanos
stackstring
Seguimiento de pila de errores
statusCodenumber
Código de estado HTTP de la solicitud ascendente
providerCallIdstring
          GitHub identificador de seguimiento de solicitudes para la correlación del registro del lado servidor |

session.compaction_start

Se ha iniciado la compactación de ventanas de contexto. La carga de datos está vacía ({}).

session.compaction_complete

La compactación de la ventana de contexto finalizó.

Campo de datosTipoObligatorioDescripción
successbooleanSi la compactación se realizó correctamente
errorstring
Mensaje de error si se produjo un error en la compactación
preCompactionTokensnumber
Tokens antes de la compactación
postCompactionTokensnumber
Tokens después de la compactación
preCompactionMessagesLengthnumber
Recuento de mensajes antes de la compactación
messagesRemovednumber
Mensajes quitados
tokensRemovednumber
Tokens eliminados
summaryContentstring
Resumen generado por LLM del historial compacto
checkpointNumbernumber
Número de instantánea de punto de control creado para la recuperación
checkpointPathstring
Ruta del archivo donde se almacenó el punto de control
compactionTokensUsed{ input, output, cachedInput }
Uso de tokens para la llamada LLM de compactación
requestIdstring
          GitHub identificador de seguimiento de solicitudes para la llamada de compactación |

session.title_changed

Efímero. Se actualizó el título generado automáticamente de la sesión.

Campo de datosTipoObligatorioDescripción
titlestringNuevo título de sesión

session.context_changed

Se ha cambiado el directorio de trabajo o el contexto del repositorio de la sesión.

Campo de datosTipoObligatorioDescripción
cwdstringDirectorio de trabajo actual
gitRootstring
Raíz del repositorio de Git
repositorystring
Repositorio en "owner/name" formato
branchstring
Rama de Git actual

session.usage_info

Efímero. Instantánea de uso de la ventana de contexto.

Campo de datosTipoObligatorioDescripción
tokenLimitnumberNúmero máximo de tokens para la ventana de contexto del modelo
currentTokensnumberTokens actuales en la ventana de contexto
messagesLengthnumberRecuento de mensajes actual en la conversación

session.task_complete

El agente ha completado su tarea asignada.

Campo de datosTipoObligatorioDescripción
summarystring
Resumen de la tarea completada

session.shutdown

La sesión finalizó.

Campo de datosTipoObligatorioDescripción
shutdownType"routine" | "error"Apagado normal o fallo
errorReasonstring
Descripción del error cuando shutdownType está "error"
totalPremiumRequestsnumberTotal de solicitudes de API Premium usadas
totalApiDurationMsnumberTiempo de llamada API acumulado en milisegundos
sessionStartTimenumberMarca de tiempo de Unix (ms) cuando se inició la sesión
codeChanges{ linesAdded, linesRemoved, filesModified }Métricas agregadas de cambio de código
modelMetricsRecord<string, ModelMetric>Desglose del uso por modelo
currentModelstring
Modelo seleccionado en el momento de apagado

Permisos y eventos de entrada de usuario

Estos eventos se emiten cuando el agente necesita aprobación o entrada del usuario antes de continuar.

permission.requested

Efímero. El agente necesita permiso para realizar una acción (ejecutar un comando, escribir un archivo, etc.).

Campo de datosTipoObligatorioDescripción
requestIdstringUsa esto para responder a través de session.respondToPermission()
permissionRequestPermissionRequestDetalles del permiso que se solicita

es permissionRequest una unión discriminada en kind:

kindCampos claveDescripción
"shell"
          `fullCommandText`, `intention`, , `commands[]`, `possiblePaths[]` | Ejecutar un comando de shell |

| "write" | fileName, diff, , intention, newFileContents? | Escribir o modificar un archivo | | "read" | path, intention | Leer un archivo o directorio | | "mcp" | serverName, toolName, toolTitle, , args?, readOnly | Invocar una herramienta MCP | | "url" | url, intention | Capturar una dirección URL | | "memory" | subject, , fact, citations | Almacenar una memoria | | "custom-tool" | toolName, , toolDescription, args? | Llame a una herramienta personalizada |

Todas las variantes kind también incluyen un enlace opcional toolCallId que retorna a la llamada de herramienta que desencadenó la solicitud.

permission.completed

Efímero. Se resolvió una solicitud de permiso.

Campo de datosTipoObligatorioDescripción
requestIdstringCoincide con el elemento correspondiente permission.requested
result.kindstringUno 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. El agente está haciendo una pregunta al usuario.

Campo de datosTipoObligatorioDescripción
requestIdstringÚselo para responder a través de session.respondToUserInput()
questionstringPregunta que se va a presentar al usuario
choicesstring[]
Opciones predefinidas para el usuario
allowFreeformboolean
Indica si se permite la entrada de texto de forma libre

user_input.completed

Efímero. Se resolvió una solicitud de entrada de usuario.

Campo de datosTipoObligatorioDescripción
requestIdstringCoincide con el correspondiente user_input.requested

elicitation.requested

Efímero. El agente necesita una entrada de formulario estructurada del usuario (protocolo de elicitación MCP).

Campo de datosTipoObligatorioDescripción
requestIdstringUsa esto para responder a través de session.respondToElicitation()
messagestringDescripción de la información necesaria
mode"form"
Modo de elicitación (actualmente solo "form")
requestedSchema{ type: "object", properties, required? }Esquema JSON que describe los campos de formulario

elicitation.completed

Efímero. Se resolvió una solicitud de elicitación.

Campo de datosTipoObligatorioDescripción
requestIdstringCoincide con el correspondiente elicitation.requested

Subagente y eventos de habilidades

subagent.started

Se invocó un agente personalizado como subagente.

Campo de datosTipoObligatorioDescripción
toolCallIdstringLlamada a la herramienta primaria que generó este subagente
agentNamestringNombre interno del subagente
agentDisplayNamestringNombre para mostrar legible por el usuario
agentDescriptionstringDescripción de lo que hace el subagente

subagent.completed

Un subagente finalizó correctamente.

Campo de datosTipoObligatorioDescripción
toolCallIdstringCorresponde con el correspondiente subagent.started
agentNamestringNombre interno
agentDisplayNamestringNombre para mostrar

subagent.failed

Un subagente encontró un error.

Campo de datosTipoObligatorioDescripción
toolCallIdstringCoincide con el elemento correspondiente subagent.started
agentNamestringNombre interno
agentDisplayNamestringNombre para mostrar
errorstringMensaje de error

subagent.selected

Se seleccionó (inferido) un agente personalizado para gestionar la solicitud actual.

Campo de datosTipoObligatorioDescripción
agentNamestringNombre interno del agente seleccionado
agentDisplayNamestringNombre para mostrar
toolsstring[] | nullNombres de herramientas disponibles para este agente; null para todas las herramientas

subagent.deselected

Se deseleccionó un agente personalizado y se devolvió al agente predeterminado. La carga de respuesta estará vacía ({}).

skill.invoked

Se activó una habilidad en la conversación actual.

Campo de datosTipoObligatorioDescripción
namestringNombre de la habilidad
pathstringRuta de acceso al archivo de la definición en SKILL.md
contentstringContenido completo de habilidades inyectado en la conversación
allowedToolsstring[]
Herramientas aprobadas automáticamente mientras esta habilidad está activa
pluginNamestring
Plugin de la habilidad originada en
pluginVersionstring
Versión del complemento

Otros eventos

abort

Se anuló el turno actual.

Campo de datosTipoObligatorioDescripción
reasonstring¿Por qué se anuló el turno (por ejemplo, "user initiated")

user.message

El usuario envió un mensaje. Se registra para la línea de tiempo de la sesión.

Campo de datosTipoObligatorioDescripción
contentstringTexto del mensaje del usuario
transformedContentstring
Versión transformada después del preprocesamiento
attachmentsAttachment[]
Archivos, directorios, selección, blob o GitHub datos adjuntos de referencia
sourcestring
Identificador de origen del mensaje
agentModestring
Modo de agente: "interactive", "plan", "autopilot"o "shell"
interactionIdstring
Identificador de interacción

system.message

Se insertó un mensaje del sistema o del desarrollador en la conversación.

Campo de datosTipoObligatorioDescripción
contentstringTexto del mensaje
role"system" | "developer"Rol de mensaje
namestring
Identificador de origen
metadata{ promptVersion?, variables? }
Metadatos de plantilla de solicitud

external_tool.requested

Efímero. El agente quiere invocar una herramienta externa (una proporcionada por el consumidor del SDK).

Campo de datosTipoObligatorioDescripción
requestIdstringUsa esto para responder a través de session.respondToExternalTool()
sessionIdstringSesión a la que pertenece esta solicitud
toolCallIdstringID de llamada de herramienta para esta invocación
toolNamestringNombre de la herramienta externa
argumentsobject
Argumentos de la herramienta

external_tool.completed

Efímero. Se resolvió una solicitud de herramienta externa.

Campo de datosTipoObligatorioDescripción
requestIdstringCoincide con el elemento correspondiente external_tool.requested

exit_plan_mode.requested

Efímero. El agente ha creado un plan y quiere salir del modo de plan.

Campo de datosTipoObligatorioDescripción
requestIdstringUsa esto para responder a través de session.respondToExitPlanMode()
summarystringResumen del plan
planContentstringContenido completo del archivo de plan
actionsstring[]Acciones de usuario disponibles (por ejemplo, aprobar, editar, rechazar)
recommendedActionstringAcción sugerida

exit_plan_mode.completed

Efímero. Se resolvió una solicitud de modo de plan de salida.

Campo de datosTipoObligatorioDescripción
requestIdstringCoincide con el elemento correspondiente exit_plan_mode.requested

command.queued

Efímero. Se puso en cola un comando slash para su ejecución.

Campo de datosTipoObligatorioDescripción
requestIdstringUsa esto para responder a través de session.respondToQueuedCommand()
commandstringTexto del comando de barra diagonal (por ejemplo, /help y /clear)

command.completed

Efímero. Se resolvió un comando en cola.

Campo de datosTipoObligatorioDescripción
requestIdstringCoincide con el elemento correspondiente command.queued

Referencia rápida: flujo de turnos de agentes

Un turno agente típico emite eventos en este orden:

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 los tipos de eventos de un vistazo

Tipo de eventoEfímeroCategoríaCampos de datos clave
assistant.turn_start
Asistente
          `turnId`, `interactionId?` |

| assistant.intent | ✅ | Asistente | intent | | assistant.reasoning | | Asistente | reasoningId, content | | assistant.reasoning_delta | ✅ | Asistente | reasoningId, deltaContent | | assistant.streaming_delta | ✅ | Asistente | totalResponseSizeBytes | | assistant.message | | Asistente | messageId, content, toolRequests?, , outputTokens?, phase? | | assistant.message_delta | ✅ | Asistente | messageId, , deltaContent, parentToolCallId? | | assistant.turn_end | | Asistente | turnId | | assistant.usage | ✅ | Asistente | model, inputTokens?, outputTokens?, , cost?, duration? | | tool.user_requested | | Herramienta | toolCallId, , toolName, arguments? | | tool.execution_start | | Herramienta | toolCallId, toolName, , arguments?, mcpServerName? | | tool.execution_partial_result | ✅ | Herramienta | toolCallId, partialOutput | | tool.execution_progress | ✅ | Herramienta | toolCallId, progressMessage | | tool.execution_complete | | Herramienta | toolCallId, success, , result?, error? | | session.idle | ✅ | Sesión | backgroundTasks? | | session.error | | Sesión | errorType, , message, statusCode? | | session.compaction_start | | Sesión | (vacío) | | session.compaction_complete | | Sesión | success, , preCompactionTokens?, summaryContent? | | session.title_changed | ✅ | Sesión | title | | session.context_changed | | Sesión | cwd, gitRoot?, , repository?, branch? | | session.usage_info | ✅ | Sesión | tokenLimit, , currentTokens, messagesLength | | session.task_complete | | Sesión | summary? | | session.shutdown | | Sesión | shutdownType, , codeChanges, modelMetrics | | permission.requested | ✅ | Permiso | requestId, permissionRequest | | permission.completed | ✅ | Permiso | requestId, result.kind | | user_input.requested | ✅ | Entrada de usuario | requestId, , question, choices? | | user_input.completed | ✅ | Entrada de usuario | requestId | | elicitation.requested | ✅ | Entrada de usuario | requestId, , message, requestedSchema | | elicitation.completed | ✅ | Entrada de usuario | requestId | | subagent.started | | Subagente | toolCallId, , agentName, agentDisplayName | | subagent.completed | | Subagente | toolCallId, , agentName, agentDisplayName | | subagent.failed | | Subagente | toolCallId, , agentName, error | | subagent.selected | | Subagente | agentName, , agentDisplayName, tools | | subagent.deselected | | Subagente | (vacío) | | skill.invoked | | Habilidad | name, path, , content, allowedTools? | | abort | | Control | reason | | user.message | | Usuario | content, , attachments?, agentMode? | | system.message | | Sistema | content, role | | external_tool.requested | ✅ | Herramienta externa | requestId, , toolName, arguments? | | external_tool.completed | ✅ | Herramienta externa | requestId | | command.queued | ✅ | Comando | requestId, command | | command.completed | ✅ | Comando | requestId | | exit_plan_mode.requested | ✅ | Modo de plan | requestId, summary, , planContent, actions | | exit_plan_mode.completed | ✅ | Modo de plan | requestId |