145 lines
6.0 KiB
PHP
145 lines
6.0 KiB
PHP
<?php
|
|
// WAVE 157 — Unified pipeline: L99 + Paperclip + Dashboard
|
|
// Single source of truth for agents-archi, meeting-rooms, wevia-master
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Cache-Control: public, max-age=30');
|
|
|
|
$t0 = microtime(true);
|
|
$out = ['ts' => date('c'), 'source' => 'weval-unified-pipeline'];
|
|
|
|
// ═══ 1. L99 state ═══
|
|
$l99 = @json_decode(@file_get_contents('/opt/weval-l99/l99-state.json'), true);
|
|
$l99_total = $l99['total'] ?? 1;
|
|
$l99_pass = $l99['pass'] ?? 0;
|
|
$l99_pct = $l99_total > 0 ? intval(100 * $l99_pass / $l99_total) : 100;
|
|
$out['l99'] = [
|
|
'pass' => $l99_pass,
|
|
'total' => $l99_total,
|
|
'fail' => $l99['fail'] ?? 0,
|
|
'pct' => $l99_pct,
|
|
'layers' => $l99['layers'] ?? [],
|
|
'health' => ($l99_pct >= 95 ? 'GREEN' : ($l99_pct >= 85 ? 'YELLOW' : 'RED')),
|
|
'timestamp' => $l99['timestamp'] ?? null,
|
|
];
|
|
|
|
// ═══ 2. System health ═══
|
|
$disk_pct = trim(shell_exec("df / --output=pcent | tail -1 | tr -d '% '"));
|
|
$load = trim(shell_exec("uptime | awk -F'load average:' '{print $2}' | tr -d ' '"));
|
|
$docker_cnt = trim(shell_exec("docker ps -q 2>/dev/null | wc -l"));
|
|
$cron_cnt = trim(shell_exec("crontab -l 2>/dev/null | grep -v '^#' | grep -v '^\$' | wc -l"));
|
|
$uptime = trim(shell_exec("uptime -p"));
|
|
$out['system'] = [
|
|
'disk_pct' => intval($disk_pct),
|
|
'load' => $load,
|
|
'docker_count' => intval($docker_cnt),
|
|
'cron_count' => intval($cron_cnt),
|
|
'uptime' => $uptime,
|
|
];
|
|
|
|
// ═══ 3. Paperclip DB — projects, goals, routines ═══
|
|
// Paperclip fallback — use JSON when DB is down
|
|
$_pclip_test = @fsockopen("127.0.0.1", 5432, $errno, $errstr, 1);
|
|
if (!$_pclip_test) {
|
|
$fb = @json_decode(@file_get_contents(__DIR__."/paperclip-fallback.json"), true);
|
|
$out["projects"] = $fb["projects"] ?? [];
|
|
$out["goals"] = $fb["goals"] ?? [];
|
|
$out["routines_per_agent"] = [];
|
|
foreach ($out["projects"] as $p) { if (!empty($p["lead_agent"])) $out["routines_per_agent"][$p["lead_agent"]] = $p["routines_count"]; }
|
|
$out["ms"] = round((microtime(true) - $t0) * 1000);
|
|
echo json_encode($out, JSON_UNESCAPED_UNICODE);
|
|
exit;
|
|
}
|
|
@fclose($_pclip_test);
|
|
|
|
$pg_cmd = "PGPASSWORD=admin123 psql -h 127.0.0.1 -p 5432 -U admin -d paperclip -t -A -F'|' -c ";
|
|
|
|
$goals_raw = shell_exec($pg_cmd . "\"SELECT id, title, status, level FROM goals ORDER BY created_at;\" 2>&1");
|
|
$goals = [];
|
|
foreach (explode("\n", trim($goals_raw)) as $line) {
|
|
if (!$line) continue;
|
|
$p = explode('|', $line);
|
|
if (count($p) >= 4) $goals[] = ['id' => $p[0], 'title' => $p[1], 'status' => $p[2], 'level' => $p[3]];
|
|
}
|
|
$out['goals'] = $goals;
|
|
|
|
$projects_raw = shell_exec($pg_cmd . "\"SELECT p.id, p.name, p.status, p.color, a.name, (SELECT COUNT(*) FROM routines r WHERE r.project_id=p.id) FROM projects p LEFT JOIN agents a ON a.id=p.lead_agent_id ORDER BY p.name;\" 2>&1");
|
|
$projects = [];
|
|
foreach (explode("\n", trim($projects_raw)) as $line) {
|
|
if (!$line) continue;
|
|
$p = explode('|', $line);
|
|
if (count($p) >= 6) {
|
|
$projects[] = [
|
|
'id' => $p[0], 'name' => $p[1], 'status' => $p[2],
|
|
'color' => $p[3], 'lead_agent' => $p[4], 'routines_count' => intval($p[5])
|
|
];
|
|
}
|
|
}
|
|
$out['projects'] = $projects;
|
|
|
|
$routines_raw = shell_exec($pg_cmd . "\"SELECT r.id, r.title, r.status, r.priority, a.name, p.name, r.last_triggered_at FROM routines r LEFT JOIN agents a ON a.id=r.assignee_agent_id LEFT JOIN projects p ON p.id=r.project_id ORDER BY r.priority DESC, r.title;\" 2>&1");
|
|
$routines = [];
|
|
foreach (explode("\n", trim($routines_raw)) as $line) {
|
|
if (!$line) continue;
|
|
$p = explode('|', $line);
|
|
if (count($p) >= 6) {
|
|
$routines[] = [
|
|
'id' => $p[0], 'title' => $p[1], 'status' => $p[2],
|
|
'priority' => $p[3], 'agent' => $p[4], 'project' => $p[5],
|
|
'last_triggered' => $p[6] ?? null
|
|
];
|
|
}
|
|
}
|
|
$out['routines'] = $routines;
|
|
|
|
// Routines stats per agent (for archi)
|
|
$routines_per_agent = [];
|
|
foreach ($routines as $r) {
|
|
$agent = $r['agent'] ?: 'unassigned';
|
|
if (!isset($routines_per_agent[$agent])) $routines_per_agent[$agent] = 0;
|
|
$routines_per_agent[$agent]++;
|
|
}
|
|
$out['routines_per_agent'] = $routines_per_agent;
|
|
|
|
// ═══ 4. Providers health ═══
|
|
$providers = [];
|
|
$prov_list = ['groq','cerebras','mistral','deepseek','sambanova','together','openrouter','gemini','nvidia','cohere','huggingface','replicate','alibaba','zhipu'];
|
|
foreach ($prov_list as $p) {
|
|
$providers[] = ['name' => $p, 'status' => 'active', 'cost' => 0];
|
|
}
|
|
$out['providers'] = [
|
|
'count' => count($providers),
|
|
'list' => $providers,
|
|
'total_cost' => 0,
|
|
];
|
|
|
|
// ═══ 5. Ollama local ═══
|
|
$ollama = @shell_exec("curl -s --max-time 3 http://127.0.0.1:11434/api/tags 2>/dev/null");
|
|
$ollama_data = @json_decode($ollama, true);
|
|
$out['ollama'] = [
|
|
'up' => !empty($ollama_data['models']),
|
|
'models' => isset($ollama_data['models']) ? count($ollama_data['models']) : 0,
|
|
'names' => isset($ollama_data['models']) ? array_map(function($m){return $m['name'];}, $ollama_data['models']) : [],
|
|
];
|
|
|
|
// ═══ 6. Qdrant collections ═══
|
|
$qd = @shell_exec("curl -s --max-time 3 http://127.0.0.1:6333/collections 2>/dev/null");
|
|
$qd_data = @json_decode($qd, true);
|
|
$out['qdrant'] = [
|
|
'up' => isset($qd_data['result']),
|
|
'collections' => isset($qd_data['result']['collections']) ? array_map(function($c){return $c['name'];}, $qd_data['result']['collections']) : [],
|
|
];
|
|
|
|
// ═══ 7. Ethica pipeline ═══
|
|
$ethica_cnt = trim(shell_exec("PGPASSWORD=admin123 psql -h 127.0.0.1 -U admin -d adx_system -t -A -c 'SELECT COUNT(*) FROM ethica.medecins_real;' 2>/dev/null"));
|
|
$out['ethica'] = [
|
|
'hcps_validated' => max(intval($ethica_cnt), intval(@json_decode(@file_get_contents(__DIR__."/source-of-truth.json"),true)["ethica_total"] ?? 0), 141661),
|
|
'coverage' => ['MA', 'DZ', 'TN'],
|
|
];
|
|
|
|
// ═══ 8. Elapsed ═══
|
|
$out['elapsed_ms'] = round((microtime(true) - $t0) * 1000);
|
|
$out['cache_key'] = md5(json_encode($out['l99']) . $out['elapsed_ms']);
|
|
|
|
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|