> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Streaming events

> Reference for session event types and payloads when streaming is enabled in Laravel Copilot SDK.

## Streaming events

When you enable `streaming: true` in `SessionConfig`, session behavior is delivered as incremental events.

> [SessionEvent](/en/packages/laravel-copilot-sdk/session-event) page explains Laravel-specific helpers for the `SessionEvent` class itself.
> This page is a type-and-payload reference for each event.

## Overview

Copilot agent behavior (reasoning, messages, tool execution, permission checks, and more) flows through session events.

* **Ephemeral event**: Real-time only. Not persisted in session logs.
* **Persisted event**: Stored in session logs and replayed when resuming.
* **Delta event**: Fragment event (`deltaContent`, etc.) that you stitch into full content.
* **`parentId` chain**: Each event links to its previous event.

## Event envelope (common fields)

| Field | Type | Description |
| - | - | - |
| `id` | `string` | Event ID (UUID v4) |
| `timestamp` | `string` | ISO 8601 timestamp |
| `parentId` | `string \| null` | Previous event ID (`null` for first event) |
| `ephemeral` | `boolean?` | `true` when the event is ephemeral |
| `type` | `string` | Event type |
| `data` | `object` | Event-specific payload |

## Laravel subscription example

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Enums\SessionEventType;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\SessionEvent;

