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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user