Skip to content

Commit 55a0012

Browse files
committed
fix(ui): restore sidebar navigation exports
1 parent 3b33613 commit 55a0012

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

ui/src/app-navigation.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ describe("navigationIconForRoute", () => {
3636
overview: "barChart",
3737
activity: "activity",
3838
workboard: "folder",
39+
worktrees: "folder",
3940
channels: "link",
4041
instances: "radio",
4142
sessions: "fileText",
@@ -74,6 +75,7 @@ describe("titleForRoute", () => {
7475
overview: "Overview",
7576
activity: "Activity",
7677
workboard: "Workboard",
78+
worktrees: "Worktrees",
7779
channels: "Channels",
7880
instances: "Instances",
7981
sessions: "Sessions",
@@ -106,6 +108,7 @@ describe("subtitleForRoute", () => {
106108
overview: "Status, entry points, health.",
107109
activity: "Browser-local tool activity summaries.",
108110
workboard: "Agent work queue and session handoff.",
111+
worktrees: "Isolated agent task checkouts and recovery snapshots.",
109112
channels: "Channels and settings.",
110113
instances: "Connected clients and nodes.",
111114
sessions: "Active sessions and defaults.",

ui/src/app-navigation.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3675
export const SETTINGS_NAVIGATION_ROUTES = [
3776
"config",
3877
"channels",

0 commit comments

Comments
 (0)