From 2e0f3aaf2566db9979ca827b9d29884be8fbeee0 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Sun, 22 Mar 2026 05:26:42 +0000 Subject: feat: surface error_msg on failed task cards in UI --- internal/api/task_view.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'internal') diff --git a/internal/api/task_view.go b/internal/api/task_view.go index e6e7097..6a4b58e 100644 --- a/internal/api/task_view.go +++ b/internal/api/task_view.go @@ -14,28 +14,34 @@ type taskView struct { *task.Task Changestats *task.Changestats `json:"changestats,omitempty"` DeploymentStatus *deployment.Status `json:"deployment_status,omitempty"` + ErrorMsg string `json:"error_msg,omitempty"` +} + +var failedStates = map[task.State]bool{ + task.StateFailed: true, + task.StateBudgetExceeded: true, + task.StateTimedOut: true, } // enrichTask fetches the latest execution for the given task and attaches -// changestats and deployment_status fields for READY tasks. -// Non-READY tasks are returned without these extra fields. +// changestats, deployment_status, and error_msg fields. func (s *Server) enrichTask(tk *task.Task) *taskView { view := &taskView{Task: tk} - if tk.State != task.StateReady { - return view - } - exec, err := s.store.GetLatestExecution(tk.ID) if err != nil { - if err == sql.ErrNoRows { - // No execution yet — still include deployment status (empty commits). + if err == sql.ErrNoRows && tk.State == task.StateReady { view.DeploymentStatus = deployment.Check(nil, tk.RepositoryURL) } return view } - view.Changestats = exec.Changestats - view.DeploymentStatus = deployment.Check(exec.Commits, tk.RepositoryURL) + if failedStates[tk.State] && exec.ErrorMsg != "" { + view.ErrorMsg = exec.ErrorMsg + } + if tk.State == task.StateReady { + view.Changestats = exec.Changestats + view.DeploymentStatus = deployment.Check(exec.Commits, tk.RepositoryURL) + } return view } -- cgit v1.2.3