package webui import ( "fmt" "html" "net/http" "os" "strings" ) func (h *handler) handleTaskPage(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") task, ok := globalQueue.findByID(id) if !ok { http.NotFound(w, r) return } snapshot := *task body := renderTaskDetailPage(h.opts, snapshot) w.Header().Set("Cache-Control", "no-store") w.Header().Set("Content-Type", "text/html; charset=utf-8") _, _ = w.Write([]byte(body)) } func renderTaskDetailPage(opts HandlerOptions, task Task) string { title := task.Name if strings.TrimSpace(title) == "" { title = task.ID } var body strings.Builder body.WriteString(`
`) body.WriteString(`Back to Tasks`) body.WriteString(`Artifacts are saved in the task folder under ./tasks.`) body.WriteString(`
`) if report := loadTaskReportFragment(task); report != "" { body.WriteString(report) } else { body.WriteString(`
Task Summary
`) body.WriteString(`
` + html.EscapeString(title) + `
`) body.WriteString(`
` + renderTaskStatusBadge(task.Status) + `
`) if strings.TrimSpace(task.ErrMsg) != "" { body.WriteString(`
` + html.EscapeString(task.ErrMsg) + `
`) } body.WriteString(`
`) } if task.Status == TaskRunning || task.Status == TaskPending { body.WriteString(`
Live Logs
`) body.WriteString(`
Connecting...
`) body.WriteString(`
`) body.WriteString(``) } return layoutHead(opts.Title+" — "+title) + layoutNav("tasks", opts.BuildLabel) + `

` + html.EscapeString(title) + `

` + body.String() + `
` } func loadTaskReportFragment(task Task) string { if strings.TrimSpace(task.ReportHTMLPath) == "" { return "" } data, err := os.ReadFile(task.ReportHTMLPath) if err != nil || len(data) == 0 { return "" } return string(data) } func taskArtifactDownloadLink(task Task, absPath string) string { if strings.TrimSpace(absPath) == "" { return "" } return fmt.Sprintf(`/export/file?path=%s`, absPath) }