Main Process
Overview
The main.js file serves as the entry point for the SmartAdmin Electron application, orchestrating the entire application lifecycle, window management, and core system initialization.
Architecture Components
Application Mode
export const isDev = true; // Development/Production mode toggle
- Controls development vs production behavior
- Affects menu visibility, update checks, and debugging features
Window Management
Main Window (mainWindow)
- Purpose: Primary chat interface
- Dimensions: 800x600 (initial)
- Features: AI chat, user interaction, main application logic
- Security: Uses main preload script with node integration
Splash Screen (splashScreen)
- Purpose: Loading screen during app initialization
- Dimensions: 400x400
- Features: Frameless, transparent, non-resizable
- Lifecycle: Shows during startup, closes when main window ready
Second Window (secondWindow)
- Purpose: Multi-purpose auxiliary window
- Use Cases: External websites, admin dashboard, ban notifications
- Features: Configurable dimensions and properties
- Security: Uses secondary preload script
Settings Window (settingsWindow)
- Purpose: Configuration management interface
- Dimensions: 900x700
- Features: AI settings, user preferences, system configuration
Action Script Window (actionScriptWindow)
- Purpose: Browser automation script management
- Dimensions: 800x600
- Features: Script editor, test runner, template management
Notification Window (notificationWindow)
- Purpose: System notifications and alerts
- Features: Frameless, always-on-top, non-focusable
- Behavior: Hidden by default, shown on demand
Core Initialization Sequence
1. Environment Setup
import dotenv from 'dotenv';
dotenv.config();
- Loads environment variables
- Configures development/production settings
2. Protocol Registration
app.setAsDefaultProtocolClient('smartadmin');
- Registers
smartadmin://protocol handler - Enables deep linking functionality
3. Single Instance Lock
const gotTheLock = app.requestSingleInstanceLock();
- Prevents multiple app instances
- Focuses existing instance on second launch attempt
4. Window Creation Pipeline
- Splash Screen: Immediate loading indicator
- Notification Window: Background notification system
- Main Window: Primary application interface
5. System Initialization
// Auto updater setup
initializeAutoUpdater(mainWindow);
// Database connection test
await testPostgresConnection();
// Settings initialization
await initializeSettings();
// RAG system setup
await initializeRAGSystem();
await refreshLibrary();
// Playwright browser initialization
await initBrowser();
// Global shortcuts registration
await registerGlobalShortcuts(appContext);
// IPC handlers registration
await registerIpcHandlers(ipcMain, appContext);
// AI system initialization
await initializeAI();
// Ably real-time connection
await initAbly();
// User session validation
await readUserSession();
Security Architecture
Content Security
- Node Integration: Enabled for convenience (development)
- Context Isolation: Disabled (should be enabled in production)
- Preload Scripts: Separate scripts for different window types
Protocol Security
- Deep Link Handling: Secure protocol URL processing
- Single Instance: Prevents security issues from multiple instances
Error Handling & User States
Initialization Failures
- AI Initialization: Graceful fallback with user notification
- Database Connection: Error logging with continued operation
- Network Services: Retry logic and offline mode support
User Authentication States
- Valid Session: Welcome message, full feature access
- No Session: Locked interface, login prompt
- Banned User: Special banned page display, main window hiding
Ban System
// IP-based bans
const banParams = new URLSearchParams({
hostname: os.hostname(),
banType: 'ip',
ip: ablyConnection.ip,
bannedDate: ablyConnection.bannedDate,
reason: ablyConnection.reason
});
// Email-based bans
if (ablyConnection.banType === 'email') {
banParams.set('banType', 'email');
banParams.set('email', ablyConnection.email);
}
Development vs Production Modes
Development Mode (isDev = true)
- Menu bar visible
- Development tools accessible
- Update checks skipped
- Enhanced logging
- Message logs to Ably
Production Mode (isDev = false)
- Hidden menu bar
- Restricted development tools
- Automatic update checks
- Optimized logging
Window Communication
IPC Architecture
await registerIpcHandlers(ipcMain, appContext);
- Centralized handler registration
- Context passing for window management
- Secure inter-process communication
Application Context
const appContext = {
mainWindow,
secondWindow,
createSecondWindow,
createSettingsWindow,
getSettingsWindow,
getSecondWindow,
createActionScriptWindows,
getNotificationWindow,
myScreen
};
Cleanup & Lifecycle Management
Application Shutdown
mainWindow.on('closed', async () => {
// Close all dependent windows
if (secondWindow && !secondWindow.isDestroyed()) {
secondWindow.close();
}
// Cleanup resources
cleanupCodegenProcesses();
await cleanupAI();
await closeAbly();
app.quit();
});
Resource Management
- Process Cleanup: Playwright and codegen processes
- AI Resources: Model unloading and memory cleanup
- Network Connections: Ably connection closure
- Window Management: Proper window destruction
Screen Management
Display Configuration
const primaryDisplay = screen.getPrimaryDisplay();
myScreen = {
width: primaryDisplay.workAreaSize.width,
height: primaryDisplay.workAreaSize.height,
notificationMargin: 20
};
Auto-Update System
Update Management
initializeAutoUpdater(mainWindow);
- Production-only update checks
- User notification system
- Graceful update installation
File Paths Configuration
const indexDir = path.join(__dirname, 'src', 'pages', 'index.html');
const settingsDir = path.join(__dirname, 'src', 'pages', 'settings.html');
const splashDir = path.join(__dirname, 'src', 'pages', 'splashScreen.html');
const actionScriptDir = path.join(__dirname, 'src', 'pages', 'actionScript.html');
const mainPreloadDir = path.join(__dirname, 'src', 'preload', 'preload.js');
const secondPreloadDir = path.join(__dirname, 'src', 'preload', 'second-preload.js');
const iconDir = path.join(__dirname, 'src', 'assets', 'logo.ico');
Platform-Specific Behavior
Windows
- Native notification support via
app.setAppUserModelId - ICO icon format support
macOS
- Protocol URL handling via
open-urlevent - Different quit behavior (stays in dock)
Cross-Platform
- Electron's consistent API usage
- Path resolution for different filesystems
Performance Considerations
Lazy Loading
- Windows created on demand
- Services initialized sequentially
- Resource cleanup on window close
Memory Management
- Proper window destruction
- AI model cleanup
- Process termination handling
Logging & Monitoring
Application Events
log.app("App Starting... Creating windows...");
log.app("🔄 Initializing auto-updater...");
log.app("🐘 Testing PostgreSQL connection...");
Error Tracking
- Comprehensive error logging
- User-friendly error messages
- Development vs production logging levels
Dependencies
Core Electron
electron: Application frameworkpath: File path utilitiesos: Operating system utilities
Application Modules
./src/modules/ipc-handlers.js: IPC communication./src/modules/settings-handler.js: Configuration management./src/modules/ai-manager.js: AI system orchestration./src/modules/rag-handler.js: Knowledge retrieval./src/modules/action-handler.js: Browser automation./src/modules/auto-updater.js: Update management./src/modules/ably-handler.js: Real-time messaging
Usage Patterns
Window Creation
await createSecondWindow(url, {
width: 1200,
height: 800,
autoHideMenuBar: true,
frame: true,
resizable: true
});
Service Initialization
const result = await initializeService();
if (result.status) {
log.success("Service initialized");
} else {
log.error("Service failed:", result.message);
}