import "@/index.css" import { ErrorBoundary, Show, Suspense, lazy, type JSX, type ParentProps } from "solid-js" import { Router, Route, Navigate } from "@solidjs/router" import { MetaProvider } from "@solidjs/meta" import { Font } from "@opencode-ai/ui/font" import { MarkedProvider } from "@opencode-ai/ui/context/marked" import { DiffComponentProvider } from "@opencode-ai/ui/context/diff" import { CodeComponentProvider } from "@opencode-ai/ui/context/code" import { I18nProvider } from "@opencode-ai/ui/context" import { Diff } from "@opencode-ai/ui/diff" import { Code } from "@opencode-ai/ui/code" import { ThemeProvider } from "@opencode-ai/ui/theme" import { GlobalSyncProvider } from "@/context/global-sync" import { PermissionProvider } from "@/context/permission" import { LayoutProvider } from "@/context/layout" import { GlobalSDKProvider } from "@/context/global-sdk" import { normalizeServerUrl, ServerProvider, useServer } from "@/context/server" import { SettingsProvider } from "@/context/settings" import { TerminalProvider } from "@/context/terminal" import { PromptProvider } from "@/context/prompt" import { FileProvider } from "@/context/file" import { CommentsProvider } from "@/context/comments" import { NotificationProvider } from "@/context/notification" import { ModelsProvider } from "@/context/models" import { DialogProvider } from "@opencode-ai/ui/context/dialog" import { CommandProvider } from "@/context/command" import { LanguageProvider, useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { HighlightsProvider } from "@/context/highlights" import Layout from "@/pages/layout" import DirectoryLayout from "@/pages/directory-layout" import { ErrorPage } from "./pages/error" const Home = lazy(() => import("@/pages/home")) const Session = lazy(() => import("@/pages/session")) const Loading = () =>
const HomeRoute = () => ( }> ) const SessionRoute = () => ( }> ) const SessionIndexRoute = () => function UiI18nBridge(props: ParentProps) { const language = useLanguage() return {props.children} } declare global { interface Window { __OPENCODE__?: { updaterEnabled?: boolean; serverPassword?: string; deepLinks?: string[]; wsl?: boolean } } } function MarkedProviderWithNativeParser(props: ParentProps) { const platform = usePlatform() return {props.children} } function AppShellProviders(props: ParentProps) { return ( {props.children} ) } function SessionProviders(props: ParentProps) { return ( {props.children} ) } function RouterRoot(props: ParentProps<{ appChildren?: JSX.Element }>) { return ( {props.appChildren} {props.children} ) } const getStoredDefaultServerUrl = (platform: ReturnType) => { if (platform.platform !== "web") return const result = platform.getDefaultServerUrl?.() if (result instanceof Promise) return if (!result) return return normalizeServerUrl(result) } const resolveDefaultServerUrl = (props: { defaultUrl?: string storedDefaultServerUrl?: string hostname: string origin: string isDev: boolean devHost?: string devPort?: string }) => { if (props.defaultUrl) return props.defaultUrl if (props.storedDefaultServerUrl) return props.storedDefaultServerUrl if (props.hostname.includes("opencode.ai")) return "http://localhost:4096" if (props.isDev) return `http://${props.devHost ?? "localhost"}:${props.devPort ?? "4096"}` return props.origin } export function AppBaseProviders(props: ParentProps) { return ( }> {props.children} ) } function ServerKey(props: ParentProps) { const server = useServer() return ( {props.children} ) } export function AppInterface(props: { defaultUrl?: string; children?: JSX.Element; isSidecar?: boolean }) { const platform = usePlatform() const storedDefaultServerUrl = getStoredDefaultServerUrl(platform) const defaultServerUrl = resolveDefaultServerUrl({ defaultUrl: props.defaultUrl, storedDefaultServerUrl, hostname: location.hostname, origin: window.location.origin, isDev: import.meta.env.DEV, devHost: import.meta.env.VITE_OPENCODE_SERVER_HOST, devPort: import.meta.env.VITE_OPENCODE_SERVER_PORT, }) return ( {routerProps.children}} > ) }