From b7b1d7c72cc9927ce607810bdb657d36ebe3a813 Mon Sep 17 00:00:00 2001 From: James Long Date: Mon, 19 Oct 2026 10:57:26 -0400 Subject: [PATCH] feat(desktop): preserve Drive-managed development state --- packages/desktop/scripts/dev.ts | 4 ++-- .../desktop/src/main/lifecycle/configure.ts | 13 +++++++----- .../src/main/service/background-service.ts | 21 +++++++++++++------ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/desktop/scripts/dev.ts b/packages/desktop/scripts/dev.ts index bd544f34e403..69e640392a5f 100644 --- a/packages/desktop/scripts/dev.ts +++ b/packages/desktop/scripts/dev.ts @@ -11,12 +11,12 @@ type DevOptions = { server: ServerSource; electron: string[] } async function main() { process.env.OPENCODE_CHANNEL = "local" - process.env.OPENCODE_VERSION = `2.0.0-local-${Date.now()}` + process.env.OPENCODE_VERSION ??= `2.0.0-local-${Date.now()}` process.env.OPENCODE_DISABLE_CHANNEL_DB = "0" const options = selectOptions() if (options.server.type === "build") process.env.OPENCODE_DESKTOP_SERVER_CHANNEL = "local" - process.env.OPENCODE_DESKTOP_ISOLATED_SERVER = "1" + process.env.OPENCODE_DESKTOP_ISOLATED_SERVER ??= "1" await prepareDesktop() await prepareServer(options.server) await startDesktop(options.electron) diff --git a/packages/desktop/src/main/lifecycle/configure.ts b/packages/desktop/src/main/lifecycle/configure.ts index 878d184a4f0a..b4aa39aed582 100644 --- a/packages/desktop/src/main/lifecycle/configure.ts +++ b/packages/desktop/src/main/lifecycle/configure.ts @@ -52,7 +52,7 @@ export function acquireApplicationLock() { function createTestRoot() { const root = testOnboarding ? path.join(tmpdir(), `opencode-onboarding-${randomUUID()}`) - : app.isPackaged + : app.isPackaged && process.env.OPENCODE_DRIVE_GUI !== "1" ? undefined : process.env.OPENCODE_DESKTOP_TEST_ROOT @@ -64,10 +64,13 @@ function createTestRoot() { mkdirSync(path.join(root, dir), { recursive: true }) if (testOnboarding) process.env.OPENCODE_DB = ":memory:" - process.env.XDG_DATA_HOME = path.join(root, "data") - process.env.XDG_CONFIG_HOME = path.join(root, "config") - process.env.XDG_CACHE_HOME = path.join(root, "cache") - process.env.XDG_STATE_HOME = path.join(root, "state") + + if (process.env.OPENCODE_DESKTOP_ISOLATED_SERVER !== "0") { + process.env.XDG_DATA_HOME = path.join(root, "data") + process.env.XDG_CONFIG_HOME = path.join(root, "config") + process.env.XDG_CACHE_HOME = path.join(root, "cache") + process.env.XDG_STATE_HOME = path.join(root, "state") + } return root } diff --git a/packages/desktop/src/main/service/background-service.ts b/packages/desktop/src/main/service/background-service.ts index 2d156b25e8a4..5fd43b71eb88 100644 --- a/packages/desktop/src/main/service/background-service.ts +++ b/packages/desktop/src/main/service/background-service.ts @@ -35,18 +35,27 @@ const connect = Effect.fn("BackgroundService.connect")(function* (mode: "initial const desktopCli = yield* DesktopCli.Service const runFork = Effect.runForkWith(yield* Effect.context()) const isolated = !app.isPackaged && process.env.OPENCODE_DESKTOP_ISOLATED_SERVER === "1" + const drive = process.env.OPENCODE_DRIVE_GUI === "1" const cli = yield* desktopCli.resolve - const version = mode === "initial" ? cli.version : undefined + const version = mode === "initial" && !drive ? cli.version : undefined if (isolated) process.env.XDG_STATE_HOME = app.getPath("userData") const client = yield* Effect.promise(() => import("@opencode/client/service")) + const file = + isolated && process.env.OPENCODE_DESKTOP_SERVER_CHANNEL === "local" + ? path.join(app.getPath("userData"), "opencode", "service-local.json") + : drive && process.env.XDG_STATE_HOME + ? path.join( + process.env.XDG_STATE_HOME, + "opencode", + process.env.OPENCODE_CHANNEL === "local" ? "service-local.json" : "service.json", + ) + : undefined + const ensure = () => client.Service.ensure({ - file: - isolated && process.env.OPENCODE_DESKTOP_SERVER_CHANNEL === "local" - ? path.join(app.getPath("userData"), "opencode", "service-local.json") - : undefined, + file, version, // A fixed port makes a second contender fail to bind and back off; port 0 never collides, so two // services could boot against the same database. @@ -62,7 +71,7 @@ const connect = Effect.fn("BackgroundService.connect")(function* (mode: "initial // A compatible service the entry module already found is adopted at once; ensure() still runs // afterwards for its side effects (terminal handoff completion), off the renderer's path. - const early = mode === "initial" && !isolated ? yield* Effect.promise(sidecarProbe) : undefined + const early = mode === "initial" && !isolated && !drive ? yield* Effect.promise(sidecarProbe) : undefined if (early) yield* Effect.sync(() => void ensure().catch(() => undefined)) const service = early ?? (yield* Effect.tryPromise(ensure))