Skip to main content
Skip to content

Streaming session events

Every action the Copilot agent takes—thinking, writing code, running tools—is emitted as a session event you can subscribe to. This guide is a field-level reference for each event type so you know exactly what data to expect without reading the SDK source.

Overview

When streaming: true is set on a session, the SDK emits ephemeral events in real time (deltas, progress updates) alongside persisted events (complete messages, tool results). All events share a common envelope and carry a data payload whose shape depends on the event type.

Diagram: Sequence diagram showing the described process.

ConceptDescription
Ephemeral eventTransient; streamed in real time but not persisted to the session log. Not replayed on session resume.
Persisted eventSaved to the session event log on disk. Replayed when resuming a session.
Delta eventAn ephemeral streaming chunk (text or reasoning). Accumulate deltas to build the complete content.
parentId chainEach event's parentId points to the previous event, forming a linked list you can walk.

Event envelope

Every session event, regardless of type, includes these fields:

FieldTypeDescription
idstring (UUID v4)Unique event identifier
timestampstring (ISO 8601)When the event was created
parentIdstring | nullID of the previous event in the chain; null for the first event
agentIdstring?Sub-agent instance ID for sub-agent-originated events; absent for root/main agent and session-level events
ephemeralboolean?true for transient events; absent or false for persisted events
typestringEvent type discriminator (see tables below)
dataobjectEvent-specific payload

Subscribing to events

Code languages navigation

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

Tip

(Python / Go) These SDKs use separate, per-event data types (for example, AssistantMessageDeltaData), so only the relevant fields exist on each type.

(.NET) The .NET SDK uses separate, strongly-typed data classes per event (e.g., AssistantMessageDeltaData), so only the relevant fields exist on each type.

(TypeScript) The TypeScript SDK uses a discriminated union—when you match on event.type, the data payload is automatically narrowed to the correct shape.

Subscribing before a session starts

A session can emit events before its create or resume call returns. The agent may already be working—especially on resume with continuePendingWork—and ephemeral events such as session.idle are never written to the session log, so getMessages cannot recover them afterwards. A subscription installed after the session handle exists misses that startup window.

Tip

(Rust) Client::prepare_session and Client::prepare_resume_session return a PreparedSession that owns the session's event channel before any protocol activity happens. Subscribe first, then call start().

use github_copilot_sdk::{Client, SessionConfig};

async fn create_without_missing_startup_events(
    client: &Client,
) -> Result<(), github_copilot_sdk::Error> {
    let prepared = client.prepare_session(
        SessionConfig::default().with_event_buffer_capacity(2048),
    )?;

    // Installed before any wire activity: nothing is dropped for lack of a receiver.
    let mut events = prepared.subscribe();
    tokio::spawn(async move {
        while let Ok(event) = events.recv().await {
            println!("{}", event.event_type);
        }
    });

    let session = prepared.start().await?;
    let _ = session;
    Ok(())
}

prepare_* is synchronous and inert: it validates the buffer capacity, allocates a local channel, and does nothing else. No session is registered and nothing reaches the CLI until start() is first polled. Dropping a prepared session that was never started leaves no state behind and closes its subscriptions; dropping the start() future cancels the in-flight startup and unregisters the session, so a retry with the same session ID succeeds. Cleanup is scoped to the exact registration the abandoned startup owned, so it cannot evict a retry that has already taken over the same session ID.

Startup buffering is worth planning for:

  • The event buffer is finite—512 events unless event_buffer_capacity overrides it. A capacity of 0 is rejected with an invalid-config error rather than clamped.
  • Slow subscribers observe a Lagged error reporting how many events were skipped. They never apply backpressure to the session's event loop.
  • Consumers that need a lossless view of a large startup burst must either configure a capacity that covers it or drain the subscription concurrently with start().

Note

For cloud sessions where the server assigns the session ID, the SDK cannot route notifications until the create response arrives and the ID is known. Events emitted before that point are not routable to any session. The guarantee is narrower: routed events are never dropped for lack of an installed receiver. Pin session_id on the config to get routing—and full pre-response coverage—from the first byte.

Render only the parent agent response

