diff --git a/api/$_IC b/api/$_IC index 6ba9e3b2f..5db4107ac 100644 --- a/api/$_IC +++ b/api/$_IC @@ -1 +1 @@ -{"timestamp":"2026-04-06 20:47:21","scan_ms":7791,"servers":{"s204":{"ip":"204.168.152.13","label":"S204 Primary","services":[{"name":"nginx","status":"active","port":"80\/443"},{"name":"php-fpm","status":"active","port":"9000"},{"name":"postgresql-16","status":"active","port":"5432"},{"name":"deerflow","status":"active","port":"2024"},{"name":"deerflow-gw","status":"active","port":"8001"},{"name":"deerflow-fe","status":"active","port":"3000"},{"name":"ollama","status":"active","port":"11434","info":"9 models"}],"docker":[{"name":"authentik-db","status":"Up 31 minutes"},{"name":"authentik-redis","status":"Up 31 minutes"},{"name":"authentik-server","status":"Up 26 minutes (healthy)"},{"name":"authentik-worker","status":"Up 26 minutes (healthy)"},{"name":"chatwoot-redis","status":"Up 31 minutes"},{"name":"langfuse","status":"Up 31 minutes"},{"name":"loki","status":"Up 31 minutes"},{"name":"mattermost","status":"Up 31 minutes (healthy)"},{"name":"n8n","status":"Up 31 minutes"},{"name":"node-exporter","status":"Up 31 minutes"},{"name":"plausible-db","status":"Up 31 minutes"},{"name":"plausible-events","status":"Up 31 minutes"},{"name":"plausible","status":"Up 31 minutes"},{"name":"prometheus","status":"Up 31 minutes"},{"name":"qdrant","status":"Up 31 minutes"},{"name":"searxng","status":"Up 31 minutes"},{"name":"twenty-redis","status":"Up 31 minutes"},{"name":"twenty","status":"Up 31 minutes"},{"name":"uptime-kuma","status":"Up 31 minutes (healthy)"},{"name":"vaultwarden","status":"Up 31 minutes (healthy)"}]},"s95":{"ip":"95.216.167.89","label":"S95 WEVADS","services":[{"name":"kumomta","status":"active","port":"587"},{"name":"apache2","status":"active","port":"80"},{"name":"postgresql","status":"active","port":"5432"},{"name":"postfix","status":"active","port":"2525"},{"name":"pmta","status":"active","port":"25"},{"name":"sentinel","status":"active","port":"5890"},{"name":"adx","status":"active","port":"5821"},{"name":"arsenal","status":"active","port":"5822"}],"docker":[{"name":"listmonk_db","status":"Up 3 days"},{"name":"listmonk","status":"Up 3 days"}]},"s151":{"ip":"151.80.235.110","label":"S151 OVH","services":[{"name":"nginx","status":"active","port":"80"},{"name":"php-fpm","status":"active","port":"9000"},{"name":"postgresql","status":"active","port":"5432"},{"name":"ollama","status":"active","port":"11434"}],"docker":[{"name":"ollama","status":"Up 13 days"}]},"blade":{"ip":"local","label":"Razer Blade","services":[{"name":"Sentinel Agent","status":"active","port":"\u2014","info":"C:\\ProgramData\\WEVAL\\sentinel-agent.ps1"}],"docker":[]}},"crons":[{"server":"S95","user":"root","schedule":"*\/30 * * * *","command":"php \/opt\/wevads\/scripts\/ethica\/ethica-validator.php 500 >> \/opt\/wevads\/logs\/ethica-validator.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"0 *\/4 * * *","command":"php \/opt\/wevads\/scripts\/cron-bounces.php >> \/var\/log\/wevads\/bounces.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"0 3 * * *","command":"\/root\/backups\/daily_backup.sh","source":"crontab"},{"server":"S95","user":"root","schedule":"0 4 * * *","command":"\/opt\/wevads\/scripts\/auto-backup-github.sh >> \/var\/log\/wevads\/backup.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"30 0 * * *","command":"php \/opt\/wevads\/scripts\/daily-stats-aggregate.php >> \/var\/log\/wevads\/daily-stats.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"30 1 * * *","command":"php \/opt\/wevads\/scripts\/cron-engagement.php >> \/var\/log\/wevads\/engagement.log 2>&1","source":"crontab"},{"server":"S151","user":"ubuntu","schedule":"*\/5 * * * *","command":"curl -s -m 10 http:\/\/localhost:11434\/api\/generate -d {model:granite4,prompt:ok,stream:false,keep_alive:-1} > \/dev\/null 2>&1","source":"crontab"},{"server":"S151","user":"ubuntu","schedule":"*\/10 * * * *","command":"docker start openclaw 2>\/dev\/null","source":"crontab"},{"server":"S151","user":"root","schedule":"*\/5 * * * *","command":"\/opt\/tracking_monitor.sh","source":"crontab"},{"server":"Blade","user":"SYSTEM","schedule":"*\/60s loop","command":"sentinel-agent.ps1 (auto-sync S204)","source":"Task Scheduler"}],"stats":{"total_crons":10,"total_services":20,"total_docker":23}} \ No newline at end of file +{"timestamp":"2026-04-06 20:47:39","scan_ms":7959,"servers":{"s204":{"ip":"204.168.152.13","label":"S204 Primary","services":[{"name":"nginx","status":"active","port":"80\/443"},{"name":"php-fpm","status":"active","port":"9000"},{"name":"postgresql-16","status":"active","port":"5432"},{"name":"deerflow","status":"active","port":"2024"},{"name":"deerflow-gw","status":"active","port":"8001"},{"name":"deerflow-fe","status":"active","port":"3000"},{"name":"ollama","status":"active","port":"11434","info":"9 models"}],"docker":[{"name":"authentik-db","status":"Up 32 minutes"},{"name":"authentik-redis","status":"Up 32 minutes"},{"name":"authentik-server","status":"Up 27 minutes (healthy)"},{"name":"authentik-worker","status":"Up 27 minutes (healthy)"},{"name":"chatwoot-redis","status":"Up 32 minutes"},{"name":"langfuse","status":"Up 32 minutes"},{"name":"loki","status":"Up 32 minutes"},{"name":"mattermost","status":"Up 32 minutes (healthy)"},{"name":"n8n","status":"Up 32 minutes"},{"name":"node-exporter","status":"Up 32 minutes"},{"name":"plausible-db","status":"Up 32 minutes"},{"name":"plausible-events","status":"Up 32 minutes"},{"name":"plausible","status":"Up 32 minutes"},{"name":"prometheus","status":"Up 32 minutes"},{"name":"qdrant","status":"Up 32 minutes"},{"name":"searxng","status":"Up 32 minutes"},{"name":"twenty-redis","status":"Up 32 minutes"},{"name":"twenty","status":"Up 32 minutes"},{"name":"uptime-kuma","status":"Up 32 minutes (healthy)"},{"name":"vaultwarden","status":"Up 32 minutes (healthy)"}]},"s95":{"ip":"95.216.167.89","label":"S95 WEVADS","services":[{"name":"kumomta","status":"active","port":"587"},{"name":"apache2","status":"active","port":"80"},{"name":"postgresql","status":"active","port":"5432"},{"name":"postfix","status":"active","port":"2525"},{"name":"pmta","status":"active","port":"25"},{"name":"sentinel","status":"active","port":"5890"},{"name":"adx","status":"active","port":"5821"},{"name":"arsenal","status":"active","port":"5822"}],"docker":[{"name":"listmonk_db","status":"Up 3 days"},{"name":"listmonk","status":"Up 3 days"}]},"s151":{"ip":"151.80.235.110","label":"S151 OVH","services":[{"name":"nginx","status":"active","port":"80"},{"name":"php-fpm","status":"active","port":"9000"},{"name":"postgresql","status":"active","port":"5432"},{"name":"ollama","status":"active","port":"11434"}],"docker":[{"name":"ollama","status":"Up 13 days"}]},"blade":{"ip":"local","label":"Razer Blade","services":[{"name":"Sentinel Agent","status":"active","port":"\u2014","info":"C:\\ProgramData\\WEVAL\\sentinel-agent.ps1"}],"docker":[]}},"crons":[{"server":"S95","user":"root","schedule":"*\/30 * * * *","command":"php \/opt\/wevads\/scripts\/ethica\/ethica-validator.php 500 >> \/opt\/wevads\/logs\/ethica-validator.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"0 *\/4 * * *","command":"php \/opt\/wevads\/scripts\/cron-bounces.php >> \/var\/log\/wevads\/bounces.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"0 3 * * *","command":"\/root\/backups\/daily_backup.sh","source":"crontab"},{"server":"S95","user":"root","schedule":"0 4 * * *","command":"\/opt\/wevads\/scripts\/auto-backup-github.sh >> \/var\/log\/wevads\/backup.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"30 0 * * *","command":"php \/opt\/wevads\/scripts\/daily-stats-aggregate.php >> \/var\/log\/wevads\/daily-stats.log 2>&1","source":"crontab"},{"server":"S95","user":"root","schedule":"30 1 * * *","command":"php \/opt\/wevads\/scripts\/cron-engagement.php >> \/var\/log\/wevads\/engagement.log 2>&1","source":"crontab"},{"server":"S151","user":"ubuntu","schedule":"*\/5 * * * *","command":"curl -s -m 10 http:\/\/localhost:11434\/api\/generate -d {model:granite4,prompt:ok,stream:false,keep_alive:-1} > \/dev\/null 2>&1","source":"crontab"},{"server":"S151","user":"ubuntu","schedule":"*\/10 * * * *","command":"docker start openclaw 2>\/dev\/null","source":"crontab"},{"server":"S151","user":"root","schedule":"*\/5 * * * *","command":"\/opt\/tracking_monitor.sh","source":"crontab"},{"server":"Blade","user":"SYSTEM","schedule":"*\/60s loop","command":"sentinel-agent.ps1 (auto-sync S204)","source":"Task Scheduler"}],"stats":{"total_crons":10,"total_services":20,"total_docker":23}} \ No newline at end of file diff --git a/api/wevia-enterprise-fleet.php b/api/wevia-enterprise-fleet.php index d5f293bc7..ac1065847 100644 --- a/api/wevia-enterprise-fleet.php +++ b/api/wevia-enterprise-fleet.php @@ -1,298 +1,77 @@ [ - "head" => ["id"=>"CEO","name"=>"CEO / Directeur Général","role"=>"Vision stratégique, décisions finales, P&L","agent"=>"wevia-master"], - "members" => [ - ["id"=>"CTO","name"=>"CTO / Directeur Technique","role"=>"Architecture, stack technique, R&D, innovation souveraine"], - ["id"=>"COO","name"=>"COO / Directeur des Opérations","role"=>"Delivery, SLA, processus métier, efficacité opérationnelle"], - ["id"=>"CFO","name"=>"CFO / Directeur Financier","role"=>"Budget, ROI, facturation, coûts infra (0€ AI target)"], - ["id"=>"CISO","name"=>"CISO / Directeur Sécurité","role"=>"Cybersécurité, audit, compliance RGPD, pen-testing"], - ] - ], - - // PRODUCT & ENGINEERING - "PRODUCT" => [ - "head" => ["id"=>"CPO","name"=>"Chief Product Officer","role"=>"Roadmap produit, priorisation features, market fit"], - "squad_leader" => ["id"=>"SL-PROD","name"=>"Squad Leader Product","role"=>"Interface WEVIA Master ↔ Product team"], - "members" => [ - ["id"=>"PO-WEVIA","name"=>"Product Owner WEVIA","role"=>"Backlog WEVIA Master AI, user stories, acceptance criteria"], - ["id"=>"PO-WEVADS","name"=>"Product Owner WEVADS","role"=>"Backlog WEVADS Arsenal, email marketing, campaigns"], - ["id"=>"PO-ETHICA","name"=>"Product Owner Ethica","role"=>"Backlog Ethica HCP, pharma compliance, scraping pipeline"], - ["id"=>"PO-L99","name"=>"Product Owner L99","role"=>"Backlog L99 QA Platform, test coverage, visual analysis"], - ["id"=>"SM-SPRINT","name"=>"Scrum Master","role"=>"Sprint planning, daily standup, retrospective, velocity tracking"], - ["id"=>"UX-LEAD","name"=>"UX/UI Lead","role"=>"Design system, accessibilité, responsive, dark mode consistency"], - ] - ], - - // ENGINEERING - "ENGINEERING" => [ - "head" => ["id"=>"VP-ENG","name"=>"VP Engineering","role"=>"Architecture technique, code quality, DevOps, CI/CD"], - "squad_leader" => ["id"=>"SL-ENG","name"=>"Squad Leader Engineering","role"=>"Interface WEVIA Master ↔ Dev team"], - "members" => [ - ["id"=>"ARCH","name"=>"Architecte Solutions","role"=>"Architecture microservices, scalabilité, patterns"], - ["id"=>"DEVOPS","name"=>"DevOps Engineer","role"=>"Docker, nginx, CI/CD, monitoring, Prometheus/Loki"], - ["id"=>"BACKEND","name"=>"Backend Lead","role"=>"PHP APIs, PostgreSQL, Qdrant, RAG pipeline"], - ["id"=>"FRONTEND","name"=>"Frontend Lead","role"=>"React, HTML/JS, dashboards L99, Arsenal, Ethica"], - ["id"=>"AI-ENG","name"=>"AI/ML Engineer","role"=>"Ollama fine-tuning, RAG, embeddings, provider cascade"], - ["id"=>"DBA","name"=>"Database Admin","role"=>"PostgreSQL, Qdrant, migrations, backup, performance"], - ] - ], - - // QUALITY & TESTING - "QUALITE" => [ - "head" => ["id"=>"DQ","name"=>"Directeur Qualité","role"=>"6σ Lean, ISO 27001, DMAIC, KPIs qualité, certification"], - "squad_leader" => ["id"=>"SL-QA","name"=>"Squad Leader QA","role"=>"Interface WEVIA Master ↔ QA team"], - "members" => [ - ["id"=>"QA-LEAD","name"=>"QA Lead","role"=>"Stratégie test, coverage gaps, regression suites"], - ["id"=>"QA-AUTO","name"=>"QA Automation","role"=>"Playwright E2E, Selenium, visual regression, video recording"], - ["id"=>"QA-PERF","name"=>"QA Performance","role"=>"Load testing, latency benchmarks, provider speed"], - ["id"=>"QA-SEC","name"=>"QA Security","role"=>"Pen-testing, OWASP, vulnérabilités, audit sécurité"], - ["id"=>"BPO","name"=>"Business Process Owner","role"=>"Processus métier, workflows n8n, automatisation"], - ] - ], - - // SALES & CONSULTING - "COMMERCIAL" => [ - "head" => ["id"=>"CSO","name"=>"Directeur Commercial","role"=>"Pipeline, deals, partenariats SAP/Huawei/Vistex"], - "squad_leader" => ["id"=>"SL-SALES","name"=>"Squad Leader Sales","role"=>"Interface WEVIA Master ↔ Sales team"], - "members" => [ - ["id"=>"BD","name"=>"Business Developer","role"=>"Prospection, leads, Ethica pharma outreach"], - ["id"=>"CSM","name"=>"Customer Success Manager","role"=>"Onboarding, satisfaction, rétention, NPS"], - ["id"=>"CONSULT","name"=>"Consultant SAP/Cloud","role"=>"Delivery missions SAP S/4HANA, Huawei Cloud, Vistex"], - ["id"=>"PRESALES","name"=>"Pre-Sales Engineer","role"=>"Démos, POC, réponses AO, chiffrage"], - ] - ], - - // OPERATIONS & INFRA - "OPERATIONS" => [ - "head" => ["id"=>"DIR-OPS","name"=>"Directeur Opérations","role"=>"Infra, SLA, incidents, capacity planning"], - "squad_leader" => ["id"=>"SL-OPS","name"=>"Squad Leader Ops","role"=>"Interface WEVIA Master ↔ Ops team"], - "members" => [ - ["id"=>"SRE","name"=>"Site Reliability Engineer","role"=>"Uptime 99.9%, alerting, auto-healing, runbooks"], - ["id"=>"SYSADMIN","name"=>"Sysadmin","role"=>"S204+S95+S151+Blade, patches, backup, DR"], - ["id"=>"NETOPS","name"=>"Network Ops","role"=>"DNS, Cloudflare, SSL, firewall, VPN Hetzner"], - ["id"=>"MTA-OPS","name"=>"MTA Operations","role"=>"PMTA, KumoMTA, Postfix, deliverability, IP warming"], - ] - ], - - // DATA & ANALYTICS - "DATA" => [ - "head" => ["id"=>"CDO","name"=>"Chief Data Officer","role"=>"Data strategy, analytics, BI, data quality"], - "squad_leader" => ["id"=>"SL-DATA","name"=>"Squad Leader Data","role"=>"Interface WEVIA Master ↔ Data team"], - "members" => [ - ["id"=>"DE","name"=>"Data Engineer","role"=>"ETL, pipelines Ethica, HCP validation, scraping"], - ["id"=>"DS","name"=>"Data Scientist","role"=>"ML models, scoring, segmentation, prédictif"], - ["id"=>"DA","name"=>"Data Analyst","role"=>"Plausible analytics, KPIs, dashboards, reporting"], - ] - ], - - // MARKETING - "MARKETING" => [ - "head" => ["id"=>"CMO","name"=>"Directeur Marketing","role"=>"Brand, content, SEO, digital marketing"], - "squad_leader" => ["id"=>"SL-MKT","name"=>"Squad Leader Marketing","role"=>"Interface WEVIA Master ↔ Marketing team"], - "members" => [ - ["id"=>"SEO","name"=>"SEO Specialist","role"=>"Référencement, content, blog, backlinks"], - ["id"=>"CRM-MGR","name"=>"CRM Manager","role"=>"Twenty CRM, contacts, nurturing, email sequences"], - ["id"=>"CONTENT","name"=>"Content Manager","role"=>"Blog, use cases, whitepapers, social media"], - ] - ], - - // ACHATS & LOGISTIQUE - "ACHATS" => [ - "head" => ["id"=>"DAL","name"=>"Directeur Achats & Logistique","role"=>"Fournisseurs, coûts, contrats, licences"], - "members" => [ - ["id"=>"BUYER","name"=>"Acheteur IT","role"=>"Serveurs Hetzner/OVH, licences, comparatifs"], - ["id"=>"VENDOR","name"=>"Vendor Manager","role"=>"Relations SAP, Huawei, Vistex, négociations"], - ] - ], - - // RH & FORMATION - "RH" => [ - "head" => ["id"=>"DRH","name"=>"Directeur RH","role"=>"Recrutement, formation, culture, onboarding"], - "members" => [ - ["id"=>"RECRUITER","name"=>"Recruteur Tech","role"=>"Sourcing, entretiens, pipeline candidats"], - ["id"=>"TRAINER","name"=>"Responsable Formation","role"=>"Onboarding, certifications SAP/Cloud, skills matrix"], - ] - ], - - // JURIDIQUE & COMPLIANCE - "LEGAL" => [ - "head" => ["id"=>"DJ","name"=>"Directeur Juridique","role"=>"Contrats, RGPD, compliance, propriété intellectuelle"], - "members" => [ - ["id"=>"DPO","name"=>"DPO (Data Protection)","role"=>"RGPD, consentement, registre traitements, Ethica compliance"], - ["id"=>"LEGAL-OPS","name"=>"Legal Ops","role"=>"Contrats clients, SLA, CGU, litiges Vistex"], - ] - ], +$DEPTS = [ + "DIRECTION" => ["head"=>"CEO","agents"=>["CTO","COO","CFO","CISO"],"squad"=>null], + "PRODUCT" => ["head"=>"CPO","agents"=>["PO-WEVIA","PO-WEVADS","PO-ETHICA","PO-L99","Scrum Master","UX Lead"],"squad"=>"SL-PROD"], + "ENGINEERING" => ["head"=>"VP Engineering","agents"=>["Architecte","DevOps","Backend Lead","Frontend Lead","AI/ML Engineer","DBA"],"squad"=>"SL-ENG"], + "QUALITE" => ["head"=>"Directeur Qualite","agents"=>["QA Lead","QA Automation","QA Performance","QA Security","BPO"],"squad"=>"SL-QA"], + "COMMERCIAL" => ["head"=>"Directeur Commercial","agents"=>["Business Dev","CSM","Consultant SAP","Pre-Sales"],"squad"=>"SL-SALES"], + "OPERATIONS" => ["head"=>"Directeur Ops","agents"=>["SRE","Sysadmin","Network Ops","MTA Ops"],"squad"=>"SL-OPS"], + "DATA" => ["head"=>"CDO","agents"=>["Data Engineer","Data Scientist","Data Analyst"],"squad"=>"SL-DATA"], + "MARKETING" => ["head"=>"CMO","agents"=>["SEO","CRM Manager","Content Manager"],"squad"=>"SL-MKT"], + "ACHATS" => ["head"=>"Dir Achats","agents"=>["Acheteur IT","Vendor Manager"],"squad"=>null], + "RH" => ["head"=>"DRH","agents"=>["Recruteur Tech","Resp Formation"],"squad"=>null], + "LEGAL" => ["head"=>"Dir Juridique","agents"=>["DPO","Legal Ops"],"squad"=>null], ]; -// ══════════════════════════════════════════════════════ -// MEETINGS STRUCTURE -// ══════════════════════════════════════════════════════ - -$MEETING_TEMPLATES = [ - ["id"=>"daily-standup","name"=>"Daily Standup","freq"=>"daily 09:00","duration"=>15, - "attendees"=>["SM-SPRINT","SL-PROD","SL-ENG","SL-QA","SL-OPS","SL-DATA"], - "agenda"=>["Done yesterday","Doing today","Blockers"],"output"=>"standup-notes"], - - ["id"=>"sprint-planning","name"=>"Sprint Planning","freq"=>"biweekly monday 10:00","duration"=>60, - "attendees"=>["SM-SPRINT","PO-WEVIA","PO-WEVADS","PO-ETHICA","PO-L99","VP-ENG","ARCH","DQ"], - "agenda"=>["Sprint review","Backlog refinement","Sprint goal","Story points"],"output"=>"sprint-plan"], - - ["id"=>"tech-sync","name"=>"Tech Architecture Sync","freq"=>"weekly wednesday 14:00","duration"=>30, - "attendees"=>["CTO","VP-ENG","ARCH","DEVOPS","AI-ENG","DBA","SRE"], - "agenda"=>["Architecture decisions","Tech debt","Performance","Security"],"output"=>"tech-decisions"], - - ["id"=>"quality-review","name"=>"Quality Review","freq"=>"weekly friday 11:00","duration"=>30, - "attendees"=>["DQ","QA-LEAD","QA-AUTO","BPO","SL-QA","PO-L99"], - "agenda"=>["L99 score","NonReg results","Incidents","6σ metrics","Gap analysis"],"output"=>"quality-report"], - - ["id"=>"exec-steering","name"=>"Executive Steering Committee","freq"=>"monthly first-monday 15:00","duration"=>60, - "attendees"=>["CEO","CTO","COO","CFO","CISO","CSO","CMO","CDO"], - "agenda"=>["KPIs","Revenue","Roadmap","Risks","Budget","Hiring"],"output"=>"exec-summary"], - - ["id"=>"security-audit","name"=>"Security Audit","freq"=>"weekly tuesday 10:00","duration"=>30, - "attendees"=>["CISO","QA-SEC","NETOPS","SRE","DPO"], - "agenda"=>["Vulnerabilities","Incidents","Compliance","Pen-test results"],"output"=>"security-report"], - - ["id"=>"data-sync","name"=>"Data & Analytics Sync","freq"=>"weekly thursday 14:00","duration"=>30, - "attendees"=>["CDO","DE","DS","DA","PO-ETHICA"], - "agenda"=>["Pipelines","HCP stats","Analytics KPIs","ML models"],"output"=>"data-report"], - - ["id"=>"ops-review","name"=>"Ops Review","freq"=>"daily 08:30","duration"=>10, - "attendees"=>["DIR-OPS","SRE","SYSADMIN","MTA-OPS","NETOPS"], - "agenda"=>["Uptime","Incidents","Disk/RAM","Docker","MTA stats"],"output"=>"ops-status"], - - ["id"=>"retrospective","name"=>"Sprint Retrospective","freq"=>"biweekly friday 16:00","duration"=>45, - "attendees"=>["SM-SPRINT","ALL-SQUAD-LEADERS","DQ"], - "agenda"=>["What went well","What didn't","Action items","Velocity"],"output"=>"retro-notes"], - - ["id"=>"sales-pipeline","name"=>"Sales Pipeline Review","freq"=>"weekly monday 11:00","duration"=>30, - "attendees"=>["CSO","BD","CSM","PRESALES","CONSULT"], - "agenda"=>["Pipeline","Deals","Ethica outreach","Proposals"],"output"=>"sales-report"], +$MEETINGS = [ + ["id"=>"ops-review","name"=>"Ops Review","freq"=>"daily 08:30","dur"=>10], + ["id"=>"daily-standup","name"=>"Daily Standup","freq"=>"daily 09:00","dur"=>15], + ["id"=>"sales-pipeline","name"=>"Sales Pipeline","freq"=>"weekly mon 11:00","dur"=>30], + ["id"=>"tech-sync","name"=>"Tech Sync","freq"=>"weekly wed 14:00","dur"=>30], + ["id"=>"data-sync","name"=>"Data Sync","freq"=>"weekly thu 14:00","dur"=>30], + ["id"=>"quality-review","name"=>"Quality Review","freq"=>"weekly fri 11:00","dur"=>30], + ["id"=>"security-audit","name"=>"Security Audit","freq"=>"weekly tue 10:00","dur"=>30], + ["id"=>"sprint-planning","name"=>"Sprint Planning","freq"=>"biweekly mon 10:00","dur"=>60], + ["id"=>"retrospective","name"=>"Retrospective","freq"=>"biweekly fri 16:00","dur"=>45], + ["id"=>"exec-steering","name"=>"Exec Steering","freq"=>"monthly 1st-mon 15:00","dur"=>60], ]; -// ══════════════════════════════════════════════════════ -// AGENT STATUS COLLECTION -// ══════════════════════════════════════════════════════ - -$action = $_GET['action'] ?? 'status'; - -if ($action === 'status' || $action === 'fleet') { - // Count agents - $total_agents = 0; - $dept_stats = []; - foreach ($DEPARTMENTS as $dept => $info) { - $count = 1 + count($info['members'] ?? []); // head + members - if (isset($info['squad_leader'])) $count++; - $total_agents += $count; - $dept_stats[$dept] = ['count' => $count, 'head' => $info['head']['name']]; - } - - // Collect live data for agents - $live = []; - - // QA Director data - $quality = @json_decode(@file_get_contents('/var/www/html/api/wevia-quality-status.json'), true); - $live['DQ'] = ['score' => $quality['global_rate'] ?? 0, 'issues' => $quality['issues_count'] ?? 0]; - - // L99 data - $l99 = @json_decode(@file_get_contents('/var/www/html/api/l99-ux-results.json'), true); - $live['QA-AUTO'] = ['pass' => $l99['pass'] ?? 0, 'total' => ($l99['pass']??0)+($l99['fail']??0)+($l99['warn']??0)]; - - // Ops data - $disk = trim(shell_exec("df / | tail -1 | awk '{print $5}'") ?? ""); - $docker = trim(shell_exec("docker ps -q | wc -l") ?? ""); - $live['SRE'] = ['disk' => $disk, 'docker' => $docker]; - - // Security data - $auth = @json_decode(@file_get_contents('/var/www/html/api/wevia-auth-status.json'), true); - $live['CISO'] = ['auth_flows' => $auth['flow_ok'] ?? 0, 'healthy' => $auth['healthy'] ?? false]; - - // Data - $ethica_count = trim(shell_exec("PGPASSWORD=admin123 psql -U admin -d adx_system -t -c \"SELECT count(*) FROM ethica.medecins_validated\" 2>/dev/null") ?? "0"); - $live['DE'] = ['hcp' => (int)$ethica_count]; - - // AI - $models = @json_decode(@file_get_contents('http://127.0.0.1:11435/api/tags'), true); - $live['AI-ENG'] = ['ollama_models' => count($models['models'] ?? [])]; - - echo json_encode([ - 'fleet' => 'WEVAL Enterprise Agent Fleet v1.0', - 'total_agents' => $total_agents, - 'departments' => count($DEPARTMENTS), - 'departments_detail' => $dept_stats, - 'meetings' => count($MEETING_TEMPLATES), - 'meeting_list' => array_map(function($m) { return ['id'=>$m['id'],'name'=>$m['name'],'freq'=>$m['freq']]; }, $MEETING_TEMPLATES), - 'live_data' => $live, - 'timestamp' => date('Y-m-d H:i:s'), - ], JSON_PRETTY_PRINT); - -} elseif ($action === 'org') { - echo json_encode($DEPARTMENTS, JSON_PRETTY_PRINT); - -} elseif ($action === 'meetings') { - echo json_encode($MEETING_TEMPLATES, JSON_PRETTY_PRINT); - -} elseif ($action === 'standup') { - // Generate daily standup from live data - $standup = ['date' => date('Y-m-d'), 'time' => date('H:i'), 'type' => 'daily-standup']; - $items = []; - - // Each squad leader reports - $quality = @json_decode(@file_get_contents('/var/www/html/api/wevia-quality-status.json'), true); - $items[] = ['agent'=>'SL-QA','report'=>'Quality: '.($quality['global_rate']??0).'%. Issues: '.($quality['issues_count']??0)]; - - $antireg = @json_decode(@file_get_contents('/var/www/html/api/wevia-antiregression-status.json'), true); - $items[] = ['agent'=>'SL-OPS','report'=>'AntiReg: '.($antireg['healthy']?'HEALTHY':'ISSUES').'. Infra stable.']; - - $auth = @json_decode(@file_get_contents('/var/www/html/api/wevia-auth-status.json'), true); - $items[] = ['agent'=>'CISO','report'=>'Auth: '.($auth['flow_ok']??0).'/9 flows. '.($auth['healthy']?'Secure':'Alert')]; - - $l99 = @json_decode(@file_get_contents('/var/www/html/api/l99-ux-results.json'), true); - $items[] = ['agent'=>'SL-PROD','report'=>'L99: '.($l99['pass']??0).'/'.max(1,($l99['pass']??0)+($l99['fail']??0)+($l99['warn']??0)).' tests']; - - $nr = @json_decode(@file_get_contents('/var/www/html/api/nonreg-latest.json'), true); - $items[] = ['agent'=>'SL-ENG','report'=>'NonReg: '.($nr['pass']??0).'/'.($nr['total']??0).' PASS']; - - $standup['reports'] = $items; - $standup['blockers'] = []; - - if (($quality['issues_count']??0) > 3) $standup['blockers'][] = 'Quality below target'; - if (!($antireg['healthy']??false)) $standup['blockers'][] = 'Anti-regression issues'; - - echo json_encode($standup, JSON_PRETTY_PRINT); - -} elseif ($action === 'run_standup') { - // Actually run and save standup - ob_start(); - $_GET['action'] = 'standup'; - include(__FILE__); - $output = ob_get_clean(); - file_put_contents('/var/www/html/api/wevia-standup-latest.json', $output); - echo $output; - -} else { - echo json_encode(['actions' => ['status','fleet','org','meetings','standup','run_standup']]); +$total = 0; +$depts_out = []; +foreach ($DEPTS as $name => $info) { + $cnt = 1 + count($info["agents"]); + if ($info["squad"]) $cnt++; + $total += $cnt; + $depts_out[$name] = ["count"=>$cnt,"head"=>$info["head"],"squad"=>$info["squad"]]; } + +if ($action === "org") { echo json_encode($DEPTS, JSON_PRETTY_PRINT); exit; } +if ($action === "meetings") { echo json_encode($MEETINGS, JSON_PRETTY_PRINT); exit; } + +if ($action === "standup") { + $q = @json_decode(@file_get_contents("/var/www/html/api/wevia-quality-status.json"),true); + $ar = @json_decode(@file_get_contents("/var/www/html/api/wevia-antiregression-status.json"),true); + $l99 = @json_decode(@file_get_contents("/var/www/html/api/l99-ux-results.json"),true); + $nr = @json_decode(@file_get_contents("/var/www/html/api/nonreg-latest.json"),true); + $auth = @json_decode(@file_get_contents("/var/www/html/api/wevia-auth-status.json"),true); + + $reports = [ + ["agent"=>"SL-QA","report"=>"Quality: ".($q["global_rate"]??0)."% | ".($q["issues_count"]??0)." issues"], + ["agent"=>"SL-OPS","report"=>"AntiReg: ".(($ar["healthy"]??false)?"HEALTHY":"ISSUES")], + ["agent"=>"SL-ENG","report"=>"NonReg: ".($nr["pass"]??0)."/".($nr["total"]??0)], + ["agent"=>"SL-PROD","report"=>"L99: ".($l99["pass"]??0)." pass"], + ["agent"=>"CISO","report"=>"Auth: ".($auth["flow_ok"]??0)."/9 flows"], + ]; + $blockers = []; + if (($q["issues_count"]??0) > 3) $blockers[] = "Quality below target"; + if (!($ar["healthy"]??false)) $blockers[] = "Anti-regression issues"; + + $standup = ["date"=>date("Y-m-d"),"time"=>date("H:i"),"reports"=>$reports,"blockers"=>$blockers]; + file_put_contents("/var/www/html/api/wevia-standup-latest.json", json_encode($standup, JSON_PRETTY_PRINT)); + echo json_encode($standup, JSON_PRETTY_PRINT); + exit; +} + +// Default: status +echo json_encode([ + "fleet" => "WEVAL Enterprise Fleet v1.0", + "total_agents" => $total, + "departments" => count($DEPTS), + "departments_detail" => $depts_out, + "meetings" => count($MEETINGS), + "meeting_list" => $MEETINGS, + "timestamp" => date("Y-m-d H:i:s"), +], JSON_PRETTY_PRINT); diff --git a/api/wevia-standup-latest.json b/api/wevia-standup-latest.json new file mode 100644 index 000000000..3f8fd554a --- /dev/null +++ b/api/wevia-standup-latest.json @@ -0,0 +1,29 @@ +{ + "date": "2026-04-06", + "time": "20:47", + "reports": [ + { + "agent": "SL-QA", + "report": "Quality: 96% | 5 issues" + }, + { + "agent": "SL-OPS", + "report": "AntiReg: HEALTHY" + }, + { + "agent": "SL-ENG", + "report": "NonReg: 152\/153" + }, + { + "agent": "SL-PROD", + "report": "L99: 143 pass" + }, + { + "agent": "CISO", + "report": "Auth: 9\/9 flows" + } + ], + "blockers": [ + "Quality below target" + ] +} \ No newline at end of file