package main
import (
"embed"
"io/fs"
"log"
"net/http"
"time"
"theskyscape.com/repo/skykit"
"theskyscape.com/repo/skylab/controllers"
"theskyscape.com/repo/skylab/models"
)
//go:embed all:views
var views embed.FS
func main() {
log.Println("Starting SkyLab on http://localhost:5000")
// Ensure workspace root directory exists
if err := models.EnsureWorkspaceRoot(); err != nil {
log.Printf("Warning: failed to create workspace root: %v", err)
}
// Start session cleanup goroutine (every 5 minutes)
go func() {
for {
time.Sleep(5 * time.Minute)
models.CleanupStaleSessions()
}
}()
// Start kernel cleanup goroutine (every 2 minutes)
go func() {
for {
time.Sleep(2 * time.Minute)
models.CleanupIdleKernels()
}
}()
// Serve public files from views/public
if _, err := fs.Sub(views, "views/public"); err == nil {
public, _ := fs.Sub(views, "views")
http.Handle("GET /public/", http.FileServerFS(public))
log.Println("Serving public files at /public/")
}
skykit.Serve(views,
skykit.WithController(controllers.Notebooks()),
skykit.WithController(controllers.Kernel()),
skykit.WithController(controllers.Gallery()),
)
}