Sub-agent events share the parent session stream and include envelope-level agentId. Root/main agent events and session-level events omit agentId, so main-chat renderers can ignore assistant events where agentId is set and route those events to traces or progress UI instead.

Code languages navigation

TypeScript
import type { CopilotSession } from "@github/copilot-sdk";

export function subscribeParentResponse(session: CopilotSession): void {
    session.on("assistant.message_delta", (event) => {
        if (!event.agentId) {
            process.stdout.write(event.data.deltaContent);
        }
    });
}

Assistant events

These events track the agent's response lifecycle—from turn start through streaming chunks to the final message.

assistant.turn_start

Emitted when the agent begins processing a turn.

Data FieldTypeRequiredDescription
turnIdstring✅Turn identifier (typically a stringified turn number)
interactionIdstringCAPI interaction ID for telemetry correlation

assistant.intent

Ephemeral. Short description of what the agent is currently doing, updated as it works.

Data FieldTypeRequiredDescription
intentstring✅Human-readable intent (e.g., "Exploring codebase")

assistant.reasoning

Complete extended thinking block from the model. Emitted after reasoning is finished.

Data FieldTypeRequiredDescription
reasoningIdstring✅Unique identifier for this reasoning block
contentstring✅The complete extended thinking text

assistant.reasoning_delta

Ephemeral. Incremental chunk of the model's extended thinking, streamed in real time.

Data FieldTypeRequiredDescription
reasoningIdstring✅Matches the corresponding assistant.reasoning event
deltaContentstring✅Text chunk to append to reasoning content

assistant.message

The assistant's complete response for this LLM call. May include tool invocation requests.

Data FieldTypeRequiredDescription
messageIdstring✅Unique identifier for this message
contentstring✅The assistant's text response
toolRequestsToolRequest[]Tool calls the assistant wants to make (see below)
reasoningOpaquestringEncrypted extended thinking (Anthropic models); session-bound
reasoningTextstringReadable reasoning text from extended thinking
encryptedContentstringEncrypted reasoning content (OpenAI models); session-bound
phasestringGeneration phase (e.g., "thinking" vs "response")
outputTokensnumberActual output token count from the API response
interactionIdstringCAPI interaction ID for telemetry
parentToolCallIdstringDeprecated. Use envelope-level agentId for sub-agent attribution

ToolRequest fields:

FieldTypeRequiredDescription
toolCallIdstring✅Unique ID for this tool call
namestring✅Tool name (e.g., "bash", "edit", "grep")
argumentsobjectParsed arguments for the tool
type"function" | "custom"Call type; defaults to "function" when absent

assistant.message_delta

Ephemeral. Incremental chunk of the assistant's text response, streamed in real time.

Data FieldTypeRequiredDescription
messageIdstring✅Matches the corresponding assistant.message event
deltaContentstring✅Text chunk to append to the message
parentToolCallIdstringDeprecated. Use envelope-level agentId for sub-agent attribution

assistant.turn_end

Emitted when the agent finishes a turn (all tool executions complete, final response delivered).

Data FieldTypeRequiredDescription
turnIdstring✅Matches the corresponding assistant.turn_start event

assistant.usage

Ephemeral. Token usage and cost information for an individual API call.

Data FieldTypeRequiredDescription
modelstring✅Model identifier (e.g., "gpt-5.4")
inputTokensnumberInput tokens consumed
outputTokensnumberOutput tokens produced
reasoningTokensnumberOutput tokens used for reasoning/chain-of-thought (subset of outputTokens)
cacheReadTokensnumberTokens read from prompt cache
cacheWriteTokensnumberTokens written to prompt cache
cacheExpiresAtstringISO 8601 timestamp when the prompt cache for this model call expires
contentFilterTriggeredbooleanWhether the response was blocked or truncated by content filtering (finish_reason === 'content_filter')
finishReasonstringModel finish reason (e.g., "stop", "length", "tool_calls", "content_filter")
costnumberModel multiplier cost for billing
durationnumberAPI call duration in milliseconds
timeToFirstTokenMsnumberTime from request dispatch to first token received (streaming latency)
interTokenLatencyMsnumberAverage latency between consecutive tokens (streaming throughput)
reasoningEffortstringReasoning effort level used for this call (e.g., "low", "medium", "high")
initiatorstringWhat triggered this call (e.g., "sub-agent"); absent for user-initiated
apiCallIdstringCompletion ID from the provider (e.g., chatcmpl-abc123)
serviceRequestIdstringCopilot service request ID (x-copilot-service-request-id) for CAPI log correlation
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"API endpoint used for the model call; useful for observability and cost attribution. ws:/responses is the websocket variant of the responses API
providerCallIdstringGitHub request tracing ID (x-github-request-id)
parentToolCallIdstringDeprecated. Use envelope-level agentId for sub-agent attribution
quotaSnapshotsRecord<string, QuotaSnapshot>Per-quota resource usage, keyed by quota identifier
copilotUsageCopilotUsageItemized token cost breakdown from the API

