(filePath)
| 2408 | { key: 'tosAcceptedDate', value: null }, |
| 2409 | { key: 'theme', value: 'light' }, |
| 2410 | { key: 'apiKey', value: null }, |
| 2411 | { key: 'aiModel', value: 'gpt-5-nano' }, |
| 2412 | { key: 'maxThumbnailSize', value: '300' }, |
| 2413 | { key: 'maxConcurrentRenders', value: '3' }, |
| 2414 | { key: 'lastVersionCheck', value: new Date().toISOString() }, |
| 2415 | { key: 'CollectUsage', value: '1' }, // Default to opt-in for analytics |
| 2416 | { key: 'ClientId', value: crypto.randomUUID() }, // Generate a unique client ID |
| 2417 | { key: 'currentVersion', value: version }, // Use imported version from package.json |
| 2418 | { key: 'versionCheckPerformedOnStartup', value: 'false' }, // New setting for version check tracking |
| 2419 | { key: 'enableZipArchives', value: '0' }, // ZIP archive support disabled by default |
| 2420 | { key: 'scanAdditionalFileTypes', value: '[]' }, // JSON array of catalog ids for additional scan types (e.g. ["obj","step"]) |
| 2421 | { key: 'aiTagMaxTags', value: '10' }, // Maximum number of AI-generated tags |
| 2422 | { key: 'aiTagUseCategories', value: '0' }, // Use category-based tagging |
| 2423 | { key: 'aiTagMergeStrategy', value: 'merge' }, // How to merge AI tags: 'replace', 'merge', 'append' |
| 2424 | { key: 'aiTagAllowRetagging', value: '0' }, // Allow re-tagging even if "AI Tagged" exists |
| 2425 | { key: 'aiTagConcurrency', value: '3' }, // Number of concurrent tag generation requests |
| 2426 | { key: 'enableBrowserExtension', value: '0' }, // Browser extension local server disabled by default |
| 2427 | { key: 'browserExtensionPort', value: '5000' }, // Port for browser extension server (default 5000) |
| 2428 | ]; |
| 2429 | |
| 2430 | // Insert default settings if they don't exist |
| 2431 | const insertStmt = db.prepare('INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)'); |
| 2432 | |
| 2433 | for (const setting of defaultSettings) { |
| 2434 | insertStmt.run(setting.key, setting.value); |
| 2435 | } |
| 2436 | |
| 2437 | console.log('Default settings initialized'); |
| 2438 | return true; |
| 2439 | } catch (error) { |
| 2440 | console.error('Error initializing default settings:', error); |
| 2441 | return false; |
| 2442 | } |
| 2443 | } |
| 2444 | |
| 2445 | async function createWindow() { |
| 2446 | const { width, height } = screen.getPrimaryDisplay().workAreaSize; |
| 2447 | mainWindow = new BrowserWindow({ |
| 2448 | width: Math.min(1600, width), |
| 2449 | height: Math.min(1000, height), |
| 2450 | backgroundColor: '#1e1e2e', // Match app's dark theme to prevent white flash |
| 2451 | show: false, // Don't show until ready to prevent white flash |
| 2452 | webPreferences: { |
| 2453 | nodeIntegration: false, |
| 2454 | contextIsolation: true, |
| 2455 | preload: path.join(__dirname, 'preload.js'), |
| 2456 | spellcheck: false, |
| 2457 | // Add these settings for clipboard access |
| 2458 | sandbox: false, |
| 2459 | enableWebSQL: false, |
| 2460 | webSecurity: true // Keep web security enabled, but allow puter.com API calls |
| 2461 | } |
| 2462 | }); |
| 2463 | // mainWindow.webContents.openDevTools() // Disabled - prevents auto-opening debug console on load |
| 2464 | |
| 2465 | // Allow puter.com API requests (handle CORS if needed) |
| 2466 | mainWindow.webContents.session.webRequest.onBeforeSendHeaders( |
| 2467 | { urls: ['https://api.puter.com/*', 'https://js.puter.com/*'] }, |
no test coverage detected