Skip to main content

Diffusion en continu d’événements dans le Kit de développement logiciel (SDK) Copilot

Référencer les événements de session émis par Kit de développement logiciel (SDK) Copilot et les champs de données que chaque événement contient.

Qui peut utiliser cette fonctionnalité ?

SDK GitHub Copilot est disponible dans tous les forfaits Copilot.

Remarque

          Kit de développement logiciel (SDK) Copilot est actuellement en préversion technique. Les fonctionnalités et la disponibilité sont susceptibles de changer.

Chaque action que l’agent Copilot prend, en pensant, en écrivant du code, en exécutant des outils, est émise en tant qu’événement de session auquel vous pouvez vous abonner. Cet article est une référence au niveau du champ pour chaque type d’événement afin de connaître exactement les données à attendre.

Lorsqu’il streaming: true est défini sur une session, le SDK émet des événements éphémères en temps réel (deltas, mises à jour de progression) ainsi que des événements persistants (messages complets, résultats de l’outil). Tous les événements partagent une enveloppe commune et portent une data charge utile dont la forme dépend de l’événement type. Pour obtenir un diagramme de séquence du flux d’événements complet, consultez le github/copilot-sdk référentiel.

ConceptDescription
          **Événement éphémère** | Transitoire; diffusé en temps réel, mais **pas** conservé dans le journal de session. Pas rejoué lors de la reprise de session. |

| Événement persistant | Enregistré dans le journal des événements de session sur le disque. Rejoué lors de la reprise d’une session. | | Événement Delta | Segment de streaming éphémère (texte ou raisonnement). Accumulez des deltas pour générer le contenu complet. | | ** parentId Chaîne** | Chaque événement pointe vers l’événement parentId précédent, formant une liste liée que vous pouvez parcourir. |

Enveloppe d’événement

Chaque événement de session, quel que soit le type, inclut les champs suivants :

ChampTypeDescription
id
          `string` (UUID v4) | Identificateur d’événement unique |

| timestamp | string (ISO 8601) | Lors de la création de l’événement | | parentId | string \| null | ID de l’événement précédent dans la chaîne ; null pour le premier événement | | ephemeral | boolean? | true pour les événements temporaires ; absents ou false pour les événements persistants | | type | string | Discriminateur de type d’événement (voir les tableaux ci-dessous) | | data | object | Charge utile spécifique à l’événement |

Abonnement aux événements

// 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);
});

Pour obtenir des exemples dans Python, Go et .NET, consultez le github/copilot-sdk référentiel.

Conseil

          **Python / Go :** Ces kits SDK utilisent une `Data` seule classe/struct avec tous les champs possibles comme facultatifs/nullables. Seuls les champs répertoriés dans les tableaux ci-dessous sont renseignés pour chaque type d’événement , le reste sera `None` / `nil`.
          **.NET:** Le Kit de développement logiciel (SDK) .NET utilise des classes de données distinctes et fortement typées par événement (par exemple), `AssistantMessageDeltaData`de sorte que seuls les champs pertinents existent sur chaque type.
          **TypeScript :** Le Kit de développement logiciel (SDK) TypeScript utilise une union discriminée : lorsque vous effectuez une correspondance sur `event.type`, la charge utile `data` est automatiquement réduite à la forme correcte.

Événements de l'Assistant

Ces événements effectuent le suivi du cycle de vie de réponse de l’agent, du début en passant par les flux en continu jusqu’au message final.

assistant.turn_start

Émis lorsque l'agent commence à traiter une itération.

Champ de donnéesTypeObligatoireDescription
turnIdstringIdentifiant de tour (généralement un numéro de tour converti en chaîne de caractères)
interactionIdstring
Identificateur d’interaction pour la corrélation de télémétrie

assistant.intent

Éphémère. Brève description de ce que fait actuellement l’agent, et mise à jour à mesure qu’il travaille.

Champ de donnéesTypeObligatoireDescription
intentstringIntention lisible par l’homme (par exemple, « Exploration du codebase »)

assistant.reasoning

Bloc de pensée étendu complet du modèle. Émis après la fin du raisonnement.

Champ de donnéesTypeObligatoireDescription
reasoningIdstringIdentificateur unique pour ce bloc de raisonnement
contentstringTexte complet de réflexion approfondie

