/ electron / paths.ts
paths.ts
 1  import { app } from 'electron'
 2  import path from 'node:path'
 3  import fs from 'node:fs'
 4  
 5  export interface RuntimePaths {
 6    swarmclawHome: string
 7    dataDir: string
 8    workspaceDir: string
 9    browserProfilesDir: string
10    standaloneEntry: string
11    standaloneDir: string
12    publicDir: string
13    staticDir: string
14  }
15  
16  function ensureDir(dir: string): void {
17    fs.mkdirSync(dir, { recursive: true })
18  }
19  
20  function isDev(): boolean {
21    return !app.isPackaged
22  }
23  
24  export function resolveRuntimePaths(): RuntimePaths {
25    const swarmclawHome = path.join(app.getPath('userData'), 'home')
26    const dataDir = path.join(swarmclawHome, 'data')
27    const workspaceDir = path.join(swarmclawHome, 'workspace')
28    const browserProfilesDir = path.join(swarmclawHome, 'browser-profiles')
29  
30    ensureDir(swarmclawHome)
31    ensureDir(dataDir)
32    ensureDir(workspaceDir)
33    ensureDir(browserProfilesDir)
34  
35    const appRoot = isDev()
36      ? path.resolve(__dirname, '..')
37      : process.resourcesPath
38  
39    const standaloneDir = path.join(appRoot, '.next', 'standalone')
40    const standaloneEntry = path.join(standaloneDir, 'server.js')
41    const publicDir = path.join(standaloneDir, 'public')
42    const staticDir = path.join(standaloneDir, '.next', 'static')
43  
44    return {
45      swarmclawHome,
46      dataDir,
47      workspaceDir,
48      browserProfilesDir,
49      standaloneEntry,
50      standaloneDir,
51      publicDir,
52      staticDir,
53    }
54  }