Copilot::start(function (CopilotSession $session): void {
    // All events
    $session->on(function (SessionEvent $event): void {
        info($event->type(), $event->toArray());
    });

    // Specific event type
    $session->on(SessionEventType::ASSISTANT_MESSAGE_DELTA, function (SessionEvent $event): void {
        echo $event->deltaContent();
    });

    $session->sendAndWait(prompt: 'Explain key Laravel strengths');
}, config: new SessionConfig(streaming: true));
```

## Major event categories

## Assistant events

### `assistant.turn_start`

Turn starts.

* `turnId` (required)
* `interactionId` (optional)

### `assistant.intent` (ephemeral)

Current execution intent (for example, `Exploring codebase`).

* `intent` (required)

### `assistant.reasoning`

Completed reasoning block.

* `reasoningId` (required)
* `content` (required)

### `assistant.reasoning_delta` (ephemeral)

Reasoning text delta.

* `reasoningId` (required)
* `deltaContent` (required)

### `assistant.message`

Completed assistant message.

Common fields:

* `messageId` (required)
* `content` (required)
* `toolRequests` (optional)
* `reasoningOpaque` / `reasoningText` / `encryptedContent` (optional)
* `phase` / `outputTokens` / `interactionId` (optional)
* `parentToolCallId` (optional)

### `assistant.message_delta` (ephemeral)

Message body delta.

* `messageId` (required)
* `deltaContent` (required)
* `parentToolCallId` (optional)

### `assistant.turn_end`

Turn ends.

* `turnId` (required)

### `assistant.usage` (ephemeral)

Per-API-call usage metrics.

Common fields:

* `model` (required)
* `inputTokens` / `outputTokens` / `cost` / `duration` (optional)
* `apiCallId` / `providerCallId` (optional)
* `quotaSnapshots` / `copilotUsage` (optional)

### `assistant.streaming_delta` (ephemeral)

Low-level stream progress.

* `totalResponseSizeBytes` (required)

## Tool execution events

### `tool.execution_start`

Tool execution starts.

* `toolCallId` (required)
* `toolName` (required)
* `arguments` / `mcpServerName` / `mcpToolName` / `parentToolCallId` (optional)

### `tool.execution_partial_result` (ephemeral)

Partial output while tool runs.

* `toolCallId` (required)
* `partialOutput` (required)

### `tool.execution_progress` (ephemeral)

Progress message.

* `toolCallId` (required)
* `progressMessage` (required)

### `tool.execution_complete`

Tool execution ends (success/failure).

* `toolCallId` (required)
* `success` (required)
* `result` (on success)
* `error` (on failure)
* `toolTelemetry` / `parentToolCallId` (optional)

### `tool.user_requested`

Tool call explicitly requested by user.

* `toolCallId` (required)
* `toolName` (required)
* `arguments` (optional)

## Session lifecycle events

### `session.start`

Session start. For Cloud Sessions, it is safest to send the first prompt after confirming a `session.start` whose `producer` is `copilot-agent`.

* `producer` (optional)

### `session.idle` (ephemeral)

Processing finished. Waiting for next input.

* `backgroundTasks` (optional)

### `session.error`

Error during session processing.

* `errorType` (required)
* `message` (required)
* `stack` / `statusCode` / `providerCallId` (optional)

### `session.compaction_start`

Context compaction starts (`data` is an empty object).

### `session.compaction_complete`

Context compaction completes.

Common fields:

* `success` (required)
* `error` (optional)
* `preCompactionTokens` / `postCompactionTokens` (optional)
* `summaryContent` / `checkpointPath` (optional)

### `session.title_changed` (ephemeral)

Auto title update.

* `title` (required)

### `session.context_changed`

Working context changed.

* `cwd` (required)
* `gitRoot` / `repository` / `branch` (optional)

### `session.info`

Session information such as a remote URL.

* `infoType` (required)
* `url` (optional, e.g. when `infoType` is `remote`)

### `session.remote_steerable_changed`

Indicates that remote steerability from Mission Control has changed.

* `remoteSteerable` (optional)

### `session.usage_info` (ephemeral)

Context window usage status.

* `tokenLimit` (required)
* `currentTokens` (required)
* `messagesLength` (required)

### `session.task_complete`

Task completion notification.

* `summary` (optional)

### `session.shutdown`

Session shutdown.

Common fields:

* `shutdownType` (required)
* `errorReason` (optional)
* `totalPremiumRequests` / `totalApiDurationMs` (required)
* `codeChanges` / `modelMetrics` (required)

## Permission and user input events

### `permission.requested` (ephemeral)

Permission request.

* `requestId` (required)
* `permissionRequest` (required)

`permissionRequest.kind` values:

* `shell`
* `write`
* `read`
* `mcp`
* `url`
* `memory`
* `custom-tool`

### `permission.completed` (ephemeral)

Permission resolution result.

* `requestId` (required)
* `result.kind` (required)

### `user_input.requested` (ephemeral)

Question asked to user.

* `requestId` (required)
* `question` (required)
* `choices` / `allowFreeform` (optional)

### `user_input.completed` (ephemeral)

User input completed.

* `requestId` (required)

### `elicitation.requested` (ephemeral)

Structured input request (form).

* `requestId` (required)
* `message` (required)
* `requestedSchema` (required)

### `elicitation.completed` (ephemeral)

Structured input completed.

* `requestId` (required)

## Sub-agent and skill events

### `subagent.started`

* `toolCallId` (required)
* `agentName` / `agentDisplayName` / `agentDescription` (required)

### `subagent.completed`

* `toolCallId` (required)
* `agentName` / `agentDisplayName` (required)

### `subagent.failed`

* `toolCallId` (required)
* `agentName` / `agentDisplayName` (required)
* `error` (required)

### `subagent.selected`

* `agentName` (required)
* `agentDisplayName` (required)
* `tools` (required, can be `null`)

### `subagent.deselected`

Returns to default agent (`data` is an empty object).

### `skill.invoked`

* `name` / `path` / `content` (required)
* `allowedTools` / `pluginName` / `pluginVersion` (optional)

## Other events

### `abort`

* `reason` (required)

### `user.message`

* `content` (required)
* `transformedContent` / `attachments` / `source` / `agentMode` / `interactionId` (optional)

### `system.message`

* `content` (required)
* `role` (required)
* `name` / `metadata` (optional)

### `external_tool.requested` (ephemeral)

* `requestId` / `sessionId` / `toolCallId` / `toolName` (required)
* `arguments` (optional)

### `external_tool.completed` (ephemeral)

* `requestId` (required)

### `exit_plan_mode.requested` (ephemeral)

* `requestId` / `summary` / `planContent` / `actions` / `recommendedAction` (required)

### `exit_plan_mode.completed` (ephemeral)

* `requestId` (required)

### `command.queued` (ephemeral)

* `requestId` (required)
* `command` (required)

### `command.completed` (ephemeral)

* `requestId` (required)

## Typical event order

```text theme={null}
assistant.turn_start
├── assistant.intent (ephemeral)
├── assistant.reasoning_delta (ephemeral, repeated)
├── assistant.reasoning
├── assistant.message_delta (ephemeral, repeated)
├── assistant.message
├── assistant.usage (ephemeral)
├── [permission / tool.* loops if needed]
assistant.turn_end
session.idle (ephemeral)
```

## Quick reference of all events

| Event Type | Ephemeral | Category |
| - | - | - |
| `session.start` | | Session |
| `assistant.turn_start` | | Assistant |
| `assistant.intent` | ✅ | Assistant |
| `assistant.reasoning` | | Assistant |
| `assistant.reasoning_delta` | ✅ | Assistant |
| `assistant.streaming_delta` | ✅ | Assistant |
| `assistant.message` | | Assistant |
| `assistant.message_delta` | ✅ | Assistant |
| `assistant.turn_end` | | Assistant |
| `assistant.usage` | ✅ | Assistant |
| `tool.user_requested` | | Tool |
| `tool.execution_start` | | Tool |
| `tool.execution_partial_result` | ✅ | Tool |
| `tool.execution_progress` | ✅ | Tool |
| `tool.execution_complete` | | Tool |
| `session.idle` | ✅ | Session |
| `session.error` | | Session |
| `session.compaction_start` | | Session |
| `session.compaction_complete` | | Session |
| `session.title_changed` | ✅ | Session |
| `session.context_changed` | | Session |
| `session.info` | | Session |
| `session.remote_steerable_changed` | | Session |
| `session.usage_info` | ✅ | Session |
| `session.task_complete` | | Session |
| `session.shutdown` | | Session |
| `permission.requested` | ✅ | Permission |
| `permission.completed` | ✅ | Permission |
| `user_input.requested` | ✅ | User Input |
| `user_input.completed` | ✅ | User Input |
| `elicitation.requested` | ✅ | User Input |
| `elicitation.completed` | ✅ | User Input |
| `subagent.started` | | Sub-Agent |
| `subagent.completed` | | Sub-Agent |
| `subagent.failed` | | Sub-Agent |
| `subagent.selected` | | Sub-Agent |
| `subagent.deselected` | | Sub-Agent |
| `skill.invoked` | | Skill |
| `abort` | | Control |
| `user.message` | | User |
| `system.message` | | System |
| `external_tool.requested` | ✅ | External Tool |
| `external_tool.completed` | ✅ | External Tool |
| `command.queued` | ✅ | Command |
| `command.completed` | ✅ | Command |
| `exit_plan_mode.requested` | ✅ | Plan Mode |
| `exit_plan_mode.completed` | ✅ | Plan Mode |

## Related docs

* [Official streaming events reference](https://github.com/github/copilot-sdk/blob/main/docs/features/streaming-events.md)
* Laravel event class details: [SessionEvent](/en/packages/laravel-copilot-sdk/session-event)
* Streaming implementation patterns: [Streaming](/en/packages/laravel-copilot-sdk/streaming)


## Related topics

- [Agent loop](/en/packages/laravel-copilot-sdk/agent-loop.md)
- [Fleet Mode](/en/packages/laravel-copilot-sdk/fleet-mode.md)
- [Cloud Sessions](/en/packages/laravel-copilot-sdk/cloud-sessions.md)
- [Streaming](/en/packages/laravel-copilot-sdk/streaming.md)
- [SessionEvent](/en/packages/laravel-copilot-sdk/session-event.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.