Files
html/api/wevia-orchestrator-scan.php

271 lines
11 KiB
PHP

<?php
// WEVIA Orchestrator Scan API v2 — 17avr2026 — Opus wire, chemins réels
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-cache, no-store');
header('Access-Control-Allow-Origin: *');
function count_intents($src) {
// Compte les patterns intent typiques
$patterns = [
'/case\s+[\'"][a-z0-9_]+[\'"]/i',
'/[\'"]intent[\'"]\s*=>\s*[\'"][a-z0-9_]+/i',
'/register_intent\s*\(/i',
'/add_intent\s*\(/i',
'/[\'"]patterns?[\'"]\s*=>\s*\[/i',
'/if\s*\(\s*preg_match\s*\(\s*[\'"][^\'"]+[\'"]/',
'/handle_[a-z_]+\s*\(/i',
];
$max = 0;
foreach ($patterns as $p) {
$n = preg_match_all($p, $src, $m);
if ($n > $max) $max = $n;
}
return $max;
}
$out = [
'generated_at' => date('c'),
'host' => gethostname(),
'intents' => [],
'tools' => [],
'skills' => [],
'vault' => [],
'wiki' => [],
'archi_flow' => [],
'pilotage' => [],
'stats_summary' => [],
];
// ===== INTENTS — vrais chemins =====
$intent_files = [
// /var/www/html/api/
'wevia-master-api' => '/var/www/html/api/wevia-master-api.php',
'wevia-opus-intents' => '/var/www/html/api/wevia-opus-intents.php',
'wevia-opus46-intents' => '/var/www/html/api/wevia-opus46-intents.php',
'wevia-opus-write' => '/var/www/html/api/wevia-opus-write-intents.php',
'wevia-fast-path-v3' => '/var/www/html/api/wevia-fast-path-v3.php',
'wevia-opus-autonomy' => '/var/www/html/api/wevia-opus-autonomy.php',
'wevia-dynamic-resolver' => '/var/www/html/api/wevia-dynamic-resolver.php',
'wevia-smart-router' => '/var/www/html/api/wevia-smart-router.php',
'wevia-arena-engine' => '/var/www/html/api/wevia-arena-engine.php',
'wevia-arena-evolve' => '/var/www/html/api/wevia-arena-evolve.php',
'wevia-wave114' => '/var/www/html/api/wevia-wave114.php',
'wave116-auto' => '/var/www/html/api/wave116-auto.php',
// /opt/wevia-brain/
'arena-pre-intents' => '/opt/wevia-brain/arena-pre-intents.php',
'wevia-dynamic-resolver-brain' => '/opt/wevia-brain/wevia-dynamic-resolver.php',
'wevia-wave200' => '/opt/wevia-brain/wevia-wave200.php',
'wevia-gap-intents' => '/opt/wevia-brain/wevia-gap-intents.php',
'wevia-master-router' => '/opt/wevia-brain/wevia-master-router.php',
'opus4-autowire-handler' => '/opt/wevia-brain/opus4-autowire-handler.php',
'wevia-strategic-guard' => '/opt/wevia-brain/wevia-strategic-guard.php',
'wevia-vault-context' => '/opt/wevia-brain/wevia-vault-context.php',
];
$total_intents = 0;
foreach ($intent_files as $name => $path) {
if (is_file($path) && is_readable($path)) {
$src = @file_get_contents($path);
$n = count_intents($src);
$total_intents += $n;
$out['intents'][$name] = [
'path' => $path,
'size' => filesize($path),
'lines' => substr_count($src, "\n"),
'count' => $n,
'mtime' => date('c', @filemtime($path)),
];
} else {
$out['intents'][$name] = ['path' => $path, 'exists' => false];
}
}
// Wired-pending intents (chacun = 1 intent individuel)
$wired_pending = glob('/var/www/html/api/wired-pending/intent-*.php');
$out['intents']['wired-pending-dir'] = [
'path' => '/var/www/html/api/wired-pending/',
'count' => count($wired_pending),
'sample' => array_slice(array_map('basename', $wired_pending), 0, 10),
];
$total_intents += count($wired_pending);
// Registry JSON
$registries = [
'arena-intent-registry' => '/var/www/html/api/arena-intent-registry.json',
'wevia-master-brain' => '/var/www/html/api/wevia-master-brain.json',
'master-orchestrator' => '/var/www/html/api/master-orchestrator.json',
];
foreach ($registries as $k => $p) {
if (is_file($p)) {
$j = @json_decode(@file_get_contents($p), true);
$cnt = is_array($j) ? count($j) : 0;
$out['intents'][$k] = [
'path' => $p,
'size' => filesize($p),
'count' => $cnt,
'kind' => 'registry',
];
}
}
// ===== TOOLS =====
$tool_files = array_unique(array_merge(
glob('/var/www/html/api/*tool*.php') ?: [],
glob('/var/www/weval/api/*tool*.php') ?: [],
glob('/opt/wevia-brain/*tool*.php') ?: []
));
$out['tools']['files'] = [];
foreach ($tool_files as $tf) {
$out['tools']['files'][] = [
'path' => $tf,
'size' => filesize($tf),
];
}
// Fetch router catalog
$ch = @curl_init('http://localhost/api/wevia-tools-router.php?action=list');
if ($ch) {
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>1, CURLOPT_TIMEOUT=>3]);
$r = @curl_exec($ch);
curl_close($ch);
if ($r) {
$j = @json_decode($r, true);
$out['tools']['router_count'] = $j['count'] ?? 0;
$out['tools']['router_names'] = $j['available_tools'] ?? [];
}
}
$out['tools']['total_count'] = max(
count($out['tools']['files']),
$out['tools']['router_count'] ?? 0
);
// Dynamic resolver tool catalog (382 tools memory claim)
$resolver_paths = [
'/opt/wevia-brain/wevia-dynamic-resolver.php',
'/var/www/html/api/wevia-dynamic-resolver.php',
];
foreach ($resolver_paths as $rp) {
if (is_file($rp)) {
$src = @file_get_contents($rp);
$n_tools = preg_match_all('/[\'"]tool[\'"]\s*=>\s*[\'"][a-z0-9_]+/i', $src, $m);
if ($n_tools === 0) $n_tools = preg_match_all('/[\'"]name[\'"]\s*=>\s*[\'"][a-z0-9_]+/i', $src, $m);
if ($n_tools === 0) $n_tools = preg_match_all('/case\s+[\'"][a-z0-9_]+[\'"]\s*:/i', $src, $m);
$out['tools']['dynamic_resolver_'.basename(dirname($rp))] = [
'path' => $rp,
'size' => filesize($rp),
'tool_count_estimate' => $n_tools,
];
}
}
// ===== SKILLS =====
$skills_root = '/var/www/weval/skills';
if (is_dir($skills_root)) {
$dirs = array_filter(glob("$skills_root/*"), 'is_dir');
foreach ($dirs as $d) {
$name = basename($d);
if (strpos($name, '{') !== false) continue;
$count = count(array_filter(glob("$d/*"), function($f){ return is_dir($f) || is_file($f); }));
$out['skills']['dirs'][$name] = ['path' => $d, 'items' => $count];
}
if (is_file("$skills_root/manifest.json")) {
$mf = @json_decode(@file_get_contents("$skills_root/manifest.json"), true);
$out['skills']['manifest'] = [
'path' => "$skills_root/manifest.json",
'size' => filesize("$skills_root/manifest.json"),
'count' => is_array($mf) ? count($mf) : 0,
];
}
}
// ===== VAULT =====
$gold_paths = [
'/var/www/html/api/_GOLD',
'/var/www/html/_vault',
'/var/www/weval/vault',
'/var/www/html/vault',
'/opt/wevia-brain/vault',
];
$total_golds = 0;
foreach ($gold_paths as $gp) {
if (is_dir($gp)) {
$files = glob("$gp/*") ?: [];
$n = count($files);
$out['vault'][basename($gp)] = ['path' => $gp, 'count' => $n];
$total_golds += $n;
}
}
// Chercher aussi les .gold-* dans /var/www/html/ direct
$gold_inline = glob('/var/www/html/*.gold-*') ?: [];
$gold_inline_api = glob('/var/www/html/api/*.gold-*') ?: [];
$total_golds += count($gold_inline) + count($gold_inline_api);
$out['vault']['inline_html'] = ['count' => count($gold_inline)];
$out['vault']['inline_api'] = ['count' => count($gold_inline_api)];
$out['vault']['total'] = $total_golds;
// ===== WIKI =====
$wiki_paths = [
'/var/www/html/wiki',
'/var/www/html/api/wiki',
'/var/www/html/api/wiki-entries',
];
$wiki_total = 0;
$out['wiki']['dirs'] = [];
foreach ($wiki_paths as $wp) {
if (is_dir($wp)) {
$html = count(glob("$wp/*.html") ?: []);
$md = count(glob("$wp/*.md") ?: []);
$json = count(glob("$wp/*.json") ?: []);
$total = $html + $md + $json;
$wiki_total += $total;
$out['wiki']['dirs'][$wp] = ['html' => $html, 'md' => $md, 'json' => $json, 'total' => $total];
}
}
$out['wiki']['total'] = $wiki_total;
// ===== ARCHI FLOW =====
$out['archi_flow'] = [
['step' => 1, 'name' => 'entry_point', 'desc' => '/api/wevia-master-api.php', 'file' => '/var/www/html/api/wevia-master-api.php'],
['step' => 2, 'name' => 'opus-write-intents', 'desc' => 'Learning loop v2 — capture avant tout', 'file' => '/var/www/html/api/wevia-opus-write-intents.php'],
['step' => 3, 'name' => 'opus46-intents', 'desc' => '62 intents opus46 bypass', 'file' => '/var/www/html/api/wevia-opus46-intents.php'],
['step' => 4, 'name' => 'opus-intents', 'desc' => '87 intents exec priority', 'file' => '/var/www/html/api/wevia-opus-intents.php'],
['step' => 5, 'name' => 'fast-path-v3', 'desc' => '218 intents NL-priority', 'file' => '/var/www/html/api/wevia-fast-path-v3.php'],
['step' => 6, 'name' => 'opus-autonomy', 'desc' => 'exec/paperclip/archi-aware/self-wire', 'file' => '/var/www/html/api/wevia-opus-autonomy.php'],
['step' => 7, 'name' => 'arena-pre-intents', 'desc' => 'pré-arena dispatch', 'file' => '/opt/wevia-brain/arena-pre-intents.php'],
['step' => 8, 'name' => 'dynamic-resolver', 'desc' => 'tools catalog dispatch', 'file' => '/opt/wevia-brain/wevia-dynamic-resolver.php'],
['step' => 9, 'name' => 'wave200', 'desc' => 'extended intent wave', 'file' => '/opt/wevia-brain/wevia-wave200.php'],
['step' => 10, 'name' => 'gap-intents', 'desc' => 'gap closure layer', 'file' => '/opt/wevia-brain/wevia-gap-intents.php'],
['step' => 11, 'name' => 'master-router', 'desc' => 'LLM provider cascade', 'file' => '/opt/wevia-brain/wevia-master-router.php'],
['step' => 12, 'name' => 'opus4-autowire', 'desc' => 'auto-wire NL handler', 'file' => '/opt/wevia-brain/opus4-autowire-handler.php'],
['step' => 13, 'name' => 'strategic-guard', 'desc' => 'security/strategic filter', 'file' => '/opt/wevia-brain/wevia-strategic-guard.php'],
['step' => 14, 'name' => 'LLM cascade', 'desc' => 'Cerebras>Groq>SambaNova>Gemini>CF>NVIDIA>OpenRouter>Mistral>Cohere'],
];
// ===== PILOTAGE =====
$out['pilotage'] = [
'nonreg_run' => '/api/nonreg-api.php?cat=all',
'infra_monitor' => '/api/infra-monitor-api.php',
'providers_status' => '/api/openclaw-proxy.php',
'wevia_stats' => '/api/wevia-master-api.php?stats',
'wevia_health' => '/api/wevia-master-api.php?health',
'wevia_dashboard' => '/api/wevia-master-api.php?dashboard',
'tools_catalog' => '/api/wevia-tools-router.php?action=list',
'intent_test' => '/api/wevia-master-api.php?test=1',
'git_status' => '/api/git-status-api.php',
'l99_status' => '/api/l99-api.php',
'brain_json' => '/api/wevia-master-brain.json',
'autonomy_status' => '/api/wevia-autonomy-status.json',
];
// ===== SUMMARY =====
$out['stats_summary'] = [
'total_intents_files' => count(array_filter($intent_files, 'is_file')),
'total_intents_count' => $total_intents,
'total_tools_router' => $out['tools']['router_count'] ?? 0,
'total_skills_dirs' => count($out['skills']['dirs'] ?? []),
'total_vault' => $total_golds,
'total_wiki' => $wiki_total,
'archi_steps' => count($out['archi_flow']),
'pilotage_actions' => count($out['pilotage']),
];
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);