// Application Configuration // This file contains all configurable settings for the application export const appConfig = { // Vercel Sandbox Configuration vercelSandbox: { // Sandbox timeout in minutes timeoutMinutes: 15, // Convert to milliseconds for Vercel Sandbox API get timeoutMs() { return this.timeoutMinutes * 60 * 1000; }, // Development server port (Vercel Sandbox typically uses 3000 for Next.js/React) devPort: 3000, // Time to wait for dev server to be ready (in milliseconds) devServerStartupDelay: 7000, // Time to wait for CSS rebuild (in milliseconds) cssRebuildDelay: 2000, // Working directory in sandbox workingDirectory: '/app', // Default runtime for sandbox runtime: 'node22' // Available: node22, python3.13, v0-next-shadcn, cua-ubuntu-xfce }, // E2B Sandbox Configuration e2b: { // Sandbox timeout in minutes timeoutMinutes: 30, // Convert to milliseconds for E2B API get timeoutMs() { return this.timeoutMinutes * 60 * 1000; }, // Development server port (E2B uses 5173 for Vite) vitePort: 5173, // Time to wait for Vite dev server to be ready (in milliseconds) viteStartupDelay: 10000, // Working directory in sandbox workingDirectory: '/home/user/app', }, // AI Model Configuration ai: { // Default AI model defaultModel: 'google/gemini-3-pro-preview', // Available models availableModels: [ 'openai/gpt-5', 'moonshotai/kimi-k2-instruct-0905', 'anthropic/claude-sonnet-4-20250514', 'google/gemini-3-pro-preview' ], // Model display names modelDisplayNames: { 'openai/gpt-5': 'GPT-5', 'moonshotai/kimi-k2-instruct-0905': 'Kimi K2 (Groq)', 'anthropic/claude-sonnet-4-20250514': 'Sonnet 4', 'google/gemini-3-pro-preview': 'Gemini 3 Pro (Preview)' } as Record, // Model API configuration modelApiConfig: { 'moonshotai/kimi-k2-instruct-0905': { provider: 'groq', model: 'moonshotai/kimi-k2-instruct-0905' } }, // Temperature settings for non-reasoning models defaultTemperature: 0.7, // Max tokens for code generation maxTokens: 8000, // Max tokens for truncation recovery truncationRecoveryMaxTokens: 4000, }, // Code Application Configuration codeApplication: { // Delay after applying code before refreshing iframe (milliseconds) defaultRefreshDelay: 2000, // Delay when packages are installed (milliseconds) packageInstallRefreshDelay: 5000, // Enable/disable automatic truncation recovery enableTruncationRecovery: false, // Disabled - too many false positives // Maximum number of truncation recovery attempts per file maxTruncationRecoveryAttempts: 1, }, // UI Configuration ui: { // Show/hide certain UI elements showModelSelector: true, showStatusIndicator: true, // Animation durations (milliseconds) animationDuration: 200, // Toast notification duration (milliseconds) toastDuration: 3000, // Maximum chat messages to keep in memory maxChatMessages: 100, // Maximum recent messages to send as context maxRecentMessagesContext: 20, }, // Development Configuration dev: { // Enable debug logging enableDebugLogging: true, // Enable performance monitoring enablePerformanceMonitoring: false, // Log API responses logApiResponses: true, }, // Package Installation Configuration packages: { // Use --legacy-peer-deps flag for npm install useLegacyPeerDeps: true, // Package installation timeout (milliseconds) installTimeout: 60000, // Auto-restart Vite after package installation autoRestartVite: true, }, // File Management Configuration files: { // Excluded file patterns (files to ignore) excludePatterns: [ 'node_modules/**', '.git/**', '.next/**', 'dist/**', 'build/**', '*.log', '.DS_Store' ], // Maximum file size to read (bytes) maxFileSize: 1024 * 1024, // 1MB // File extensions to treat as text textFileExtensions: [ '.js', '.jsx', '.ts', '.tsx', '.css', '.scss', '.sass', '.html', '.xml', '.svg', '.json', '.yml', '.yaml', '.md', '.txt', '.env', '.gitignore', '.dockerignore' ], }, // API Endpoints Configuration (for external services) api: { // Retry configuration maxRetries: 3, retryDelay: 1000, // milliseconds // Request timeout (milliseconds) requestTimeout: 30000, } }; // Type-safe config getter export function getConfig(key: K): typeof appConfig[K] { return appConfig[key]; } // Helper to get nested config values export function getConfigValue(path: string): any { return path.split('.').reduce((obj, key) => obj?.[key], appConfig as any); } export default appConfig;