From 958320f9c1572841c6c4b7aeba4559a79693002d Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:41:22 -0600 Subject: [PATCH 01/32] fix(app): remote http server connections --- packages/app/src/context/global-sdk.tsx | 37 +++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/app/src/context/global-sdk.tsx b/packages/app/src/context/global-sdk.tsx index 8c50a88781..346657e2fb 100644 --- a/packages/app/src/context/global-sdk.tsx +++ b/packages/app/src/context/global-sdk.tsx @@ -12,19 +12,32 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo const platform = usePlatform() const abort = new AbortController() + const password = typeof window === "undefined" ? undefined : window.__OPENCODE__?.serverPassword + const auth = (() => { - if (typeof window === "undefined") return - const password = window.__OPENCODE__?.serverPassword if (!password) return + if (!server.isLocal()) return return { Authorization: `Basic ${btoa(`opencode:${password}`)}`, } })() + const eventFetch = (() => { + if (!platform.fetch) return + try { + const url = new URL(server.url) + const loopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "::1" + if (url.protocol === "http:" && !loopback) return platform.fetch + } catch { + return + } + })() + const eventSdk = createOpencodeClient({ baseUrl: server.url, signal: abort.signal, - headers: auth, + fetch: eventFetch, + headers: eventFetch ? undefined : auth, }) const emitter = createGlobalEmitter<{ [key: string]: Event @@ -80,7 +93,17 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo let streamErrorLogged = false void (async () => { - const events = await eventSdk.global.event() + const events = await eventSdk.global.event({ + onSseError: (error) => { + if (streamErrorLogged) return + streamErrorLogged = true + console.error("[global-sdk] event stream error", { + url: server.url, + fetch: eventFetch ? "platform" : "webview", + error, + }) + }, + }) let yielded = Date.now() for await (const event of events.stream) { const directory = event.directory ?? "global" @@ -106,7 +129,11 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo .catch((error) => { if (streamErrorLogged) return streamErrorLogged = true - console.error("[global-sdk] event stream failed", error) + console.error("[global-sdk] event stream failed", { + url: server.url, + fetch: eventFetch ? "platform" : "webview", + error, + }) }) onCleanup(() => { From 50f208d69f9a3b418290f01f96117308842d9e9d Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:17:05 -0600 Subject: [PATCH 02/32] fix(app): suggestion active state broken --- .../components/prompt-input/slash-popover.tsx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/app/src/components/prompt-input/slash-popover.tsx b/packages/app/src/components/prompt-input/slash-popover.tsx index 554a15bb78..259883d61e 100644 --- a/packages/app/src/components/prompt-input/slash-popover.tsx +++ b/packages/app/src/components/prompt-input/slash-popover.tsx @@ -53,18 +53,15 @@ export const PromptPopover: Component = (props) => { > {(item) => { - const active = props.atActive === props.atKey(item) - const shared = { - "w-full flex items-center gap-x-2 rounded-md px-2 py-0.5": true, - "bg-surface-raised-base-hover": active, - } + const key = props.atKey(item) if (item.type === "agent") { return (