github/copilot-sdk · error
failed to get events
Error message
failed to get events: %w
What it means
Session.GetEvents sends the `session.getMessages` RPC to the runtime to fetch the session's event/message list. This error wraps any transport- or server-side failure returned by that request, so the underlying cause (connection closed, session unknown, timeout) is in the wrapped `%w` chain.
Solutions
- Inspect the wrapped error (errors.Unwrap / %v) to find the root cause
- Verify the runtime process is still alive and the session ID is valid
- Reconnect the client and recreate/reattach the session, then retry GetEvents
- Add retry with backoff around GetEvents for transient transport errors
Example fix
// before
events, err := session.GetEvents(ctx)
// after
events, err := session.GetEvents(ctx)
if err != nil {
var netErr net.Error
if errors.As(err, &netErr) {
events, err = session.GetEvents(ctx) // retry transient failure
}
} Defensive patterns
Strategy: retry
Validate before calling
if session == nil || session.SessionID == "" {
return errors.New("session not initialized")
} Try / catch
events, err := session.GetEvents(ctx)
if err != nil {
var retryable bool
for i := 0; i < 3 && !retryable; i++ {
time.Sleep(backoff(i))
events, err = session.GetEvents(ctx)
retryable = err == nil
}
} Prevention
- Health-check the connection before polling
- Stop polling once Disconnect was called
- Always inspect the wrapped cause, not just the top-level message
When it happens
Trigger: Calling Session.GetEvents(ctx) when the RPC request `session.getMessages` fails: the client connection is down, the session ID is no longer valid server-side, or the runtime returns an error response.
Common situations: Polling events after the runtime process exited; using a Session whose server-side state was discarded; network/pipe breakage between client and a child-process runtime.
Understand the failure class
Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.
Related errors
- unknown error
- failed to create session
- failed to resume session
- failed to send message
- failed to disconnect session
AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09).
Data as JSON: /api/errors/5b70b482c48d6ae9.
Report an issue: GitHub.
Appendix: source
Thrown at go/session.go:1803
// Returns an error if the session has been disconnected or the connection fails.
//
// Example:
//
// events, err := session.GetEvents(context.Background())
// if err != nil {
// log.Printf("Failed to get events: %v", err)
// return
// }
// for _, event := range events {
// if d, ok := event.Data.(*copilot.AssistantMessageData); ok {
// fmt.Println("Assistant:", d.Content)
// }
// }
func (s *Session) GetEvents(ctx context.Context) ([]SessionEvent, error) {
result, err := s.client.Request(ctx, "session.getMessages", sessionGetMessagesRequest{SessionID: s.SessionID})
if err != nil {
return nil, fmt.Errorf("failed to get events: %w", err)
}
var response sessionGetMessagesResponse
if err := json.Unmarshal(result, &response); err != nil {
return nil, fmt.Errorf("failed to unmarshal get events response: %w", err)
}
return response.Events, nil
}
// Disconnect closes this session and releases all in-memory resources (event
// handlers, tool handlers, permission handlers).
//
// The caller should ensure the session is idle (e.g., [Session.SendAndWait] has
// returned) before disconnecting. If the session is not idle, in-flight event
// handlers or tool handlers may observe failures.
//
// Session state on disk (conversation history, planning state, artifacts) is
// preserved, so the conversation can be resumed later by callingView on GitHub (pinned to cd8cf15dc3)