summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-12-21 14:57:55 -0500
committerDax Raad <[email protected]>2025-12-21 14:57:55 -0500
commit2536e9f45b6d6b440070549317e7fb77446cfe68 (patch)
tree89533e57447444fb1777c5b0f0877583633774cc
parent9188bc542cce563f3f5a5b1767265c988fa01712 (diff)
downloadopencode-2536e9f45b6d6b440070549317e7fb77446cfe68.tar.gz
opencode-2536e9f45b6d6b440070549317e7fb77446cfe68.zip
tui: fix SDK context usage and server port fallback
- Update SDK context to return client instead of event for proper usage - Add server port fallback to 4096 when port 0 is specified but unavailable - Fix SDK event listener usage in TUI app
-rw-r--r--packages/opencode/src/cli/cmd/tui/app.tsx23
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/sdk.tsx3
-rw-r--r--packages/opencode/src/server/server.ts14
3 files changed, 27 insertions, 13 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index e81de1889..f63f6cb1a 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -169,7 +169,7 @@ function App() {
const local = useLocal()
const kv = useKV()
const command = useCommandDialog()
- const { event } = useSDK()
+ const sdk = useSDK()
const toast = useToast()
const { theme, mode, setMode } = useTheme()
const sync = useSync()
@@ -418,6 +418,15 @@ function App() {
category: "System",
},
{
+ title: "Open WebUI",
+ value: "webui.open",
+ onSelect: () => {
+ open(sdk.url).catch(() => {})
+ dialog.clear()
+ },
+ category: "System",
+ },
+ {
title: "Exit the app",
value: "app.exit",
onSelect: () => exit(),
@@ -487,11 +496,11 @@ function App() {
}
})
- event.on(TuiEvent.CommandExecute.type, (evt) => {
+ sdk.event.on(TuiEvent.CommandExecute.type, (evt) => {
command.trigger(evt.properties.command)
})
- event.on(TuiEvent.ToastShow.type, (evt) => {
+ sdk.event.on(TuiEvent.ToastShow.type, (evt) => {
toast.show({
title: evt.properties.title,
message: evt.properties.message,
@@ -500,7 +509,7 @@ function App() {
})
})
- event.on(SessionApi.Event.Deleted.type, (evt) => {
+ sdk.event.on(SessionApi.Event.Deleted.type, (evt) => {
if (route.data.type === "session" && route.data.sessionID === evt.properties.info.id) {
route.navigate({ type: "home" })
toast.show({
@@ -510,7 +519,7 @@ function App() {
}
})
- event.on(SessionApi.Event.Error.type, (evt) => {
+ sdk.event.on(SessionApi.Event.Error.type, (evt) => {
const error = evt.properties.error
const message = (() => {
if (!error) return "An error occured"
@@ -531,7 +540,7 @@ function App() {
})
})
- event.on(Installation.Event.Updated.type, (evt) => {
+ sdk.event.on(Installation.Event.Updated.type, (evt) => {
toast.show({
variant: "success",
title: "Update Complete",
@@ -540,7 +549,7 @@ function App() {
})
})
- event.on(Installation.Event.UpdateAvailable.type, (evt) => {
+ sdk.event.on(Installation.Event.UpdateAvailable.type, (evt) => {
toast.show({
variant: "info",
title: "Update Available",
diff --git a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx
index b283f672f..3ea7c90b7 100644
--- a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx
@@ -2,7 +2,6 @@ import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2"
import { createSimpleContext } from "./helper"
import { createGlobalEmitter } from "@solid-primitives/event-bus"
import { batch, onCleanup, onMount } from "solid-js"
-import { iife } from "@/util/iife"
export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
name: "SDK",
@@ -70,6 +69,6 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
abort.abort()
})
- return { client: sdk, event: emitter }
+ return { client: sdk, event: emitter, url: props.url }
},
})
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index 2f4b3b221..9a5607e7d 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -2601,13 +2601,19 @@ export namespace Server {
}
export function listen(opts: { port: number; hostname: string }) {
- const server = Bun.serve({
- port: opts.port,
+ const args = {
hostname: opts.hostname,
idleTimeout: 0,
fetch: App().fetch,
websocket: websocket,
- })
- return server
+ } as const
+ if (opts.port === 0) {
+ try {
+ return Bun.serve({ ...args, port: 4096 })
+ } catch {
+ // port 4096 not available, fall through to use port 0
+ }
+ }
+ return Bun.serve({ ...args, port: opts.port })
}
}