Changeset 0.25.0 (#160)

This commit is contained in:
2026-03-08 16:54:17 +00:00
parent 937be26578
commit 2b01d540d6
63 changed files with 6942 additions and 2773 deletions

View File

@@ -524,6 +524,10 @@ func main() {
protected.POST("/chat/completions", comp.Complete)
protected.GET("/tools", comp.ListTools)
// Surface discovery (v0.25.0)
surfaceH := handlers.NewSurfaceHandler(stores)
protected.GET("/surfaces", surfaceH.ListEnabledSurfaces)
// Summarize & Continue (backed by compaction service)
compactionSvc := compaction.NewService(stores, roleResolver)
summarize := handlers.NewSummarizeHandler(compactionSvc)
@@ -580,6 +584,8 @@ func main() {
protected.DELETE("/personas/:id/avatar", handlers.DeletePersonaAvatar)
protected.GET("/personas/:id/knowledge-bases", personas.GetPersonaKBs) // v0.17.0
protected.PUT("/personas/:id/knowledge-bases", personas.SetPersonaKBs) // v0.17.0
protected.GET("/personas/:id/tool-grants", personas.GetPersonaToolGrants) // v0.25.0
protected.PUT("/personas/:id/tool-grants", personas.SetPersonaToolGrants) // v0.25.0
// Notes
notes := handlers.NewNoteHandler(stores)
@@ -826,6 +832,8 @@ func main() {
admin.DELETE("/personas/:id/avatar", handlers.DeletePersonaAvatar)
admin.GET("/personas/:id/knowledge-bases", personaAdm.GetPersonaKBs) // v0.17.0
admin.PUT("/personas/:id/knowledge-bases", personaAdm.SetPersonaKBs) // v0.17.0
admin.GET("/personas/:id/tool-grants", personaAdm.GetPersonaToolGrants) // v0.25.0
admin.PUT("/personas/:id/tool-grants", personaAdm.SetPersonaToolGrants) // v0.25.0
// Admin memory review (v0.18.0)
adminMemH := handlers.NewMemoryHandler(stores)
@@ -941,6 +949,19 @@ func main() {
admin.PUT("/routing/policies/:id", routingAdm.UpdatePolicy)
admin.DELETE("/routing/policies/:id", routingAdm.DeletePolicy)
admin.POST("/routing/test", routingAdm.TestRouting)
// Surface lifecycle management (v0.25.0)
surfacesDir := ""
if cfg.StoragePath != "" {
surfacesDir = cfg.StoragePath + "/surfaces"
}
surfaceAdm := handlers.NewSurfaceHandler(stores, surfacesDir)
admin.GET("/surfaces", surfaceAdm.ListSurfaces)
admin.GET("/surfaces/:id", surfaceAdm.GetSurface)
admin.POST("/surfaces/install", surfaceAdm.InstallSurface)
admin.PUT("/surfaces/:id/enable", surfaceAdm.EnableSurface)
admin.PUT("/surfaces/:id/disable", surfaceAdm.DisableSurface)
admin.DELETE("/surfaces/:id", surfaceAdm.DeleteSurface)
}
}
@@ -954,48 +975,16 @@ func main() {
// Login page — no auth required
base.GET("/login", pageEngine.RenderLogin())
// Authenticated page routes
pageRoutes := base.Group("")
pageRoutes.Use(middleware.AuthOrRedirect(cfg))
{
// Chat surface (default) — bridge to existing SPA
pageRoutes.GET("/", pageEngine.RenderSurface("chat"))
pageRoutes.GET("/chat/:chatID", pageEngine.RenderSurface("chat"))
// Editor surface — server renders layout, JS builds CodeMirror inside
pageRoutes.GET("/editor", pageEngine.RenderSurface("editor"))
pageRoutes.GET("/editor/:wsId", pageEngine.RenderSurface("editor"))
// Notes surface
pageRoutes.GET("/notes", pageEngine.RenderSurface("notes"))
pageRoutes.GET("/notes/:noteId", pageEngine.RenderSurface("notes"))
}
// Admin pages — auth + admin role required
adminPages := base.Group("/admin")
adminPages.Use(middleware.AuthOrRedirect(cfg))
adminPages.Use(middleware.RequireAdminPage())
{
adminPages.GET("", pageEngine.RenderSurface("admin"))
adminPages.GET("/:section", pageEngine.RenderSurface("admin"))
}
// Settings pages — auth required
settingsPages := base.Group("/settings")
settingsPages.Use(middleware.AuthOrRedirect(cfg))
{
settingsPages.GET("", pageEngine.RenderSurface("settings"))
settingsPages.GET("/:section", pageEngine.RenderSurface("settings"))
}
// ── Workflow routes (v0.24.3) ────────────
// Anonymous session entry point for workflow channels.
// AuthOrSession tries JWT first, falls back to session cookie.
wfPages := base.Group("/w")
wfPages.Use(middleware.AuthOrSession(cfg, stores))
{
wfPages.GET("/:id", pageEngine.RenderWorkflow())
}
// v0.25.0: Surface routes generated from manifest registry.
// Replaces manual per-surface route blocks.
pageEngine.RegisterPageRoutes(base, pages.PageRouteMiddleware{
Authenticated: middleware.AuthOrRedirect(cfg),
Admin: []gin.HandlerFunc{
middleware.AuthOrRedirect(cfg),
middleware.RequireAdminPage(),
},
Session: middleware.AuthOrSession(cfg, stores),
})
// Workflow API — session participants can send messages + trigger completions
wfAPI := base.Group("/api/v1/w")