summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src
diff options
context:
space:
mode:
authorAndrew Thal <[email protected]>2026-01-10 08:56:48 -0600
committerGitHub <[email protected]>2026-01-10 08:56:48 -0600
commit02b7eb59f8ce9d80a9a80210c0a8ca9de716962e (patch)
treeca46a3c7e598e64c4885cb0ba802e52450572c92 /packages/app/src
parenta8f23fb54812c4cbd60a8b1057d234200a7f6e02 (diff)
downloadopencode-02b7eb59f8ce9d80a9a80210c0a8ca9de716962e.tar.gz
opencode-02b7eb59f8ce9d80a9a80210c0a8ca9de716962e.zip
feat: support configuring default server URL for desktop (#7363)
Diffstat (limited to 'packages/app/src')
-rw-r--r--packages/app/src/app.tsx5
-rw-r--r--packages/app/src/components/dialog-select-server.tsx51
-rw-r--r--packages/app/src/context/platform.tsx6
3 files changed, 59 insertions, 3 deletions
diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx
index dc7b976fc..bf6da3b4d 100644
--- a/packages/app/src/app.tsx
+++ b/packages/app/src/app.tsx
@@ -33,13 +33,14 @@ const Loading = () => <div class="size-full flex items-center justify-center tex
declare global {
interface Window {
- __OPENCODE__?: { updaterEnabled?: boolean; port?: number; serverReady?: boolean }
+ __OPENCODE__?: { updaterEnabled?: boolean; port?: number; serverReady?: boolean; serverUrl?: string }
}
}
const defaultServerUrl = iife(() => {
if (location.hostname.includes("opencode.ai")) return "http://localhost:4096"
- if (window.__OPENCODE__) return `http://127.0.0.1:${window.__OPENCODE__.port}`
+ if (window.__OPENCODE__?.serverUrl) return window.__OPENCODE__.serverUrl
+ if (window.__OPENCODE__?.port) return `http://127.0.0.1:${window.__OPENCODE__.port}`
if (import.meta.env.DEV)
return `http://${import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"}`
diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx
index 6d224c6c3..7e2bcc181 100644
--- a/packages/app/src/components/dialog-select-server.tsx
+++ b/packages/app/src/components/dialog-select-server.tsx
@@ -1,4 +1,4 @@
-import { createEffect, createMemo, onCleanup } from "solid-js"
+import { createResource, createEffect, createMemo, onCleanup, Show } from "solid-js"
import { createStore, reconcile } from "solid-js/store"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { Dialog } from "@opencode-ai/ui/dialog"
@@ -35,6 +35,8 @@ export function DialogSelectServer() {
error: "",
status: {} as Record<string, ServerStatus | undefined>,
})
+ const [defaultUrl, defaultUrlActions] = createResource(() => platform.getDefaultServerUrl?.())
+ const isDesktop = platform.platform === "desktop"
const items = createMemo(() => {
const current = server.url
@@ -173,6 +175,53 @@ export function DialogSelectServer() {
</div>
</form>
</div>
+
+ <Show when={isDesktop}>
+ <div class="mt-6 px-3 flex flex-col gap-1.5">
+ <div class="px-3">
+ <h3 class="text-14-regular text-text-weak">Default server</h3>
+ <p class="text-12-regular text-text-weak mt-1">
+ Connect to this server on app launch instead of starting a local server. Requires restart.
+ </p>
+ </div>
+ <div class="flex items-center gap-2 px-3 py-2">
+ <Show
+ when={defaultUrl()}
+ fallback={
+ <Show
+ when={server.url}
+ fallback={<span class="text-14-regular text-text-weak">No server selected</span>}
+ >
+ <Button
+ variant="secondary"
+ size="small"
+ onClick={async () => {
+ await platform.setDefaultServerUrl?.(server.url)
+ defaultUrlActions.refetch(server.url)
+ }}
+ >
+ Set current server as default
+ </Button>
+ </Show>
+ }
+ >
+ <div class="flex items-center gap-2 flex-1 min-w-0">
+ <span class="truncate text-14-regular">{serverDisplayName(defaultUrl()!)}</span>
+ </div>
+ <Button
+ variant="ghost"
+ size="small"
+ onClick={async () => {
+ await platform.setDefaultServerUrl?.(null)
+ defaultUrlActions.refetch()
+ }}
+ >
+ Clear
+ </Button>
+ </Show>
+ </div>
+ </div>
+ </Show>
</div>
</Dialog>
)
diff --git a/packages/app/src/context/platform.tsx b/packages/app/src/context/platform.tsx
index 7fcbb620a..b0822e707 100644
--- a/packages/app/src/context/platform.tsx
+++ b/packages/app/src/context/platform.tsx
@@ -37,6 +37,12 @@ export type Platform = {
/** Fetch override */
fetch?: typeof fetch
+
+ /** Get the configured default server URL (desktop only) */
+ getDefaultServerUrl?(): Promise<string | null>
+
+ /** Set the default server URL to use on app startup (desktop only) */
+ setDefaultServerUrl?(url: string | null): Promise<void>
}
export const { use: usePlatform, provider: PlatformProvider } = createSimpleContext({