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

  1. Verify the message store is reachable and the session ID exists in that same store
  2. Retry on transient errors (lock timeout, cancelled context)
  3. 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

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


AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29). Data as JSON: /api/errors/33b7cb85a583cf1b. Report an issue: GitHub.