Feat v0.2.4: SDK Topbar, Schedules surface, manifest icons, UserMenu cleanup
Shell navigation: - sw.shell.Topbar — composable nav bar (title + slot + bell + user menu) - Topbar CSS in sw-shell.css, wired into SDK via dynamic import Schedules surface (packages/schedules/): - Wraps kernel /api/v1/schedules CRUD + run + logs - Table view with cron badge, human-readable preview, enable toggle - Create/edit dialog with live cron-to-english preview Manifest icons: - icon field in manifest.json (emoji string) - Surfaces API returns icon from package manifest - UserMenu renders per-surface icons UserMenu cleanup: - Removed dead Chat/Notes/Projects hardcoded links - Menu now driven by /api/v1/surfaces API (installed surfaces only) - Core surfaces filtered via CORE_IDS set Bug fixes: - isAdmin() in can.js now checks surface.admin.access RBAC grant instead of deprecated user.role column (v0.2.0 regression) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -726,6 +726,7 @@ func (h *PackageHandler) ListEnabledSurfaces(c *gin.Context) {
|
||||
ID string `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Route string `json:"route"`
|
||||
Icon string `json:"icon,omitempty"`
|
||||
}
|
||||
|
||||
var enabled []navSurface
|
||||
@@ -738,10 +739,12 @@ func (h *PackageHandler) ListEnabledSurfaces(c *gin.Context) {
|
||||
continue
|
||||
}
|
||||
route, _ := p.Manifest["route"].(string)
|
||||
icon, _ := p.Manifest["icon"].(string)
|
||||
enabled = append(enabled, navSurface{
|
||||
ID: p.ID,
|
||||
Title: p.Title,
|
||||
Route: route,
|
||||
Icon: icon,
|
||||
})
|
||||
}
|
||||
if enabled == nil {
|
||||
|
||||
Reference in New Issue
Block a user