'ok','proposals'=>load_proposals()], JSON_UNESCAPED_UNICODE); exit; } if ($action === 'scan') { if (!file_exists($LOG)) { echo json_encode(['status'=>'empty']); exit; } $patterns = []; foreach (array_slice(@file($LOG, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: [], -500) as $l) { $ev = @json_decode($l, true); if (!$ev || !isset($ev['msg']) || !isset($ev['exec_count']) || $ev['exec_count'] > 0) continue; $toks = array_filter(preg_split('/\W+/u', mb_strtolower($ev['msg'])), fn($t) => mb_strlen($t) >= 4); if (empty($toks)) continue; $sig = implode('|', array_unique($toks)); if (!isset($patterns[$sig])) $patterns[$sig] = ['count'=>0,'samples'=>[],'keywords'=>$toks]; $patterns[$sig]['count']++; if (count($patterns[$sig]['samples']) < 3) $patterns[$sig]['samples'][] = $ev['msg']; } uasort($patterns, fn($a,$b) => $b['count']-$a['count']); echo json_encode(['status'=>'ok','patterns_found'=>count($patterns),'top_candidates'=>array_slice($patterns,0,20,true)], JSON_UNESCAPED_UNICODE); exit; } if ($action === 'propose' && $_SERVER['REQUEST_METHOD'] === 'POST') { $body = @json_decode(file_get_contents('php://input'), true); if (!$body) { http_response_code(400); exit; } $p = load_proposals(); $p[] = ['id'=>'p_'.date('YmdHis'),'name'=>$body['name']??'','trigger'=>$body['trigger']??'','cmd'=>$body['cmd']??'','status'=>'pending','created_at'=>date('c')]; @file_put_contents($PROPOSALS, json_encode($p, JSON_PRETTY_PRINT)); echo json_encode(['status'=>'ok','stored'=>count($p)]); exit; } if ($action === 'dormants') { $d = []; // V55 base cats $d['hubs'] = []; foreach (glob('/var/www/html/*hub*.html') as $h) { $n = basename($h,'.html'); if (strpos($n,'pre-carto') !== false) continue; $d['hubs'][] = ['name'=>$n,'size_kb'=>round(filesize($h)/1024,1),'url'=>'/'.basename($h)]; } $d['priority_intents'] = []; if (file_exists('/opt/wevia-brain/priority-intents-nl.json')) { foreach ((json_decode(file_get_contents('/opt/wevia-brain/priority-intents-nl.json'), true) ?: []) as $p) { $c = trim($p['command']??''); $t = $p['triggers']??''; if (strlen($c) < 10 || $c === 'echo bonjour' || strpos($t,'zxq') === 0) continue; $d['priority_intents'][] = ['name'=>$p['name'],'trigger'=>$t,'cmd_preview'=>substr($c,0,120)]; } } $d['archived_intents'] = []; foreach (glob('/opt/weval-l99/wiki/_var_www_html_api_wevia-*-intent*.json') as $a) { $dd = @json_decode(file_get_contents($a), true); if ($dd) $d['archived_intents'][] = ['file'=>basename($dd['file']??''),'fns'=>$dd['functions']??[]]; } $d['backend_php_intents'] = []; foreach (glob('/var/www/html/api/*intent*.php') as $p) $d['backend_php_intents'][] = ['name'=>basename($p),'size_kb'=>round(filesize($p)/1024,1)]; $d['dormant_wevia_ia'] = []; $d['s89_ai_apis'] = []; if (file_exists('/opt/wevia-brain/DORMANT-CAPABILITIES-ARCHIVE.json')) { $dca = @json_decode(file_get_contents('/opt/wevia-brain/DORMANT-CAPABILITIES-ARCHIVE.json'), true); foreach (($dca['categories']['dormant_wevia_ia']['files']??[]) as $f) $d['dormant_wevia_ia'][] = ['file'=>$f['file']??'','size_b'=>$f['size']??0]; foreach (($dca['categories']['s89_ai_apis']['files']??[]) as $f) $d['s89_ai_apis'][] = ['file'=>$f['file']??'','size_b'=>$f['size']??0,'role'=>$f['role']??'']; } $d['orchestrators'] = []; foreach (glob('/var/www/html/api/*orchestrator*.php') as $o) { $bn = basename($o); $active = in_array($bn, ['wevia-sse-orchestrator.php','wevia-sse-orchestrator-public.php']); $d['orchestrators'][] = ['name'=>$bn,'size_kb'=>round(filesize($o)/1024,1),'status'=>$active?'active':'dormant']; } $d['tool_registries'] = []; foreach (['/opt/wevia-brain/tool-registry-v2.json','/opt/wevia-brain/tool-registry-v3-opus-arch.json','/var/www/html/api/wevia-tool-registry.json'] as $tr) { if (!file_exists($tr)) continue; $dd = @json_decode(file_get_contents($tr), true); $tools = $dd['tools']??[]; $d['tool_registries'][] = ['file'=>basename($tr),'tools_count'=>is_array($tools)?count($tools):0,'version'=>$dd['version']??'-']; } // V58 cats $d['brain_nucleus'] = []; foreach (glob('/opt/wevia-brain/prompts/nucleus/*.md') as $n) $d['brain_nucleus'][] = ['name'=>basename($n,'.md'),'size_kb'=>round(filesize($n)/1024,1)]; $d['personas'] = []; foreach (glob('/opt/wevia-brain/prompts/personas/*.md') as $p) $d['personas'][] = ['name'=>basename($p,'.md'),'size_kb'=>round(filesize($p)/1024,1)]; $d['system_prompts'] = []; foreach (glob('/opt/wevia-brain/prompts/system/*.md') as $sp) $d['system_prompts'][] = ['name'=>basename($sp,'.md'),'size_kb'=>round(filesize($sp)/1024,1)]; $d['knowledge_bases'] = []; foreach (glob('/opt/wevia-brain/knowledge/*.{json,md}', GLOB_BRACE) as $kb) $d['knowledge_bases'][] = ['name'=>basename($kb),'size_kb'=>round(filesize($kb)/1024,1)]; $d['knowledge_deep'] = []; foreach (glob('/opt/wevia-brain/knowledge/deep/*.md') as $kd) $d['knowledge_deep'][] = ['name'=>basename($kd,'.md'),'size_kb'=>round(filesize($kd)/1024,1)]; $d['oss_skills'] = []; if (is_dir('/opt/skills')) { foreach (glob('/opt/skills/*', GLOB_ONLYDIR) as $sk) $d['oss_skills'][] = ['name'=>basename($sk)]; } $d['weval_ecosystem'] = []; foreach (glob('/opt/weval-*', GLOB_ONLYDIR) as $we) $d['weval_ecosystem'][] = ['name'=>basename($we)]; $d['oss_repos'] = []; foreach (glob('/opt/*/.git', GLOB_ONLYDIR) as $gr) { $repo = basename(dirname($gr)); $d['oss_repos'][] = ['name'=>$repo,'path'=>'/opt/'.$repo]; } // === V59 NEW 7 categories === // 1. OPUS artifacts (hooks, dispatchers, system, orchestrators scattered) $d['opus_artifacts'] = []; $opus_files = array_merge( glob('/opt/wevia-brain/opus*.php'), glob('/opt/wevia-brain/opus*.sh'), glob('/opt/wevia-brain/cognitive-opus*.php'), glob('/opt/wevia-brain/prompts/opus-*.md'), glob('/opt/wevia-brain/prompts/opus-*.json'), glob('/opt/wevia-brain/modules/opus*.php'), glob('/var/www/html/api/opus*.php'), glob('/var/www/html/api/opus5-*.php'), glob('/var/www/html/api/wevia-opus*.php'), glob('/var/www/html/api/nonreg-opus.php') ); foreach ($opus_files as $o) { $d['opus_artifacts'][] = ['file'=>basename($o),'path'=>$o,'size_kb'=>round(filesize($o)/1024,1)]; } // 2. QDRANT collections $d['qdrant_collections'] = []; if (is_dir('/opt/qdrant-data/collections')) { foreach (glob('/opt/qdrant-data/collections/*', GLOB_ONLYDIR) as $qc) { $d['qdrant_collections'][] = ['name'=>basename($qc)]; } } // 3. RND plugins (74 domaines tech/business) $d['rnd_plugins'] = []; if (is_dir('/opt/rnd-agents/plugins')) { foreach (glob('/opt/rnd-agents/plugins/*', GLOB_ONLYDIR) as $rp) { $d['rnd_plugins'][] = ['name'=>basename($rp)]; } } // 4. Obsidian vault (doctrines/learnings/decisions/KB) $d['obsidian_vault'] = []; foreach (['doctrines','learnings','decisions','kb','sessions','tools','infra','ethica'] as $cat) { $dir = "/opt/obsidian-vault/$cat"; if (!is_dir($dir)) continue; $files = @scandir($dir) ?: []; $count = count(array_filter($files, fn($f) => !in_array($f, ['.', '..']))); $d['obsidian_vault'][] = ['category'=>$cat,'count'=>$count,'path'=>$dir]; } // 5. Memory systems (claude-mem, supermemory, claude-mem skills) $d['memory_systems'] = []; foreach (['/opt/claude-mem','/opt/supermemory','/opt/wevia-brain/knowledge'] as $ms) { if (!is_dir($ms)) continue; $size_mb = 0; foreach (glob("$ms/*") as $f) if (is_file($f)) $size_mb += filesize($f); $d['memory_systems'][] = ['name'=>basename($ms),'path'=>$ms,'size_mb'=>round($size_mb/1024/1024,2)]; } // 6. Agent frameworks (autogen, SuperClaude, HolyClaude, rnd-swarm, rnd-astron, deer-flow) $d['agent_frameworks'] = []; $frameworks = ['SuperClaude_Framework','HolyClaude','autogen','rnd-swarm','rnd-astron-agent','rnd-edict','deer-flow','deepagent','claw-code','aios','FrancyJGLisboa_agent-skill-creator']; foreach ($frameworks as $fw) { $path = "/opt/$fw"; if (is_dir($path)) { $d['agent_frameworks'][] = ['name'=>$fw,'path'=>$path]; } } // 7. Other OSS clones + /opt raw dirs $d['other_oss'] = []; $known = array_flip(array_merge($frameworks, ['skills','skillsmith','paperclip-skills','huggingface-skills','awesome-agent-skills','antigravity-awesome-skills','wevia-brain','wevia-finetune','wevads','weval-l99','weval-nonreg','weval-crewai','weval-litellm','weval-guardian','weval-ops','weval-plugins','weval-radar','weval-scrapy','weval-security','weval-ux','claude-mem','supermemory','system-prompts-ai','qdrant-data','backups','containerd','google','guard','gitea','jzOcb_writing-style-skill','keyhacks','open-webui-fresh','paperclip-weval','plausible','pmta','pmta-versions','prometheus','render-configs','ruflo','searxng','sovereign-api','twenty-compose','twenty','vaultwarden','vllm','wazuh','whisper.cpp','hf-spaces','isolated-pmta5','fmgapp','flowise-data','DiffusionDB','LTX-Video','activepieces','authentik','anythingllm','antigravity-awesome-skills','awesome-claude-code-toolkit','everything-claude-code'])); foreach (glob('/opt/*', GLOB_ONLYDIR) as $dir) { $name = basename($dir); if (!isset($known[$name])) { $d['other_oss'][] = ['name'=>$name,'path'=>$dir]; } } $counts = []; foreach ($d as $k => $v) $counts[$k] = count($v); $counts['TOTAL'] = array_sum($counts); echo json_encode(['status'=>'ok','counts'=>$counts,'dormants'=>$d], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); exit; } echo json_encode(['error'=>'action: list | scan | propose | dormants']);