mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-23 10:42:00 +00:00
Builds on the clarify/needs-input work with a cross-cutting pass to make the desktop surfaces feel like one app. - Global Cmd+K command palette (cmdk): nav, settings deep-links, async API-key / MCP-server / archived-session groups, reusable theme sub-page (light/dark groups, stays open on pick), loop nav, fuzzy match. Replaces per-page settings search. - Shared SearchField: borderless, underline-on-focus, `field-sizing` auto-width. Unifies sessions sidebar, pages, overlays, command center, cron; drops bespoke OverlaySearchInput. - Cron & Profiles converted to OverlayView; flat token-driven panels (no card-in-card / divider borders) matching command center. - `r` refresh hotkey via useRefreshHotkey; drop the visible refresh buttons. - Button text/textStrong link variants applied across settings & views; shared PAGE_INSET_X content gutters. - Math/ascii loaders replace "Loading…" text placeholders; x-icon close over text "Close"; cursor-pointer at the dropdown/select primitive level.
94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
export const SESSION_ROUTE_PREFIX = '/'
|
|
export const NEW_CHAT_ROUTE = '/'
|
|
export const SETTINGS_ROUTE = '/settings'
|
|
export const COMMAND_CENTER_ROUTE = '/command-center'
|
|
export const SKILLS_ROUTE = '/skills'
|
|
export const MESSAGING_ROUTE = '/messaging'
|
|
export const ARTIFACTS_ROUTE = '/artifacts'
|
|
export const CRON_ROUTE = '/cron'
|
|
export const PROFILES_ROUTE = '/profiles'
|
|
export const AGENTS_ROUTE = '/agents'
|
|
|
|
export type AppView =
|
|
| 'agents'
|
|
| 'artifacts'
|
|
| 'chat'
|
|
| 'command-center'
|
|
| 'cron'
|
|
| 'messaging'
|
|
| 'profiles'
|
|
| 'settings'
|
|
| 'skills'
|
|
|
|
export type AppRouteId =
|
|
| 'agents'
|
|
| 'artifacts'
|
|
| 'command-center'
|
|
| 'cron'
|
|
| 'messaging'
|
|
| 'new'
|
|
| 'profiles'
|
|
| 'settings'
|
|
| 'skills'
|
|
|
|
export interface AppRoute {
|
|
id: AppRouteId
|
|
path: string
|
|
view: AppView
|
|
}
|
|
|
|
export const APP_ROUTES = [
|
|
{ id: 'new', path: NEW_CHAT_ROUTE, view: 'chat' },
|
|
{ id: 'settings', path: SETTINGS_ROUTE, view: 'settings' },
|
|
{ id: 'command-center', path: COMMAND_CENTER_ROUTE, view: 'command-center' },
|
|
{ id: 'skills', path: SKILLS_ROUTE, view: 'skills' },
|
|
{ id: 'messaging', path: MESSAGING_ROUTE, view: 'messaging' },
|
|
{ id: 'artifacts', path: ARTIFACTS_ROUTE, view: 'artifacts' },
|
|
{ id: 'cron', path: CRON_ROUTE, view: 'cron' },
|
|
{ id: 'profiles', path: PROFILES_ROUTE, view: 'profiles' },
|
|
{ id: 'agents', path: AGENTS_ROUTE, view: 'agents' }
|
|
] as const satisfies readonly AppRoute[]
|
|
|
|
const APP_VIEW_BY_PATH = new Map<string, AppView>(APP_ROUTES.map(route => [route.path, route.view]))
|
|
const RESERVED_PATHS: ReadonlySet<string> = new Set(APP_ROUTES.map(route => route.path))
|
|
|
|
// Views that render as a full-screen modal card (OverlayView) over the shell.
|
|
// While one is open the app's titlebar control clusters must hide so they don't
|
|
// bleed over the overlay (they sit at a higher z-index than the overlay card).
|
|
export const OVERLAY_VIEWS: ReadonlySet<AppView> = new Set([
|
|
'agents',
|
|
'command-center',
|
|
'cron',
|
|
'profiles',
|
|
'settings'
|
|
])
|
|
|
|
export function isOverlayView(view: AppView): boolean {
|
|
return OVERLAY_VIEWS.has(view)
|
|
}
|
|
|
|
export function isNewChatRoute(pathname: string): boolean {
|
|
return pathname === NEW_CHAT_ROUTE
|
|
}
|
|
|
|
export function routeSessionId(pathname: string): string | null {
|
|
if (!pathname.startsWith(SESSION_ROUTE_PREFIX) || RESERVED_PATHS.has(pathname)) {
|
|
return null
|
|
}
|
|
|
|
const id = pathname.slice(SESSION_ROUTE_PREFIX.length)
|
|
|
|
return id && !id.includes('/') ? decodeURIComponent(id) : null
|
|
}
|
|
|
|
export function sessionRoute(sessionId: string): string {
|
|
return `${SESSION_ROUTE_PREFIX}${encodeURIComponent(sessionId)}`
|
|
}
|
|
|
|
export function appViewForPath(pathname: string): AppView {
|
|
if (isNewChatRoute(pathname) || routeSessionId(pathname)) {
|
|
return 'chat'
|
|
}
|
|
|
|
return APP_VIEW_BY_PATH.get(pathname) ?? 'chat'
|
|
}
|