()
| 117 | } |
| 118 | |
| 119 | function resolveUserDataDir(): string { |
| 120 | const envDir = process.env.CHATLAB_DATA_DIR |
| 121 | if (envDir) { |
| 122 | return expandHome(envDir) |
| 123 | } |
| 124 | |
| 125 | const config = loadConfig() |
| 126 | if (config.data.user_data_dir) { |
| 127 | return expandHome(config.data.user_data_dir) |
| 128 | } |
| 129 | |
| 130 | // First run: check for existing Electron desktop data before using default |
| 131 | const result = migrateFromElectronIfNeeded(SYSTEM_DIR) |
| 132 | if (result.migrated && result.userDataDir) { |
| 133 | return result.userDataDir |
| 134 | } |
| 135 | |
| 136 | const defaultDir = getDefaultNodeUserDataDir() |
| 137 | |
| 138 | if (result.electronDetected) { |
| 139 | // Electron was used but we couldn't find databases — likely a custom data directory. |
| 140 | // Don't persist default to config.toml so migration retries on next startup. |
| 141 | _pendingElectronDataWarning = true |
| 142 | return defaultDir |
| 143 | } |
| 144 | |
| 145 | writeConfigField('data', 'user_data_dir', defaultDir) |
| 146 | return defaultDir |
| 147 | } |
| 148 | |
| 149 | export function getDefaultNodeUserDataDir(): string { |
| 150 | return path.join(os.homedir(), '.chatlab', 'data') |
no test coverage detected