Changeset 0.25.0 (#160)
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user