assistant.streaming_delta

Ephemeral. Low-level network progress indicator—total bytes received from the streaming API response.

Data FieldTypeRequiredDescription
totalResponseSizeBytesnumber✅Cumulative bytes received so far

Tool execution events

These events track the full lifecycle of each tool invocation—from the model requesting a tool call through execution to completion.

tool.execution_start

Emitted when a tool begins executing.

Data FieldTypeRequiredDescription
toolCallIdstring✅Unique identifier for this tool call
toolNamestring✅Name of the tool (e.g., "bash", "edit", "grep")
argumentsobjectParsed arguments passed to the tool
mcpServerNamestringMCP server name, when the tool is provided by an MCP server
mcpToolNamestringOriginal tool name on the MCP server
parentToolCallIdstringDeprecated. Use envelope-level agentId for sub-agent attribution

tool.execution_partial_result

Ephemeral. Incremental output from a running tool (e.g., streaming bash output).

Data FieldTypeRequiredDescription
toolCallIdstring✅Matches the corresponding tool.execution_start
partialOutputstring✅Incremental output chunk

tool.execution_progress

Ephemeral. Human-readable progress status from a running tool (e.g., MCP server progress notifications).

Data FieldTypeRequiredDescription
toolCallIdstring✅Matches the corresponding tool.execution_start
progressMessagestring✅Progress status message

tool.execution_complete

Emitted when a tool finishes executing—successfully or with an error.

Data FieldTypeRequiredDescription
toolCallIdstring✅Matches the corresponding tool.execution_start
successboolean✅Whether execution succeeded
modelstringModel that generated this tool call
interactionIdstringCAPI interaction ID
isUserRequestedbooleantrue when the user explicitly requested this tool call
resultResultPresent on success (see below)
error{ message, code? }Present on failure
toolTelemetryobjectTool-specific telemetry (e.g., CodeQL check counts)
parentToolCallIdstringDeprecated. Use envelope-level agentId for sub-agent attribution

Result fields:

FieldTypeRequiredDescription
contentstring✅Concise result sent to the LLM (may be truncated for token efficiency)
detailedContentstringFull result for display, preserving complete content like diffs
contentsContentBlock[]Structured content blocks (text, terminal, image, audio, resource)

tool.user_requested

Emitted when the user explicitly requests a tool invocation (rather than the model choosing to call one).

Data FieldTypeRequiredDescription
toolCallIdstring✅Unique identifier for this tool call
toolNamestring✅Name of the tool the user wants to invoke
argumentsobjectArguments for the invocation

Session lifecycle events

session.idle

Ephemeral. The agent has finished all processing and is ready for the next message. This is the signal that a turn is fully complete.

Data FieldTypeRequiredDescription
abortedbooleanTrue when the preceding turn was cancelled via abort signal

session.error

An error occurred during session processing.

Data FieldTypeRequiredDescription
errorTypestring✅Error category (e.g., "authentication", "quota", "rate_limit")
messagestring✅Human-readable error message
stackstringError stack trace
statusCodenumberHTTP status code from the upstream request
providerCallIdstringGitHub request tracing ID for server-side log correlation

session.compaction_start

Context window compaction has begun. Data payload is empty ({}).

session.compaction_complete

Context window compaction finished.

