diff --git a/apps/backend/internal/orchestrator/event_handlers.go b/apps/backend/internal/orchestrator/event_handlers.go index 6294f94005..a79305818e 100644 --- a/apps/backend/internal/orchestrator/event_handlers.go +++ b/apps/backend/internal/orchestrator/event_handlers.go @@ -892,14 +892,22 @@ func (s *Service) updateTaskSessionState(ctx context.Context, taskID, sessionID zap.String("old_state", string(oldState)), zap.String("new_state", string(nextState))) if s.eventBus != nil { - _ = s.eventBus.Publish(ctx, events.TaskSessionStateChanged, bus.NewEvent(events.TaskSessionStateChanged, "task-session", map[string]interface{}{ + eventData := map[string]interface{}{ "task_id": taskID, "session_id": sessionID, "old_state": string(oldState), "new_state": string(nextState), "agent_profile_id": session.AgentProfileID, "agent_profile_snapshot": session.AgentProfileSnapshot, - })) + } + // Include review_status and workflow_step_id if present to ensure frontend state consistency + if session.ReviewStatus != nil { + eventData["review_status"] = *session.ReviewStatus + } + if session.WorkflowStepID != nil { + eventData["workflow_step_id"] = *session.WorkflowStepID + } + _ = s.eventBus.Publish(ctx, events.TaskSessionStateChanged, bus.NewEvent(events.TaskSessionStateChanged, "task-session", eventData)) } } diff --git a/apps/web/components/task/task-chat-panel.tsx b/apps/web/components/task/task-chat-panel.tsx index 874c14a1e8..bbcef7e2f1 100644 --- a/apps/web/components/task/task-chat-panel.tsx +++ b/apps/web/components/task/task-chat-panel.tsx @@ -131,7 +131,9 @@ export function TaskChatPanel({ // Check if we should show the approve button // Show when session has a review_status that is not approved (meaning it's in a review step) - const showApproveButton = session?.review_status != null && session.review_status !== 'approved'; + // Also hide while agent is working to prevent premature approval + const showApproveButton = + session?.review_status != null && session.review_status !== 'approved' && !isWorking; const handleSubmit = async (event?: FormEvent) => { event?.preventDefault();