From e16115f53f8508ccd632dc52f3e53659a8a6dd2c Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 5 May 2026 15:27:10 +1000 Subject: [PATCH] fix(desktop): improve WSL OpenCode updates --- packages/app/src/components/dialog-select-server.tsx | 6 +++++- packages/app/src/components/dialog-wsl-server.tsx | 7 +++++++ packages/desktop-electron/src/main/wsl.ts | 7 +++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index c627deed30..7ee185b289 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -5,6 +5,7 @@ import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" import { Icon } from "@opencode-ai/ui/icon" import { IconButton } from "@opencode-ai/ui/icon-button" import { List } from "@opencode-ai/ui/list" +import { Spinner } from "@opencode-ai/ui/spinner" import { TextField } from "@opencode-ai/ui/text-field" import { useMutation } from "@tanstack/solid-query" import { showToast } from "@opencode-ai/ui/toast" @@ -717,7 +718,10 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) { if (wslDistro) updateWslMutation.mutate(wslDistro) }} > - {updating() ? "Updating OpenCode..." : label()} + + + + {label()} )} diff --git a/packages/app/src/components/dialog-wsl-server.tsx b/packages/app/src/components/dialog-wsl-server.tsx index 99ff342beb..b601865d3d 100644 --- a/packages/app/src/components/dialog-wsl-server.tsx +++ b/packages/app/src/components/dialog-wsl-server.tsx @@ -91,6 +91,10 @@ export function DialogWslServer(props: DialogWslServerProps = {}) { }) const installTarget = createMemo(() => installableDistros().find((item) => item.name === store.installTarget) ?? null) const installingDistro = createMemo(() => current()?.job?.kind === "install-distro") + const installingOpencode = createMemo(() => { + const job = current()?.job + return job?.kind === "install-opencode" && job.distro === store.selectedDistro + }) const wslReady = createMemo(() => !!current()?.runtime?.available && !current()?.pendingRestart) const distroReady = createMemo(() => { const probe = selectedProbe() @@ -523,6 +527,9 @@ export function DialogWslServer(props: DialogWslServerProps = {}) { disabled={busy()} onClick={() => runSelectedDistro((distro) => api.installOpencode(distro))} > + + + {opencodeCheck()?.resolvedPath ? "Update OpenCode" : "Install OpenCode"} diff --git a/packages/desktop-electron/src/main/wsl.ts b/packages/desktop-electron/src/main/wsl.ts index 582608d3c8..e0ee64d8be 100644 --- a/packages/desktop-electron/src/main/wsl.ts +++ b/packages/desktop-electron/src/main/wsl.ts @@ -33,9 +33,8 @@ export type RunWslOptions = { const DEFAULT_WSL_TIMEOUT_MS = 20_000 const DEFAULT_WSL_INSTALL_TIMEOUT_MS = 15 * 60_000 -export function wslArgs(args: string[], distro?: string | null) { - if (distro) return ["-d", distro, "--", ...args] - return ["--", ...args] +export function wslArgs(args: string[], distro?: string | null, user?: string | null) { + return [...(distro ? ["-d", distro] : []), ...(user ? ["--user", user] : []), "--", ...args] } export function runWsl(args: string[], opts: RunWslOptions = {}) { @@ -333,7 +332,7 @@ export async function readWslCommandVersion(command: string, distro: string, opt export async function upgradeWslOpencode(target: string, command: string, distro: string, opts?: RunWslOptions) { return runInteractiveCommand( resolveSystem32Command("wsl.exe"), - wslArgs(["bash", "-lc", `${shellEscape(command)} upgrade ${shellEscape(target)}`], distro), + wslArgs(["bash", "-lc", `${shellEscape(command)} upgrade ${shellEscape(target)}`], distro, "root"), withTimeout(opts, DEFAULT_WSL_INSTALL_TIMEOUT_MS), DEFAULT_WSL_INSTALL_TIMEOUT_MS, )