Add Claude integration to dashboard

Add comprehensive Claude Code monitoring and realtime streaming to the K8s dashboard.
Includes API endpoints for health, stats, summary, inventory, and live event streaming.
Frontend provides overview, usage, inventory, debug, and live feed views.
This commit is contained in:
OpenCode Test
2026-01-03 10:54:48 -08:00
parent de89f3066c
commit ae958528a6
26 changed files with 1638 additions and 2 deletions

View File

@@ -7,20 +7,31 @@ import (
"log"
"net/http"
"os"
"path/filepath"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
"github.com/will/k8s-agent-dashboard/internal/api"
"github.com/will/k8s-agent-dashboard/internal/claude"
"github.com/will/k8s-agent-dashboard/internal/store"
)
//go:embed all:web
var webFS embed.FS
func defaultClaudeDir() string {
home, err := os.UserHomeDir()
if err != nil {
return "/home/will/.claude" // fallback; best-effort
}
return filepath.Join(home, ".claude")
}
func main() {
port := flag.String("port", "8080", "Server port")
dataDir := flag.String("data", "/data", "Data directory for state")
claudeDir := flag.String("claude", defaultClaudeDir(), "Claude Code directory")
flag.Parse()
// Initialize store
@@ -29,6 +40,12 @@ func main() {
log.Fatalf("Failed to initialize store: %v", err)
}
// Initialize Claude loader
claudeLoader := claude.NewLoader(*claudeDir)
// Initialize event hub
hub := claude.NewEventHub(1000)
// Create router
r := chi.NewRouter()
@@ -48,6 +65,16 @@ func main() {
// API routes
r.Route("/api", func(r chi.Router) {
r.Get("/health", api.HealthCheck)
r.Route("/claude", func(r chi.Router) {
r.Get("/health", api.GetClaudeHealth(claudeLoader))
r.Get("/stats", api.GetClaudeStats(claudeLoader))
r.Get("/summary", api.GetClaudeSummary(claudeLoader))
r.Get("/inventory", api.GetClaudeInventory(claudeLoader))
r.Get("/debug/files", api.GetClaudeDebugFiles(claudeLoader))
r.Get("/live/backlog", api.GetClaudeLiveBacklog(claudeLoader))
r.Get("/stream", api.GetClaudeStream(hub))
})
r.Get("/status", api.GetClusterStatus(s))
r.Get("/pending", api.GetPendingActions(s))
r.Post("/pending/{id}/approve", api.ApproveAction(s))
@@ -78,6 +105,10 @@ func main() {
log.Printf("Starting server on %s", addr)
log.Printf("Data directory: %s", *dataDir)
log.Printf("Claude directory: %s", *claudeDir)
stop := make(chan struct{})
go claude.TailHistoryFile(stop, hub, filepath.Join(*claudeDir, "history.jsonl"))
if err := http.ListenAndServe(addr, r); err != nil {
log.Fatalf("Server failed: %v", err)