assistant.reasoning_delta

Éphémère. Partie incrémentielle de la pensée étendue du modèle, diffusée en temps réel.

Champ de donnéesTypeObligatoireDescription
reasoningIdstringCorrespond à l’événement correspondant assistant.reasoning
deltaContentstringBloc de texte à ajouter au contenu de raisonnement

assistant.message

Réponse complète de l’Assistant pour cet appel LLM. Peut inclure des demandes d’appel d’outil.

Champ de donnéesTypeObligatoireDescription
messageIdstringIdentificateur unique pour ce message
contentstringRéponse textuelle de l’Assistant
toolRequestsToolRequest[]
Les appels que l'assistant souhaite faire avec l'outil (voir ci-dessous)
reasoningOpaquestring
Pensée étendue chiffrée (modèles anthropiques) ; liée à la session
reasoningTextstring
Texte de raisonnement lisible résultant d'une réflexion approfondie
encryptedContentstring
Contenu de raisonnement chiffré (modèles OpenAI) ; liées à la session
phasestring
Phase de génération (par exemple, "thinking" vs "response")
outputTokensnumber
Nombre exact de jetons de sortie dans la réponse de l’API
interactionIdstring
Identificateur d’interaction pour la télémétrie
parentToolCallIdstring
Définir quand ce message provient d’un sous-agent
          **
          `ToolRequest` Champs:**
ChampTypeObligatoireDescription
toolCallIdstringID unique pour cet appel d’outil
namestringNom de l’outil (par exemple, , "bash"``"edit", "grep")
argumentsobject
Arguments analysés pour l’outil
type"function" | "custom"
Type d’appel ; prend la valeur par défaut "function" lorsqu’il est absent

assistant.message_delta

Éphémère. Segment incrémentiel de la réponse de texte de l’assistant, diffusé en temps réel.

Champ de donnéesTypeObligatoireDescription
messageIdstringCorrespond à l’événement correspondant assistant.message
deltaContentstringBloc de texte à ajouter au message
parentToolCallIdstring
Définir lorsqu’il provient d’un sous-agent

assistant.turn_end

Émis lorsque l’agent termine un tour (toutes les exécutions d’outils sont terminées, réponse finale remise).

Champ de donnéesTypeObligatoireDescription
turnIdstringCorrespond à l’événement correspondant assistant.turn_start

assistant.usage

Éphémère. Informations d’utilisation et de coût des jetons pour un appel d’API individuel.

Champ de donnéesTypeObligatoireDescription
modelstringIdentificateur de modèle (par exemple, "gpt-4.1")
inputTokensnumber
Jetons d’entrée consommés
outputTokensnumber
Jetons de sortie produits
cacheReadTokensnumber
Jetons lus à partir du cache d’invite
cacheWriteTokensnumber
Jetons écrits dans le cache d’invite
costnumber
Coût du multiplicateur de modèle pour la facturation
durationnumber
Durée des appels d’API en millisecondes
initiatorstring
Ce qui a déclenché cet appel (par exemple, "sub-agent") ; absent si initié par l'utilisateur
apiCallIdstring
ID d’achèvement du fournisseur (par exemple, chatcmpl-abc123)
providerCallIdstring
          GitHub ID de suivi de requête (`x-github-request-id`) |

| parentToolCallId | string | | Définir lorsque l’utilisation provient d’un sous-agent | | quotaSnapshots | Record<string, QuotaSnapshot> | | Utilisation des ressources par quota, indexé par identificateur de quota | | copilotUsage | CopilotUsage | | Répartition des coûts des jetons itemisés à partir de l’API |

assistant.streaming_delta

Éphémère. Indicateur de progression réseau de bas niveau : nombre total d’octets reçus de la réponse de l’API de diffusion en continu.

Champ de donnéesTypeObligatoireDescription
totalResponseSizeBytesnumberOctets cumulés reçus jusqu’à présent

Événements d’exécution d’outils

Ces événements suivent le cycle de vie complet de chaque appel d'outil, depuis la demande d'appel d'outil par le modèle, à travers l'exécution, jusqu'à son achèvement.

tool.execution_start

Émis lorsqu’un outil commence à s’exécuter.

