import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { Agentation } from 'agentation' import { createRoot } from 'react-dom/client' import { Router, useRoute } from 'wouter' import { Toaster } from '@/client/components/ui/toast' import { TooltipProvider } from '@/client/components/ui/tooltip' import { installAppletErrorHook } from '@/client/features/applets/applet-log' import { initConnection } from '@/client/features/chat/chat-connection' import { AppRouter } from './app/AppRouter' const queryClient = new QueryClient() // Agentation has no built-in route filter (checked v2.3.3 props), so gate the // mount ourselves: the harness debug page is a raw log surface where the // annotation toolbar just overlaps the panes. function DevAgentation() { const [onHarnessDebug] = useRoute('/dev/harness') return onHarnessDebug ? null : } // Open the single app-wide chat WebSocket once and hand it the query client so // live frames fold into the RQ transcript cache. Lives for the page's lifetime. initConnection(queryClient) // Catch applet errors that escape React (handlers, async effects) and journal // them for `moi debug logs` — attribution is by bundle URL in the stack, so // host-app errors never match (see features/applets/applet-log.ts). installAppletErrorHook() export function mount(el: HTMLElement) { function Root() { return ( {process.env.NODE_ENV === 'development' && } ) } createRoot(el).render() }