@agent-native/dispatch 0.14.8 → 0.14.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/layout/Layout.d.ts +2 -1
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +5 -5
- package/dist/components/layout/Layout.js.map +1 -1
- package/package.json +2 -2
- package/src/components/layout/Layout.spec.tsx +21 -0
- package/src/components/layout/Layout.tsx +14 -9
- package/src/components/workspace-app-card.spec.tsx +34 -3
|
@@ -30,8 +30,9 @@ export declare function NavContent({ onNavigate, extensions, collapsed, collapsi
|
|
|
30
30
|
collapsible?: boolean;
|
|
31
31
|
onCollapsedChange?: (collapsed: boolean) => void;
|
|
32
32
|
}): import("node_modules/@types/react").JSX.Element;
|
|
33
|
-
export declare function Layout({ children, extensions, }: {
|
|
33
|
+
export declare function Layout({ children, extensions, agentPageHref, }: {
|
|
34
34
|
children: ReactNode;
|
|
35
35
|
extensions?: DispatchExtensionConfig;
|
|
36
|
+
agentPageHref?: string;
|
|
36
37
|
}): import("node_modules/@types/react").JSX.Element;
|
|
37
38
|
//# sourceMappingURL=Layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AA0CA,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAiBf,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,mFAAmF;IACnF,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gEAAgE;IAChE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AA6ND,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,UAWlE;AAsPD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,UAAU,EACV,SAAiB,EACjB,WAAmB,EACnB,iBAAiB,GAClB,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD,
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AA0CA,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAiBf,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,mFAAmF;IACnF,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gEAAgE;IAChE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AA6ND,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,UAWlE;AAsPD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,UAAU,EACV,SAAiB,EACjB,WAAmB,EACnB,iBAAiB,GAClB,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD,mDA+PA;AAED,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,UAAU,EACV,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,mDA4IA"}
|
|
@@ -393,7 +393,7 @@ export function NavContent({ onNavigate, extensions, collapsed = false, collapsi
|
|
|
393
393
|
onNavigate?.();
|
|
394
394
|
}, "aria-label": label, className: ({ isActive }) => {
|
|
395
395
|
const active = isActive || itemMatchesLocalPath;
|
|
396
|
-
return cn("flex h-
|
|
396
|
+
return cn("flex h-8 w-8 items-center justify-center rounded-md text-sm", active
|
|
397
397
|
? "bg-sidebar-accent font-medium text-sidebar-accent-foreground"
|
|
398
398
|
: "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground");
|
|
399
399
|
}, children: Icon ? (_jsx(Icon, { size: 16, className: "shrink-0" })) : (_jsx("span", { className: "h-4 w-4 shrink-0", "aria-hidden": "true" })) }) }), _jsx(TooltipContent, { side: "right", children: label })] })) : (_jsxs(NavLink, { to: dispatchNavLinkTarget(item.to), onClick: (event) => {
|
|
@@ -420,9 +420,9 @@ export function NavContent({ onNavigate, extensions, collapsed = false, collapsi
|
|
|
420
420
|
? t("sidebar.expandSidebar")
|
|
421
421
|
: t("sidebar.collapseSidebar"), className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", children: collapsed ? (_jsx(IconLayoutSidebarLeftExpand, { className: "h-4 w-4 rtl:-scale-x-100" })) : (_jsx(IconLayoutSidebarLeftCollapse, { className: "h-4 w-4 rtl:-scale-x-100" })) }) }), _jsx(TooltipContent, { side: "right", children: collapsed
|
|
422
422
|
? t("sidebar.expandSidebar")
|
|
423
|
-
: t("sidebar.collapseSidebar") })] })) : null] }) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto", children: [_jsxs("nav", { className: cn("py-3", collapsed ? "px-1" : "px-2"), children: [_jsx("ul", { className: cn("space-y-0.5", collapsed
|
|
423
|
+
: t("sidebar.collapseSidebar") })] })) : null] }) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto", children: [_jsxs("nav", { className: cn("py-3", collapsed ? "px-1" : "px-2"), children: [_jsx("ul", { className: cn(collapsed ? "flex flex-col items-center gap-1" : "space-y-0.5"), children: primaryNavItems.map(renderNavItem) }), collapsed ? (_jsxs(_Fragment, { children: [_jsx("ul", { className: "mt-5 flex flex-col items-center gap-1", children: operationsNavItems.map(renderNavItem) }), _jsx("ul", { className: "mt-3 flex flex-col items-center gap-1", children: ADVANCED_NAV_ITEMS.map(renderNavItem) })] })) : (_jsxs("div", { className: "mt-5", children: [_jsx("p", { className: "px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45", children: t("dispatch.nav.operate", { defaultValue: "Operate" }) }), _jsx("ul", { className: "space-y-0.5", children: operationsNavItems.map(renderNavItem) }), _jsxs("details", { className: "group mt-3", open: advancedOpen, children: [_jsxs("summary", { className: "flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden", children: [_jsx("span", { children: t("dispatch.nav.advanced", { defaultValue: "Advanced" }) }), _jsx(IconChevronDown, { size: 14, className: "transition-transform group-open:rotate-180" })] }), _jsx("ul", { className: "mt-1 space-y-0.5", children: ADVANCED_NAV_ITEMS.map(renderNavItem) })] })] }))] }), !collapsed ? (_jsxs("div", { className: "mt-auto shrink-0", children: [_jsx("div", { className: "px-2 py-1", children: _jsx(ExtensionsSidebarSection, {}) }), _jsx("div", { className: "px-3 py-2", children: _jsx(OrgSwitcher, {}) }), _jsx("div", { className: "px-3 py-2", children: _jsx(FeedbackButton, {}) })] })) : null] })] }));
|
|
424
424
|
}
|
|
425
|
-
export function Layout({ children, extensions, }) {
|
|
425
|
+
export function Layout({ children, extensions, agentPageHref, }) {
|
|
426
426
|
const t = useT();
|
|
427
427
|
const location = useLocation();
|
|
428
428
|
const navigate = useNavigate();
|
|
@@ -473,7 +473,7 @@ export function Layout({ children, extensions, }) {
|
|
|
473
473
|
t("dispatch.sidebar.suggestionGrantKey"),
|
|
474
474
|
];
|
|
475
475
|
const appContent = (_jsxs("div", { className: "flex h-full min-w-0 flex-1 flex-col overflow-hidden", children: [showHeader ? _jsx(Header, { onOpenMobile: () => setMobileOpen(true) }) : null, _jsx(InvitationBanner, {}), _jsx("main", { className: cn("flex-1", isChatRoute ? "min-h-0 overflow-hidden" : "overflow-y-auto"), children: showHeader ? (_jsx("div", { className: "mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6", children: children })) : (children) })] }));
|
|
476
|
-
const content = isChatRoute ? (_jsx("div", { className: "agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden", children: appContent })) : (_jsx(AgentSidebar, { position: "right", defaultOpen: false, chatViewTransition: true, storageKey: "dispatch", openOnChatRunning: chatHomeHandoffActive, onFullscreenRequest: openAskAgentFullscreen, emptyStateText: t("dispatch.sidebar.emptyAgentText"), suggestions: sidebarSuggestions, children: appContent }));
|
|
477
|
-
return (_jsx(HeaderActionsProvider, { children: _jsxs("div", { className: "agent-layout-shell flex h-screen w-full overflow-hidden bg-background", children: [_jsx("aside", { "data-collapsed": sidebarCollapsed ? "true" : "false", className: cn("agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex", sidebarCollapsed ? "w-
|
|
476
|
+
const content = isChatRoute ? (_jsx("div", { className: "agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden", children: appContent })) : (_jsx(AgentSidebar, { position: "right", defaultOpen: false, agentPageHref: agentPageHref, chatViewTransition: true, storageKey: "dispatch", openOnChatRunning: chatHomeHandoffActive, onFullscreenRequest: openAskAgentFullscreen, emptyStateText: t("dispatch.sidebar.emptyAgentText"), suggestions: sidebarSuggestions, children: appContent }));
|
|
477
|
+
return (_jsx(HeaderActionsProvider, { children: _jsxs("div", { className: "agent-layout-shell flex h-screen w-full overflow-hidden bg-background", children: [_jsx("aside", { "data-collapsed": sidebarCollapsed ? "true" : "false", className: cn("agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex", sidebarCollapsed ? "w-14" : "w-56"), children: _jsx(NavContent, { extensions: extensions, collapsed: sidebarCollapsed, collapsible: true, onCollapsedChange: setSidebarCollapsed }) }), _jsx(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: _jsxs(SheetContent, { side: "left", className: "w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden", children: [_jsx(SheetTitle, { className: "sr-only", children: t("dispatch.nav.navigation") }), _jsx(SheetDescription, { className: "sr-only", children: t("dispatch.nav.navigationDescription") }), _jsx("div", { className: "flex h-full w-full flex-col", children: _jsx(NavContent, { extensions: extensions, collapsed: false, onNavigate: () => setMobileOpen(false) }) })] }) }), content] }) }));
|
|
478
478
|
}
|
|
479
479
|
//# sourceMappingURL=Layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentSidebar,\n FeedbackButton,\n appBasePath,\n appPath,\n focusAgentChat,\n navigateWithAgentChatViewTransition,\n useActionQuery,\n useAgentChatHomeHandoff,\n useAgentChatHomeHandoffLinks,\n useChatThreads,\n useT,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { ExtensionsSidebarSection } from \"@agent-native/core/client/extensions\";\nimport { InvitationBanner, OrgSwitcher } from \"@agent-native/core/client/org\";\nimport {\n IconActivity,\n IconArrowUpRight,\n IconApps,\n IconBrain,\n IconChartBar,\n IconBrandTelegram,\n IconKey,\n IconChevronDown,\n IconDots,\n IconEdit,\n IconLayersSubtract,\n IconMessageQuestion,\n IconMessages,\n IconPlus,\n IconPlugConnected,\n IconBroadcast,\n IconFingerprint,\n IconHistory,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarLeftExpand,\n IconPuzzle,\n IconSettings,\n IconSettingsAutomation,\n IconShieldCheck,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { NavLink, useLocation, useNavigate } from \"react-router\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { Input } from \"../ui/input\";\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"../ui/sheet\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { Header } from \"./Header\";\nimport { HeaderActionsProvider } from \"./HeaderActions\";\n\nexport type DispatchNavSection = \"primary\" | \"operations\";\n\nexport type DispatchNavIcon = ComponentType<{\n size?: number | string;\n className?: string;\n}>;\n\nexport interface DispatchNavItem {\n /** Stable id used for keys and navigation.view. Avoid built-in ids. */\n id: string;\n /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */\n to: string;\n label: string;\n icon?: DispatchNavIcon;\n /** Defaults to \"operations\", which is where local management tools usually fit. */\n section?: DispatchNavSection;\n /** Override active matching for nested or multi-route tools. */\n match?: (pathname: string) => boolean;\n}\n\nexport interface DispatchExtensionConfig {\n /** Extra sidebar tabs supplied by the generated workspace. */\n navItems?: readonly DispatchNavItem[];\n /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */\n queryKeys?: readonly string[];\n}\n\nconst PRIMARY_NAV_ITEMS = [\n {\n id: \"overview\",\n to: \"/overview\",\n label: \"Overview\",\n icon: IconBroadcast,\n section: \"primary\",\n },\n {\n id: \"chat\",\n to: \"/chat\",\n label: \"Chat\",\n icon: IconMessageQuestion,\n section: \"primary\",\n },\n {\n id: \"apps\",\n to: \"/apps\",\n label: \"Apps\",\n icon: IconApps,\n section: \"primary\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst OPERATIONS_NAV_ITEMS = [\n {\n id: \"operations\",\n to: \"/operations\",\n label: \"Operations\",\n icon: IconActivity,\n section: \"operations\",\n },\n {\n id: \"metrics\",\n to: \"/metrics\",\n label: \"Metrics\",\n icon: IconChartBar,\n section: \"operations\",\n },\n {\n id: \"automations\",\n to: \"/automations\",\n label: \"Automations\",\n icon: IconSettingsAutomation,\n section: \"operations\",\n },\n {\n id: \"approvals\",\n to: \"/approvals\",\n label: \"Approvals\",\n icon: IconShieldCheck,\n section: \"operations\",\n },\n {\n id: \"destinations\",\n to: \"/destinations\",\n label: \"Destinations\",\n icon: IconArrowUpRight,\n section: \"operations\",\n },\n {\n id: \"integrations\",\n to: \"/integrations\",\n label: \"Integrations\",\n icon: IconPuzzle,\n section: \"operations\",\n },\n {\n id: \"vault\",\n to: \"/vault\",\n label: \"Vault\",\n icon: IconKey,\n section: \"operations\",\n },\n {\n id: \"agents\",\n to: \"/agents\",\n label: \"Agents\",\n icon: IconPlugConnected,\n section: \"operations\",\n },\n {\n id: \"workspace\",\n to: \"/workspace\",\n label: \"Resources\",\n icon: IconLayersSubtract,\n section: \"operations\",\n },\n {\n id: \"settings\",\n to: \"/settings\",\n label: \"Settings\",\n icon: IconSettings,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst ADVANCED_NAV_ITEMS = [\n {\n id: \"messaging\",\n to: \"/messaging\",\n label: \"Messaging\",\n icon: IconBrandTelegram,\n section: \"operations\",\n },\n {\n id: \"identities\",\n to: \"/identities\",\n label: \"Identities\",\n icon: IconFingerprint,\n section: \"operations\",\n },\n {\n id: \"audit\",\n to: \"/audit\",\n label: \"Audit\",\n icon: IconHistory,\n section: \"operations\",\n },\n {\n id: \"dreams\",\n to: \"/dreams\",\n label: \"Dreams\",\n icon: IconBrain,\n section: \"operations\",\n },\n {\n id: \"thread-debug\",\n to: \"/thread-debug\",\n label: \"Thread Debug\",\n icon: IconMessages,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst EMPTY_NAV_ITEMS: readonly DispatchNavItem[] = [];\n\nconst CHROMELESS_PATHS = [\"/approval\"];\nconst SIDEBAR_COLLAPSE_KEY = \"dispatch.sidebar.collapsed\";\n\n// Routes whose page renders its own toolbar.\n// Layout still mounts the sidebar + AgentSidebar, but skips its own Header so\n// there's no double-header.\nfunction pageOwnsToolbar(pathname: string): boolean {\n if (pathname === \"/tools\" || pathname.startsWith(\"/tools/\")) return true;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\"))\n return true;\n return false;\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nfunction sectionFor(item: DispatchNavItem): DispatchNavSection {\n return item.section ?? \"operations\";\n}\n\nfunction navItemMatchesPath(item: DispatchNavItem, pathname: string): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction navItemsForSection(\n items: readonly DispatchNavItem[],\n section: DispatchNavSection,\n): DispatchNavItem[] {\n return items.filter((item) => sectionFor(item) === section);\n}\n\nfunction localDispatchPath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction dispatchNavLinkTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n // Mirror the basename calculation entry.client.tsx uses to configure the\n // router (basePath iff the current URL is under that mount, \"\" otherwise).\n // Reading the live URL directly avoids races with the previous check on\n // `__reactRouterContext.basename`, which could read undefined before the\n // entry script set it — that race produced /dispatch/dispatch/<route>\n // history entries that 404'd on back-button navigation.\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\nfunction chatThreadPath(threadId: string): string {\n return `/chat/${encodeURIComponent(threadId)}`;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nexport function formatThreadAge(updatedAt: number, now = Date.now()) {\n const diffMs = Math.max(0, now - updatedAt);\n const minutes = Math.floor(diffMs / 60_000);\n if (minutes < 1) return \"now\";\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 14) return `${days}d`;\n if (days < 365) return `${Math.floor(days / 7)}w`;\n return `${Math.floor(days / 365)}y`;\n}\n\nfunction threadTitle(thread: ChatThreadSummary, fallback: string) {\n return thread.title || thread.preview || fallback;\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary) {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction DispatchChatsSection({ onNavigate }: { onNavigate?: () => void }) {\n const t = useT();\n const navigate = useNavigate();\n const location = useLocation();\n const {\n threads,\n activeThreadId,\n isLoading: chatsLoading,\n createThread,\n switchThread,\n renameThread,\n refreshThreads,\n } = useChatThreads(undefined, \"dispatch\", undefined, { autoCreate: false });\n const [renamingThreadId, setRenamingThreadId] = useState<string | null>(null);\n const [renameDraft, setRenameDraft] = useState(\"\");\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n const committingRenameRef = useRef(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 8),\n [activeThreadId, threads],\n );\n\n useEffect(() => {\n const refresh = () => refreshThreads();\n const handleRunning = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { isRunning?: unknown }\n | undefined;\n if (detail?.isRunning === false) refreshThreads();\n };\n\n window.addEventListener(\"agent-chat:threads-updated\", refresh);\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"agent-chat:threads-updated\", refresh);\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n window.removeEventListener(\"focus\", refresh);\n };\n }, [refreshThreads]);\n\n useEffect(() => {\n if (!renamingThreadId) return;\n requestAnimationFrame(() => {\n renameInputRef.current?.focus();\n renameInputRef.current?.select();\n });\n }, [renamingThreadId]);\n\n function openThread(threadId: string, options?: { isNew?: boolean }) {\n switchThread(threadId);\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\n options?.isNew ? \"/chat\" : chatThreadPath(threadId),\n ),\n );\n onNavigate?.();\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: options?.isNew === true },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n const threadId = await createThread();\n if (threadId) openThread(threadId, { isNew: true });\n }\n\n function startRenameThread(thread: ChatThreadSummary) {\n committingRenameRef.current = false;\n setRenameDraft(threadTitle(thread, t(\"dispatch.sidebar.newChat\")));\n setRenamingThreadId(thread.id);\n }\n\n function cancelRenameThread() {\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n }\n\n async function commitRenameThread() {\n if (committingRenameRef.current) return;\n const threadId = renamingThreadId;\n const title = renameDraft.trim();\n if (!threadId) return;\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n if (title) await renameThread(threadId, title);\n committingRenameRef.current = false;\n }\n\n function handleRenameSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n void commitRenameThread();\n }\n\n return (\n <div className=\"ms-4 min-w-0 space-y-0.5\">\n {chatsLoading &&\n visibleThreads.length === 0 &&\n Array.from({ length: 3 }).map((_, index) => (\n <div\n key={`chat-skeleton-${index}`}\n className=\"flex items-center gap-2 px-3 py-1\"\n >\n <Skeleton className=\"size-3.5 shrink-0 rounded-sm\" />\n <Skeleton className=\"h-3 w-3/4 rounded\" />\n </div>\n ))}\n {visibleThreads.map((thread) => {\n const localPathname = localDispatchPath(location.pathname);\n const isActive =\n thread.id ===\n (threadIdFromPath(localPathname) ??\n (localPathname === \"/chat\" ? null : activeThreadId));\n const isRenaming = thread.id === renamingThreadId;\n const title = threadTitle(thread, t(\"dispatch.sidebar.newChat\"));\n return (\n <div\n key={thread.id}\n className={cn(\n \"group/item relative flex min-w-0 items-center rounded-lg transition-colors\",\n isActive\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\n : \"text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground\",\n )}\n >\n {isRenaming ? (\n <form\n onSubmit={handleRenameSubmit}\n className=\"flex min-w-0 flex-1 items-center px-1\"\n >\n <Input\n ref={renameInputRef}\n value={renameDraft}\n onChange={(event) => setRenameDraft(event.target.value)}\n onBlur={() => void commitRenameThread()}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancelRenameThread();\n }\n }}\n maxLength={160}\n aria-label={t(\"dispatch.sidebar.renameThread\", { title })}\n className=\"h-6 min-w-0 rounded-sm border-sidebar-border bg-background px-1.5 text-xs\"\n />\n </form>\n ) : (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2 px-2 py-1.5 pe-1 text-start text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"block min-w-0 flex-1 truncate\">\n {title}\n </span>\n <time className=\"w-8 shrink-0 whitespace-nowrap text-end text-[11px] tabular-nums text-muted-foreground/60 transition-opacity group-hover/item:opacity-0 group-focus-within/item:opacity-0\">\n {isActive\n ? \"\"\n : formatThreadAge(threadUpdatedAt(thread))}\n </time>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{title}</TooltipContent>\n </Tooltip>\n <div className=\"pointer-events-none absolute end-1 top-1/2 flex -translate-y-1/2 items-center gap-0.5\">\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={t(\"dispatch.sidebar.chatOptions\", {\n title,\n })}\n className=\"pointer-events-auto rounded p-0.5 text-muted-foreground/50 opacity-0 transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover/item:opacity-100 group-focus-within/item:opacity-100 data-[state=open]:opacity-100 data-[state=open]:text-foreground\"\n >\n <IconDots className=\"size-3\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {t(\"dispatch.sidebar.chatOptions\", { title })}\n </TooltipContent>\n </Tooltip>\n <DropdownMenuContent\n align=\"start\"\n side=\"right\"\n className=\"w-44\"\n >\n <DropdownMenuItem\n onSelect={() => startRenameThread(thread)}\n >\n <IconEdit className=\"size-3.5\" />\n {t(\"dispatch.sidebar.renameChat\")}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n )}\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => void handleNewChat()}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-xs text-muted-foreground/60 transition-colors hover:bg-sidebar-accent/50 hover:text-foreground\"\n >\n <IconPlus className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"dispatch.sidebar.newChat\")}</span>\n </button>\n </div>\n );\n}\n\nexport function NavContent({\n onNavigate,\n extensions,\n collapsed = false,\n collapsible = false,\n onCollapsedChange,\n}: {\n onNavigate?: () => void;\n extensions?: DispatchExtensionConfig;\n collapsed?: boolean;\n collapsible?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const extensionNavItems = extensions?.navItems ?? EMPTY_NAV_ITEMS;\n const primaryNavItems = [\n ...PRIMARY_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"primary\"),\n ];\n const operationsNavItems = [\n ...OPERATIONS_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"operations\"),\n ];\n const localPathname = localDispatchPath(location.pathname);\n const advancedOpen = ADVANCED_NAV_ITEMS.some((item) =>\n navItemMatchesPath(item, localPathname),\n );\n const navLabel = (item: DispatchNavItem) => {\n const key =\n item.id === \"thread-debug\"\n ? \"threadDebug\"\n : item.id === \"workspace\"\n ? \"resources\"\n : item.id;\n return t(`dispatch.nav.${key}`, { defaultValue: item.label });\n };\n\n const renderNavItem = (item: DispatchNavItem) => {\n const Icon = item.icon;\n const itemMatchesLocalPath = navItemMatchesPath(item, localPathname);\n const label = navLabel(item);\n return (\n <li key={item.id}>\n {collapsed ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n aria-label={label}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-10 w-10 items-center justify-center rounded-md text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n </NavLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n ) : (\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate\">{label}</span>\n </NavLink>\n )}\n {!collapsed && item.id === \"chat\" && itemMatchesLocalPath ? (\n <DispatchChatsSection onNavigate={onNavigate} />\n ) : null}\n </li>\n );\n };\n\n return (\n <>\n <div className={cn(\"border-b py-3\", collapsed ? \"px-1\" : \"px-4\")}>\n <div\n className={cn(\n \"flex items-center\",\n collapsed ? \"justify-center\" : \"gap-2\",\n )}\n >\n {!collapsed && (\n <>\n <img\n src={appPath(\"/agent-native-icon-light.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"block h-5 w-auto shrink-0 dark:hidden\"\n />\n <img\n src={appPath(\"/agent-native-icon-dark.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"hidden h-5 w-auto shrink-0 dark:block\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-lg font-bold tracking-tight text-foreground\">\n {workspaceLabel ?? \"Dispatch\"}\n </div>\n </div>\n </>\n )}\n {collapsible ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n aria-label={\n collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")\n }\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {collapsed ? (\n <IconLayoutSidebarLeftExpand className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <IconLayoutSidebarLeftCollapse className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <nav className={cn(\"py-3\", collapsed ? \"px-1\" : \"px-2\")}>\n <ul\n className={cn(\n \"space-y-0.5\",\n collapsed && \"flex flex-col items-center\",\n )}\n >\n {primaryNavItems.map(renderNavItem)}\n </ul>\n\n {collapsed ? (\n <ul className=\"mt-2 flex flex-col items-center space-y-0.5\">\n {[...operationsNavItems, ...ADVANCED_NAV_ITEMS].map(\n renderNavItem,\n )}\n </ul>\n ) : (\n <div className=\"mt-5\">\n <p className=\"px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45\">\n {t(\"dispatch.nav.operate\", { defaultValue: \"Operate\" })}\n </p>\n <ul className=\"space-y-0.5\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n\n <details className=\"group mt-3\" open={advancedOpen}>\n <summary className=\"flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden\">\n <span>\n {t(\"dispatch.nav.advanced\", { defaultValue: \"Advanced\" })}\n </span>\n <IconChevronDown\n size={14}\n className=\"transition-transform group-open:rotate-180\"\n />\n </summary>\n <ul className=\"mt-1 space-y-0.5\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </details>\n </div>\n )}\n </nav>\n\n {!collapsed ? (\n <div className=\"mt-auto shrink-0\">\n <div className=\"px-2 py-1\">\n <ExtensionsSidebarSection />\n </div>\n\n <div className=\"px-3 py-2\">\n <OrgSwitcher />\n </div>\n\n <div className=\"px-3 py-2\">\n <FeedbackButton />\n </div>\n </div>\n ) : null}\n </div>\n </>\n );\n}\n\nexport function Layout({\n children,\n extensions,\n}: {\n children: ReactNode;\n extensions?: DispatchExtensionConfig;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const [mobileOpen, setMobileOpen] = useState(false);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === \"1\";\n } catch {\n return false;\n }\n });\n const localPathname = localDispatchPath(location.pathname);\n const isChatRoute =\n localPathname === \"/chat\" || localPathname.startsWith(\"/chat/\");\n const chatHomeHandoffActive = useAgentChatHomeHandoff({\n storageKey: \"dispatch\",\n activePath: localPathname,\n enabled: !isChatRoute,\n });\n const chatHandoffLinkOptions = {\n storageKey: \"dispatch\",\n isChatPath: (pathname: string) =>\n pathname === \"/chat\" || pathname.startsWith(\"/chat/\"),\n };\n useAgentChatHomeHandoffLinks(chatHandoffLinkOptions);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSE_KEY,\n sidebarCollapsed ? \"1\" : \"0\",\n );\n } catch {\n // Ignore storage failures; the in-memory preference still works.\n }\n }, [sidebarCollapsed]);\n\n if (CHROMELESS_PATHS.some((path) => localPathname === path)) {\n return <>{children}</>;\n }\n\n const showHeader = !isChatRoute && !pageOwnsToolbar(localPathname);\n function openAskAgentFullscreen() {\n focusAgentChat();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n }\n const sidebarSuggestions = [\n t(\"dispatch.sidebar.suggestionBuildApp\"),\n t(\"dispatch.sidebar.suggestionRouteSlack\"),\n t(\"dispatch.sidebar.suggestionGrantKey\"),\n ];\n const appContent = (\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-hidden\">\n {showHeader ? <Header onOpenMobile={() => setMobileOpen(true)} /> : null}\n <InvitationBanner />\n <main\n className={cn(\n \"flex-1\",\n isChatRoute ? \"min-h-0 overflow-hidden\" : \"overflow-y-auto\",\n )}\n >\n {showHeader ? (\n <div className=\"mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6\">\n {children}\n </div>\n ) : (\n children\n )}\n </main>\n </div>\n );\n const content = isChatRoute ? (\n <div className=\"agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden\">\n {appContent}\n </div>\n ) : (\n <AgentSidebar\n position=\"right\"\n defaultOpen={false}\n chatViewTransition\n storageKey=\"dispatch\"\n openOnChatRunning={chatHomeHandoffActive}\n onFullscreenRequest={openAskAgentFullscreen}\n emptyStateText={t(\"dispatch.sidebar.emptyAgentText\")}\n suggestions={sidebarSuggestions}\n >\n {appContent}\n </AgentSidebar>\n );\n\n return (\n <HeaderActionsProvider>\n <div className=\"agent-layout-shell flex h-screen w-full overflow-hidden bg-background\">\n <aside\n data-collapsed={sidebarCollapsed ? \"true\" : \"false\"}\n className={cn(\n \"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex\",\n sidebarCollapsed ? \"w-12\" : \"w-64\",\n )}\n >\n <NavContent\n extensions={extensions}\n collapsed={sidebarCollapsed}\n collapsible\n onCollapsedChange={setSidebarCollapsed}\n />\n </aside>\n\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n >\n <SheetTitle className=\"sr-only\">\n {t(\"dispatch.nav.navigation\")}\n </SheetTitle>\n <SheetDescription className=\"sr-only\">\n {t(\"dispatch.nav.navigationDescription\")}\n </SheetDescription>\n <div className=\"flex h-full w-full flex-col\">\n <NavContent\n extensions={extensions}\n collapsed={false}\n onNavigate={() => setMobileOpen(false)}\n />\n </div>\n </SheetContent>\n </Sheet>\n\n {content}\n </div>\n </HeaderActionsProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentSidebar,\n FeedbackButton,\n appBasePath,\n appPath,\n focusAgentChat,\n navigateWithAgentChatViewTransition,\n useActionQuery,\n useAgentChatHomeHandoff,\n useAgentChatHomeHandoffLinks,\n useChatThreads,\n useT,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { ExtensionsSidebarSection } from \"@agent-native/core/client/extensions\";\nimport { InvitationBanner, OrgSwitcher } from \"@agent-native/core/client/org\";\nimport {\n IconActivity,\n IconArrowUpRight,\n IconApps,\n IconBrain,\n IconChartBar,\n IconBrandTelegram,\n IconKey,\n IconChevronDown,\n IconDots,\n IconEdit,\n IconLayersSubtract,\n IconMessageQuestion,\n IconMessages,\n IconPlus,\n IconPlugConnected,\n IconBroadcast,\n IconFingerprint,\n IconHistory,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarLeftExpand,\n IconPuzzle,\n IconSettings,\n IconSettingsAutomation,\n IconShieldCheck,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport { NavLink, useLocation, useNavigate } from \"react-router\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { Input } from \"../ui/input\";\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"../ui/sheet\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { Header } from \"./Header\";\nimport { HeaderActionsProvider } from \"./HeaderActions\";\n\nexport type DispatchNavSection = \"primary\" | \"operations\";\n\nexport type DispatchNavIcon = ComponentType<{\n size?: number | string;\n className?: string;\n}>;\n\nexport interface DispatchNavItem {\n /** Stable id used for keys and navigation.view. Avoid built-in ids. */\n id: string;\n /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */\n to: string;\n label: string;\n icon?: DispatchNavIcon;\n /** Defaults to \"operations\", which is where local management tools usually fit. */\n section?: DispatchNavSection;\n /** Override active matching for nested or multi-route tools. */\n match?: (pathname: string) => boolean;\n}\n\nexport interface DispatchExtensionConfig {\n /** Extra sidebar tabs supplied by the generated workspace. */\n navItems?: readonly DispatchNavItem[];\n /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */\n queryKeys?: readonly string[];\n}\n\nconst PRIMARY_NAV_ITEMS = [\n {\n id: \"overview\",\n to: \"/overview\",\n label: \"Overview\",\n icon: IconBroadcast,\n section: \"primary\",\n },\n {\n id: \"chat\",\n to: \"/chat\",\n label: \"Chat\",\n icon: IconMessageQuestion,\n section: \"primary\",\n },\n {\n id: \"apps\",\n to: \"/apps\",\n label: \"Apps\",\n icon: IconApps,\n section: \"primary\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst OPERATIONS_NAV_ITEMS = [\n {\n id: \"operations\",\n to: \"/operations\",\n label: \"Operations\",\n icon: IconActivity,\n section: \"operations\",\n },\n {\n id: \"metrics\",\n to: \"/metrics\",\n label: \"Metrics\",\n icon: IconChartBar,\n section: \"operations\",\n },\n {\n id: \"automations\",\n to: \"/automations\",\n label: \"Automations\",\n icon: IconSettingsAutomation,\n section: \"operations\",\n },\n {\n id: \"approvals\",\n to: \"/approvals\",\n label: \"Approvals\",\n icon: IconShieldCheck,\n section: \"operations\",\n },\n {\n id: \"destinations\",\n to: \"/destinations\",\n label: \"Destinations\",\n icon: IconArrowUpRight,\n section: \"operations\",\n },\n {\n id: \"integrations\",\n to: \"/integrations\",\n label: \"Integrations\",\n icon: IconPuzzle,\n section: \"operations\",\n },\n {\n id: \"vault\",\n to: \"/vault\",\n label: \"Vault\",\n icon: IconKey,\n section: \"operations\",\n },\n {\n id: \"agents\",\n to: \"/agents\",\n label: \"Agents\",\n icon: IconPlugConnected,\n section: \"operations\",\n },\n {\n id: \"workspace\",\n to: \"/workspace\",\n label: \"Resources\",\n icon: IconLayersSubtract,\n section: \"operations\",\n },\n {\n id: \"settings\",\n to: \"/settings\",\n label: \"Settings\",\n icon: IconSettings,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst ADVANCED_NAV_ITEMS = [\n {\n id: \"messaging\",\n to: \"/messaging\",\n label: \"Messaging\",\n icon: IconBrandTelegram,\n section: \"operations\",\n },\n {\n id: \"identities\",\n to: \"/identities\",\n label: \"Identities\",\n icon: IconFingerprint,\n section: \"operations\",\n },\n {\n id: \"audit\",\n to: \"/audit\",\n label: \"Audit\",\n icon: IconHistory,\n section: \"operations\",\n },\n {\n id: \"dreams\",\n to: \"/dreams\",\n label: \"Dreams\",\n icon: IconBrain,\n section: \"operations\",\n },\n {\n id: \"thread-debug\",\n to: \"/thread-debug\",\n label: \"Thread Debug\",\n icon: IconMessages,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst EMPTY_NAV_ITEMS: readonly DispatchNavItem[] = [];\n\nconst CHROMELESS_PATHS = [\"/approval\"];\nconst SIDEBAR_COLLAPSE_KEY = \"dispatch.sidebar.collapsed\";\n\n// Routes whose page renders its own toolbar.\n// Layout still mounts the sidebar + AgentSidebar, but skips its own Header so\n// there's no double-header.\nfunction pageOwnsToolbar(pathname: string): boolean {\n if (pathname === \"/tools\" || pathname.startsWith(\"/tools/\")) return true;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\"))\n return true;\n return false;\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nfunction sectionFor(item: DispatchNavItem): DispatchNavSection {\n return item.section ?? \"operations\";\n}\n\nfunction navItemMatchesPath(item: DispatchNavItem, pathname: string): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction navItemsForSection(\n items: readonly DispatchNavItem[],\n section: DispatchNavSection,\n): DispatchNavItem[] {\n return items.filter((item) => sectionFor(item) === section);\n}\n\nfunction localDispatchPath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction dispatchNavLinkTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n // Mirror the basename calculation entry.client.tsx uses to configure the\n // router (basePath iff the current URL is under that mount, \"\" otherwise).\n // Reading the live URL directly avoids races with the previous check on\n // `__reactRouterContext.basename`, which could read undefined before the\n // entry script set it — that race produced /dispatch/dispatch/<route>\n // history entries that 404'd on back-button navigation.\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\nfunction chatThreadPath(threadId: string): string {\n return `/chat/${encodeURIComponent(threadId)}`;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nexport function formatThreadAge(updatedAt: number, now = Date.now()) {\n const diffMs = Math.max(0, now - updatedAt);\n const minutes = Math.floor(diffMs / 60_000);\n if (minutes < 1) return \"now\";\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 14) return `${days}d`;\n if (days < 365) return `${Math.floor(days / 7)}w`;\n return `${Math.floor(days / 365)}y`;\n}\n\nfunction threadTitle(thread: ChatThreadSummary, fallback: string) {\n return thread.title || thread.preview || fallback;\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary) {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction DispatchChatsSection({ onNavigate }: { onNavigate?: () => void }) {\n const t = useT();\n const navigate = useNavigate();\n const location = useLocation();\n const {\n threads,\n activeThreadId,\n isLoading: chatsLoading,\n createThread,\n switchThread,\n renameThread,\n refreshThreads,\n } = useChatThreads(undefined, \"dispatch\", undefined, { autoCreate: false });\n const [renamingThreadId, setRenamingThreadId] = useState<string | null>(null);\n const [renameDraft, setRenameDraft] = useState(\"\");\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n const committingRenameRef = useRef(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 8),\n [activeThreadId, threads],\n );\n\n useEffect(() => {\n const refresh = () => refreshThreads();\n const handleRunning = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { isRunning?: unknown }\n | undefined;\n if (detail?.isRunning === false) refreshThreads();\n };\n\n window.addEventListener(\"agent-chat:threads-updated\", refresh);\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"agent-chat:threads-updated\", refresh);\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n window.removeEventListener(\"focus\", refresh);\n };\n }, [refreshThreads]);\n\n useEffect(() => {\n if (!renamingThreadId) return;\n requestAnimationFrame(() => {\n renameInputRef.current?.focus();\n renameInputRef.current?.select();\n });\n }, [renamingThreadId]);\n\n function openThread(threadId: string, options?: { isNew?: boolean }) {\n switchThread(threadId);\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\n options?.isNew ? \"/chat\" : chatThreadPath(threadId),\n ),\n );\n onNavigate?.();\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: options?.isNew === true },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n const threadId = await createThread();\n if (threadId) openThread(threadId, { isNew: true });\n }\n\n function startRenameThread(thread: ChatThreadSummary) {\n committingRenameRef.current = false;\n setRenameDraft(threadTitle(thread, t(\"dispatch.sidebar.newChat\")));\n setRenamingThreadId(thread.id);\n }\n\n function cancelRenameThread() {\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n }\n\n async function commitRenameThread() {\n if (committingRenameRef.current) return;\n const threadId = renamingThreadId;\n const title = renameDraft.trim();\n if (!threadId) return;\n committingRenameRef.current = true;\n setRenamingThreadId(null);\n setRenameDraft(\"\");\n if (title) await renameThread(threadId, title);\n committingRenameRef.current = false;\n }\n\n function handleRenameSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n void commitRenameThread();\n }\n\n return (\n <div className=\"ms-4 min-w-0 space-y-0.5\">\n {chatsLoading &&\n visibleThreads.length === 0 &&\n Array.from({ length: 3 }).map((_, index) => (\n <div\n key={`chat-skeleton-${index}`}\n className=\"flex items-center gap-2 px-3 py-1\"\n >\n <Skeleton className=\"size-3.5 shrink-0 rounded-sm\" />\n <Skeleton className=\"h-3 w-3/4 rounded\" />\n </div>\n ))}\n {visibleThreads.map((thread) => {\n const localPathname = localDispatchPath(location.pathname);\n const isActive =\n thread.id ===\n (threadIdFromPath(localPathname) ??\n (localPathname === \"/chat\" ? null : activeThreadId));\n const isRenaming = thread.id === renamingThreadId;\n const title = threadTitle(thread, t(\"dispatch.sidebar.newChat\"));\n return (\n <div\n key={thread.id}\n className={cn(\n \"group/item relative flex min-w-0 items-center rounded-lg transition-colors\",\n isActive\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\n : \"text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground\",\n )}\n >\n {isRenaming ? (\n <form\n onSubmit={handleRenameSubmit}\n className=\"flex min-w-0 flex-1 items-center px-1\"\n >\n <Input\n ref={renameInputRef}\n value={renameDraft}\n onChange={(event) => setRenameDraft(event.target.value)}\n onBlur={() => void commitRenameThread()}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancelRenameThread();\n }\n }}\n maxLength={160}\n aria-label={t(\"dispatch.sidebar.renameThread\", { title })}\n className=\"h-6 min-w-0 rounded-sm border-sidebar-border bg-background px-1.5 text-xs\"\n />\n </form>\n ) : (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2 px-2 py-1.5 pe-1 text-start text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"block min-w-0 flex-1 truncate\">\n {title}\n </span>\n <time className=\"w-8 shrink-0 whitespace-nowrap text-end text-[11px] tabular-nums text-muted-foreground/60 transition-opacity group-hover/item:opacity-0 group-focus-within/item:opacity-0\">\n {isActive\n ? \"\"\n : formatThreadAge(threadUpdatedAt(thread))}\n </time>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{title}</TooltipContent>\n </Tooltip>\n <div className=\"pointer-events-none absolute end-1 top-1/2 flex -translate-y-1/2 items-center gap-0.5\">\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={t(\"dispatch.sidebar.chatOptions\", {\n title,\n })}\n className=\"pointer-events-auto rounded p-0.5 text-muted-foreground/50 opacity-0 transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover/item:opacity-100 group-focus-within/item:opacity-100 data-[state=open]:opacity-100 data-[state=open]:text-foreground\"\n >\n <IconDots className=\"size-3\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {t(\"dispatch.sidebar.chatOptions\", { title })}\n </TooltipContent>\n </Tooltip>\n <DropdownMenuContent\n align=\"start\"\n side=\"right\"\n className=\"w-44\"\n >\n <DropdownMenuItem\n onSelect={() => startRenameThread(thread)}\n >\n <IconEdit className=\"size-3.5\" />\n {t(\"dispatch.sidebar.renameChat\")}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n )}\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => void handleNewChat()}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-xs text-muted-foreground/60 transition-colors hover:bg-sidebar-accent/50 hover:text-foreground\"\n >\n <IconPlus className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"dispatch.sidebar.newChat\")}</span>\n </button>\n </div>\n );\n}\n\nexport function NavContent({\n onNavigate,\n extensions,\n collapsed = false,\n collapsible = false,\n onCollapsedChange,\n}: {\n onNavigate?: () => void;\n extensions?: DispatchExtensionConfig;\n collapsed?: boolean;\n collapsible?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const extensionNavItems = extensions?.navItems ?? EMPTY_NAV_ITEMS;\n const primaryNavItems = [\n ...PRIMARY_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"primary\"),\n ];\n const operationsNavItems = [\n ...OPERATIONS_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"operations\"),\n ];\n const localPathname = localDispatchPath(location.pathname);\n const advancedOpen = ADVANCED_NAV_ITEMS.some((item) =>\n navItemMatchesPath(item, localPathname),\n );\n const navLabel = (item: DispatchNavItem) => {\n const key =\n item.id === \"thread-debug\"\n ? \"threadDebug\"\n : item.id === \"workspace\"\n ? \"resources\"\n : item.id;\n return t(`dispatch.nav.${key}`, { defaultValue: item.label });\n };\n\n const renderNavItem = (item: DispatchNavItem) => {\n const Icon = item.icon;\n const itemMatchesLocalPath = navItemMatchesPath(item, localPathname);\n const label = navLabel(item);\n return (\n <li key={item.id}>\n {collapsed ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n aria-label={label}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-8 items-center justify-center rounded-md text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n </NavLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n ) : (\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate\">{label}</span>\n </NavLink>\n )}\n {!collapsed && item.id === \"chat\" && itemMatchesLocalPath ? (\n <DispatchChatsSection onNavigate={onNavigate} />\n ) : null}\n </li>\n );\n };\n\n return (\n <>\n <div className={cn(\"border-b py-3\", collapsed ? \"px-1\" : \"px-4\")}>\n <div\n className={cn(\n \"flex items-center\",\n collapsed ? \"justify-center\" : \"gap-2\",\n )}\n >\n {!collapsed && (\n <>\n <img\n src={appPath(\"/agent-native-icon-light.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"block h-5 w-auto shrink-0 dark:hidden\"\n />\n <img\n src={appPath(\"/agent-native-icon-dark.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"hidden h-5 w-auto shrink-0 dark:block\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-lg font-bold tracking-tight text-foreground\">\n {workspaceLabel ?? \"Dispatch\"}\n </div>\n </div>\n </>\n )}\n {collapsible ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n aria-label={\n collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")\n }\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {collapsed ? (\n <IconLayoutSidebarLeftExpand className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <IconLayoutSidebarLeftCollapse className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <nav className={cn(\"py-3\", collapsed ? \"px-1\" : \"px-2\")}>\n <ul\n className={cn(\n collapsed ? \"flex flex-col items-center gap-1\" : \"space-y-0.5\",\n )}\n >\n {primaryNavItems.map(renderNavItem)}\n </ul>\n\n {collapsed ? (\n <>\n <ul className=\"mt-5 flex flex-col items-center gap-1\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n <ul className=\"mt-3 flex flex-col items-center gap-1\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </>\n ) : (\n <div className=\"mt-5\">\n <p className=\"px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45\">\n {t(\"dispatch.nav.operate\", { defaultValue: \"Operate\" })}\n </p>\n <ul className=\"space-y-0.5\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n\n <details className=\"group mt-3\" open={advancedOpen}>\n <summary className=\"flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden\">\n <span>\n {t(\"dispatch.nav.advanced\", { defaultValue: \"Advanced\" })}\n </span>\n <IconChevronDown\n size={14}\n className=\"transition-transform group-open:rotate-180\"\n />\n </summary>\n <ul className=\"mt-1 space-y-0.5\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </details>\n </div>\n )}\n </nav>\n\n {!collapsed ? (\n <div className=\"mt-auto shrink-0\">\n <div className=\"px-2 py-1\">\n <ExtensionsSidebarSection />\n </div>\n\n <div className=\"px-3 py-2\">\n <OrgSwitcher />\n </div>\n\n <div className=\"px-3 py-2\">\n <FeedbackButton />\n </div>\n </div>\n ) : null}\n </div>\n </>\n );\n}\n\nexport function Layout({\n children,\n extensions,\n agentPageHref,\n}: {\n children: ReactNode;\n extensions?: DispatchExtensionConfig;\n agentPageHref?: string;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const [mobileOpen, setMobileOpen] = useState(false);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === \"1\";\n } catch {\n return false;\n }\n });\n const localPathname = localDispatchPath(location.pathname);\n const isChatRoute =\n localPathname === \"/chat\" || localPathname.startsWith(\"/chat/\");\n const chatHomeHandoffActive = useAgentChatHomeHandoff({\n storageKey: \"dispatch\",\n activePath: localPathname,\n enabled: !isChatRoute,\n });\n const chatHandoffLinkOptions = {\n storageKey: \"dispatch\",\n isChatPath: (pathname: string) =>\n pathname === \"/chat\" || pathname.startsWith(\"/chat/\"),\n };\n useAgentChatHomeHandoffLinks(chatHandoffLinkOptions);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSE_KEY,\n sidebarCollapsed ? \"1\" : \"0\",\n );\n } catch {\n // Ignore storage failures; the in-memory preference still works.\n }\n }, [sidebarCollapsed]);\n\n if (CHROMELESS_PATHS.some((path) => localPathname === path)) {\n return <>{children}</>;\n }\n\n const showHeader = !isChatRoute && !pageOwnsToolbar(localPathname);\n function openAskAgentFullscreen() {\n focusAgentChat();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n }\n const sidebarSuggestions = [\n t(\"dispatch.sidebar.suggestionBuildApp\"),\n t(\"dispatch.sidebar.suggestionRouteSlack\"),\n t(\"dispatch.sidebar.suggestionGrantKey\"),\n ];\n const appContent = (\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-hidden\">\n {showHeader ? <Header onOpenMobile={() => setMobileOpen(true)} /> : null}\n <InvitationBanner />\n <main\n className={cn(\n \"flex-1\",\n isChatRoute ? \"min-h-0 overflow-hidden\" : \"overflow-y-auto\",\n )}\n >\n {showHeader ? (\n <div className=\"mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6\">\n {children}\n </div>\n ) : (\n children\n )}\n </main>\n </div>\n );\n const content = isChatRoute ? (\n <div className=\"agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden\">\n {appContent}\n </div>\n ) : (\n <AgentSidebar\n position=\"right\"\n defaultOpen={false}\n agentPageHref={agentPageHref}\n chatViewTransition\n storageKey=\"dispatch\"\n openOnChatRunning={chatHomeHandoffActive}\n onFullscreenRequest={openAskAgentFullscreen}\n emptyStateText={t(\"dispatch.sidebar.emptyAgentText\")}\n suggestions={sidebarSuggestions}\n >\n {appContent}\n </AgentSidebar>\n );\n\n return (\n <HeaderActionsProvider>\n <div className=\"agent-layout-shell flex h-screen w-full overflow-hidden bg-background\">\n <aside\n data-collapsed={sidebarCollapsed ? \"true\" : \"false\"}\n className={cn(\n \"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex\",\n sidebarCollapsed ? \"w-14\" : \"w-56\",\n )}\n >\n <NavContent\n extensions={extensions}\n collapsed={sidebarCollapsed}\n collapsible\n onCollapsedChange={setSidebarCollapsed}\n />\n </aside>\n\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n >\n <SheetTitle className=\"sr-only\">\n {t(\"dispatch.nav.navigation\")}\n </SheetTitle>\n <SheetDescription className=\"sr-only\">\n {t(\"dispatch.nav.navigationDescription\")}\n </SheetDescription>\n <div className=\"flex h-full w-full flex-col\">\n <NavContent\n extensions={extensions}\n collapsed={false}\n onNavigate={() => setMobileOpen(false)}\n />\n </div>\n </SheetContent>\n </Sheet>\n\n {content}\n </div>\n </HeaderActionsProvider>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/dispatch",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.9",
|
|
4
4
|
"description": "Dispatch — workspace control plane for agent-native apps. Vault, integrations, destinations, scheduled jobs, and cross-app delegation, shipped as a single drop-in package.",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"typescript-7": "npm:typescript@^7.0.2",
|
|
94
94
|
"vite": "8.1.0",
|
|
95
95
|
"vitest": "^4.1.5",
|
|
96
|
-
"@agent-native/core": "0.
|
|
96
|
+
"@agent-native/core": "0.100.0"
|
|
97
97
|
},
|
|
98
98
|
"peerDependencies": {
|
|
99
99
|
"@agent-native/core": ">=0.8.0",
|
|
@@ -138,6 +138,27 @@ describe("Dispatch NavContent", () => {
|
|
|
138
138
|
);
|
|
139
139
|
});
|
|
140
140
|
|
|
141
|
+
it("keeps collapsed navigation compact and preserves section spacing", async () => {
|
|
142
|
+
await act(async () => {
|
|
143
|
+
root.render(
|
|
144
|
+
<MemoryRouter initialEntries={["/overview"]}>
|
|
145
|
+
<TooltipProvider>
|
|
146
|
+
<NavContent collapsed />
|
|
147
|
+
</TooltipProvider>
|
|
148
|
+
</MemoryRouter>,
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const lists = [...container.querySelectorAll("nav > ul")];
|
|
153
|
+
expect(lists).toHaveLength(3);
|
|
154
|
+
expect(lists[0].className).toContain("gap-1");
|
|
155
|
+
expect(lists[1].className).toContain("mt-5");
|
|
156
|
+
expect(lists[1].className).toContain("gap-1");
|
|
157
|
+
expect(lists[2].className).toContain("mt-3");
|
|
158
|
+
expect(lists[2].className).toContain("gap-1");
|
|
159
|
+
expect(lists[0].querySelector("a")?.className).toContain("h-8 w-8");
|
|
160
|
+
});
|
|
161
|
+
|
|
141
162
|
it("uses the quieter Analytics-style chat history and retains thread actions", async () => {
|
|
142
163
|
await act(async () => {
|
|
143
164
|
root.render(
|
|
@@ -648,7 +648,7 @@ export function NavContent({
|
|
|
648
648
|
className={({ isActive }) => {
|
|
649
649
|
const active = isActive || itemMatchesLocalPath;
|
|
650
650
|
return cn(
|
|
651
|
-
"flex h-
|
|
651
|
+
"flex h-8 w-8 items-center justify-center rounded-md text-sm",
|
|
652
652
|
active
|
|
653
653
|
? "bg-sidebar-accent font-medium text-sidebar-accent-foreground"
|
|
654
654
|
: "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
@@ -775,19 +775,21 @@ export function NavContent({
|
|
|
775
775
|
<nav className={cn("py-3", collapsed ? "px-1" : "px-2")}>
|
|
776
776
|
<ul
|
|
777
777
|
className={cn(
|
|
778
|
-
"space-y-0.5",
|
|
779
|
-
collapsed && "flex flex-col items-center",
|
|
778
|
+
collapsed ? "flex flex-col items-center gap-1" : "space-y-0.5",
|
|
780
779
|
)}
|
|
781
780
|
>
|
|
782
781
|
{primaryNavItems.map(renderNavItem)}
|
|
783
782
|
</ul>
|
|
784
783
|
|
|
785
784
|
{collapsed ? (
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
renderNavItem
|
|
789
|
-
|
|
790
|
-
|
|
785
|
+
<>
|
|
786
|
+
<ul className="mt-5 flex flex-col items-center gap-1">
|
|
787
|
+
{operationsNavItems.map(renderNavItem)}
|
|
788
|
+
</ul>
|
|
789
|
+
<ul className="mt-3 flex flex-col items-center gap-1">
|
|
790
|
+
{ADVANCED_NAV_ITEMS.map(renderNavItem)}
|
|
791
|
+
</ul>
|
|
792
|
+
</>
|
|
791
793
|
) : (
|
|
792
794
|
<div className="mt-5">
|
|
793
795
|
<p className="px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45">
|
|
@@ -838,9 +840,11 @@ export function NavContent({
|
|
|
838
840
|
export function Layout({
|
|
839
841
|
children,
|
|
840
842
|
extensions,
|
|
843
|
+
agentPageHref,
|
|
841
844
|
}: {
|
|
842
845
|
children: ReactNode;
|
|
843
846
|
extensions?: DispatchExtensionConfig;
|
|
847
|
+
agentPageHref?: string;
|
|
844
848
|
}) {
|
|
845
849
|
const t = useT();
|
|
846
850
|
const location = useLocation();
|
|
@@ -926,6 +930,7 @@ export function Layout({
|
|
|
926
930
|
<AgentSidebar
|
|
927
931
|
position="right"
|
|
928
932
|
defaultOpen={false}
|
|
933
|
+
agentPageHref={agentPageHref}
|
|
929
934
|
chatViewTransition
|
|
930
935
|
storageKey="dispatch"
|
|
931
936
|
openOnChatRunning={chatHomeHandoffActive}
|
|
@@ -944,7 +949,7 @@ export function Layout({
|
|
|
944
949
|
data-collapsed={sidebarCollapsed ? "true" : "false"}
|
|
945
950
|
className={cn(
|
|
946
951
|
"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex",
|
|
947
|
-
sidebarCollapsed ? "w-
|
|
952
|
+
sidebarCollapsed ? "w-14" : "w-56",
|
|
948
953
|
)}
|
|
949
954
|
>
|
|
950
955
|
<NavContent
|
|
@@ -51,9 +51,13 @@ describe("WorkspaceAppCard", () => {
|
|
|
51
51
|
);
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
)
|
|
54
|
+
const appLink = container.querySelector<HTMLAnchorElement>(
|
|
55
|
+
'a[aria-label="Open Analytics"]',
|
|
56
|
+
);
|
|
57
|
+
expect(appLink?.getAttribute("href")).toBe("/analytics");
|
|
58
|
+
expect(appLink?.getAttribute("target")).toBeNull();
|
|
59
|
+
expect(appLink?.getAttribute("rel")).toBeNull();
|
|
60
|
+
expect(appLink?.className).toContain("focus-visible:ring-2");
|
|
57
61
|
|
|
58
62
|
const actions = [
|
|
59
63
|
container.querySelector<HTMLButtonElement>(
|
|
@@ -77,4 +81,31 @@ describe("WorkspaceAppCard", () => {
|
|
|
77
81
|
expect(action?.className).not.toContain("opacity-0");
|
|
78
82
|
}
|
|
79
83
|
});
|
|
84
|
+
|
|
85
|
+
it("opens pending Builder apps in a new tab", async () => {
|
|
86
|
+
await act(async () => {
|
|
87
|
+
root.render(
|
|
88
|
+
<TooltipProvider>
|
|
89
|
+
<WorkspaceAppCard
|
|
90
|
+
app={{
|
|
91
|
+
id: "new-app",
|
|
92
|
+
name: "New app",
|
|
93
|
+
path: "/new-app",
|
|
94
|
+
builderUrl: "https://builder.example.com/projects/new-app",
|
|
95
|
+
status: "pending",
|
|
96
|
+
}}
|
|
97
|
+
/>
|
|
98
|
+
</TooltipProvider>,
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const appLink = container.querySelector<HTMLAnchorElement>(
|
|
103
|
+
'a[aria-label="Open New app"]',
|
|
104
|
+
);
|
|
105
|
+
expect(appLink?.getAttribute("href")).toBe(
|
|
106
|
+
"https://builder.example.com/projects/new-app",
|
|
107
|
+
);
|
|
108
|
+
expect(appLink?.getAttribute("target")).toBe("_blank");
|
|
109
|
+
expect(appLink?.getAttribute("rel")).toBe("noreferrer");
|
|
110
|
+
});
|
|
80
111
|
});
|