Champ de donnéesTypeObligatoireDescription
toolCallIdstringIdentificateur unique pour cet appel d’outil
toolNamestringNom de l’outil (par exemple, "bash", "edit", "grep")
argumentsobject
Arguments analysés passés à l’outil
mcpServerNamestring
Nom du serveur MCP, lorsque l’outil est fourni par un serveur MCP
mcpToolNamestring
Nom de l’outil d’origine sur le serveur MCP
parentToolCallIdstring
Définir lorsqu’il est appelé par un sous-agent

tool.execution_partial_result

Éphémère. Sortie incrémentielle d’un outil en cours d’exécution (par exemple, diffusion en continu de la sortie bash).

Champ de donnéesTypeObligatoireDescription
toolCallIdstringCorrespond au tool.execution_start correspondant
partialOutputstringSegment de sortie incrémentiel

tool.execution_progress

Éphémère. État de progression lisible par l’homme à partir d’un outil en cours d’exécution (par exemple, notifications de progression du serveur MCP).

Champ de donnéesTypeObligatoireDescription
toolCallIdstringCorrespond au tool.execution_start correspondant
progressMessagestringMessage d’état de progression

tool.execution_complete

Émis lorsqu'un outil termine son exécution, avec succès ou avec une erreur.

Champ de donnéesTypeObligatoireDescription
toolCallIdstringCorrespond au tool.execution_start correspondant
successbooleanIndique si l’exécution a réussi
modelstring
Modèle qui a généré cet appel d’outil
interactionIdstring
Identificateur d’interaction
isUserRequestedboolean
          `true` lorsque l’utilisateur a explicitement demandé cet appel d’outil |

| result | Result | | Présentation sur la réussite (voir ci-dessous) | | error | { message, code? } | | Présent en cas d’échec | | toolTelemetry | object | | Télémétrie spécifique à l’outil | | parentToolCallId | string | | Définir lorsqu’il est appelé par un sous-agent |

          **
          `Result` Champs:**
