From a6571aa8b7c1a39105d7b10132b3c57fa9cc9a0d Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Thu, 11 Jun 2026 01:05:20 +0300 Subject: [PATCH] fix: avoid unnecessary macOS folder prompts on desktop startup Start managed OpenCode from the app data directory instead of the home folder Prevent unnecessary Desktop, Documents, Downloads, and Music access prompts Add coverage for configured OpenCode working directory --- packages/electron/main.mjs | 5 ++++ .../server/lib/opencode/hmr-state-runtime.js | 9 ++++++- .../lib/opencode/hmr-state-runtime.test.js | 24 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/web/server/lib/opencode/hmr-state-runtime.test.js diff --git a/packages/electron/main.mjs b/packages/electron/main.mjs index 4358e39f..b3c81744 100644 --- a/packages/electron/main.mjs +++ b/packages/electron/main.mjs @@ -1089,7 +1089,12 @@ const spawnLocalServer = async () => { process.env.OPENCHAMBER_HOST = bindHost; process.env.OPENCHAMBER_DIST_DIR = resolveWebDistDir(); process.env.OPENCHAMBER_RUNTIME = 'desktop'; + process.env.OPENCHAMBER_OPENCODE_CWD = app.getPath('userData'); process.env.OPENCHAMBER_DESKTOP_NOTIFY = 'true'; + try { + fs.mkdirSync(process.env.OPENCHAMBER_OPENCODE_CWD, { recursive: true }); + } catch { + } if (desktopUiPassword) { process.env.OPENCHAMBER_UI_PASSWORD = desktopUiPassword; } else { diff --git a/packages/web/server/lib/opencode/hmr-state-runtime.js b/packages/web/server/lib/opencode/hmr-state-runtime.js index c06da01c..f98c4c19 100644 --- a/packages/web/server/lib/opencode/hmr-state-runtime.js +++ b/packages/web/server/lib/opencode/hmr-state-runtime.js @@ -6,12 +6,19 @@ export const createHmrStateRuntime = (dependencies) => { stateKey, } = dependencies; + const getInitialOpenCodeWorkingDirectory = () => { + const configured = typeof processLike.env.OPENCHAMBER_OPENCODE_CWD === 'string' + ? processLike.env.OPENCHAMBER_OPENCODE_CWD.trim() + : ''; + return configured || os.homedir(); + }; + const getOrCreateHmrState = () => { if (!globalThisLike[stateKey]) { globalThisLike[stateKey] = { openCodeProcess: null, openCodePort: null, - openCodeWorkingDirectory: os.homedir(), + openCodeWorkingDirectory: getInitialOpenCodeWorkingDirectory(), isShuttingDown: false, signalsAttached: false, userProvidedOpenCodePassword: undefined, diff --git a/packages/web/server/lib/opencode/hmr-state-runtime.test.js b/packages/web/server/lib/opencode/hmr-state-runtime.test.js new file mode 100644 index 00000000..12211a2e --- /dev/null +++ b/packages/web/server/lib/opencode/hmr-state-runtime.test.js @@ -0,0 +1,24 @@ +import { describe, expect, it } from 'vitest'; + +import { createHmrStateRuntime } from './hmr-state-runtime.js'; + +const createRuntime = (env = {}) => createHmrStateRuntime({ + globalThisLike: {}, + os: { homedir: () => '/Users/example' }, + processLike: { env }, + stateKey: '__testHmrState', +}); + +describe('hmr state runtime', () => { + it('uses configured OpenCode cwd when provided', () => { + const runtime = createRuntime({ OPENCHAMBER_OPENCODE_CWD: '/tmp/openchamber-data' }); + + expect(runtime.getOrCreateHmrState().openCodeWorkingDirectory).toBe('/tmp/openchamber-data'); + }); + + it('falls back to home directory without configured OpenCode cwd', () => { + const runtime = createRuntime(); + + expect(runtime.getOrCreateHmrState().openCodeWorkingDirectory).toBe('/Users/example'); + }); +});