import "@/index.css" import { I18nProvider } from "@opencode-ai/ui/context" import { DialogProvider } from "@opencode-ai/ui/context/dialog" import { FileComponentProvider } from "@opencode-ai/ui/context/file" import { MarkedProvider } from "@opencode-ai/ui/context/marked" import { File } from "@opencode-ai/ui/file" import { Font } from "@opencode-ai/ui/font" import { Splash } from "@opencode-ai/ui/logo" import { ThemeProvider } from "@opencode-ai/ui/theme" import { MetaProvider } from "@solidjs/meta" import { type BaseRouterProps, Navigate, Route, Router } from "@solidjs/router" import { type Duration, Effect } from "effect" import { type Component, createMemo, createResource, createSignal, ErrorBoundary, For, type JSX, lazy, onCleanup, type ParentProps, Show, Suspense, } from "solid-js" import { Dynamic } from "solid-js/web" import { CommandProvider } from "@/context/command" import { CommentsProvider } from "@/context/comments" import { FileProvider } from "@/context/file" import { GlobalSDKProvider } from "@/context/global-sdk" import { GlobalSyncProvider } from "@/context/global-sync" import { HighlightsProvider } from "@/context/highlights" import { LanguageProvider, useLanguage } from "@/context/language" import { LayoutProvider } from "@/context/layout" import { ModelsProvider } from "@/context/models" import { NotificationProvider } from "@/context/notification" import { PermissionProvider } from "@/context/permission" import { usePlatform } from "@/context/platform" import { PromptProvider } from "@/context/prompt" import { ServerConnection, ServerProvider, serverName, useServer } from "@/context/server" import { SettingsProvider } from "@/context/settings" import { TerminalProvider } from "@/context/terminal" import DirectoryLayout from "@/pages/directory-layout" import Layout from "@/pages/layout" import { ErrorPage } from "./pages/error" import { useCheckServerHealth } from "./utils/server-health" 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 deepLinks?: string[] wsl?: boolean } api?: { setTitlebar?: (theme: { mode: "light" | "dark" }) => Promise } } } 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} ) } export function AppBaseProviders(props: ParentProps) { return ( { void window.api?.setTitlebar?.({ mode }) }} > }> {props.children} ) } const effectMinDuration = (duration: Duration.Input) => (e: Effect.Effect) => Effect.all([e, Effect.sleep(duration)], { concurrency: "unbounded" }).pipe(Effect.map((v) => v[0])) function ConnectionGate(props: ParentProps<{ disableHealthCheck?: boolean }>) { const server = useServer() const checkServerHealth = useCheckServerHealth() const [checkMode, setCheckMode] = createSignal<"blocking" | "background">("blocking") // performs repeated health check with a grace period for // non-http connections, otherwise fails instantly const [startupHealthCheck, healthCheckActions] = createResource(() => props.disableHealthCheck ? true : Effect.gen(function* () { if (!server.current) return true const { http, type } = server.current while (true) { const res = yield* Effect.promise(() => checkServerHealth(http)) if (res.healthy) return true if (checkMode() === "background" || type === "http") return false } }).pipe( effectMinDuration(checkMode() === "blocking" ? "1.2 seconds" : 0), Effect.timeoutOrElse({ duration: "10 seconds", onTimeout: () => Effect.succeed(false) }), Effect.ensuring(Effect.sync(() => setCheckMode("background"))), Effect.runPromise, ), ) return (
} > { if (checkMode() === "background") healthCheckActions.refetch() }} onServerSelected={(key) => { setCheckMode("blocking") server.setActive(key) healthCheckActions.refetch() }} /> } > {props.children} ) } function ConnectionError(props: { onRetry?: () => void; onServerSelected?: (key: ServerConnection.Key) => void }) { const language = useLanguage() const server = useServer() const others = () => server.list.filter((s) => ServerConnection.key(s) !== server.key) const name = createMemo(() => server.name || server.key) const serverToken = "\u0000server\u0000" const unreachable = createMemo(() => language.t("app.server.unreachable", { server: serverToken }).split(serverToken)) const timer = setInterval(() => props.onRetry?.(), 1000) onCleanup(() => clearInterval(timer)) return (

{unreachable()[0]} {name()} {unreachable()[1]}

{language.t("app.server.retrying")}

0}>
{language.t("app.server.otherServers")}
{(conn) => { const key = ServerConnection.key(conn) return ( ) }}
) } export function AppInterface(props: { children?: JSX.Element defaultServer: ServerConnection.Key servers?: Array router?: Component disableHealthCheck?: boolean }) { return ( {routerProps.children}} > ) }