ChampTypeObligatoireDescription
contentstringRésultat concis envoyé au LLM (pouvant être tronqué pour l'optimisation des tokens)
detailedContentstring
Résultat complet pour l'affichage, préservant le contenu complet, y compris les différences
contentsContentBlock[]
Blocs de contenu structurés (texte, terminal, image, audio, ressource)

tool.user_requested

Émis lorsque l’utilisateur demande explicitement un appel d’outil (plutôt que le modèle choisissant d’en appeler un).

Champ de donnéesTypeObligatoireDescription
toolCallIdstringIdentificateur unique pour cet appel d’outil
toolNamestringNom de l’outil que l’utilisateur souhaite appeler
argumentsobject
Arguments pour l’appel

Événements de cycle de vie de session

session.idle

Éphémère. L’agent a terminé tout le traitement et est prêt pour le message suivant. Il s’agit du signal qu’un tour est entièrement terminé.

Champ de donnéesTypeObligatoireDescription
backgroundTasksBackgroundTasks
Agents/shells en arrière-plan continuent de s'exécuter lorsque l'agent devenait inactif

session.error

Une erreur s’est produite pendant le traitement de la session.

Champ de donnéesTypeObligatoireDescription
errorTypestringCatégorie d’erreur (par exemple, , "authentication"``"quota", "rate_limit")
messagestringMessage d’erreur lisible par l’humain
stackstring
Trace de pile d’erreurs
statusCodenumber
Code d’état HTTP à partir de la requête en amont
providerCallIdstring
          GitHub ID de suivi de requête pour la corrélation des journaux côté serveur |

session.compaction_start

La compaction de la fenêtre de contexte a commencé. La charge utile des données est vide ({}).

session.compaction_complete

Compactage de fenêtre de contexte terminé.

Champ de donnéesTypeObligatoireDescription
successbooleanIndique si la compaction a réussi
errorstring
Message d’erreur en cas d’échec de compactage
preCompactionTokensnumber
Jetons avant compactage
postCompactionTokensnumber
Jetons après compactage
preCompactionMessagesLengthnumber
Nombre de messages avant compactage
messagesRemovednumber
Messages supprimés
tokensRemovednumber
Jetons supprimés
summaryContentstring
Résumé de l'historique compacté généré par le LLM
checkpointNumbernumber
Numéro d’instantané de point de contrôle créé pour la récupération
checkpointPathstring
Chemin d’accès au fichier où le point de contrôle a été stocké
compactionTokensUsed{ input, output, cachedInput }
Utilisation des jetons pour l'appel de la compaction avec LLM
requestIdstring
          GitHub ID de suivi de requête pour l’appel de compactage |

session.title_changed

Éphémère. Le titre généré automatiquement de la session a été mis à jour.

Champ de donnéesTypeObligatoireDescription
titlestringNouveau titre de session

session.context_changed

Le répertoire de travail ou le contexte du référentiel de la session a changé.

Champ de donnéesTypeObligatoireDescription
cwdstringRépertoire de travail actuel
gitRootstring
Racine du référentiel Git
repositorystring
Référentiel au format "owner/name"
branchstring
Branche Git actuelle

session.usage_info

Éphémère. Instantané d’utilisation de la fenêtre de contexte.

Champ de donnéesTypeObligatoireDescription
tokenLimitnumberNombre maximal de jetons pour la fenêtre de contexte du modèle
currentTokensnumberJetons actuels dans la fenêtre de contexte
messagesLengthnumberNombre de messages actuels dans la conversation

session.task_complete

L’agent a terminé sa tâche affectée.

Champ de donnéesTypeObligatoireDescription
summarystring
Résumé de la tâche terminée

session.shutdown

La session s’est terminée.

Champ de donnéesTypeObligatoireDescription
shutdownType"routine" | "error"Arrêt normal ou panne
errorReasonstring
Description de l’erreur quand shutdownType est "error"
totalPremiumRequestsnumberNombre total de demandes d’API Premium utilisées
totalApiDurationMsnumberTemps d’appel d’API cumulé en millisecondes
sessionStartTimenumberHorodatage Unix (ms) au démarrage de la session
codeChanges{ linesAdded, linesRemoved, filesModified }Métriques globales de modification de code
modelMetricsRecord<string, ModelMetric>Répartition de l’utilisation par modèle
currentModelstring
Modèle sélectionné au moment de l’arrêt

Événements d’autorisation et d’entrée utilisateur

Ces événements sont émis lorsque l’agent a besoin d’approbation ou d’entrée de l’utilisateur avant de continuer.

permission.requested

Éphémère. L’agent a besoin d’une autorisation pour effectuer une action (exécuter une commande, écrire un fichier, etc.).

Champ de donnéesTypeObligatoireDescription
requestIdstringUtilisez-le pour répondre via session.respondToPermission()
permissionRequestPermissionRequestDétails de l’autorisation demandée

Il permissionRequest s’agit d’une union discriminatoire sur kind:

kindChamps clésDescription
"shell"
          `fullCommandText`, `intention`, `commands[]`, `possiblePaths[]` | Exécuter une commande shell |

| "write" | fileName, diff, intention, newFileContents? | Écrire/modifier un fichier | | "read" | path, intention | Lire un fichier ou un répertoire | | "mcp" | serverName, toolName, , toolTitle, args?, readOnly | Appeler un outil MCP | | "url" | url, intention | Récupérer une URL | | "memory" | subject, fact, citations | Stocker une mémoire | | "custom-tool" | toolName, toolDescription, args? | Appeler un outil personnalisé |

Toutes les kind variantes incluent également une liaison facultative toolCallId vers l’appel d’outil qui a déclenché la demande.

permission.completed

Éphémère. Une demande d’autorisation a été résolue.

Champ de donnéesTypeObligatoireDescription
requestIdstringCorrespond au permission.requested correspondant
result.kindstringUn des : "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

Éphémère. L’agent pose une question à l’utilisateur.

Champ de donnéesTypeObligatoireDescription
requestIdstringUtilisez-le pour répondre via session.respondToUserInput()
questionstringQuestion à présenter à l’utilisateur
choicesstring[]
Choix prédéfinis pour l’utilisateur
allowFreeformboolean
Indique si l’entrée de texte de forme libre est autorisée

user_input.completed

Éphémère. Une demande d’entrée utilisateur a été résolue.

Champ de donnéesTypeObligatoireDescription
requestIdstringCorrespond au user_input.requested correspondant

elicitation.requested

Éphémère. L'agent a besoin d'une entrée de formulaire structurée de l'utilisateur (protocole MCP d'élucidation).

