From 694e8123776792cb7e1dd7c0b09c47508ac398b5 Mon Sep 17 00:00:00 2001 From: Alex Yaroshuk Date: Thu, 29 Jan 2026 04:45:36 +0800 Subject: [PATCH] restore open web ui command --- packages/opencode/src/cli/cmd/tui/app.tsx | 20 +++++++++++++++++++ .../opencode/src/cli/cmd/tui/context/sdk.tsx | 4 ++-- packages/opencode/src/cli/cmd/tui/thread.ts | 11 ++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 10d7a25f88f..38d1426bb2d 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -106,6 +106,7 @@ export function tui(input: { fetch?: typeof fetch events?: EventSource onExit?: () => Promise + onOpenWebUI?: () => Promise }) { // promise to prevent immediate exit return new Promise(async (resolve) => { @@ -131,6 +132,7 @@ export function tui(input: { directory={input.directory} fetch={input.fetch} events={input.events} + onOpenWebUI={input.onOpenWebUI} > @@ -506,6 +508,24 @@ function App() { renderer.toggleDebugOverlay() dialog.clear() }, + }, + { + title: "Open WebUI", + value: "webui.open", + onSelect: async () => { + try { + const urlToOpen = sdk.onOpenWebUI ? await sdk.onOpenWebUI() : sdk.url + await open(urlToOpen) + } catch (error) { + toast.show({ + variant: "error", + message: "Failed to open WebUI", + duration: 3000, + }) + } + dialog.clear() + }, + category: "System", }, { title: "Toggle console", diff --git a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx index 3339e7b00d2..2532f58852e 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx @@ -9,7 +9,7 @@ export type EventSource = { export const { use: useSDK, provider: SDKProvider } = createSimpleContext({ name: "SDK", - init: (props: { url: string; directory?: string; fetch?: typeof fetch; events?: EventSource }) => { + init: (props: { url: string; directory?: string; fetch?: typeof fetch; events?: EventSource; onOpenWebUI?: () => Promise }) => { const abort = new AbortController() const sdk = createOpencodeClient({ baseUrl: props.url, @@ -89,6 +89,6 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({ if (timer) clearTimeout(timer) }) - return { client: sdk, event: emitter, url: props.url } + return { client: sdk, event: emitter, url: props.url, onOpenWebUI: props.onOpenWebUI } }, }) diff --git a/packages/opencode/src/cli/cmd/tui/thread.ts b/packages/opencode/src/cli/cmd/tui/thread.ts index 05714268545..a5b777c6a25 100644 --- a/packages/opencode/src/cli/cmd/tui/thread.ts +++ b/packages/opencode/src/cli/cmd/tui/thread.ts @@ -154,6 +154,17 @@ export const TuiThreadCommand = cmd({ onExit: async () => { await client.call("shutdown", undefined) }, + onOpenWebUI: async () => { + if (shouldStartServer) { + // Server already running, return the URL + return url + } else { + // Start server on demand using default network options (localhost) + const defaultOpts = await resolveNetworkOptions({ port: 0, hostname: "127.0.0.1", mdns: false, cors: [] }) + const server = await client.call("server", defaultOpts) + return server.url + } + }, }) setTimeout(() => {