env('RSX_MODE', 'development'), /* |-------------------------------------------------------------------------- | Manifest Modules |-------------------------------------------------------------------------- | | These modules process files during manifest scanning. Each module | handles specific file types and extracts metadata. Modules are | processed in priority order (lower number = higher priority). | */ 'manifest_modules' => [ // Core modules (can be copied and modified) // PHP extraction is handled directly in Manifest to avoid DRY violations // JavaScript is a first-class citizen, handled directly in Manifest.php \App\RSpade\Core\Manifest\Modules\Blade_ManifestModule::class, \App\RSpade\Integrations\Scss\Scss_ManifestModule::class, // Custom modules // \App\RSpade\Modules\Custom\MyCustomModule::class, ], /* |-------------------------------------------------------------------------- | Manifest Support Modules |-------------------------------------------------------------------------- | | These modules run AFTER the primary manifest is built to add | supplementary metadata that requires the full manifest to be available. | Order matters - modules are processed in the order listed. | */ 'manifest_support' => [ \App\RSpade\Core\Dispatch\Route_ManifestSupport::class, \App\RSpade\Core\Manifest\Modules\Model_ManifestSupport::class, \App\RSpade\Integrations\Jqhtml\Jqhtml_ManifestSupport::class, \App\RSpade\Core\SPA\Spa_ManifestSupport::class, ], /* |-------------------------------------------------------------------------- | Integrations |-------------------------------------------------------------------------- | | External integrations that extend the framework's capabilities. | Each integration can provide file discovery, processing, and bundling. | */ 'integrations' => [ // Register integration service providers here // These will be loaded automatically if enabled 'providers' => [ \App\RSpade\Integrations\Jqhtml\Jqhtml_Service_Provider::class, \App\RSpade\Core\Controller\Controller_Service_Provider::class, \App\RSpade\Core\Database\Database_Service_Provider::class, ], // Integration-specific configuration 'jqhtml' => [ 'compiler' => [ 'cache' => true, 'cache_ttl' => 3600, 'source_maps' => true, ], ], ], /* |-------------------------------------------------------------------------- | Bundle Processors |-------------------------------------------------------------------------- | | Configure global processors that transform files during bundle compilation. | These processors are automatically applied to all bundles based on file | extensions. Order matters - processors with lower priority run first. | */ 'bundle_processors' => [ // SCSS/Sass processor \App\RSpade\Integrations\Scss\Scss_BundleProcessor::class, // JQHTML processor \App\RSpade\Integrations\Jqhtml\Jqhtml_BundleProcessor::class, // Add custom processors here // \App\RSpade\Processors\MyCustomProcessor::class, ], /* |-------------------------------------------------------------------------- | Required Bundles |-------------------------------------------------------------------------- | | These bundles are automatically prepended to every bundle's include list. | They provide core functionality that all bundles need. | */ 'required_bundles' => [ 'jquery', // jQuery library - foundation for many components 'lodash', // Lodash utility library - common utilities 'core', // Core framework JS - Manifest, Rsx, cache, etc. 'jqhtml', // Jqhtml library - client side templating library ], /* |-------------------------------------------------------------------------- | Bundle Aliases |-------------------------------------------------------------------------- | | Map bundle aliases to their corresponding bundle classes. | These aliases can be used in bundle 'include' arrays for convenience. | */ 'bundle_aliases' => [ 'core' => \App\RSpade\Core\Bundle\Core_Bundle::class, 'jquery' => \App\RSpade\Bundles\Jquery_Bundle::class, 'lodash' => \App\RSpade\Bundles\Lodash_Bundle::class, 'bootstrap5' => \App\RSpade\Bundles\Bootstrap5_Bundle::class, 'jqhtml' => \App\RSpade\Integrations\Jqhtml\Jqhtml_Bundle::class, ], /* |-------------------------------------------------------------------------- | RSX Routing Configuration |-------------------------------------------------------------------------- | | Configure how RSX handles routing, caching, and request dispatch. | */ 'routing' => [ // Directories to check for static assets 'asset_dirs' => ['public', 'assets', 'static', 'dist', 'build'], // Handler type priorities (lower number = higher priority) 'handler_priority' => [ 'controller' => 1, 'file' => 2, 'asset' => 3, 'custom' => 4, ], ], /* |-------------------------------------------------------------------------- | Public Directory Configuration |-------------------------------------------------------------------------- | | Configure security and access control for the /rsx/public/ directory. | Files in this directory are served at the root URL of the application. | */ 'public' => [ // Global patterns blocked from HTTP access for security // These patterns are always blocked regardless of public_ignore.json 'ignore_patterns' => [ 'public_ignore.json', '.git', '.gitignore', '.gitattributes', '*.php', '.env', '.env.*', '*.sh', '*.py', '*.rb', '*.conf', '*.ini', '*.sql', '*.bak', '*.tmp', '*~', ], ], /* |-------------------------------------------------------------------------- | RSX Manifest Configuration |-------------------------------------------------------------------------- | | Configure how RSX discovers and indexes classes, routes, and attributes. | */ 'manifest' => [ // Base directories to scan (relative to base_path()) // Can be directories (will be scanned recursively) or individual files 'scan_directories' => [ 'rsx', // Main RSX application directory (symlinked to ../rsx) 'app/RSpade/Core', // Core framework classes (runtime essentials) 'app/RSpade/Integrations', // Integration modules (Jqhtml, Scss, etc.) 'app/RSpade/Bundles', // Third-party bundles 'app/RSpade/Breadcrumbs', // Progressive breadcrumb resolution 'app/RSpade/CodeQuality', // Code quality rules and checks 'app/RSpade/Lib', // UI features (Flash alerts, etc.) 'app/RSpade/temp', // Framework developer testing directory ], // Specific filenames to exclude from manifest scanning (anywhere in tree) 'excluded_files' => [ 'CLAUDE.md', // Documentation for AI assistants '.placeholder', // Empty directory markers '.DS_Store', // macOS folder metadata 'Thumbs.db', // Windows thumbnail cache 'desktop.ini', // Windows folder settings '.gitkeep', // Git empty directory markers '.gitattributes', // Git attributes config '._rsx_helper.php', // IDE helper stubs (auto-generated) ], // Directories to exclude from code quality checks (relative path segments) // These are matched via str_contains, so 'Core/Manifest' matches 'app/RSpade/Core/Manifest/' 'excluded_dirs' => [ 'vendor', 'node_modules', 'storage', '.git', 'public', 'resource', 'Core/Manifest', // Manifest builder uses reflection - can't use Manifest API ], ], /* |-------------------------------------------------------------------------- | RSX Development Settings |-------------------------------------------------------------------------- | | Diagnostic flags for debugging. Override in user config for preferences. | */ 'development' => [ // Show detailed error messages 'debug' => env('RSX_DEBUG', env('APP_DEBUG', false)), // Log all dispatches for debugging 'log_dispatches' => env('RSX_LOG_DISPATCHES', false), // Show route matching details in error pages 'show_route_details' => env('RSX_SHOW_ROUTE_DETAILS', env('APP_DEBUG', false)), // Disable AJAX request batching for easier debugging // When true, each Ajax.call() makes an immediate individual request // When false (default), requests are batched using setTimeout(0) 'ajax_disable_batching' => env('AJAX_DISABLE_BATCHING', false), ], /* |-------------------------------------------------------------------------- | Code Quality Configuration |-------------------------------------------------------------------------- | | Settings for code quality checks and validation rules. | */ 'code_quality' => [ // Framework developer mode - enables additional testing capabilities // When true, allows testing rules in app/RSpade/temp directory 'is_framework_developer' => env('IS_FRAMEWORK_DEVELOPER', false), // Whitelisted PHP/JS files allowed in project root directory // These are typically build configuration files and IDE helpers 'root_whitelist' => [ 'vite.config.js', 'webpack.config.js', 'webpack.mix.js', '_ide_helper.php', // Laravel IDE Helper '._rsx_helper.php', // RSX IDE Helper '.phpstorm.meta.php', // PhpStorm metadata ], // Whitelisted test files allowed in rsx/ directory (not subdirectories) // Test files should normally be in proper test directories, not loose in rsx/ 'rsx_test_whitelist' => [ // Currently no test files should exist directly in rsx/ ], // Classes exempt from suffix inheritance rules // Children of these classes can use any naming pattern 'suffix_exempt_classes' => [ 'Component', // JQHTML components can have flexible naming 'Component', // JQHTML v2 components can have flexible naming 'Rsx_System_Model_Abstract', // System models (e.g., Session) have special naming ], ], /* |-------------------------------------------------------------------------- | IDE Integration Configuration |-------------------------------------------------------------------------- | | Settings for VS Code extension and IDE bridge communication. | */ 'ide_integration' => [ // Application domain for IDE to connect to // Set to 'auto' to auto-discover from first web request // Or specify explicitly: 'https://example.com' // // WARNING: When set to 'auto', email sending will be restricted to test mode // with whitelisted receivers only, as email functionality requires a hardcoded // domain. Production email sending will be disabled. // TODO: Implement email test mode when email functionality is added (~1 month) 'application_domain' => env('RSX_APPLICATION_DOMAIN', 'auto'), // Path where IDE bridge files are stored (auth tokens, discovered domain) 'bridge_path' => 'storage/rsx-ide-bridge', // Enable IDE services endpoint (disabled in production by default) 'enabled' => env('RSX_IDE_SERVICES_ENABLED', env('APP_ENV', 'local') !== 'production'), ], /* |-------------------------------------------------------------------------- | JavaScript Configuration |-------------------------------------------------------------------------- | | Settings for JavaScript parsing and transformation. | */ 'javascript' => [ 'babel' => [ // Enable Babel transformation for decorators 'transform_enabled' => env('BABEL_TRANSFORM', true), // Target environment for transformation (modern, es6, es5) 'target' => env('BABEL_TARGET', 'modern'), // Cache directory for transformed files 'cache_dir' => 'storage/rsx-tmp/babel_cache', ], // Enable decorator support (parsed and optionally transformed) 'decorators' => true, // Note: Private fields (#private) use native browser support, not transpiled ], /* |-------------------------------------------------------------------------- | Console Debug Configuration |-------------------------------------------------------------------------- | | Core debug system settings. Override outputs and filters in user config. | */ 'console_debug' => [ // Master switch to enable/disable all console debug output 'enabled' => env('CONSOLE_DEBUG_ENABLED', true), ], /* |-------------------------------------------------------------------------- | Exception Handlers |-------------------------------------------------------------------------- | | Exception handlers are executed in priority order when exceptions occur. | Each handler can choose to handle the exception (return a response) or | pass it to the next handler (return null). Handlers are sorted by priority | with lower numbers running first. | | Handler Priority Ranges: | - 1-50: Critical/environment-specific (CLI, AJAX, Playwright) | - 51-100: Standard handlers | - 101-500: Low priority handlers | - 501+: Fallback* or catch-all handlers (RSX dispatch bootstrapper) | | Users can add custom handlers or reorder existing ones by modifying this array. | */ 'exception_handlers' => [ \App\RSpade\Core\Exceptions\Cli_Exception_Handler::class, // Priority 10 \App\RSpade\Core\Exceptions\Ajax_Exception_Handler::class, // Priority 20 \App\RSpade\Core\Debug\Playwright_Exception_Handler::class, // Priority 30 \App\RSpade\Core\Providers\Rsx_Dispatch_Bootstrapper_Handler::class, // Priority 1000 ], /* |-------------------------------------------------------------------------- | Thumbnail Configuration |-------------------------------------------------------------------------- | | Configure the two-tier thumbnail caching system with named presets | (developer-defined) and dynamic thumbnails (ad-hoc sizes). | | Storage Structure: | - storage/rsx-thumbnails/preset/ - Named preset thumbnails | - storage/rsx-thumbnails/dynamic/ - Dynamic ad-hoc thumbnails | | Quota Management: | - Preset thumbnails: Enforced via scheduled rsx:thumbnails:clean task | - Dynamic thumbnails: Enforced synchronously after each new thumbnail | - Both use LRU eviction (oldest mtime deleted first) | | LRU Tracking: | - Both preset and dynamic thumbnails have mtime touched on cache hit | - Touch only occurs if mtime is older than touch_interval (default 10 min) | - Prevents excessive filesystem writes while maintaining LRU accuracy | | Commands: | - php artisan rsx:thumbnails:clean [--preset] [--dynamic] | - php artisan rsx:thumbnails:generate [--preset=name] | - php artisan rsx:thumbnails:stats | */ 'thumbnails' => [ // Named preset definitions // Format: 'name' => ['type' => 'cover'|'fit', 'width' => int, 'height' => int] 'presets' => [ 'profile' => ['type' => 'cover', 'width' => 200, 'height' => 200], 'gallery' => ['type' => 'fit', 'width' => 400, 'height' => 300], 'icon_small' => ['type' => 'cover', 'width' => 32, 'height' => 32], 'icon_large' => ['type' => 'cover', 'width' => 64, 'height' => 64], ], // Storage quotas in bytes (both enforced via LRU eviction) 'quotas' => [ 'preset_max_bytes' => 100 * 1024 * 1024, // 100MB (enforced via scheduled task) 'dynamic_max_bytes' => 50 * 1024 * 1024, // 50MB (enforced synchronously) ], // Maximum dimension limit for dynamic thumbnails (base resolution before 2x scaling) // This value is doubled during generation (800 becomes 1600x1600 after 2x scaling) // Preset thumbnails have no enforced maximum (developer-controlled) // NOTE: Application configuration - not overridable via environment variable 'max_dynamic_size' => 800, // Touch mtime on cache hit to update LRU tracking (both preset and dynamic) 'touch_on_read' => env('THUMBNAILS_TOUCH_ON_READ', true), // Only touch if mtime is older than this many seconds (prevents excessive filesystem writes) 'touch_interval' => env('THUMBNAILS_TOUCH_INTERVAL', 600), // 10 minutes ], /* |-------------------------------------------------------------------------- | Task System |-------------------------------------------------------------------------- | | Configuration for the unified task execution system supporting: | - Immediate CLI execution | - Scheduled tasks (cron-based) | - Queued async tasks with worker management | | Worker Concurrency: | - global_max_workers: Maximum total workers across all queues | - Per-queue max_workers: Maximum concurrent workers for specific queue | - Workers are spawned up to configured limits | | Task Lifecycle: | - Tasks start as "pending" in database | - Worker process marks as "running" and updates heartbeat | - Completes as "completed" or "failed" | - Stuck tasks detected via timeout + heartbeat + PID checking | | Queues: | - default: General purpose task queue | - scheduled: Auto-created tasks from #[Schedule] attributes | - Custom queues: Define as needed (video, export, email, etc.) | | Commands: | - php artisan rsx:task:process (run via cron every minute) | - php artisan rsx:task:run Service method [params] | - php artisan rsx:task:list | */ 'tasks' => [ // Maximum workers across all queues (prevents server overload) 'global_max_workers' => 1, // Default timeout for tasks (seconds) - used if task doesn't specify 'default_timeout' => 1800, // 30 minutes // How long before a task is considered stuck (seconds) 'cleanup_stuck_after' => 1800, // 30 minutes // Default TTL for task temp directories (seconds) 'temp_directory_default_ttl' => 3600, // 1 hour // How long to keep completed/failed task records (days) 'task_retention_days' => 30, // Queue-specific configuration 'queues' => [ 'default' => [ 'max_workers' => 1, ], 'scheduled' => [ 'max_workers' => 1, ], // Future queues can be added here: // 'video' => ['max_workers' => 2], // 'export' => ['max_workers' => 1], // 'email' => ['max_workers' => 5], ], ], /* |-------------------------------------------------------------------------- | Datetime Configuration |-------------------------------------------------------------------------- | | Configure date and time handling across the application. | See: php artisan rsx:man time | */ 'datetime' => [ // Default timezone (IANA identifier) when user has no preference // Resolution order: login_users.timezone → this default → 'America/Chicago' 'default_timezone' => env('RSX_DEFAULT_TIMEZONE', 'America/Chicago'), // Time dropdown interval in minutes (for Schedule_Input component) 'time_interval' => 15, // Default duration for new events in minutes (for Schedule_Input component) 'default_duration' => 60, ], ];