Champ de donnéesTypeObligatoireDescription
requestIdstringUtilisez-le pour répondre via session.respondToElicitation()
messagestringDescription des informations nécessaires
mode"form"
Mode d’élicitation (actuellement uniquement "form")
requestedSchema{ type: "object", properties, required? }Schéma JSON décrivant les champs de formulaire

elicitation.completed

Éphémère. Une demande d’éciation a été résolue.

Champ de donnéesTypeObligatoireDescription
requestIdstringCorrespond au elicitation.requested correspondant

Événements de sous-agent et de compétence

subagent.started

Un agent personnalisé a été appelé en tant que sous-agent.

Champ de donnéesTypeObligatoireDescription
toolCallIdstringAppel de l’outil parent qui a généré ce sous-agent
agentNamestringNom interne du sous-agent
agentDisplayNamestringNom d’affichage lisible par l’homme
agentDescriptionstringDescription de ce que fait le sous-agent

subagent.completed

Un sous-agent a terminé avec succès.

Champ de donnéesTypeObligatoireDescription
toolCallIdstringCorrespond au subagent.started correspondant
agentNamestringNom interne
agentDisplayNamestringNom d'affichage

subagent.failed

Un sous-agent a rencontré une erreur.

Champ de donnéesTypeObligatoireDescription
toolCallIdstringCorrespond au subagent.started correspondant
agentNamestringNom interne
agentDisplayNamestringNom d'affichage
errorstringMessage d'erreur

subagent.selected

Un agent personnalisé a été sélectionné (déduit) pour gérer la requête actuelle.

Champ de donnéesTypeObligatoireDescription
agentNamestringNom interne de l’agent sélectionné
agentDisplayNamestringNom d'affichage
toolsstring[] | nullNoms d’outils disponibles pour cet agent ; null pour tous les outils

subagent.deselected

Un agent personnalisé a été désélectionné, retournant à l’agent par défaut. La charge utile de réponse est vide ({}).

skill.invoked

Une compétence a été activée pour la conversation actuelle.

Champ de donnéesTypeObligatoireDescription
namestringNom de la compétence
pathstringChemin d’accès au fichier de la définition SKILL.md
contentstringContenu de compétences intégral intégré dans la conversation
allowedToolsstring[]
Outils approuvés automatiquement pendant que cette compétence est active
pluginNamestring
Le plug-in d'origine de la compétence
pluginVersionstring
Version du plug-in

Autres événements

abort

Le tour actuel a été abandonné.

Champ de donnéesTypeObligatoireDescription
reasonstringPourquoi le tour a été abandonné (par exemple, "user initiated")

user.message

L’utilisateur a envoyé un message. Enregistré pour la chronologie de la session.

Champ de donnéesTypeObligatoireDescription
contentstringTexte du message de l’utilisateur
transformedContentstring
Version transformée après prétraitement
attachmentsAttachment[]
Fichier, répertoire, élément sélectionné, objet blob ou pièce jointe de référence GitHub
sourcestring
Identificateur de source de message
agentModestring
Mode agent : "interactive", , "plan"``"autopilot"ou"shell"
interactionIdstring
Identificateur d’interaction

system.message

Une invite de système ou de développeur a été injectée dans la conversation.

Champ de donnéesTypeObligatoireDescription
contentstringTexte de l’invite
role"system" | "developer"Rôle du message
namestring
Identificateur de la source
metadata{ promptVersion?, variables? }
Métadonnées du modèle d'invite

external_tool.requested

Éphémère. L’agent souhaite appeler un outil externe (fourni par le consommateur du SDK).

Champ de donnéesTypeObligatoireDescription
requestIdstringUtilisez-le pour répondre via session.respondToExternalTool()
sessionIdstringSession à laquelle cette demande appartient
toolCallIdstringIdentifiant d'outil appelé pour cet appel
toolNamestringNom de l’outil externe
argumentsobject
Arguments en faveur de l'outil

external_tool.completed

Éphémère. Une demande d’outil externe a été résolue.

Champ de donnéesTypeObligatoireDescription
requestIdstringCorrespond au external_tool.requested correspondant

exit_plan_mode.requested

Éphémère. L’agent a créé un plan et souhaite quitter le mode plan.

