charmbracelet/crush · error
failed to list messages: %w
Error message
failed to list messages: %w
What it means
getSessionMessages wraps a.messages.List failures as 'failed to list messages: %w'. It is the single choke point for reading a session's message history, used by Run, Summarize and summary reconstruction (session.SummaryMessageID splicing).
Source
Thrown at internal/agent/agent.go:1692
ToolCallID: tc.ID,
Output: fantasy.ToolResultOutputContentError{
Error: errors.New("tool call was interrupted and did not produce a result, you may retry this call if the result is still needed"),
},
})
}
if len(syntheticParts) == 0 {
return fantasy.Message{}, false
}
return fantasy.Message{
Role: fantasy.MessageRoleTool,
Content: syntheticParts,
}, true
}
func (a *sessionAgent) getSessionMessages(ctx context.Context, session session.Session) ([]message.Message, error) {
msgs, err := a.messages.List(ctx, session.ID)
if err != nil {
return nil, fmt.Errorf("failed to list messages: %w", err)
}
if session.SummaryMessageID != "" {
summaryMsgIndex := -1
for i, msg := range msgs {
if msg.ID == session.SummaryMessageID {
summaryMsgIndex = i
break
}
}
if summaryMsgIndex != -1 {
msgs = msgs[summaryMsgIndex:]
msgs[0].Role = message.User
}
}
return msgs, nil
}
View on GitHub (pinned to 7944b8e522)
Solutions
- Verify the message store is reachable and the session ID exists in that same store
- Retry on transient errors (lock timeout, cancelled context)
- Check the wrapped cause: not-found means stale ID, I/O errors mean DB problems
Defensive patterns
Strategy: try-catch
Validate before calling
if _, err := sessions.Get(ctx, session.ID); err != nil {
return nil, fmt.Errorf("skip history read: %w", err)
} Try / catch
msgs, err := getHistory(ctx, session)
if err != nil && strings.Contains(err.Error(), "failed to list messages") {
return fallbackToEmptyHistory(), nil // degrade gracefully if product allows
} Prevention
- Confirm session and message rows live in the same database instance
- Add index/health checks on the messages table for large sessions
- Wrap list calls with retry for transient lock errors
When it happens
Trigger: a.messages.List(ctx, session.ID) errors — store unavailable, invalid session ID, or query failure; the error propagates to 'failed to get session messages' in Run.
Common situations: DB corruption or lock contention on the messages table; querying messages for a session from a different/rotated database; context cancellation during large history reads.
Related errors
- failed to get session messages: %w
- failed to get session: %w
- errors.New(s.Error)
- failed to create user message: %w
- error creating file history: %w
AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29).
Data as JSON: /api/errors/33b7cb85a583cf1b.
Report an issue: GitHub.