@@ -33,6 +33,45 @@ export const SIDEBAR_SECTIONS = [
3333 { label : "settings" , routes : [ "config" ] } ,
3434] as const satisfies readonly SidebarSection [ ] ;
3535
36+ type SidebarSectionRouteId = ( typeof SIDEBAR_SECTIONS ) [ number ] [ "routes" ] [ number ] ;
37+
38+ export type SidebarNavRoute = Exclude < SidebarSectionRouteId , "chat" | "config" > ;
39+
40+ export const SIDEBAR_NAV_ROUTES = SIDEBAR_SECTIONS . flatMap ( ( section ) =>
41+ section . label === "control" || section . label === "agent" ? section . routes : [ ] ,
42+ ) as readonly SidebarNavRoute [ ] ;
43+
44+ export const DEFAULT_SIDEBAR_PINNED_ROUTES = [
45+ "overview" ,
46+ ] as const satisfies readonly SidebarNavRoute [ ] ;
47+
48+ const SIDEBAR_NAV_ROUTE_SET = new Set < NavigationRouteId > ( SIDEBAR_NAV_ROUTES ) ;
49+
50+ function isSidebarNavRoute ( value : unknown ) : value is SidebarNavRoute {
51+ return typeof value === "string" && SIDEBAR_NAV_ROUTE_SET . has ( value as NavigationRouteId ) ;
52+ }
53+
54+ export function normalizeSidebarPinnedRoutes ( value : unknown ) : SidebarNavRoute [ ] | undefined {
55+ if ( ! Array . isArray ( value ) ) {
56+ return undefined ;
57+ }
58+ const seen = new Set < SidebarNavRoute > ( ) ;
59+ const routes : SidebarNavRoute [ ] = [ ] ;
60+ for ( const routeId of value ) {
61+ if ( ! isSidebarNavRoute ( routeId ) || seen . has ( routeId ) ) {
62+ continue ;
63+ }
64+ seen . add ( routeId ) ;
65+ routes . push ( routeId ) ;
66+ }
67+ return routes ;
68+ }
69+
70+ export function sidebarMoreRoutes ( pinnedRoutes : readonly SidebarNavRoute [ ] ) : SidebarNavRoute [ ] {
71+ const pinned = new Set ( pinnedRoutes ) ;
72+ return SIDEBAR_NAV_ROUTES . filter ( ( routeId ) => ! pinned . has ( routeId ) ) ;
73+ }
74+
3675export const SETTINGS_NAVIGATION_ROUTES = [
3776 "config" ,
3877 "channels" ,
0 commit comments