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'); + }); +});