Data FieldTypeRequiredDescription
successboolean✅Whether compaction succeeded
errorstringError message if compaction failed
preCompactionTokensnumberTokens before compaction
postCompactionTokensnumberTokens after compaction
preCompactionMessagesLengthnumberMessage count before compaction
messagesRemovednumberMessages removed
tokensRemovednumberTokens removed
summaryContentstringLLM-generated summary of compacted history
checkpointNumbernumberCheckpoint snapshot number created for recovery
checkpointPathstringFile path where the checkpoint was stored
compactionTokensUsed{ input, output, cachedInput }Token usage for the compaction LLM call
requestIdstringGitHub request tracing ID for the compaction call

session.title_changed

Ephemeral. The session's auto-generated title was updated.

Data FieldTypeRequiredDescription
titlestring✅New session title

session.context_changed

The session's working directory or repository context changed.

Data FieldTypeRequiredDescription
cwdstring✅Current working directory
gitRootstringGit repository root
repositorystringRepository in "owner/name" format
branchstringCurrent git branch

session.usage_info

Ephemeral. Context window utilization snapshot.

Data FieldTypeRequiredDescription
tokenLimitnumber✅Maximum tokens for the model's context window
currentTokensnumber✅Current tokens in the context window
messagesLengthnumber✅Current message count in the conversation

session.session_limits_changed

Session limits changed for the current accounting window. A null sessionLimits value means no limits are active.

Data FieldTypeRequiredDescription
sessionLimitsSessionLimitsConfig | null✅Current session limits, or null when no limits are active
sessionLimits.maxAiCreditsnumberMaximum AI Credits allowed across the session's current accounting window

session.usage_checkpoint

Durable aggregate usage checkpoint used to reconstruct accounting when a session is resumed.

Data FieldTypeRequiredDescription
totalNanoAiunumber✅Session-wide accumulated nano-AI units cost at checkpoint time
totalPremiumRequestsnumberTotal number of premium API requests used at checkpoint time

session.task_complete

The agent has completed its assigned task.

Data FieldTypeRequiredDescription
summarystringSummary of the completed task

session.shutdown

The session has ended.

Data FieldTypeRequiredDescription
shutdownType"routine" | "error"✅Normal shutdown or crash
errorReasonstringError description when shutdownType is "error"
totalPremiumRequestsnumber✅Total premium API requests used
totalApiDurationMsnumber✅Cumulative API call time in milliseconds
sessionStartTimenumber✅Unix timestamp (ms) when the session started
codeChanges{ linesAdded, linesRemoved, filesModified }✅Aggregate code change metrics
modelMetricsRecord<string, ModelMetric>✅Per-model usage breakdown
currentModelstringModel selected at shutdown time

Permission and user input events

These events are emitted when the agent needs approval or input from the user before continuing.

permission.requested

The agent needs permission to perform an action (run a command, write a file, etc.).

Data FieldTypeRequiredDescription
requestIdstring✅Use this to respond via session.respondToPermission()
permissionRequestPermissionRequest✅Details of the permission being requested

The permissionRequest is a discriminated union on kind:

kindKey FieldsDescription
"shell"fullCommandText, intention, commands[], possiblePaths[]Execute a shell command
"write"fileName, diff, intention, newFileContents?Write/modify a file
"read"path, intentionRead a file or directory
"mcp"serverName, toolName, toolTitle, args?, readOnlyCall an MCP tool
"url"url, intentionFetch a URL
"memory"subject, fact, citationsStore a memory
"custom-tool"toolName, toolDescription, args?Call a custom tool

All kind variants also include an optional toolCallId linking back to the tool call that triggered the request.

permission.completed

A permission request was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding permission.requested
result.kindstring✅One of: "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

Ephemeral. The agent is asking the user a question.

Data FieldTypeRequiredDescription
requestIdstring✅Use this to respond via session.respondToUserInput()
questionstring✅The question to present to the user
choicesstring[]Predefined choices for the user
allowFreeformbooleanWhether free-form text input is allowed

user_input.completed

Ephemeral. A user input request was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding user_input.requested

elicitation.requested

Ephemeral. The agent needs structured form input from the user (MCP elicitation protocol).

Data FieldTypeRequiredDescription
requestIdstring✅Use this to respond via session.respondToElicitation()
messagestring✅Description of what information is needed
mode"form"Elicitation mode (currently only "form")
requestedSchema{ type: "object", properties, required? }✅JSON Schema describing the form fields

