From e897883f9171574c4ad99aa00f5a077467159091 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Thu, 16 Apr 2026 14:41:53 +1000 Subject: [PATCH] feat: deep-link local server failures into management --- packages/app/src/app.tsx | 20 +++++++++++++++++++ .../src/components/dialog-select-server.tsx | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index dbe1074484..e0f8a14818 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -1,5 +1,7 @@ import "@/index.css" +import { Button } from "@opencode-ai/ui/button" import { I18nProvider } from "@opencode-ai/ui/context" +import { useDialog } from "@opencode-ai/ui/context/dialog" import { DialogProvider } from "@opencode-ai/ui/context/dialog" import { FileComponentProvider } from "@opencode-ai/ui/context/file" import { MarkedProvider } from "@opencode-ai/ui/context/marked" @@ -37,6 +39,7 @@ 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" @@ -223,12 +226,15 @@ function ConnectionGate(props: ParentProps<{ disableHealthCheck?: boolean }>) { } function ConnectionError(props: { onRetry?: () => void; onServerSelected?: (key: ServerConnection.Key) => void }) { + const dialog = useDialog() const language = useLanguage() + const platform = usePlatform() 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 canOpenLocalServer = createMemo(() => !!platform.localServer && server.current?.type === "sidecar") const timer = setInterval(() => props.onRetry?.(), 1000) onCleanup(() => clearInterval(timer)) @@ -243,6 +249,20 @@ function ConnectionError(props: { onRetry?: () => void; onServerSelected?: (key: {unreachable()[1]}

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

+ + + 0}>
diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index 63efa2b275..caefa2cf94 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -20,6 +20,10 @@ import { type ServerHealth, useCheckServerHealth } from "@/utils/server-health" const DEFAULT_USERNAME = "opencode" +interface DialogSelectServerProps { + initialView?: "list" | "local" +} + interface ServerFormProps { value: string name: string @@ -172,7 +176,7 @@ function ServerForm(props: ServerFormProps) { ) } -export function DialogSelectServer() { +export function DialogSelectServer(props: DialogSelectServerProps = {}) { const navigate = useNavigate() const dialog = useDialog() const server = useServer() @@ -193,7 +197,7 @@ export function DialogSelectServer() { status: undefined as boolean | undefined, }, localServer: { - showPage: false, + showPage: props.initialView === "local", }, editServer: { id: undefined as string | undefined,