@@ -403,7 +403,7 @@ func (a *agent) processGeneration(ctx context.Context, sessionID, content string
403403 agentMessage, toolResults, err := a.streamAndHandleEvents(ctx, sessionID, msgHistory)
404404 if err != nil {
405405 if errors.Is(err, context.Canceled) {
406− agentMessage.AddFinish(message.FinishReasonCanceled)
406+ agentMessage.AddFinish(message.FinishReasonCanceled, "Request cancelled", "")
407407 a.messages.Update(context.Background(), agentMessage)
408408 return a.err(ErrRequestCancelled)
409409 }
@@ -454,11 +454,15 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
454454 // Process each event in the stream.
455455 for event := range eventChan {
456456 if processErr := a.processEvent(ctx, sessionID, &assistantMsg, event); processErr != nil {
457− a.finishMessage(ctx, &assistantMsg, message.FinishReasonCanceled)
457+ if errors.Is(processErr, context.Canceled) {
458+ a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled, "Request cancelled", "")
459+ } else {
460+ a.finishMessage(ctx, &assistantMsg, message.FinishReasonError, "API Error", processErr.Error())
461+ }
458462 return assistantMsg, nil, processErr
459463 }
460464 if ctx.Err() != nil {
461− a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled)
465+ a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled, "Request cancelled", "")
462466 return assistantMsg, nil, ctx.Err()
463467 }
464468 }
@@ -468,7 +472,7 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
468472 for i, toolCall := range toolCalls {
469473 select {
470474 case <-ctx.Done():
471− a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled)
475+ a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled, "Request cancelled", "")
472476 // Make all future tool calls cancelled
473477 for j := i; j < len(toolCalls); j++ {
474478 toolResults[j] = message.ToolResult{
@@ -516,7 +520,7 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
516520 IsError: true,
517521 }
518522 }
519− a.finishMessage(ctx, &assistantMsg, message.FinishReasonPermissionDenied)
523+ a.finishMessage(ctx, &assistantMsg, message.FinishReasonPermissionDenied, "Permission denied", "")
520524 break
521525 }
522526 }
@@ -548,8 +552,8 @@ out:
548552 return assistantMsg, &msg, err
549553}
550554
551−func (a *agent) finishMessage(ctx context.Context, msg *message.Message, finishReson message.FinishReason) {
552− msg.AddFinish(finishReson)
555+func (a *agent) finishMessage(ctx context.Context, msg *message.Message, finishReson message.FinishReason, message, details string) {
556+ msg.AddFinish(finishReson, message, details)
553557 _ = a.messages.Update(ctx, *msg)
554558}
555559
@@ -580,15 +584,10 @@ func (a *agent) processEvent(ctx context.Context, sessionID string, assistantMsg
580584 assistantMsg.FinishToolCall(event.ToolCall.ID)
581585 return a.messages.Update(ctx, *assistantMsg)
582586 case provider.EventError:
583− if errors.Is(event.Error, context.Canceled) {
584− slog.Info(fmt.Sprintf("Event processing canceled for session: %s", sessionID))
585− return context.Canceled
586− }
587− slog.Error(event.Error.Error())
588587 return event.Error
589588 case provider.EventComplete:
590589 assistantMsg.SetToolCalls(event.Response.ToolCalls)
591− assistantMsg.AddFinish(event.Response.FinishReason)
590+ assistantMsg.AddFinish(event.Response.FinishReason, "", "")
592591 if err := a.messages.Update(ctx, *assistantMsg); err != nil {
593592 return fmt.Errorf("failed to update message: %w", err)
594593 }