@@ -449,8 +449,8 @@ func (a *agent) createUserMessage(ctx context.Context, sessionID, content string
450func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msgHistory []message.Message) (message.Message, *message.Message, error) {
450func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msgHistory []message.Message) (message.Message, *message.Message, error) {
451 ctx = context.WithValue(ctx, tools.SessionIDContextKey, sessionID)
451 ctx = context.WithValue(ctx, tools.SessionIDContextKey, sessionID)
452− eventChan := a.provider.StreamResponse(ctx, msgHistory, slices.Collect(a.tools.Seq()))
453+ // Create the assistant message first so the spinner shows immediately
454 assistantMsg, err := a.messages.Create(ctx, sessionID, message.CreateMessageParams{
454 assistantMsg, err := a.messages.Create(ctx, sessionID, message.CreateMessageParams{
455 Role: message.Assistant,
455 Role: message.Assistant,
456 Parts: []message.ContentPart{},
456 Parts: []message.ContentPart{},
@@ -461,6 +461,9 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
461 return assistantMsg, nil, fmt.Errorf("failed to create assistant message: %w", err)
461 return assistantMsg, nil, fmt.Errorf("failed to create assistant message: %w", err)
464+ // Now collect tools (which may block on MCP initialization)
465+ eventChan := a.provider.StreamResponse(ctx, msgHistory, slices.Collect(a.tools.Seq()))
464 // Add the session and message ID into the context if needed by tools.
467 // Add the session and message ID into the context if needed by tools.
465 ctx = context.WithValue(ctx, tools.MessageIDContextKey, assistantMsg.ID)
468 ctx = context.WithValue(ctx, tools.MessageIDContextKey, assistantMsg.ID)