| Server IP : 162.214.67.83 / Your IP : 216.73.217.9 Web Server : Apache System : Linux dedi-13542965.clustter.com.br 5.14.0-687.20.1.el9_8.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Jun 30 06:22:49 EDT 2026 x86_64 User : pjacortinas ( 1096) PHP Version : 8.3.32 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/pjacortinas/www/wp-content/plugins/softaculous-pro/lib/ai/core/ |
Upload File : |
<?php
if(!defined('SOFTACULOUS')){
die('Hacking Attempt');
}
class ProjectContext {
private $project_path;
public function __construct($project_path){
$this->project_path = rtrim($project_path, '/');
}
public function detect_type(){
if(file_exists($this->project_path.'/wp-config.php') || file_exists($this->project_path.'/wp-load.php')){
return 'wordpress';
}
if(file_exists($this->project_path.'/artisan')){
return 'laravel';
}
if(file_exists($this->project_path.'/config/core.php') && is_dir($this->project_path.'/web')){
return 'concrete5';
}
if(file_exists($this->project_path.'/app/etc/env.php') || file_exists($this->project_path.'/app/Mage.php')){
return 'magento';
}
if(file_exists($this->project_path.'/composer.json')){
$composer = @json_decode(@file_get_contents($this->project_path.'/composer.json'), true);
if(!empty($composer['require']['laravel/framework'])) return 'laravel';
if(!empty($composer['require']['symfony/symfony'])) return 'symfony';
if(!empty($composer['require']['drupal/core'])) return 'drupal';
return 'php-composer';
}
if(file_exists($this->project_path.'/package.json')){
$pkg = @json_decode(@file_get_contents($this->project_path.'/package.json'), true);
if(!empty($pkg['dependencies']['next'])) return 'nextjs';
if(!empty($pkg['dependencies']['react'])) return 'react';
if(!empty($pkg['dependencies']['vue'])) return 'vue';
return 'node';
}
if(is_dir($this->project_path.'/public_html') || is_dir($this->project_path.'/public')){
return 'php';
}
$files = glob($this->project_path.'/*.php');
if(!empty($files)) return 'php';
$files = glob($this->project_path.'/*.html');
if(!empty($files)) return 'static';
return 'unknown';
}
public function get_overview(){
$type = $this->detect_type();
$overview = "Project type: {$type}\n";
$overview .= "Project path: {$this->project_path}\n";
$overview .= "NOTE: Outside the Project path - access is strictly limited to read and list operations only.\n";
$overview .= "Do not use bash tool, for reading, or writing a file or directory in any case\n\n";
$structure = $this->get_structure_summary(2);
if(!empty($structure)){
$overview .= "Project structure:\n{$structure}\n\n";
}
$stats = $this->get_file_stats();
if(!empty($stats)){
$overview .= "File statistics:\n";
foreach($stats as $ext => $count){
$overview .= " .{$ext}: {$count} files\n";
}
}
return $overview;
}
public function get_structure_summary($max_depth = 2){
$result = $this->scan_structure($this->project_path, $max_depth, 0);
return $result;
}
private function scan_structure($path, $max_depth, $current_depth){
if($current_depth >= $max_depth) return '';
$skip = array('.', '..', '.git', 'node_modules', 'vendor', '.svn', '.ai_git', '.ai_backups', 'cache', 'tmp', 'temp');
$items = @scandir($path);
if(!$items) return '';
$output = '';
$indent = str_repeat(' ', $current_depth);
$basename = $current_depth === 0 ? basename($path) : basename($path);
$dirs = array();
$files = array();
foreach($items as $item){
if(in_array($item, $skip)) continue;
if(strpos($item, '.') === 0 && strlen($item) > 1) continue;
$full = $path.'/'.$item;
if(is_dir($full)){
$dirs[] = $item;
}else{
$files[] = $item;
}
}
foreach($dirs as $d){
$output .= $indent . '📁 ' . $d . "/\n";
$output .= $this->scan_structure($path.'/'.$d, $max_depth, $current_depth + 1);
}
sort($files);
foreach(array_slice($files, 0, 20) as $f){
$output .= $indent . '📄 ' . $f . "\n";
}
if(count($files) > 20){
$output .= $indent . ' ... and ' . (count($files) - 20) . ' more files\n';
}
return $output;
}
public function get_file_stats(){
$stats = array();
$this->count_by_ext($this->project_path, $stats, 0, 4);
arsort($stats);
return array_slice($stats, 0, 15);
}
private function count_by_ext($path, array &$stats, $depth, $max_depth){
if($depth >= $max_depth) return;
$skip = array('.', '..', '.git', 'node_modules', 'vendor', '.svn', '.ai_git', '.ai_backups');
$items = @scandir($path);
if(!$items) return;
foreach($items as $item){
if(in_array($item, $skip)) continue;
if(strpos($item, '.') === 0 && strlen($item) > 1) continue;
$full = $path.'/'.$item;
if(is_dir($full)){
$this->count_by_ext($full, $stats, $depth + 1, $max_depth);
}else{
$ext = strtolower(pathinfo($item, PATHINFO_EXTENSION));
if(empty($ext)) $ext = 'other';
if(!isset($stats[$ext])) $stats[$ext] = 0;
$stats[$ext]++;
}
}
}
public function get_system_prompt_additions(){
$type = $this->detect_type();
$prompts = array(
'wordpress' => "This is a WordPress installation. Follow WordPress coding standards. Use WordPress functions and APIs. The main files are in wp-content/ (themes, plugins).",
'laravel' => "This is a Laravel application. Follow PSR standards. Routes are in routes/, controllers in app/Http/Controllers/, models in app/Models/, views in resources/views/.",
'php' => "This is a PHP application. Follow PSR coding standards.",
'php-composer' => "This is a PHP application using Composer for dependency management.",
'react' => "This is a React application. Components typically use JSX. State management via hooks or external libraries.",
'nextjs' => "This is a Next.js application. Uses file-based routing in the app/ or pages/ directory.",
'vue' => "This is a Vue.js application. Components use .vue single-file components.",
'node' => "This is a Node.js application.",
'static' => "This is a static HTML/CSS/JS site.",
);
if(isset($prompts[$type])){
return $prompts[$type];
}
return "Analyze the codebase structure to understand the project before making changes.";
}
}