refactor: store browser use settings in database

This commit is contained in:
Simos Mikelatos
2026-06-15 17:57:00 +00:00
parent 260070bae0
commit e6263dbd1f

View File

@@ -3,17 +3,16 @@ import { randomUUID } from 'node:crypto';
import { spawn } from 'node:child_process'; import { spawn } from 'node:child_process';
import dns from 'node:dns/promises'; import dns from 'node:dns/promises';
import fs from 'node:fs'; import fs from 'node:fs';
import fsPromises from 'node:fs/promises';
import net from 'node:net'; import net from 'node:net';
import os from 'node:os';
import path from 'node:path'; import { appConfigDb } from '@/modules/database/repositories/app-config.js';
const require = createRequire(import.meta.url); const require = createRequire(import.meta.url);
const IS_PLATFORM = process.env.VITE_IS_PLATFORM === 'true'; const IS_PLATFORM = process.env.VITE_IS_PLATFORM === 'true';
const MAX_SESSIONS_PER_OWNER = Number.parseInt(process.env.CLOUDCLI_BROWSER_USE_MAX_SESSIONS_PER_OWNER || '3', 10); const MAX_SESSIONS_PER_OWNER = Number.parseInt(process.env.CLOUDCLI_BROWSER_USE_MAX_SESSIONS_PER_OWNER || '3', 10);
const SESSION_TTL_MS = Number.parseInt(process.env.CLOUDCLI_BROWSER_USE_SESSION_TTL_MS || String(30 * 60 * 1000), 10); const SESSION_TTL_MS = Number.parseInt(process.env.CLOUDCLI_BROWSER_USE_SESSION_TTL_MS || String(30 * 60 * 1000), 10);
const ALLOW_PRIVATE_NETWORKS = process.env.CLOUDCLI_BROWSER_USE_ALLOW_PRIVATE_NETWORKS === '1'; const ALLOW_PRIVATE_NETWORKS = process.env.CLOUDCLI_BROWSER_USE_ALLOW_PRIVATE_NETWORKS === '1';
const SETTINGS_PATH = path.join(os.homedir(), '.cloudcli', 'browser-use-settings.json'); const BROWSER_USE_SETTINGS_KEY = 'browser_use_settings';
type BrowserUseRuntime = 'cloud' | 'local'; type BrowserUseRuntime = 'cloud' | 'local';
type BrowserUseSessionStatus = 'ready' | 'stopped' | 'unavailable'; type BrowserUseSessionStatus = 'ready' | 'stopped' | 'unavailable';
@@ -69,28 +68,29 @@ function getRuntime(): BrowserUseRuntime {
return IS_PLATFORM ? 'cloud' : 'local'; return IS_PLATFORM ? 'cloud' : 'local';
} }
async function readSettings(): Promise<BrowserUseSettings> { function readSettings(): BrowserUseSettings {
try { try {
const raw = await fsPromises.readFile(SETTINGS_PATH, 'utf8'); const raw = appConfigDb.get(BROWSER_USE_SETTINGS_KEY);
if (!raw) {
return DEFAULT_SETTINGS;
}
const parsed = JSON.parse(raw) as Partial<BrowserUseSettings>; const parsed = JSON.parse(raw) as Partial<BrowserUseSettings>;
return { return {
enabled: parsed.enabled !== false, enabled: parsed.enabled !== false,
}; };
} catch (error: any) { } catch (error: any) {
if (error?.code !== 'ENOENT') { console.warn('[Browser Use] Failed to read settings:', error?.message || error);
console.warn('[Browser Use] Failed to read settings:', error?.message || error);
}
return DEFAULT_SETTINGS; return DEFAULT_SETTINGS;
} }
} }
async function writeSettings(settings: BrowserUseSettings): Promise<BrowserUseSettings> { function writeSettings(settings: BrowserUseSettings): BrowserUseSettings {
const normalized = { const normalized = {
enabled: settings.enabled !== false, enabled: settings.enabled !== false,
}; };
await fsPromises.mkdir(path.dirname(SETTINGS_PATH), { recursive: true }); appConfigDb.set(BROWSER_USE_SETTINGS_KEY, JSON.stringify(normalized));
await fsPromises.writeFile(SETTINGS_PATH, JSON.stringify(normalized, null, 2), 'utf8');
return normalized; return normalized;
} }
@@ -356,7 +356,7 @@ export const browserUseService = {
}, },
async updateSettings(settings: Partial<BrowserUseSettings>) { async updateSettings(settings: Partial<BrowserUseSettings>) {
const current = await readSettings(); const current = readSettings();
return writeSettings({ return writeSettings({
...current, ...current,
enabled: settings.enabled ?? current.enabled, enabled: settings.enabled ?? current.enabled,
@@ -364,7 +364,7 @@ export const browserUseService = {
}, },
async getStatus() { async getStatus() {
const settings = await readSettings(); const settings = readSettings();
const readiness = getRuntimeReadiness(); const readiness = getRuntimeReadiness();
const available = settings.enabled && readiness.playwrightInstalled && readiness.chromiumInstalled; const available = settings.enabled && readiness.playwrightInstalled && readiness.chromiumInstalled;
@@ -421,7 +421,7 @@ export const browserUseService = {
throw new Error(`Browser Use is limited to ${MAX_SESSIONS_PER_OWNER} active sessions per user.`); throw new Error(`Browser Use is limited to ${MAX_SESSIONS_PER_OWNER} active sessions per user.`);
} }
const settings = await readSettings(); const settings = readSettings();
const readiness = getRuntimeReadiness(); const readiness = getRuntimeReadiness();
if (!settings.enabled || !readiness.playwrightInstalled || !readiness.chromiumInstalled || !readiness.playwright) { if (!settings.enabled || !readiness.playwrightInstalled || !readiness.chromiumInstalled || !readiness.playwright) {
session.message = getSetupMessage(settings, readiness); session.message = getSetupMessage(settings, readiness);