elicitation.completed

Ephemeral. An elicitation request was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding elicitation.requested

Sub-agent and skill events

subagent.started

A custom agent was invoked as a sub-agent.

Data FieldTypeRequiredDescription
toolCallIdstring✅Parent tool call that spawned this sub-agent
agentNamestring✅Internal name of the sub-agent
agentDisplayNamestring✅Human-readable display name
agentDescriptionstring✅Description of what the sub-agent does
modelstringModel the sub-agent will run with, when known at start

subagent.completed

A sub-agent finished successfully.

Data FieldTypeRequiredDescription
toolCallIdstring✅Matches the corresponding subagent.started
agentNamestring✅Internal name
agentDisplayNamestring✅Display name
modelstringModel used by the sub-agent
durationMsnumberWall-clock execution duration in milliseconds
totalTokensnumberTotal input and output tokens consumed
totalToolCallsnumberTotal tool calls made

subagent.failed

A sub-agent encountered an error.

Data FieldTypeRequiredDescription
toolCallIdstring✅Matches the corresponding subagent.started
agentNamestring✅Internal name
agentDisplayNamestring✅Display name
errorstring✅Error message
modelstringModel selected for the sub-agent, when known
durationMsnumberWall-clock execution duration in milliseconds
totalTokensnumberTotal input and output tokens consumed before failure
totalToolCallsnumberTotal tool calls made before failure

subagent.selected

A custom agent was selected (inferred) to handle the current request.

Data FieldTypeRequiredDescription
agentNamestring✅Internal name of the selected agent
agentDisplayNamestring✅Display name
toolsstring[] | null✅Tool names available to this agent; null for all tools

subagent.deselected

A custom agent was deselected, returning to the default agent. Data payload is empty ({}).

skill.invoked

A skill was activated for the current conversation.

Data FieldTypeRequiredDescription
namestring✅Skill name
pathstring✅File path to the SKILL.md definition
contentstring✅Full skill content injected into the conversation
allowedToolsstring[]Tools auto-approved while this skill is active
pluginNamestringPlugin the skill originated from
pluginVersionstringPlugin version

Other events

abort

The current turn was aborted.

Data FieldTypeRequiredDescription
reasonstring✅Why the turn was aborted (e.g., "user initiated")

user.message

The user sent a message. Recorded for the session timeline.

Data FieldTypeRequiredDescription
contentstring✅The user's message text
transformedContentstringTransformed version after preprocessing
attachmentsAttachment[]File, directory, selection, blob, or GitHub reference attachments
sourcestringMessage source identifier
agentModestringAgent mode: "interactive", "plan", "autopilot", or "shell"
interactionIdstringCAPI interaction ID

system.message

A system or developer prompt was injected into the conversation.

Data FieldTypeRequiredDescription
contentstring✅The prompt text
role"system" | "developer"✅Message role
namestringSource identifier
metadata{ promptVersion?, variables? }Prompt template metadata

external_tool.requested

The agent wants to invoke an external tool (one provided by the SDK consumer).

Data FieldTypeRequiredDescription
requestIdstring✅Use this to respond via session.respondToExternalTool()
sessionIdstring✅Session this request belongs to
toolCallIdstring✅Tool call ID for this invocation
toolNamestring✅Name of the external tool
argumentsobjectArguments for the tool

external_tool.completed

An external tool request was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding external_tool.requested

exit_plan_mode.requested

Ephemeral. The agent has created a plan and wants to exit plan mode.

Data FieldTypeRequiredDescription
requestIdstring✅Use this to respond via session.respondToExitPlanMode()
summarystring✅Summary of the plan
planContentstring✅Full plan file content
actionsstring[]✅Available user actions (e.g., approve, edit, reject)
recommendedActionstring✅Suggested action

exit_plan_mode.completed

Ephemeral. An exit plan mode request was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding exit_plan_mode.requested

command.queued

Ephemeral. A slash command was queued for execution.

Data FieldTypeRequiredDescription
requestIdstring✅Use this to respond via session.respondToQueuedCommand()
commandstring✅The slash command text (e.g., /help, /clear)

command.completed