Champ de donnéesTypeObligatoireDescription
requestIdstringUtilisez-le pour répondre via session.respondToExitPlanMode()
summarystringRésumé du plan
planContentstringContenu complet du fichier de plan
actionsstring[]Actions utilisateur disponibles (par exemple, approuver, modifier, rejeter)
recommendedActionstringAction suggérée

exit_plan_mode.completed

Éphémère. Une demande de mode de plan de sortie a été résolue.

Champ de donnéesTypeObligatoireDescription
requestIdstringCorrespond au exit_plan_mode.requested correspondant

command.queued

Éphémère. Une commande slash a été mise en file d’attente pour exécution.

Champ de donnéesTypeObligatoireDescription
requestIdstringUtilisez-le pour répondre via session.respondToQueuedCommand()
commandstringTexte de la commande slash (par exemple, /help, /clear)

command.completed

Éphémère. Une commande mise en file d’attente a été résolue.

Champ de donnéesTypeObligatoireDescription
requestIdstringCorrespond au command.queued correspondant

Référence rapide : flux de transformation agentique

Un tour agentique classique émet des événements dans cet ordre :

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)

Tous les types d’événements en un clin d’œil

Type d’événementÉphémèreCatégorieChamps de données clés
assistant.turn_start
Assistant
          `turnId`, `interactionId?` |

| assistant.intent | ✅ | Assistant | intent | | assistant.reasoning | | Assistant | reasoningId, content | | assistant.reasoning_delta | ✅ | Assistant | reasoningId, deltaContent | | assistant.streaming_delta | ✅ | Assistant | totalResponseSizeBytes | | assistant.message | | Assistant | messageId, content, , toolRequests?, outputTokens?, phase? | | assistant.message_delta | ✅ | Assistant | messageId, deltaContent, parentToolCallId? | | assistant.turn_end | | Assistant | turnId | | assistant.usage | ✅ | Assistant | model, inputTokens?, , outputTokens?, cost?, duration? | | tool.user_requested | | Outil | toolCallId, toolName, arguments? | | tool.execution_start | | Outil | toolCallId, toolName, arguments?, mcpServerName? | | tool.execution_partial_result | ✅ | Outil | toolCallId, partialOutput | | tool.execution_progress | ✅ | Outil | toolCallId, progressMessage | | tool.execution_complete | | Outil | toolCallId, success, result?, error? | | session.idle | ✅ | Session | backgroundTasks? | | session.error | | Session | errorType, message, statusCode? | | session.compaction_start | | Session | (vide) | | session.compaction_complete | | Session | success, preCompactionTokens?, summaryContent? | | session.title_changed | ✅ | Session | title | | session.context_changed | | Session | cwd, gitRoot?, repository?, branch? | | session.usage_info | ✅ | Session | tokenLimit, currentTokens, messagesLength | | session.task_complete | | Session | summary? | | session.shutdown | | Session | shutdownType, codeChanges, modelMetrics | | permission.requested | ✅ | Autorisation | requestId, permissionRequest | | permission.completed | ✅ | Autorisation | requestId, result.kind | | user_input.requested | ✅ | Entrée utilisateur | requestId, question, choices? | | user_input.completed | ✅ | Entrée utilisateur | requestId | | elicitation.requested | ✅ | Entrée utilisateur | requestId, message, requestedSchema | | elicitation.completed | ✅ | Entrée utilisateur | requestId | | subagent.started | | Sous-agent | toolCallId, agentName, agentDisplayName | | subagent.completed | | sous-agent | toolCallId, agentName, agentDisplayName | | subagent.failed | | Sous-agent | toolCallId, agentName, error | | subagent.selected | | Sous-Agent | agentName, agentDisplayName, tools | | subagent.deselected | | Sous-agent | (vide) | | skill.invoked | | Compétence | name, path, content, allowedTools? | | abort | | Contrôle | reason | | user.message | | Utilisateur | content, attachments?, agentMode? | | system.message | | Système | content, role | | external_tool.requested | ✅ | Outil externe | requestId, toolName, arguments? | | external_tool.completed | ✅ | Outil externe | requestId | | command.queued | ✅ | Command | requestId, command | | command.completed | ✅ | Command | requestId | | exit_plan_mode.requested | ✅ | Plan Mode | requestId, summary, planContent, actions | | exit_plan_mode.completed | ✅ | Plan Mode | requestId |