package server import ( "fmt" "html" "strings" "github.com/dal/kaos/internal/supervisor" ) // statusIcons maps folder names to emoji icons. var statusIcons = map[string]string{ "backlog": "๐Ÿ“ฆ", "ready": "๐Ÿ“‹", "active": "๐Ÿ”„", "review": "๐Ÿ‘€", "done": "โœ…", } // columnOrder defines the display order of columns. var columnOrder = []string{"backlog", "ready", "active", "review", "done"} // renderDashboard generates the full dashboard HTML page. func renderDashboard(columns map[string][]supervisor.Task) string { var b strings.Builder b.WriteString(` KAOS Dashboard

๐Ÿ”ง KAOS Dashboard

v0.2
`) for _, col := range columnOrder { tasks := columns[col] icon := statusIcons[col] b.WriteString(fmt.Sprintf(`
`, col, col)) b.WriteString(fmt.Sprintf(`
%s %s%d
`, icon, strings.ToUpper(col), len(tasks))) for _, t := range tasks { b.WriteString(renderTaskCard(t)) } b.WriteString("
\n") } b.WriteString(`
`) return b.String() } // renderTaskCard generates HTML for a single task card. func renderTaskCard(t supervisor.Task) string { var b strings.Builder b.WriteString(fmt.Sprintf(`
`, t.ID, t.ID)) b.WriteString(fmt.Sprintf(`
%s
`, html.EscapeString(t.ID))) b.WriteString(fmt.Sprintf(`
%s
`, html.EscapeString(t.Title))) b.WriteString(fmt.Sprintf(`
%s ยท %s
`, html.EscapeString(t.Agent), html.EscapeString(t.Model))) if len(t.DependsOn) > 0 { b.WriteString(fmt.Sprintf(`
Zavisi od: %s
`, html.EscapeString(strings.Join(t.DependsOn, ", ")))) } b.WriteString("
\n") return b.String() } // renderTaskDetail generates HTML fragment for task detail panel. func renderTaskDetail(t supervisor.Task, content string) string { var b strings.Builder b.WriteString(`โœ•`) b.WriteString(fmt.Sprintf(`

%s: %s

`, html.EscapeString(t.ID), html.EscapeString(t.Title))) b.WriteString(fmt.Sprintf(`

Agent: %s ยท Model: %s ยท Status: %s

`, html.EscapeString(t.Agent), html.EscapeString(t.Model), html.EscapeString(t.Status))) if len(t.DependsOn) > 0 { b.WriteString(fmt.Sprintf(`

Zavisi od: %s

`, html.EscapeString(strings.Join(t.DependsOn, ", ")))) } b.WriteString(fmt.Sprintf(`
%s
`, html.EscapeString(content))) return b.String() }