Ephemeral. A queued command was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding command.queued

session_limits_exhausted.requested

Ephemeral. The current session budget was exhausted and the runtime needs a user decision before continuing.

Data FieldTypeRequiredDescription
requestIdstring✅Use this ID when responding to the pending exhausted-limit request
maxAiCreditsnumber✅Configured max AI Credits for the current accounting window
usedAiCreditsnumber✅AI Credits already consumed in the current accounting window

session_limits_exhausted.completed

Ephemeral. A pending exhausted-limit request was resolved.

Data FieldTypeRequiredDescription
requestIdstring✅Matches the corresponding session_limits_exhausted.requested event
response.action"add" | "set" | "unset" | "cancel"✅Action selected for the exhausted-limit request
response.additionalAiCreditsnumberAI Credits to add to the current max when response.action is "add"
response.maxAiCreditsnumberNew absolute max AI Credits when response.action is "set"

Quick reference: agentic turn flow

A typical agentic turn emits events in this order:

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
│   ├── permission.completed  → Approval result
│   ├── 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)

All event types at a glance

This table lists key data payload fields. Common envelope fields are documented above.

Event TypeEphemeralCategoryKey Data Fields
assistant.turn_startAssistantturnId, interactionId?
assistant.intent✅Assistantintent
assistant.reasoningAssistantreasoningId, content
assistant.reasoning_delta✅AssistantreasoningId, deltaContent
assistant.streaming_delta✅AssistanttotalResponseSizeBytes
assistant.messageAssistantmessageId, content, toolRequests?, outputTokens?, phase?
assistant.message_delta✅AssistantmessageId, deltaContent
assistant.turn_endAssistantturnId
assistant.usage✅Assistantmodel, apiEndpoint?, inputTokens?, outputTokens?, cost?, duration?
tool.user_requestedTooltoolCallId, toolName, arguments?
tool.execution_startTooltoolCallId, toolName, arguments?, mcpServerName?
tool.execution_partial_result✅TooltoolCallId, partialOutput
tool.execution_progress✅TooltoolCallId, progressMessage
tool.execution_completeTooltoolCallId, success, result?, error?
session.idle✅Sessionaborted?
session.errorSessionerrorType, message, statusCode?
session.compaction_startSession(empty)
session.compaction_completeSessionsuccess, preCompactionTokens?, summaryContent?
session.title_changed✅Sessiontitle
session.context_changedSessioncwd, gitRoot?, repository?, branch?
session.usage_info✅SessiontokenLimit, currentTokens, messagesLength
session.session_limits_changedSessionsessionLimits
session.usage_checkpointSessiontotalNanoAiu, totalPremiumRequests?
session.task_completeSessionsummary?
session.shutdownSessionshutdownType, codeChanges, modelMetrics
permission.requestedPermissionrequestId, permissionRequest
permission.completedPermissionrequestId, result.kind
user_input.requested✅User InputrequestId, question, choices?
user_input.completed✅User InputrequestId
elicitation.requested✅User InputrequestId, message, requestedSchema
elicitation.completed✅User InputrequestId
subagent.startedSub-AgenttoolCallId, agentName, agentDisplayName, model?
subagent.completedSub-AgenttoolCallId, agentName, agentDisplayName, model?, durationMs?, totalTokens?, totalToolCalls?
subagent.failedSub-AgenttoolCallId, agentName, error, model?, durationMs?, totalTokens?, totalToolCalls?
subagent.selectedSub-AgentagentName, agentDisplayName, tools
subagent.deselectedSub-Agent(empty)
skill.invokedSkillname, path, content, allowedTools?
abortControlreason
user.messageUsercontent, attachments?, agentMode?
system.messageSystemcontent, role
external_tool.requestedExternal ToolrequestId, toolName, arguments?
external_tool.completedExternal ToolrequestId
command.queued✅CommandrequestId, command
command.completed✅CommandrequestId
session_limits_exhausted.requested✅SessionrequestId, maxAiCredits, usedAiCredits
session_limits_exhausted.completed✅SessionrequestId, response.action
exit_plan_mode.requested✅Plan ModerequestId, summary, planContent, actions
exit_plan_mode.completed✅Plan ModerequestId