@@ -403,7 +403,7 @@ func (a *agent) processGeneration(ctx context.Context, sessionID, content string
403 agentMessage, toolResults, err := a.streamAndHandleEvents(ctx, sessionID, msgHistory)
403 agentMessage, toolResults, err := a.streamAndHandleEvents(ctx, sessionID, msgHistory)
404 if err != nil {
404 if err != nil {
405 if errors.Is(err, context.Canceled) {
405 if errors.Is(err, context.Canceled) {
406− agentMessage.AddFinish(message.FinishReasonCanceled)
406+ agentMessage.AddFinish(message.FinishReasonCanceled, "Request cancelled", "")
407 a.messages.Update(context.Background(), agentMessage)
407 a.messages.Update(context.Background(), agentMessage)
408 return a.err(ErrRequestCancelled)
408 return a.err(ErrRequestCancelled)
@@ -454,11 +454,15 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
454 // Process each event in the stream.
454 // Process each event in the stream.
455 for event := range eventChan {
455 for event := range eventChan {
456 if processErr := a.processEvent(ctx, sessionID, &assistantMsg, event); processErr != nil {
456 if processErr := a.processEvent(ctx, sessionID, &assistantMsg, event); processErr != nil {
457+ if errors.Is(processErr, context.Canceled) {
458+ a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled, "Request cancelled", "")
457− a.finishMessage(ctx, &assistantMsg, message.FinishReasonCanceled)
460+ a.finishMessage(ctx, &assistantMsg, message.FinishReasonError, "API Error", processErr.Error())
458 return assistantMsg, nil, processErr
462 return assistantMsg, nil, processErr
460 if ctx.Err() != nil {
464 if ctx.Err() != nil {
461− a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled)
465+ a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled, "Request cancelled", "")
462 return assistantMsg, nil, ctx.Err()
466 return assistantMsg, nil, ctx.Err()
@@ -468,7 +472,7 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
468 for i, toolCall := range toolCalls {
472 for i, toolCall := range toolCalls {
470 case <-ctx.Done():
474 case <-ctx.Done():
471− a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled)
475+ a.finishMessage(context.Background(), &assistantMsg, message.FinishReasonCanceled, "Request cancelled", "")
472 // Make all future tool calls cancelled
476 // Make all future tool calls cancelled
473 for j := i; j < len(toolCalls); j++ {
477 for j := i; j < len(toolCalls); j++ {
474 toolResults[j] = message.ToolResult{
478 toolResults[j] = message.ToolResult{
@@ -516,7 +520,7 @@ func (a *agent) streamAndHandleEvents(ctx context.Context, sessionID string, msg
516 IsError: true,
520 IsError: true,
519− a.finishMessage(ctx, &assistantMsg, message.FinishReasonPermissionDenied)
523+ a.finishMessage(ctx, &assistantMsg, message.FinishReasonPermissionDenied, "Permission denied", "")
@@ -548,8 +552,8 @@ out:
548 return assistantMsg, &msg, err
552 return assistantMsg, &msg, err
551−func (a *agent) finishMessage(ctx context.Context, msg *message.Message, finishReson message.FinishReason) {
555+func (a *agent) finishMessage(ctx context.Context, msg *message.Message, finishReson message.FinishReason, message, details string) {
552− msg.AddFinish(finishReson)
556+ msg.AddFinish(finishReson, message, details)
553 _ = a.messages.Update(ctx, *msg)
557 _ = a.messages.Update(ctx, *msg)
@@ -580,15 +584,10 @@ func (a *agent) processEvent(ctx context.Context, sessionID string, assistantMsg
580 assistantMsg.FinishToolCall(event.ToolCall.ID)
584 assistantMsg.FinishToolCall(event.ToolCall.ID)
581 return a.messages.Update(ctx, *assistantMsg)
585 return a.messages.Update(ctx, *assistantMsg)
582 case provider.EventError:
586 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
587− slog.Error(event.Error.Error())
588 return event.Error
587 return event.Error
589 case provider.EventComplete:
588 case provider.EventComplete:
590 assistantMsg.SetToolCalls(event.Response.ToolCalls)
589 assistantMsg.SetToolCalls(event.Response.ToolCalls)
591− assistantMsg.AddFinish(event.Response.FinishReason)
590+ assistantMsg.AddFinish(event.Response.FinishReason, "", "")
592 if err := a.messages.Update(ctx, *assistantMsg); err != nil {
591 if err := a.messages.Update(ctx, *assistantMsg); err != nil {
593 return fmt.Errorf("failed to update message: %w", err)
592 return fmt.Errorf("failed to update message: %w", err)
@@ -801,6 +800,16 @@ func (a *agent) CancelAll() {
801 a.Cancel(key.(string)) // key is sessionID
800 a.Cancel(key.(string)) // key is sessionID
802 return true
801 return true
804+ timeout := time.After(5 * time.Second)
810+ time.Sleep(200 * time.Millisecond)
806func (a *agent) UpdateModel() error {
815func (a *agent) UpdateModel() error {