diff --git a/electron/main/index.ts b/electron/main/index.ts index 0c6a29034..dd0da3067 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -57,21 +57,17 @@ if (isE2EMode && requestedUserDataDir) { app.setPath('userData', requestedUserDataDir); } -// Disable GPU hardware acceleration globally for maximum stability across -// all GPU configurations (no GPU, integrated, discrete). -// -// Rationale (following VS Code's philosophy): -// - Page/file loading is async data fetching — zero GPU dependency. -// - The original per-platform GPU branching was added to avoid CPU rendering -// competing with sync I/O on Windows, but all file I/O is now async -// (fs/promises), so that concern no longer applies. -// - Software rendering is deterministic across all hardware; GPU compositing -// behaviour varies between vendors (Intel, AMD, NVIDIA, Apple Silicon) and -// driver versions, making it the #1 source of rendering bugs in Electron. -// -// Users who want GPU acceleration can pass `--enable-gpu` on the CLI or -// set `"disable-hardware-acceleration": false` in the app config (future). -app.disableHardwareAcceleration(); +const portableExecutableDir = process.env.PORTABLE_EXECUTABLE_DIR?.trim(); +const isPortable = Boolean(portableExecutableDir) || process.argv.includes('--portable'); +if (process.platform === 'win32' && isPortable) { + const baseDir = portableExecutableDir || process.cwd(); + app.setPath('userData', join(baseDir, 'DeskClawData')); +} + +const disableGpu = process.argv.includes('--disable-gpu') || process.env.DESKCLAW_DISABLE_GPU === '1'; +if (disableGpu) { + app.disableHardwareAcceleration(); +} // On Linux, set CHROME_DESKTOP so Chromium can find the correct .desktop file. // On Wayland this maps the running window to clawx.desktop (→ icon + app grouping); @@ -288,20 +284,6 @@ async function initialize(): Promise { `Runtime: platform=${process.platform}/${process.arch}, electron=${process.versions.electron}, node=${process.versions.node}, packaged=${app.isPackaged}, pid=${process.pid}, ppid=${process.ppid}` ); - if (!isE2EMode) { - // Warm up network optimization (non-blocking) - void warmupNetworkOptimization(); - - // Initialize Telemetry early - await initTelemetry(); - - // Apply persisted proxy settings before creating windows or network requests. - await applyProxySettings(); - await syncLaunchAtStartupSettingFromStore(); - } else { - logger.info('Running in E2E mode: startup side effects minimized'); - } - // Set application menu createMenu(); @@ -313,6 +295,22 @@ async function initialize(): Promise { createTray(window); } + if (!isE2EMode) { + void (async () => { + void warmupNetworkOptimization(); + const telemetryEnabled = await getSetting('telemetryEnabled'); + if (telemetryEnabled) { + await initTelemetry(); + } + await applyProxySettings(); + await syncLaunchAtStartupSettingFromStore(); + })().catch((error) => { + logger.warn('Deferred startup initialization failed:', error); + }); + } else { + logger.info('Running in E2E mode: startup side effects minimized'); + } + // Override security headers ONLY for the OpenClaw Gateway Control UI. // The URL filter ensures this callback only fires for gateway requests, // avoiding unnecessary overhead on every other HTTP response.