Add first-class profile support to the desktop app without app reloads. - Swap the single live gateway onto a session's profile lazily (spawned on demand by the Electron backend pool), so one backend serves the active profile and others stay cold — no OOM with many profiles. - Aggregate sessions across profiles by reading each profile's state.db read-only; unified "All profiles" view groups sessions per profile with per-profile pagination, while the default view stays scoped to one profile. - Add an Arc-style profile rail at the sidebar foot: a default<->all toggle pinned left, colored named-profile squares scrolling between, Manage pinned right. Profile identity is a deterministic per-name color. - Route profile-scoped REST (config/env/skills/tools/model) to the active gateway profile and invalidate React Query caches on swap. Single-profile users never trigger a swap, so their path is unchanged. Backend: - web_server: profile-aware active/list endpoints + per-profile session totals; hermes_state: session_count(exclude_children); main.py: honor --profile over HERMES_HOME env for pooled backends. UI primitives: - Add a position-aware Tip tooltip (instant, themed) as a drop-in for native title=, and strip redundant tooltips from self-descriptive chrome.
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import './styles.css'
|
|
|
|
import { QueryClientProvider } from '@tanstack/react-query'
|
|
import { StrictMode } from 'react'
|
|
import { createRoot } from 'react-dom/client'
|
|
import { HashRouter } from 'react-router-dom'
|
|
|
|
import App from './app'
|
|
import { ErrorBoundary } from './components/error-boundary'
|
|
import { HapticsProvider } from './components/haptics-provider'
|
|
import { installClipboardShim } from './lib/clipboard'
|
|
import { queryClient } from './lib/query-client'
|
|
import { ThemeProvider } from './themes/context'
|
|
|
|
installClipboardShim()
|
|
|
|
// Dev-only: install __PERF_DRIVE__ + __PERF_PROBE__ on window so the
|
|
// scripts/ harnesses can drive a synthetic stream + record render cost.
|
|
// Tree-shaken out of production builds. (Uses MODE rather than DEV because
|
|
// our Vite setup currently bundles with PROD=true even in `vite dev`; see
|
|
// scripts/dev-no-hmr.mjs for the surrounding workarounds.)
|
|
if (import.meta.env.MODE !== 'production') {
|
|
import('./app/chat/perf-probe')
|
|
}
|
|
|
|
createRoot(document.getElementById('root')!).render(
|
|
<StrictMode>
|
|
<ErrorBoundary label="root">
|
|
<QueryClientProvider client={queryClient}>
|
|
<ThemeProvider>
|
|
<HapticsProvider>
|
|
<HashRouter>
|
|
<App />
|
|
</HashRouter>
|
|
</HapticsProvider>
|
|
</ThemeProvider>
|
|
</QueryClientProvider>
|
|
</ErrorBoundary>
|
|
</StrictMode>
|
|
)
|