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,
)