Changeset 0.28.7 (#193)
This commit is contained in:
@@ -228,7 +228,7 @@ func main() {
|
||||
handlers.SeedProviders(cfg, stores, keyResolver)
|
||||
|
||||
// Seed builtin extensions from disk (idempotent, version-aware)
|
||||
handlers.SeedBuiltinExtensions(stores, "extensions/builtin")
|
||||
handlers.SeedBuiltinPackages(stores, "extensions/builtin")
|
||||
|
||||
// Load search provider config from DB (defaults to DuckDuckGo if not set)
|
||||
loadSearchConfig(stores)
|
||||
@@ -662,9 +662,9 @@ 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)
|
||||
// Surface discovery (v0.25.0, v0.28.7: unified packages)
|
||||
pkgH := handlers.NewPackageHandler(stores)
|
||||
protected.GET("/surfaces", pkgH.ListEnabledSurfaces)
|
||||
|
||||
// Summarize & Continue (backed by compaction service)
|
||||
compactionSvc := compaction.NewService(stores, roleResolver)
|
||||
@@ -1124,18 +1124,26 @@ func main() {
|
||||
admin.DELETE("/routing/policies/:id", routingAdm.DeletePolicy)
|
||||
admin.POST("/routing/test", routingAdm.TestRouting)
|
||||
|
||||
// Surface lifecycle management (v0.25.0)
|
||||
surfacesDir := ""
|
||||
// Package lifecycle management (v0.28.7 — replaces surfaces + extensions admin)
|
||||
packagesDir := ""
|
||||
if cfg.StoragePath != "" {
|
||||
surfacesDir = cfg.StoragePath + "/surfaces"
|
||||
packagesDir = cfg.StoragePath + "/packages"
|
||||
}
|
||||
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)
|
||||
pkgAdm := handlers.NewPackageHandler(stores, packagesDir)
|
||||
admin.GET("/packages", pkgAdm.ListPackages)
|
||||
admin.GET("/packages/:id", pkgAdm.GetPackage)
|
||||
admin.POST("/packages/install", pkgAdm.InstallPackage)
|
||||
admin.PUT("/packages/:id/enable", pkgAdm.EnablePackage)
|
||||
admin.PUT("/packages/:id/disable", pkgAdm.DisablePackage)
|
||||
admin.DELETE("/packages/:id", pkgAdm.DeletePackage)
|
||||
|
||||
// Surface aliases (backward compat — same handlers)
|
||||
admin.GET("/surfaces", pkgAdm.ListPackages)
|
||||
admin.GET("/surfaces/:id", pkgAdm.GetPackage)
|
||||
admin.POST("/surfaces/install", pkgAdm.InstallPackage)
|
||||
admin.PUT("/surfaces/:id/enable", pkgAdm.EnablePackage)
|
||||
admin.PUT("/surfaces/:id/disable", pkgAdm.DisablePackage)
|
||||
admin.DELETE("/surfaces/:id", pkgAdm.DeletePackage)
|
||||
|
||||
// Task management — admin (v0.27.1, extended v0.27.2)
|
||||
taskAdm := handlers.NewTaskHandler(stores)
|
||||
@@ -1154,15 +1162,16 @@ func main() {
|
||||
|
||||
// v0.27.0: Extension surface static assets (JS, CSS, images).
|
||||
// Served without auth — same rationale as extension assets (script tags can't send headers).
|
||||
// In split deployment, nginx serves these from /data/surfaces/ directly.
|
||||
// v0.28.7: on-disk path moved to /data/packages/, URL stays /surfaces/:id/ for stability.
|
||||
// In split deployment, nginx serves these from /data/packages/ directly.
|
||||
if cfg.StoragePath != "" {
|
||||
surfacesStaticDir := cfg.StoragePath + "/surfaces"
|
||||
packagesStaticDir := cfg.StoragePath + "/packages"
|
||||
base.GET("/surfaces/:id/*path", func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
filePath := c.Param("path")
|
||||
// Security: prevent path traversal
|
||||
clean := filepath.Clean(filepath.Join(surfacesStaticDir, id, filePath))
|
||||
if !strings.HasPrefix(clean, filepath.Clean(surfacesStaticDir)) {
|
||||
clean := filepath.Clean(filepath.Join(packagesStaticDir, id, filePath))
|
||||
if !strings.HasPrefix(clean, filepath.Clean(packagesStaticDir)) {
|
||||
c.Status(http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user