Files
weval-consulting/agents-sim.html

878 lines
71 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>WEVAL Enterprise</title>
<style>@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@600;800;900&display=swap');*{margin:0;padding:0;box-sizing:border-box}body{background:#e4ecf6;background-image:radial-gradient(#c8d8e8 1px,transparent 1px);background-size:20px 20px;overflow-y:auto;font-family:'Nunito'}canvas{display:block}
#T{position:fixed;pointer-events:none;display:none;z-index:99;background:#fff;border:3px solid;border-radius:12px;padding:10px 14px;color:#2a2a4a;box-shadow:0 4px 16px #0002;max-width:210px;font-size:.78rem}#T b{display:block;font-size:.9rem}#T i{font-style:normal;font-size:.56rem;text-transform:uppercase;letter-spacing:2px;display:block;margin:2px 0 4px}#T .p{color:#e94560;font-weight:700;font-size:.68rem;margin-top:3px}#T .s{font-size:.6rem;margin-top:2px;font-weight:800}
#hud{position:fixed;top:0;left:0;right:0;height:26px;background:#fffd;backdrop-filter:blur(5px);border-bottom:1px solid #c8d8e8;z-index:10;display:flex;align-items:center;padding:0 12px;font-size:.7rem}#hud b{color:#e94560}#hud span{margin-left:14px;color:#5a6a80}
</style></head><body>
<div id="hud"><b>WEVAL Enterprise</b><span id="st"></span><span style="margin-left:auto;font-size:.6rem;color:#64748b" id="hud-time"></span></div>
<canvas id="c"></canvas>
<div id="T"><b></b><i></i><span class="d"></span><span class="p"></span><span class="s"></span></div>
<script>
const C=document.getElementById('c'),X=C.getContext('2d'),TT=document.getElementById('T');
let W,H,mx=-1,my=-1,hov=null,fr=0,tc=0;
const DP=[
{id:'ceo',l:'👑 CEO',cl:'#e94560',st:['Decision','Budget','Strategy','Hiring'],fl:'#fde8ec'},
{id:'sal',l:'🎯 Prospect',cl:'#ff6b6b',st:['Leads','Qualify','Outreach','Convert'],fl:'#fde8e8'},
{id:'con',l:'💼 Consult',cl:'#845ef7',st:['Analyse','Design','Propose','Deliver'],fl:'#f0e8ff'},
{id:'dev',l:'⚡ Dev Lab',cl:'#339af0',st:['Code','Review','Test','Deploy'],fl:'#e8f0ff'},
{id:'ecc',l:'💻 ECC Code',cl:'#20c997',st:['Parse','Review','Build','Ship'],fl:'#e8fff5'},
{id:'srv',l:'🖥 Infra',cl:'#f59f00',st:['Monitor','Alert','Fix','Report'],fl:'#fff5e0'},
{id:'sec',l:'🛡 Security',cl:'#ff922b',st:['Scan','Audit','Patch','Certify'],fl:'#fff0e0'},
{id:'qa',l:'🧪 QA',cl:'#be4bdb',st:['Plan','Run','Report','Ship'],fl:'#f5e8ff'},
{id:'pha',l:'💊 Pharma',cl:'#da77f2',st:['Scrape','Enrich','Campaign','Ship'],fl:'#fde8ff'},
{id:'ops',l:'📡 Monitor',cl:'#fcc419',st:['Watch','Alert','Fix','Report'],fl:'#fffde0'},
{id:'cog',l:'🎯 Cognitive',cl:'#15aabf',st:['Analyze','Reason','Create','Decide'],fl:'#e0f5f8'},
{id:'sc',l:'✨ SuperClaude',cl:'#7950f2',st:['Research','Plan','Execute','Ship'],fl:'#f0e8ff'},
{id:'persona',l:'👤 Personas',cl:'#e64980',st:['Consult','Design','Review','Ship'],fl:'#fde0f0'},
{id:'act',l:'⚡ Activators',cl:'#fd7e14',st:['Trigger','Process','Validate','Ship'],fl:'#fff0e0'},
{id:'oss_intg',l:'🔗 OSS Wired',cl:'#0ca678',st:['Evaluate','Import','Wire','Ship'],fl:'#e0ffe8'},
{id:'cron',l:'⏰ Crons',cl:'#74c0fc',st:['Ethica','B2B','NonReg','Backup'],fl:'#e8f0ff'},
{id:'mta',l:'📧 MTA',cl:'#f783ac',st:['PMTA','KumoMTA','Postfix','Deliver'],fl:'#ffe8f0'},
{id:'ai',l:'🧠 AI Engine',cl:'#3bc9db',st:['Route','Infer','Consensus','Return'],fl:'#e0f8ff'},
{id:'saas',l:'📦 SaaS',cl:'#fab005',st:['LeadForge','Outreach','MailWarm','Proposal'],fl:'#fff8e0'},
{id:'dead',l:'💀 Archives',cl:'#ced4da',st:['S88','S89','ECS','Archive'],fl:'#f0f0f0'},
{id:'wire',l:'🔌 TO WIRE',cl:'#ff8787',st:['Connect','Config','Test','Activate'],fl:'#ffe8e8'},
{id:'dock',l:'🐳 Docker',cl:'#63e6be',st:['Build','Run','Monitor','Scale'],fl:'#e0fff5'},
{id:'dorm',l:'💤 Dormants',cl:'#dee2e6',st:['Clone','Evaluate','Wire','Activate'],fl:'#f5f5f5'},
{id:'wevia',l:'🧠 WEVIA Suite',cl:'#ff6b6b',st:['Chat','Code','Life','Gateway'],fl:'#ffe8e8'},
{id:'plat',l:'🔧 Platform',cl:'#868e96',st:['Index','Search','Bench','Discover'],fl:'#f0f0f8'}
];
// OUTPUT KPIs per dept (right panel)
// Frequency per dept (for bubble display)
const AMETA={
'CEO':{fq:'1x/j 7h',inp:'3 rapports équipe'},
'Ethica':{fq:'*/5min 24/7',inp:'DabaDoc + LinkedIn'},
'Analyst':{fq:'3x/j',inp:'Données marché B2B'},
'Writer':{fq:'5x/j',inp:'Briefs client'},
'Proposal':{fq:'sur demande',inp:'Specs client'},
'Contract':{fq:'sur demande',inp:'Terms signés'},
'Architect':{fq:'2x/j',inp:'Cahier des charges'},
'Planner':{fq:'1x/j matin',inp:'Backlog JIRA'},
'DeerFlow':{fq:'3x/j',inp:'Question recherche'},
'Critic':{fq:'sur demande',inp:'Proposal à valider'},
'Translate':{fq:'sur demande',inp:'Page à traduire'},
'Academy':{fq:'1x/semaine',inp:'Contenu formation'},
'Executor':{fq:'5-15x/j',inp:'PR merged'},
'Debugger':{fq:'3-8x/j',inp:'Bug report'},
'Reviewer':{fq:'5x/j',inp:'Pull request'},
'Designer':{fq:'2x/j',inp:'Wireframe/spec'},
'WEDROID':{fq:'continu 24/7',inp:'Erreur détectée'},
'Simplifier':{fq:'1x/j',inp:'Module >500 lignes'},
'Blueprint':{fq:'sur demande',inp:'Specs projet'},
'DevForge':{fq:'sur demande',inp:'Template code'},
'Watchdog':{fq:'*/3min 24/7',inp:'20 Docker + 5 svc'},
'Guardian':{fq:'*/5min 24/7',inp:'8 fichiers protégés'},
'Blade':{fq:'*/60s 24/7',inp:'Desktop sync'},
'GitMaster':{fq:'sur push',inp:'Commit Git'},
'Security':{fq:'2x/j',inp:'OWASP rules'},
'Verifier':{fq:'1x/semaine',inp:'Checklist ISO'},
'QA':{fq:'2x/j 6h+18h',inp:'148 test cases'},
'TestEng':{fq:'sur push',inp:'GitHub Actions'},
'Tracer':{fq:'continu',inp:'access.log + error.log'},
'Scientist':{fq:'1x/j 5h',inp:'182 modèles à bench'},
'Playwright':{fq:'2x/j',inp:'41 scénarios E2E'},
'Explore':{fq:'3x/j',inp:'URLs annuaires santé'},
'DocSpec':{fq:'sur demande',inp:'API à documenter'},
'MiroFish':{fq:'1x/j',inp:'Brief créatif'},
'TaskMgr':{fq:'continu',inp:'Tickets ouverts'},
'Brain':{fq:'1x/j',inp:'Idées brainstorm'},
'Intro':{fq:'1x/j',inp:'Métriques perf'},
'Orch':{fq:'continu',inp:'5 agents à sync'},
'Dashboard':{fq:'temps réel',inp:'KPIs collectés'},
'EthicaCron':{fq:'*/5min cron',inp:'Queue DZ+MA+TN'},
'B2BCron':{fq:'/4h cron',inp:'166 leads table'},
'NonRegCron':{fq:'6h+18h cron',inp:'153 tests suite'},
'BackupCron':{fq:'4h daily cron',inp:'PG + configs'},
'PMTA':{fq:'continu port 25',inp:'Queue 10K emails'},
'KumoMTA':{fq:'continu port 587',inp:'Nouveaux envois'},
'Postfix':{fq:'continu 2525',inp:'Relais interne'},
'Groq':{fq:'on-demand <100ms',inp:'Prompt utilisateur'},
'Cerebras':{fq:'fallback <200ms',inp:'Requête complexe'},
'Ollama':{fq:'on-demand local',inp:'Requête souveraine'},
'LeadForge':{fq:'sur demande',inp:'Critères recherche'},
'OutreachAI':{fq:'sur campagne',inp:'Liste contacts'},
'MailWarm':{fq:'continu',inp:'IPs à réchauffer'},
'ProposalAI':{fq:'sur demande',inp:'Brief client'},
'S88 GPU':{fq:'MORT',inp:'—'},
'S89':{fq:'DOWN',inp:'—'},
'ECS PMTA':{fq:'INCONNU',inp:'—'},
'Loki':{fq:'RESTARTING',inp:'Logs Docker'},
'WEVCODE':{fq:'on-demand',inp:'Question code'},
'WEVIALife':{fq:'*/5min sync',inp:'Fichiers desktop'},
'WEVIAGateway':{fq:'continu 24/7',inp:'Requêtes multi-IA'},
'TTS':{fq:'sur demande',inp:'Texte à vocaliser'},
'MermaidGen':{fq:'sur demande',inp:'Spec diagramme'},
'L99':{fq:'sur demande',inp:'79 layers à checker'},
'ClaudeSync':{fq:'par session',inp:'Transcript Claude'},
'SkillsRAG':{fq:'on-demand',inp:'Query Qdrant'},
'PromptsLib':{fq:'on-demand',inp:'Contexte à matcher'},
'CodeWiki':{fq:'sur commit',inp:'203 fichiers index'},
'AIBench':{fq:'1x/j 5h cron',inp:'182 modèles API'},
'OSSDiscover':{fq:'1x/j cron',inp:'GitHub trending'},
'GHGrab':{fq:'sur demande',inp:'URL repo à cloner'},
'AgentShield':{fq:'1x/j',inp:'Code source à scan'},
'ECC architect':{fq:'continu',inp:'Code multi-langage'},
'ECC python reviewer':{fq:'continu',inp:'PRs Python'},
'ECC java build resolver':{fq:'continu',inp:'Maven/Gradle builds'},
'Cog-Analysis':{fq:'on-demand',inp:'Donnees complexes'},
'Cog-Codegen':{fq:'on-demand',inp:'Specs fonctionnelles'},
'Cog-Strategy':{fq:'on-demand',inp:'Business context'},
'SC DeepResearch':{fq:'on-demand',inp:'Requetes recherche'},
'SC Orchestration':{fq:'continu',inp:'Task queues'},
'Persona SAPConsultant':{fq:'on-demand',inp:'Queries SAP'},
'Persona CloudArchitect':{fq:'on-demand',inp:'Infra specs'},
'ACT QA':{fq:'*/4h',inp:'Test triggers'},
'ACT Infra':{fq:'*/6h',inp:'Provisioning tasks'},
};
// Fallback freq by dept
var FREQ_DEF={ceo:'1x/j',sal:'continu',con:'sur demande',dev:'continu',srv:'*/3min',sec:'2x/j',qa:'2x/j',pha:'*/5min',ops:'continu',cron:'auto',mta:'continu',ai:'on-demand',saas:'on-demand',dead:'—',wire:'—',intg:'—',dock:'24/7',dorm:'—',wevia:'on-demand',plat:'on-demand'};
const OUT={
ceo:{input:'📥 Rapports agents',output:'📤 Décisions strat',kpi:'1x/j',icon:'👔',metric:'1 brief/j',deliverables:['Brief Telegram 7h','Validation budget Q3','Revue hiring','Contrats signes']},
sal:{input:'📥 1052 leads DB',output:'📤 Scraping actif',kpi:'B2B pipeline',icon:'🎯',metric:'1052 leads',deliverables:['131K HCPs Ethica','166 leads B2B','469 LinkedIn','Emails DZ+MA+TN','Proposals PDF']},
con:{input:'📥 5 demandes/j',output:'📤 3 proposals/j',kpi:'Win rate 60%',icon:'💼',metric:'3 props',deliverables:['Blueprints cloud','Schemas Mermaid','Sprint roadmaps','Traductions 90KB']},
dev:{input:'📥 Tickets GitHub',output:'📤 Commits+deploys',kpi:'CI/CD continu',icon:'⚡',metric:'12 deploys/j',deliverables:['52 repos maintenus','36 pages WEVADS','APIs cx/droid/sentinel','Git releases']},
srv:{input:'📥 480 checks/j',output:'📤 5 restarts/j',kpi:'Uptime 99.9%',icon:'🖥️',metric:'99.9%',deliverables:['20 Docker monitores','8 chattr+i','Disk <85%','Nginx reload','30+ crons']},
sec:{input:'📥 288 scans/j',output:'📤 2 audits/j',kpi:'0 CVE critiques',icon:'🛡️',metric:'0 CVE',deliverables:['Headers HTTP OK','SSL Jun 2026','Fail2Ban','CrowdSec','RGPD check']},
qa:{input:'📥 153 tests NonReg',output:'📤 153/153 PASS',kpi:'Score 100%',icon:'🧪',metric:'148 PASS',deliverables:['NonReg 153/153','Playwright 41','11 baselines','BackstopJS','Rapport HTML']},
pha:{input:'📥 DabaDoc+GMap',output:'📤 125,748 HCPs',kpi:'DZ87K MA19K TN17K',icon:'💊',metric:'125.7K',deliverables:['DabaDoc 50 villes','LinkedIn tels','Email gap DZ 15K','Master dedup 5h']},
ops:{input:'📥 7,752 opens total',output:'📤 4,694 clicks total',kpi:'Track actif',icon:'📡',metric:'7.7K opens',deliverables:['admin.html live','Kanban updated','Weekly report','KPI chart 7j']},
cron:{input:'📥 18 cron.d S95',output:'📤 Ethica+B2B+NR',kpi:'Auto 24/7',icon:'⏰',metric:'50+ crons/j',deliverables:['EthicaCron 288/j','B2BCron 6/j','NonRegCron 2/j','BackupCron 1/j']},
mta:{input:'📥 3M contacts DB',output:'📤 7752 opens total',kpi:'50 bounces',icon:'📧',metric:'7.7K opens',deliverables:['PMTA 10K DKIM','KumoMTA routing','Postfix relay','Bounce auto']},
ai:{input:'📥 7 Ollama models',output:'📤 Groq+Cerebras',kpi:'On-demand',icon:'🧠',metric:'7 models',deliverables:['Groq 500 req/j','Cerebras 120/j','Ollama 200/j','Manager consensus']},
saas:{input:'📥 8 modules codés',output:'📤 0 users (pas lancé)',kpi:'Pré-launch',icon:'📦',metric:'0 users',deliverables:['LeadForge','OutreachAI','MailWarm','ProposalAI']},
dead:{input:'📥 —',output:'📤 Archives only',kpi:'À annuler',icon:'💀',metric:'-45€/m',deliverables:['S88 9.9GB archive','S89 adx 6.6GB','ECS inconnu']},
wire:{input:'📥 19 à connecter',output:'📤 0 wired yet',kpi:'Backlog',icon:'🔌',metric:'19 TODO',deliverables:['LlamaIndex RAG','Stripe SK','WhatsApp token','Azure AD','Gemini']},
oss_intg:{input:'📥 17 à intégrer',output:'📤 4 en cours',kpi:'Progress 24%',icon:'🔗',metric:'4/17',deliverables:['Paperclip 150 agents','Authentik SSO','OhMyCC 19','SuperClaude 7']},
dock:{input:'📥 19 containers',output:'📤 18 UP + Loki KO',kpi:'95% healthy',icon:'🐳',metric:'19 dock',deliverables:['OpenWebUI :8281','Flowise :3033','Twenty :3000','n8n :5678','Loki BROKEN']},
dorm:{input:'📥 6 clonés',output:'📤 0 activés',kpi:'À évaluer',icon:'💤',metric:'6 wait',deliverables:['HolyClaude','LTX-Video','DeepAgent','Strix','Prometheus']},
wevia:{input:'📥 200 sessions/j',output:'📤 200 réponses/j',kpi:'4 modes actifs',icon:'🧠',metric:'200/j',deliverables:['WEVCODE 4 modes','WEVIALife sync','Gateway 18','TTS','L99 93 layers']},
plat:{input:'📥 Qdrant 4414pts',output:'📤 Skills+Prompts',kpi:'RAG actif',icon:'🔧',metric:'4414 sk'},
ecc:{input:'📥 Code source multi-lang',output:'📤 Build + Review',kpi:'36 agents',icon:'💻',metric:'36 langages',deliverables:['Java builds','Python reviews','Kotlin checks','C++ resolvers','Rust audits','Go packages','TS reviews','Ruby gems']},
cog:{input:'📥 Complex queries',output:'📤 Structured reasoning',kpi:'9 agents',icon:'🎯',metric:'9 capacites cognitives',deliverables:['Analysis reports','Code generation','Creative outputs','Debug traces','Document processing','Strategy plans','Reasoning chains']},
sc:{input:'📥 Claude tasks',output:'📤 Enhanced responses',kpi:'7 modes',icon:'✨',metric:'7 super-modes',deliverables:['Deep research','Business panels','Orchestration plans','Brainstorming outputs','Task management','Token optimization','Code analysis']},
persona:{input:'📥 Domain queries',output:'📤 Expert responses',kpi:'6 experts',icon:'👤',metric:'6 domaines',deliverables:['SAP consulting','Cloud architecture','Cyber audits','Email delivery','Full-stack code','Data science']},
act:{input:'📥 Triggers',output:'📤 Automated actions',kpi:'5 activators',icon:'⚡',metric:'5 domaines actives',deliverables:['QA automation','Data pipelines','Business rules','Core dev tasks','Infra provisioning']},
};
// Rich speech for work state: action + freq + success + output
const SPEECH={
'CEO':['📊 Brief quotidien\n⏰ 1×/jour | ✅ 100%\n📤 Décision validée','💰 Revue budget Q3\n⏰ 1×/sem | ✅ 100%\n📤 Budget approuvé'],
'Ethica':['💊 Scrape DabaDoc MA\n⏰ */5min | ✅ 95%\n📤 +120 HCPs enrichis','📧 Drip email TN\n⏰ */5min | ✅ 88%\n📤 200 emails envoyés'],
'Analyst':['📊 Analyse marché SAP\n⏰ 3×/jour | ✅ 100%\n📤 Rapport SWOT livré','📈 Segment B2B\n⏰ 2×/jour | ✅ 100%\n📤 50 prospects qualifiés'],
'Writer':['✍️ Cold email campagne\n⏰ 10×/jour | ✅ 92%\n📤 10 emails rédigés','📝 Proposal client\n⏰ 2×/jour | ✅ 100%\n📤 1 proposal PDF'],
'Proposal':['📑 Génère proposal\n⏰ 2×/jour | ✅ 100%\n📤 1 PDF formaté','📋 Pricing insert\n⏰ 1×/jour | ✅ 100%\n📤 Grille tarifaire'],
'Contract':['📜 Génère NDA\n⏰ 1×/sem | ✅ 100%\n📤 1 contrat signé','⚖️ Review contrat\n⏰ 2×/sem | ✅ 100%\n📤 Validé juridique'],
'Architect':['🏗️ Design archi cloud\n⏰ 1×/jour | ✅ 100%\n📤 Blueprint livré','📐 Schema micro-svc\n⏰ 2×/sem | ✅ 100%\n📤 Diagramme Mermaid'],
'Planner':['📋 Sprint planning\n⏰ 1×/sem | ✅ 100%\n📤 Backlog priorisé','📊 Update Gantt\n⏰ 1×/jour | ✅ 100%\n📤 Timeline à jour'],
'DeerFlow':['🦌 Deep research IA\n⏰ 3×/jour | ✅ 97%\n📤 Synthèse 12 sources','📚 Veille techno\n⏰ 1×/jour | ✅ 100%\n📤 Rapport R&D'],
'Critic':['⚖️ Évalue risques\n⏰ 2×/jour | ✅ 100%\n📤 Matrice risques','🔍 Challenge budget\n⏰ 1×/sem | ✅ 100%\n📤 Go/NoGo décision'],
'Translate':['🌍 Traduction FR→AR\n⏰ 5×/jour | ✅ 98%\n📤 Page traduite','🌐 Sync i18n\n⏰ 1×/jour | ✅ 100%\n📤 90KB mis à jour'],
'Academy':['🎓 Génère training\n⏰ 1×/sem | ✅ 100%\n📤 Module formation','📝 Quiz create\n⏰ 2×/sem | ✅ 100%\n📤 10 questions'],
'Executor':['⚡ Deploy prod v3.2\n⏰ 5×/jour | ✅ 95%\n📤 Release déployée','🔄 Migration DB\n⏰ 1×/jour | ✅ 100%\n📤 Schema migré'],
'Debugger':['🐛 Fix API 500\n⏰ 3×/jour | ✅ 90%\n📤 Bug résolu','🔍 Trace memory leak\n⏰ 1×/jour | ✅ 85%\n📤 Leak colmaté'],
'Reviewer':['👁️ Review PR #847\n⏰ 5×/jour | ✅ 100%\n📤 PR approuvé','🔍 Audit qualité\n⏰ 2×/jour | ✅ 100%\n📤 Score qualité'],
'Designer':['🎨 Mockup dashboard\n⏰ 2×/jour | ✅ 100%\n📤 Design livré','🖌️ Animation CSS\n⏰ 1×/jour | ✅ 100%\n📤 Composant animé'],
'WEDROID':['🤖 Auto-fix API auth\n⏰ 10×/jour | ✅ 93%\n📤 Service réparé','🔧 Repair PG index\n⏰ 3×/jour | ✅ 97%\n📤 Index rebuilt'],
'Simplifier':['✂️ Refactor 2K lignes\n⏰ 1×/jour | ✅ 100%\n📤 -40% code','🗑️ Dead code cleanup\n⏰ 2×/jour | ✅ 100%\n📤 50 fichiers nettoyés'],
'Blueprint':['📐 Auto blueprint\n⏰ 1×/jour | ✅ 100%\n📤 Projet structuré','🏗️ Template gen\n⏰ 2×/sem | ✅ 100%\n📤 Scaffold complet'],
'DevForge':['🔨 Gen component\n⏰ 3×/jour | ✅ 88%\n📤 Composant React','⚙️ API scaffold\n⏰ 1×/jour | ✅ 95%\n📤 CRUD endpoint'],
'Watchdog':['🐕 Check */3min\n⏰ 480×/jour | ✅ 99.8%\n📤 20 Docker monitorés','⚠️ Restart service\n⏰ 5×/jour | ✅ 100%\n📤 Service relancé'],
'Guardian':['🛡️ chattr +i config\n⏰ 288×/jour | ✅ 100%\n📤 8 fichiers protégés','🔒 Scan intrus\n⏰ */5min | ✅ 100%\n📤 0 intrusion'],
'Blade':['💻 Sync Razer→S204\n⏰ 1440×/jour | ✅ 99.5%\n📤 Fichiers synchronisés','📁 Upload docs\n⏰ 10×/jour | ✅ 100%\n📤 Docs uploadés'],
'GitMaster':['🌿 Tag v3.2.1\n⏰ 2×/jour | ✅ 100%\n📤 Release taguée','🔀 Merge develop\n⏰ 3×/jour | ✅ 100%\n📤 Branch merged'],
'Security':['🔐 Scan OWASP top10\n⏰ 2×/jour | ✅ 100%\n📤 0 vulnérabilité','🔒 Audit headers\n⏰ 1×/jour | ✅ 100%\n📤 Headers conformes'],
'Verifier':['✅ Check RGPD\n⏰ 1×/sem | ✅ 100%\n📤 Compliance OK','📋 Audit ISO 27001\n⏰ 1×/mois | ✅ 100%\n📤 Certification'],
'QA':['🧪 Run NonReg 153\n⏰ 2×/jour | ✅ 100%\n📤 153/153 PASS','🎭 Playwright 41\n⏰ 1×/jour | ✅ 100%\n📤 41/41 screenshots'],
'TestEng':['🧰 Build Docker img\n⏰ 3×/jour | ✅ 95%\n📤 Image publiée','⚙️ Pipeline CI\n⏰ 5×/jour | ✅ 90%\n📤 Build green'],
'Tracer':['🔦 Trace erreur 500\n⏰ 5×/jour | ✅ 88%\n📤 Root cause trouvé','📋 Parse access.log\n⏰ 1×/jour | ✅ 100%\n📤 Anomalies détectées'],
'Scientist':['🔬 Bench 182 modèles\n⏰ 1×/jour | ✅ 100%\n📤 Leaderboard updated','📊 Mesure latence\n⏰ 1×/jour | ✅ 100%\n📤 8 endpoints testés'],
'Playwright':['🎭 Visual test 41\n⏰ 1×/jour | ✅ 100%\n📤 41 baselines OK','📸 Screenshot diff\n⏰ 1×/jour | ✅ 98%\n📤 0 régression'],
'EthicaCron':['⏰ Drip DZ+MA+TN\n⏰ 288×/jour | ✅ 95%\n📤 +500 HCPs/jour','📧 Master dedup 5h\n⏰ 1×/jour | ✅ 100%\n📤 Base nettoyée'],
'B2BCron':['🔄 B2B scrape cycle\n⏰ 6×/jour | ✅ 88%\n📤 +20 leads/cycle','📧 Email pattern gen\n⏰ 6×/jour | ✅ 75%\n📤 Patterns validés'],
'NonRegCron':['🧪 153 tests auto\n⏰ 2×/jour | ✅ 100%\n📤 Report HTML','📊 Alert TG si FAIL\n⏰ 2×/jour | ✅ 100%\n📤 Telegram envoyé'],
'BackupCron':['💾 PG backup daily\n⏰ 1×/jour | ✅ 100%\n📤 Dump 22MB','📦 GOLD sync\n⏰ 1×/jour | ✅ 100%\n📤 Configs archivées'],
'PMTA':['📮 Batch 10K emails\n⏰ continu | ✅ 98%\n📤 10K livrés/jour','🔑 DKIM signing\n⏰ continu | ✅ 100%\n📤 Signature valide'],
'KumoMTA':['🚀 Smart routing\n⏰ continu | ✅ 97%\n📤 5K livrés/jour','🌡️ Warm IP pool\n⏰ continu | ✅ 95%\n📤 Réputation maintenue'],
'Groq':['⚡ Process 500 req/j\n⏰ continu | ✅ 99.5%\n📤 Latence 180ms avg','🧠 Classify intent\n⏰ continu | ✅ 97%\n📤 Classification OK'],
'Ollama':['🏠 Run qwen3:8b\n⏰ continu | ✅ 99%\n📤 Inference locale','🧠 Embed all-minilm\n⏰ continu | ✅ 100%\n📤 Vecteurs générés'],
'Watchdog':['🐕 Check */3min\n⏰ 480×/jour | ✅ 99.8%\n📤 Tout UP','⚠️ Alert disk\n⏰ si >85% | ✅ 100%\n📤 Telegram envoyé']
};
const AG=[
{n:'WEVIA PUBLIC',rm:'wevia',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🧠',act:['Execute','Plan','Report','Sync']},
{n:'OSS Flowise',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'OSS AIOS',rm:'oss_intg',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'Engineer WEVADS',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Engineer Ethica',rm:'pha',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💊',act:['Execute','Plan','Report','Sync']},
{n:'DevOps',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'QA',rm:'qa',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'Data Engineer',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Research DeerFlow',rm:'con',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Marketing',rm:'sal',d:'cmo',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔥',act:['Execute','Plan','Report','Sync']},
{n:'Finance',rm:'ops',d:'cfo',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'CTO',rm:'con',d:'cto',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Writer',rm:'sal',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔥',act:['Execute','Plan','Report','Sync']},
{n:'Executor',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Guardian',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Watchdog',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Blade',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'GitMaster',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Planner',rm:'ops',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'Critic',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Analyst',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Debugger',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Reviewer',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Simplifier',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Blueprint',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'DevForge',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'TaskMgr',rm:'ops',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'WEVAL Manager',rm:'ops',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'Scientist',rm:'con',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Brain',rm:'ops',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'Explore',rm:'con',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'DocSpec',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Academy',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'B2BCron',rm:'cron',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⏰',act:['Execute','Plan','Report','Sync']},
{n:'WEDROID v5',rm:'dev',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'OSS BrowserUse',rm:'oss_intg',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'Orch',rm:'ops',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'Dashboard',rm:'ops',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'Translate',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Proposal',rm:'sal',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔥',act:['Execute','Plan','Report','Sync']},
{n:'TestEng',rm:'qa',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'Verifier',rm:'sec',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🛡',act:['Execute','Plan','Report','Sync']},
{n:'NonRegCron',rm:'cron',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⏰',act:['Execute','Plan','Report','Sync']},
{n:'WEVIA LIFE',rm:'wevia',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🧠',act:['Execute','Plan','Report','Sync']},
{n:'OSS CrewAI',rm:'oss_intg',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'Intro',rm:'con',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Rabbit Nuclei',rm:'qa',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'OSS AEGIS',rm:'oss_intg',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'OSS Activepieces',rm:'oss_intg',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'Contract',rm:'sal',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔥',act:['Execute','Plan','Report','Sync']},
{n:'EthicaCron',rm:'cron',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⏰',act:['Execute','Plan','Report','Sync']},
{n:'OSS OpenClaw',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'OSS LangChain',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'Tracer',rm:'qa',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'Playwright',rm:'qa',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'OSS Dify',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'OSS OpenWebUI',rm:'oss_intg',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'Analyst 2',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Planner 2',rm:'ops',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'Watchdog 2',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Blade Sentinel',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Git Master',rm:'srv',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🖥',act:['Execute','Plan','Report','Sync']},
{n:'Explorer',rm:'con',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'DocSpecialist',rm:'con',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'MiroFish 2',rm:'ops',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'📡',act:['Execute','Plan','Report','Sync']},
{n:'SC DeepResearch',rm:'sc',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'SC BusinessPanel',rm:'sc',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'SC Orchestration',rm:'sc',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'SC Brainstorming',rm:'sc',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'SC TaskManager',rm:'sc',d:'pm',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'OSS Mastra',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'ECC java build resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC kotlin reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC opensource packager',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC python reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'OSS Scrapy',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'OSS Supermemory',rm:'oss_intg',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'OSS EvoMaster',rm:'oss_intg',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'ECC java reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC opensource forker',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC pytorch build resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ACT QA',rm:'act',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'OSS Prometheus',rm:'oss_intg',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'ECC kotlin build resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC security reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ACT DataAI',rm:'act',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'OSS Goose',rm:'oss_intg',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🔗',act:['Execute','Plan','Report','Sync']},
{n:'ECC loop operator',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC planner',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC tdd guide',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ACT Business',rm:'act',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'ECC opensource sanitizer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC typescript reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ACT CoreDev',rm:'act',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'CEO',rm:'ceo',d:'ceo',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'👔',act:['Execute','Plan','Report','Sync']},
{n:'ECC performance optimizer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC refactor cleaner',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC rust build resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'Architect',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'WEDROID',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Architect 2',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'WEDROID 2',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Security',rm:'sec',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🛡',act:['Execute','Plan','Report','Sync']},
{n:'Designer',rm:'dev',d:'designer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'ECC harness optimizer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC healthcare reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'Critic 2',rm:'con',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💼',act:['Execute','Plan','Report','Sync']},
{n:'Debugger 2',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Code Reviewer',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Code Simplifier',rm:'dev',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Verifier 2',rm:'sec',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🛡',act:['Execute','Plan','Report','Sync']},
{n:'Test Engineer',rm:'qa',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'Tracer 2',rm:'qa',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🧪',act:['Execute','Plan','Report','Sync']},
{n:'EthicaScraper',rm:'pha',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💊',act:['Execute','Plan','Report','Sync']},
{n:'SC TokenEfficiency',rm:'sc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'SC Introspection',rm:'sc',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'✨',act:['Execute','Plan','Report','Sync']},
{n:'ECC architect',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC build error resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC chief of staff',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC code reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC cpp build resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC cpp reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC database reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC doc updater',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ACT Infra',rm:'act',d:'devops',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'⚡',act:['Execute','Plan','Report','Sync']},
{n:'Persona DataScientist',rm:'persona',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'👤',act:['Execute','Plan','Report','Sync']},
{n:'Persona SAPConsultant',rm:'persona',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'👤',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Analysis',rm:'cog',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Documents',rm:'cog',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Expansion',rm:'cog',d:'researcher',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Opus46',rm:'cog',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Reasoning',rm:'cog',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'ECC docs lookup',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC e2e runner',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC flutter reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC gan evaluator',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC gan generator',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC gan planner',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC go build resolver',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC go reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'ECC rust reviewer',rm:'ecc',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'💻',act:['Execute','Plan','Report','Sync']},
{n:'Persona CloudArchitect',rm:'persona',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'👤',act:['Execute','Plan','Report','Sync']},
{n:'Persona CyberAuditor',rm:'persona',d:'qa',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'👤',act:['Execute','Plan','Report','Sync']},
{n:'Persona EmailExpert',rm:'persona',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'👤',act:['Execute','Plan','Report','Sync']},
{n:'Persona FullStackDev',rm:'persona',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'👤',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Codegen',rm:'cog',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Creative',rm:'cog',d:'designer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Debug',rm:'cog',d:'engineer',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:0,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'Cog-Strategy',rm:'cog',d:'general',p:'Paperclip',sk:'#e8cca0',hc:'#333',F:1,re:'🎯',act:['Execute','Plan','Report','Sync']},
{n:'PMTA',rm:'mta',d:'SMTP:25',p:'NEVER TOUCH',sk:'#f0c0c0',hc:'#333',F:0,re:'📧',act:['Send','Deliver']},
{n:'KumoMTA',rm:'mta',d:'SMTP:587',p:'Smart routing',sk:'#f0c0c0',hc:'#333',F:0,re:'📧',act:['Send','Deliver']},
{n:'Postfix',rm:'mta',d:'Relay:2525',p:'Internal',sk:'#f0c0c0',hc:'#333',F:0,re:'📧',act:['Send','Deliver']},
{n:'Groq',rm:'ai',d:'Default LLM',p:'llama-3.3-70b',sk:'#c0f0f0',hc:'#333',F:0,re:'🧠',act:['Infer','Route']},
{n:'Cerebras',rm:'ai',d:'Fallback',p:'qwen-3-235b',sk:'#c0f0f0',hc:'#333',F:0,re:'🧠',act:['Infer','Route']},
{n:'Ollama',rm:'ai',d:'Sovereign',p:'12 models',sk:'#c0f0f0',hc:'#333',F:0,re:'🧠',act:['Infer','Route']},
{n:'LeadForge',rm:'saas',d:'Lead Gen',p:'SaaS',sk:'#f0e0b0',hc:'#333',F:0,re:'📦',act:['Execute','Track']},
{n:'OutreachAI',rm:'saas',d:'Sequences',p:'SaaS',sk:'#f0e0b0',hc:'#333',F:0,re:'📦',act:['Execute','Track']},
{n:'MailWarm',rm:'saas',d:'IP Warming',p:'SaaS',sk:'#f0e0b0',hc:'#333',F:0,re:'📦',act:['Execute','Track']},
{n:'ProposalAI',rm:'saas',d:'PDF Gen',p:'SaaS',sk:'#f0e0b0',hc:'#333',F:0,re:'📦',act:['Execute','Track']},
{n:'S88 GPU',rm:'dead',d:'DEAD -45eur',p:'Archive',sk:'#d0d0d0',hc:'#888',F:0,re:'💀',act:['Cancel']},
{n:'S89',rm:'dead',d:'DOWN',p:'Archive',sk:'#d0d0d0',hc:'#888',F:0,re:'💀',act:['Cancel']},
{n:'ECS PMTA',rm:'dead',d:'UNKNOWN',p:'Archive',sk:'#d0d0d0',hc:'#888',F:0,re:'💀',act:['Cancel']},
{n:'LlamaIndex',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'CrewAI',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'AutoGen',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'AnythingLLM',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Dify',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'vLLM',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'LocalAI',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Stripe',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'WhatsApp',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'OVH SMS',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Azure AD',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Gemini',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'ListMonk',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'NoVNC',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Supermemory',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Wazuh',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'CrowdSec',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'Microsoft',rm:'wire',d:'TO WIRE',p:'pending',sk:'#f0c0c0',hc:'#c0392b',F:0,re:'🔌',act:['Connect','Wire']},
{n:'n8n',rm:'dock',d:':5678',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Flowise',rm:'dock',d:':3033',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'OpenWebUI',rm:'dock',d:':8281',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Twenty',rm:'dock',d:':3000',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Mattermost',rm:'dock',d:':8065',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'SearXNG',rm:'dock',d:':8080',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Qdrant',rm:'dock',d:':6333',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Plausible',rm:'dock',d:':8000',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Authentik',rm:'dock',d:':9000',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Vaultwarden',rm:'dock',d:':8222',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Uptime-Kuma',rm:'dock',d:':3001',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'ClickHouse',rm:'dock',d:':8123',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Loki',rm:'dock',d:':18821',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'MiroFish',rm:'dock',d:':3050',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'Redis',rm:'dock',d:':6379',p:'Docker',sk:'#c0f0e0',hc:'#0ea5e9',F:0,re:'🐳',act:['Monitor','Restart']},
{n:'HolyClaude',rm:'dorm',d:'Dormant',p:'To evaluate',sk:'#e0e0e0',hc:'#888',F:0,re:'💤',act:['Evaluate']},
{n:'LTX-Video',rm:'dorm',d:'Dormant',p:'To evaluate',sk:'#e0e0e0',hc:'#888',F:0,re:'💤',act:['Evaluate']},
{n:'DeepAgent',rm:'dorm',d:'Dormant',p:'To evaluate',sk:'#e0e0e0',hc:'#888',F:0,re:'💤',act:['Evaluate']},
{n:'Claude-Mem',rm:'dorm',d:'Dormant',p:'To evaluate',sk:'#e0e0e0',hc:'#888',F:0,re:'💤',act:['Evaluate']},
{n:'Strix',rm:'dorm',d:'Dormant',p:'To evaluate',sk:'#e0e0e0',hc:'#888',F:0,re:'💤',act:['Evaluate']},
{n:'Prometheus',rm:'dorm',d:'Dormant',p:'To evaluate',sk:'#e0e0e0',hc:'#888',F:0,re:'💤',act:['Evaluate']},
{n:'WEVCODE',rm:'wevia',d:'4 modes',p:'WEVIA',sk:'#f0d0d0',hc:'#333',F:0,re:'🧠',act:['Execute']},
{n:'WEVIAGateway',rm:'wevia',d:'18 providers',p:'WEVIA',sk:'#f0d0d0',hc:'#333',F:0,re:'🧠',act:['Execute']},
{n:'TTS',rm:'wevia',d:'Voice FR',p:'WEVIA',sk:'#f0d0d0',hc:'#333',F:0,re:'🧠',act:['Execute']},
{n:'MermaidGen',rm:'wevia',d:'Diagrams',p:'WEVIA',sk:'#f0d0d0',hc:'#333',F:0,re:'🧠',act:['Execute']},
{n:'L99',rm:'wevia',d:'761 tests',p:'WEVIA',sk:'#f0d0d0',hc:'#333',F:0,re:'🧠',act:['Execute']},
{n:'ClaudeSync',rm:'wevia',d:'Desktop',p:'WEVIA',sk:'#f0d0d0',hc:'#333',F:0,re:'🧠',act:['Execute']},
{n:'SkillsRAG',rm:'plat',d:'4414 pts',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'PromptsLib',rm:'plat',d:'55 prompts',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'CodeWiki',rm:'plat',d:'203 files',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'AIBench',rm:'plat',d:'182 models',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'ModelScope',rm:'plat',d:'Registry',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'OSSDiscover',rm:'plat',d:'685 tools',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'GHGrab',rm:'plat',d:'17 repos',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'AgentShield',rm:'plat',d:'Security',p:'Platform',sk:'#d0d0e0',hc:'#333',F:0,re:'🔧',act:['Index']},
{n:'BackupCron',rm:'cron',d:'PG backup',p:'4am daily',sk:'#c0d0f0',hc:'#333',F:0,re:'⏰',act:['Backup']},
{n:'Ethica',rm:'sal',d:'HCP Manager',p:'131K contacts',sk:'#f0d0b0',hc:'#333',F:0,re:'🔥',act:['Scrape','Enrich']}
];
// Tasks are now per-agent in act[]
const HU=26,BASE_RH=60,ROW_ADD=50;
AG.forEach(function(a){a.si='sit';a.x=0;a.y=0;a.dx=0;a.dy=0;a.cx=0;a.cy=0;a.bob=Math.random()*6.28;a.wk=0;a.triggered=false;a.alert='';a.alertOn=false;a.wtmr=0;a.dir=1;a.bl=0;a.blt=80+Math.random()*200;a.tk='';a.tkt=0;a.wp=[];a.wpi=0;});
function rz(){
W=innerWidth;var totalNeeded=HU+10;for(var ii=0;ii<DP.length;ii++)totalNeeded+=(typeof deptH==='function'?deptH(ii):60)+3;H=Math.max(innerHeight,totalNeeded);
C.width=W*2;C.height=H*2;X.scale(2,2);C.style.height=H+'px';
lay();
}
function oX(){return 4;}
function oW(){return Math.floor(W*.35);}
function pX(){return Math.floor(W*.38);}
function pW(){return Math.floor(W*.42);}
function oRect(i){return {x:oX(),y:deptY(i),w:oW(),h:deptH(i)};}
function pRect(i){return {x:pX(),y:deptY(i),w:pW(),h:deptH(i)};}
function lay(){
AG.forEach(function(a){
var di=DP.findIndex(function(d){return d.id===a.rm;});
if(di<0)return;
var o=oRect(di);
var mates=AG.filter(function(b){return b.rm===a.rm;});
var mi=mates.indexOf(a);
var cols=Math.min(mates.length,7);
var row=Math.floor(mi/cols);
var col=mi%cols;
var spacing=Math.min(50,(o.w-20)/Math.max(cols,1));
var totalW=cols*spacing;
a.dx=o.x+(o.w-totalW)/2+col*spacing+spacing/2;
var rows2=Math.ceil(mates.length/cols);
var totalVH=rows2*48;
a.dy=o.y+20+(o.h-totalVH)/2+row*48;
if(a.si==='sit'){a.x=a.dx;a.y=a.dy;}
var dept=DP[di];
var pr=pRect(di);
var psi=Math.floor(Math.random()*dept.pp.length);
var sw=pr.w/dept.pp.length;
a.cx=pr.x+psi*sw+sw/2;
a.cy=pr.y+pr.h/2;
});
}
function deptH(i){if(i>=DP.length||!DP[i])return 80;var cnt=AG.filter(function(a){return a.rm===DP[i].id;}).length;var rows=Math.ceil(cnt/Math.min(cnt,5));return BASE_RH+rows*ROW_ADD;}
function deptY(i){var y=HU+4;for(var j=0;j<i;j++)y+=deptH(j)+3;return y;}
addEventListener('resize',rz);rz();
// DRAW OFFICE (left)
function drawOff(i){
if(i>=DP.length||!DP[i])return;var r=oRect(i),d=DP[i],cl=d.cl,fl=d.fl;
X.fillStyle='#0001';X.beginPath();X.roundRect(r.x+3,r.y+3,r.w,r.h,8);X.fill();
var g=X.createLinearGradient(r.x,r.y,r.x,r.y+r.h);g.addColorStop(0,fl);g.addColorStop(1,fl+'bb');
X.fillStyle=g;X.beginPath();X.roundRect(r.x,r.y,r.w,r.h,8);X.fill();
X.strokeStyle=cl+'70';X.lineWidth=2;X.beginPath();X.roundRect(r.x,r.y,r.w,r.h,8);X.stroke();
X.fillStyle=cl;X.beginPath();X.roundRect(r.x,r.y,5,r.h,[8,0,0,8]);X.fill();
X.font='900 12px Nunito';X.fillStyle=cl;X.textAlign='left';X.fillText(d.l,r.x+6,r.y+14);
// Agent count badge
var cnt=AG.filter(function(a){return a.rm===d.id;}).length;
var acnt=AG.filter(function(a){return a.rm===d.id&&a.si!=='sit';}).length;
var bx=r.x+X.measureText(d.l).width+12;
X.fillStyle=acnt>0?'#22c55e30':'#64748b20';X.beginPath();X.roundRect(bx,r.y+4,22,14,7);X.fill();
X.font='800 8px JetBrains Mono';X.fillStyle=acnt>0?'#22c55e':'#64748b';X.fillText(cnt,bx+11,r.y+14);
// Status dot
X.fillStyle=acnt>0?'#22c55e':'#94a3b8';X.beginPath();X.arc(r.x+r.w-10,r.y+10,4,0,6.28);X.fill();
if(acnt>0){X.fillStyle='#22c55e40';X.beginPath();X.arc(r.x+r.w-10,r.y+10,7+Math.sin(fr*.1)*2,0,6.28);X.fill();}
// Door on right
var dy=r.y+r.h/2;
X.fillStyle='#fff';X.beginPath();X.roundRect(r.x+r.w-1,dy-6,5,12,[0,3,3,0]);X.fill();
X.strokeStyle=cl;X.lineWidth=1;X.beginPath();X.roundRect(r.x+r.w-1,dy-6,5,12,[0,3,3,0]);X.stroke();
X.fillStyle=cl;X.beginPath();X.arc(r.x+r.w+2.5,dy,1,0,6.28);X.fill();
}
// DRAW PIPELINE (right)
function drawPipe(i){
var r=pRect(i),d=DP[i],cl=d.cl;
X.fillStyle='#f4f6fc';X.beginPath();X.roundRect(r.x,r.y,r.w,r.h,8);X.fill();
X.strokeStyle=cl+'30';X.lineWidth=1;X.beginPath();X.roundRect(r.x,r.y,r.w,r.h,8);X.stroke();
var by=r.y+r.h/2;
// Pipeline background gradient
var pbg=X.createLinearGradient(r.x,r.y,r.x+r.w,r.y);
pbg.addColorStop(0,cl+'08');pbg.addColorStop(0.5,cl+'15');pbg.addColorStop(1,cl+'08');
X.fillStyle=pbg;X.fillRect(r.x+3,r.y+3,r.w-6,r.h-6);
X.fillStyle=cl+'12';X.beginPath();X.roundRect(r.x+3,by-4,r.w-6,8,3);X.fill();
// Animated flow dots on track
var flowX=(fr*0.5+i*100)%(r.w-20);
X.fillStyle=cl+'40';X.beginPath();X.arc(r.x+10+flowX,by,3,0,6.28);X.fill();
X.fillStyle=cl+'25';X.beginPath();X.arc(r.x+10+(flowX+15)%(r.w-20),by,2,0,6.28);X.fill();
var sw=r.w/d.pp.length;
d.pp.forEach(function(s,j){
var sx=r.x+j*sw+sw/2;
X.fillStyle='#fff';X.beginPath();X.arc(sx,by,11,0,6.28);X.fill();
X.fillStyle=cl+'25';X.beginPath();X.arc(sx,by,11,0,6.28);X.fill();
X.strokeStyle=cl;X.lineWidth=1.5;X.beginPath();X.arc(sx,by,11,0,6.28);X.stroke();
X.fillStyle=cl;X.beginPath();X.arc(sx,by,4,0,6.28);X.fill();
X.font='800 7px Nunito';X.fillStyle=cl;X.textAlign='center';X.fillText(s,sx,by+18);
// Stage number inside circle
X.font='bold 8px JetBrains Mono';X.fillStyle='#fff';X.textBaseline='middle';X.fillText(j+1,sx,by);X.textBaseline='alphabetic';
if(j<d.pp.length-1){
// Animated arrow between stages
var ax=sx+sw/2;
X.fillStyle=cl+'50';X.beginPath();X.moveTo(ax-4,by-3);X.lineTo(ax+4,by);X.lineTo(ax-4,by+3);X.closePath();X.fill();
}
});
X.font='800 8px Nunito';X.fillStyle=cl+'90';X.textAlign='right';X.fillText('PIPELINE',r.x+r.w-4,r.y+9);
}
// WALKWAY between office and pipeline
function outX(){return pX()+pW()+8;}
function outW(){return Math.floor(W*.12);}
function outRect(i){return {x:outX(),y:deptY(i),w:outW(),h:deptH(i)};}
function drawOut(i){
if(i>=DP.length||!DP[i])return;var r=outRect(i),d=DP[i],cl=d.cl;
var o=OUT[d.id];if(!o)return;
// Background
var g=X.createLinearGradient(r.x,r.y,r.x+r.w,r.y+r.h);
g.addColorStop(0,'#f8fafc');g.addColorStop(1,'#f0f4f8');
X.fillStyle=g;X.beginPath();X.roundRect(r.x,r.y,r.w,r.h,8);X.fill();
X.strokeStyle=cl+'40';X.lineWidth=1;X.beginPath();X.roundRect(r.x,r.y,r.w,r.h,8);X.stroke();
// Right color bar
X.fillStyle=cl;X.beginPath();X.roundRect(r.x+r.w-4,r.y,4,r.h,[0,8,8,0]);X.fill();
// Header
X.font='800 7px Nunito';X.fillStyle=cl;X.textAlign='center';
X.fillText('OUTPUT',r.x+r.w/2,r.y+10);
// Date removed (was confusing 2/4 = 2 avril)
// Icon
X.font='14px sans-serif';X.fillText(o.icon,r.x+r.w/2,r.y+r.h/2-5);
// Metric (big)
X.font='900 10px JetBrains Mono';
var mColor=o.metric.includes('TODO')||o.metric.includes('-45')||o.metric.includes('wait')?'#ef4444':
o.metric.includes('OK')||o.metric.includes('99')||o.metric.includes('+')?'#22c55e':'#3b82f6';
X.fillStyle=mColor;X.fillText(o.metric,r.x+r.w/2,r.y+r.h/2+10);
// Input line
// Capacity bar
var capPct=70+Math.sin(i*.7)*20;// simulated capacity usage
X.fillStyle='#e2e8f0';X.beginPath();X.roundRect(r.x+6,r.y+r.h-28,r.w-12,5,2);X.fill();
var barColor=capPct>80?'#ef4444':capPct>50?'#f59e0b':'#22c55e';
X.fillStyle=barColor;X.beginPath();X.roundRect(r.x+6,r.y+r.h-28,Math.min(capPct,100)/100*(r.w-12),5,2);X.fill();
X.font='600 4.5px JetBrains Mono';X.fillStyle=barColor;X.textAlign='right';
X.fillText(Math.round(capPct)+'%',r.x+r.w-6,r.y+r.h-30);X.textAlign='center';
// Input/Output
X.font='600 5px Nunito';X.fillStyle='#64748b';
X.fillText(o.input,r.x+r.w/2,r.y+r.h-18);
X.fillStyle='#2a2a4a';X.font='700 5px Nunito';
X.fillText(o.output,r.x+r.w/2,r.y+r.h-10);
}
function drawWalk(){
DP.forEach(function(d,i){
var o=oRect(i),p=pRect(i),ym=o.y+o.h/2;
// Walkway with animated dashes
var wx1=o.x+o.w+2,wx2=p.x-4,wy=ym;
X.fillStyle='#d8e4f0';X.beginPath();X.roundRect(wx1,wy-4,wx2-wx1,8,3);X.fill();
X.strokeStyle=d.cl+'60';X.lineWidth=1;X.setLineDash([6,4]);X.lineDashOffset=-fr*0.3;
X.beginPath();X.moveTo(wx1+4,wy);X.lineTo(wx2-4,wy);X.stroke();X.setLineDash([]);
// Arrow
X.fillStyle=d.cl+'80';X.beginPath();X.moveTo(wx2-8,wy-4);X.lineTo(wx2,wy);X.lineTo(wx2-8,wy+4);X.closePath();X.fill();
// Arrow from pipeline to output
var or2=outRect(i);var ox1=p.x+p.w+2,ox2=or2.x-2;
X.fillStyle='#d8e4f0';X.beginPath();X.roundRect(ox1,wy-3,ox2-ox1,6,2);X.fill();
X.fillStyle=d.cl+'60';X.beginPath();X.moveTo(ox2-6,wy-3);X.lineTo(ox2,wy);X.lineTo(ox2-6,wy+3);X.closePath();X.fill();
X.strokeStyle='#e0d050';X.lineWidth=.5;X.setLineDash([3,4]);
X.beginPath();X.moveTo(o.x+o.w+8,ym);X.lineTo(p.x-4,ym);X.stroke();X.setLineDash([]);
X.fillStyle='#b0c0d860';X.font='7px sans-serif';X.textAlign='center';
X.fillText('→',(o.x+o.w+p.x)/2,ym+2);
});
}
// CHARACTER (emoji-based HD)
function drawC(a){
var isH=a===hov,sit=a.si==='sit',sc=isH?1.2:1;
var bob=sit?0:Math.sin(a.bob)*1.5;
var di=DP.findIndex(function(d){return d.id===a.rm;});
var cl=di>=0?DP[di].cl:'#888';
X.save();X.translate(a.x,a.y+bob);X.scale(sc,sc);
if(isH){X.shadowColor=cl;X.shadowBlur=12;}
// Shadow
X.fillStyle='#00000018';X.beginPath();X.ellipse(0,sit?5:10,7,2.5,0,0,6.28);X.fill();
// Body (colored pill)
var bg=X.createLinearGradient(-5,-4,5,4);bg.addColorStop(0,cl);bg.addColorStop(1,cl+'99');
X.fillStyle=bg;X.beginPath();X.roundRect(-6,-5,12,10,[5,5,2,2]);X.fill();
X.fillStyle='#ffffff20';X.beginPath();X.roundRect(-4,-4,4,7,[2,0,0,2]);X.fill();
// Legs (walking)
if(!sit){
var lsw=Math.sin(a.wk)*3;
X.fillStyle=cl+'bb';
X.save();X.translate(-2.5,4);X.rotate(lsw*.04);X.beginPath();X.roundRect(-1.5,0,3,7,1.5);X.fill();X.restore();
X.save();X.translate(2.5,4);X.rotate(-lsw*.04);X.beginPath();X.roundRect(-1.5,0,3,7,1.5);X.fill();X.restore();
X.fillStyle='#fff';
X.beginPath();X.ellipse(-2.5+lsw*.1,11,2.5,1.2,0,0,6.28);X.fill();
X.beginPath();X.ellipse(2.5-lsw*.1,11,2.5,1.2,0,0,6.28);X.fill();
}
// Arms
X.fillStyle=a.sk;
var asw=sit?0:Math.sin(a.wk+.5)*.15;
X.save();X.translate(-7,-1);X.rotate(sit?.2:asw);X.beginPath();X.roundRect(-1.5,0,3,sit?4:7,1.5);X.fill();X.restore();
X.save();X.translate(7,-1);X.rotate(sit?-.2:-asw);X.beginPath();X.roundRect(-1.5,0,3,sit?4:7,1.5);X.fill();X.restore();
// HEAD — use emoji face for HD quality
X.font='22px sans-serif';X.textAlign='center';X.textBaseline='middle';
X.fillText(a.re||'👤',0,-14);
// Name
X.textBaseline='alphabetic';
X.font=(isH?'800':'600')+' '+(isH?7:5.5)+'px Nunito';
X.fillStyle=isH?'#2a2a4a':a.si!=='sit'?cl:'#6a7a98';
X.textAlign='center';X.fillText(a.n,0,sit?14:20);
// Active dot
if(a.si!=='sit'){
X.fillStyle=cl+'40';X.beginPath();X.arc(0,-28,5+Math.sin(fr*.15)*2,0,6.28);X.fill();
X.fillStyle=cl;X.beginPath();X.arc(0,-28,3,0,6.28);X.fill();
}
// Task bubble
if(a.tkt>0){
X.globalAlpha=Math.min(a.tkt/6,1);
var tw2=Math.min(a.tk.length*5+16,180);
var by2=a.si==='sit'?20:26;
// Speech bubble BELOW agent
X.fillStyle='#ffffffee';X.shadowColor='#00000020';X.shadowBlur=6;
X.strokeStyle='#3b82f680';X.lineWidth=1;
X.beginPath();X.roundRect(-tw2/2,by2,tw2,34,8);X.fill();X.stroke();X.shadowBlur=0;
// Triangle pointing UP to agent
X.fillStyle='#ffffffee';X.beginPath();X.moveTo(-4,by2);X.lineTo(4,by2);X.lineTo(0,by2-5);X.closePath();X.fill();
// Action text
// Line 1: action
X.font='700 7px Nunito';X.fillStyle='#1e40af';X.textAlign='center';X.textBaseline='middle';
X.fillText(a.tk,0,by2+7);
// Line 2: freq
var meta=AMETA[a.n]||{};
var fr2=meta.fq||FREQ_DEF[a.rm]||'';
X.font='600 5.5px Nunito';X.fillStyle='#94a3b8';
X.fillText('⏱ '+fr2,0,by2+16);
// Line 3: input
if(meta.inp){
X.font='600 5px Nunito';X.fillStyle='#64748b';
X.fillText('📥 '+meta.inp,0,by2+24);
}
X.textBaseline='alphabetic';X.globalAlpha=1;
}
// ALERT: compact red badge
if(a.alertOn&&a.alert){
X.shadowColor='#ef4444';X.shadowBlur=6+Math.sin(fr*.15)*3;
X.fillStyle='#ef444420';X.beginPath();X.arc(0,-14,14,0,6.28);X.fill();
X.shadowBlur=0;
X.fillStyle='#ef4444';X.beginPath();X.arc(12,-22,6,0,6.28);X.fill();
X.font='bold 8px sans-serif';X.fillStyle='#fff';X.textAlign='center';X.textBaseline='middle';
X.fillText('!',12,-22);X.textBaseline='alphabetic';
var atxt=a.alert.length>16?a.alert.substring(0,16):a.alert;
var aw3=Math.min(atxt.length*5+14,110);
X.fillStyle='#fef2f2ee';X.strokeStyle='#fca5a5';X.lineWidth=1;
X.beginPath();X.roundRect(-aw3/2,-42,aw3,15,4);X.fill();X.stroke();
X.font='600 7px JetBrains Mono';X.fillStyle='#dc2626';X.textAlign='center';X.textBaseline='middle';
X.fillText(atxt,0,-34.5);X.textBaseline='alphabetic';
}
X.restore();
}
// PATH
function mkP(a){
var di=DP.findIndex(function(d){return d.id===a.rm;});
if(di<0)return[];
var o=oRect(di),ym=o.y+o.h/2;
return[{x:o.x+o.w+6,y:ym},{x:a.cx,y:a.cy}];
}
function mkR(a){
var di=DP.findIndex(function(d){return d.id===a.rm;});
if(di<0)return[];
var o=oRect(di),ym=o.y+o.h/2;
return[{x:o.x+o.w+6,y:ym},{x:a.dx,y:a.dy}];
}
// UPDATE
function upd(dt){fr++;var ac=0;
AG.forEach(function(a){
a.bob+=dt*(a.si==='sit'?1:4);a.blt-=dt*60;
if(a.blt<=0){a.bl=4;a.blt=80+Math.random()*200;}
if(a.bl>0)a.bl-=dt*60;if(a.tkt>0)a.tkt-=dt*3;
if(a.si==='sit'){
if(a.triggered){a.triggered=false;a.alert='';a.alertOn=false;a.wp=mkP(a);a.wpi=0;a.si='go';a.wk=0;a.tkt=60;}
}else if(a.si==='go'){a.wk+=dt*6;ac++;
if(a.wpi<a.wp.length){var w=a.wp[a.wpi],dx=w.x-a.x,dy=w.y-a.y,d=Math.sqrt(dx*dx+dy*dy);
if(d>1.5){a.x+=dx/d*55*dt;a.y+=dy/d*55*dt;a.dir=dx>0?1:-1;}else a.wpi++;}
else{a.si='work';a.wtmr=80;}
}else if(a.si==='work'){a.wk+=dt*2;ac++;a.wtmr-=dt*60;
if(a.wtmr<=0){a.wp=mkR(a);a.wpi=0;a.si='back';tc++;}
}else if(a.si==='back'){a.wk+=dt*6;ac++;
if(a.wpi<a.wp.length){var w2=a.wp[a.wpi],dx2=w2.x-a.x,dy2=w2.y-a.y,d2=Math.sqrt(dx2*dx2+dy2*dy2);
if(d2>1.5){a.x+=dx2/d2*55*dt;a.y+=dy2/d2*55*dt;a.dir=dx2>0?1:-1;}else a.wpi++;}
else{a.si='sit';a.x=a.dx;a.y=a.dy;a.dir=1;}
}
});
// Legend
if(fr===1){
X.fillStyle='#ffffff90';X.beginPath();X.roundRect(W-320,2,310,22,4);X.fill();
X.font='600 7px Nunito';X.textAlign='left';
var lx=W-315;
[['🟢','Actif','#22c55e'],['🔴','Alerte','#ef4444'],['🟠','To Wire','#f97316'],['🟡','Integrate','#84cc16'],['🐳','Docker','#0ea5e9'],['💤','Dormant','#a1a1aa'],['💀','Dead','#64748b']].forEach(function(l){
X.fillStyle=l[2];X.fillText(l[0]+' '+l[1],lx,16);lx+=44;
});
}
document.getElementById('hud-time').textContent=new Date().toLocaleTimeString();
document.getElementById('st').textContent='👥'+AG.length+'/150'+' 🟢'+ac+' 📦'+tc+' 🔴LIVE';
}
function alertAgent(name,msg){
var a=AG.find(function(x){return x.n===name;});
if(a){a.alert=msg;a.alertOn=true;}
}
function trig(name,action){var a=AG.find(function(x){return x.n===name;});if(a&&a.si==='sit'){a.triggered=true;a.tk=action;}return !!a;}
function trigD(dept,action){var aa=AG.filter(function(x){return x.rm===dept&&x.si==='sit';});if(aa.length){var a=aa[~~(Math.random()*aa.length)];a.triggered=true;a.tk=action;}}
var lastRT=0;
function realTime(t){
if(t-lastRT<10000)return;lastRT=t;
var h=new Date().getHours(),m=new Date().getMinutes();
// Realtime monitor check
if(m%5===0){trig('EthicaCron','Drip DZ+MA+TN');trigD('pha','Ethica drip');}
if(h%4===0&&m<2)trig('B2BCron','B2B scrape');
if((h===6||h===18)&&m<2){trig('NonRegCron','153 tests');trig('QA','NonReg run');}
if(h===4&&m<2)trig('BackupCron','PG backup');
if(m%3===0)trig('Watchdog','Check */3min');
if(h===7&&m<2){trig('CEO','Daily brief');trig('TaskMgr','Status report');}
if(h>=9&&h<=18){
if(Math.random()<0.25)trigD('dev','Commit push');
if(Math.random()<0.12)trigD('con','Client call');
if(Math.random()<0.08)trigD('sec','Security scan');
if(Math.random()<0.15)trigD('ops','Monitor check');
if(Math.random()<0.1)trigD('sal','New lead');
}
if(Math.random()<0.12)trigD('dock','Container check');
if(Math.random()<0.15)trigD('ai','AI request');
// Static alerts for known issues
alertAgent('S88 GPU','💀 GPU MORT — annuler Hetzner -45€/mois');
alertAgent('S89','⚰️ SERVEUR DOWN — port 49222 inaccessible');
alertAgent('ECS PMTA','❓ STATUS INCONNU — à vérifier');
alertAgent('Loki','⚠️ RESTARTING — container en boucle');
// Check Stripe/WhatsApp/OVH SMS missing creds
alertAgent('Stripe','🔴 SK live MANQUANTE — dashboard.stripe.com');
alertAgent('WhatsApp','🔴 TOKEN MANQUANT');
alertAgent('OVH SMS','🔴 CREDS MANQUANTES');
alertAgent('Azure AD','🔴 3 tenants EXPIRÉS — re-register');
alertAgent('Gemini','🔴 API DISABLED — activer aistudio.google.com');
}
function hit(){
hov=null;
AG.forEach(function(a){if(Math.abs(mx-a.x)<8&&Math.abs(my-a.y)<14)hov=a;});
if(hov){
TT.style.display='block';
TT.style.left=Math.min(mx+12,W-220)+'px';
TT.style.top=Math.max(my-120,10)+'px';
var dd=DP.find(function(d){return d.id===hov.rm;});
TT.style.borderColor=dd?dd.cl:'#888';
TT.querySelector('b').textContent=hov.n+(hov.F?' 👩':' 👨');
TT.querySelector('i').textContent=dd?dd.l:'';
TT.querySelector('i').style.color=dd?dd.cl:'';
TT.querySelector('.d').textContent=hov.d;
TT.querySelector('.p').textContent='→ '+hov.p;
var sm={sit:'💤 Bureau',go:'🚶→ Pipeline',work:'⚙️ Produit',back:'✅ Retour'};
TT.querySelector('.s').textContent=sm[hov.si]||'';
TT.querySelector('.s').style.color=hov.si==='sit'?'#94a3b8':'#16a34a';
} else {TT.style.display='none';}
}
var lt=0;
function loop(t){
var dt=Math.min((t-lt)/1000,.04);lt=t;
X.fillStyle='#e4ecf6';X.fillRect(0,0,W,H);realTime(t);
drawWalk();
for(var i=0;i<DP.length;i++){drawOff(i);drawPipe(i);drawOut(i);}
upd(dt);
var sorted=AG.slice().sort(function(a,b){return a.y-b.y;});
sorted.forEach(function(a){drawC(a);});
hit();
requestAnimationFrame(loop);
}
C.addEventListener('click',function(e){
var cx2=e.clientX,cy2=e.clientY;
AG.forEach(function(a){
if(Math.abs(cx2-a.x)<12&&Math.abs(cy2-a.y)<18&&a.alertOn){
a.alertOn=false;a.alert='';
}
});
});
C.addEventListener('click',function(ev){
var ex=ev.clientX,ey=ev.clientY+window.scrollY;
var clicked=null;
AG.forEach(function(a){if(Math.abs(ex-a.x)<15&&Math.abs(ey-a.y)<25)clicked=a;});
if(clicked){
if(clicked.alertOn){clicked.alertOn=false;clicked.alert='';return;}
var dd2=DP.find(function(d){return d.id===clicked.rm;})||{};
var meta2=AMETA[clicked.n]||{};
var out3=OUT[clicked.rm]||{};
var sm2={sit:'En attente',go:'Vers pipeline',work:'En action',back:'Retour bureau'};
var oldP=document.getElementById('agent-panel');if(oldP)oldP.remove();
var panel=document.createElement('div');
panel.id='agent-panel';
panel.style.cssText='position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;padding:20px;min-width:340px;max-width:440px;box-shadow:0 12px 40px #0004;z-index:200;font-family:Nunito,sans-serif';
var sC=clicked.si!=='sit'?'#16a34a':'#64748b';
var h3='<div style="display:flex;justify-content:space-between;align-items:center">';
h3+='<div style="font-size:1.4rem;font-weight:900;color:'+(dd2.cl||'#333')+'">'+clicked.re+' '+clicked.n+'<\/div>';
h3+='<div style="cursor:pointer;font-size:1.5rem;color:#94a3b8;padding:4px 8px" onclick="this.parentElement.parentElement.remove()">X<\/div><\/div>';
h3+='<div style="font-size:.7rem;color:#64748b;text-transform:uppercase;letter-spacing:1.5px;margin:4px 0 10px;padding-bottom:8px;border-bottom:2px solid '+(dd2.cl||'#e2e8f0')+'">'+(dd2.l||'')+'<\/div>';
h3+='<div style="display:inline-block;padding:4px 12px;border-radius:6px;font-size:.72rem;font-weight:800;background:#f8fafc;color:'+sC+'">'+(sm2[clicked.si]||clicked.si)+'<\/div>';
h3+='<div style="font-size:.85rem;color:#1e293b;font-weight:700;margin:8px 0 4px">'+clicked.d+'<\/div>';
h3+='<div style="font-size:.78rem;color:#475569;margin-bottom:10px">'+clicked.p+'<\/div>';
h3+='<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px">';
h3+='<div style="background:#f0f9ff;border-radius:8px;padding:8px;text-align:center"><div style="font-size:.55rem;color:#94a3b8;text-transform:uppercase">Frequence<\/div><div style="font-size:.82rem;font-weight:800;color:#1e40af">'+(meta2.fq||'N/A')+'<\/div><\/div>';
h3+='<div style="background:#f0fdf4;border-radius:8px;padding:8px;text-align:center"><div style="font-size:.55rem;color:#94a3b8;text-transform:uppercase">Output<\/div><div style="font-size:.82rem;font-weight:800;color:#16a34a">'+(out3.metric||'~')+'<\/div><\/div>';
h3+='<\/div>';
if(meta2.inp)h3+='<div style="font-size:.72rem;color:#3b82f6;margin:3px 0">📥 '+meta2.inp+'<\/div>';
if(out3.output)h3+='<div style="font-size:.72rem;color:#16a34a;margin:3px 0">📤 '+out3.output+'<\/div>';
if(out3.kpi)h3+='<div style="font-size:.72rem;color:#64748b;margin:3px 0">📊 '+out3.kpi+'<\/div>';
h3+='<div style="margin-top:10px;padding-top:8px;border-top:1px solid #f1f5f9"><div style="font-size:.55rem;color:#94a3b8;text-transform:uppercase;margin-bottom:4px">Actions<\/div>';
(clicked.act||[]).forEach(function(ac){h3+='<span style="display:inline-block;background:#eff6ff;color:#2563eb;padding:2px 8px;border-radius:4px;font-size:.65rem;margin:2px;font-weight:600">'+ac+'<\/span>';});
h3+='<\/div>';
panel.innerHTML=h3;
document.body.appendChild(panel);
return;
}
// OUTPUT PANEL CLICK → modal with deliverables + download
for(var oi=0;oi<DP.length;oi++){
var or3=outRect(oi);
if(ex>=or3.x&&ex<=or3.x+or3.w&&ey>=or3.y&&ey<=or3.y+or3.h){
var d3=DP[oi];if(!d3)break;var o3=OUT[d3.id];if(!o3)break;
var ags=AG.filter(function(a){return a.rm===d3.id;});
var oldP2=document.getElementById('agent-panel');if(oldP2)oldP2.remove();
var p2=document.createElement('div');p2.id='agent-panel';
p2.style.cssText='position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;padding:24px;min-width:420px;max-width:520px;max-height:80vh;overflow-y:auto;box-shadow:0 12px 40px #0004;z-index:200;font-family:Nunito,sans-serif';
var h4='<div style="display:flex;justify-content:space-between"><div style="font-size:1.3rem;font-weight:900;color:'+(d3.cl||'#333')+'">'+d3.l+' \u2014 Output<\/div>';
h4+='<div style="cursor:pointer;font-size:1.5rem;color:#94a3b8;padding:2px 8px" onclick="this.parentElement.parentElement.remove()">X<\/div><\/div>';
h4+='<div style="font-size:2.2rem;font-weight:900;color:#16a34a;margin:10px 0">'+(o3.metric||'')+'<\/div>';
h4+='<div style="font-size:.82rem;color:#475569;margin-bottom:12px">'+(o3.input||'')+' \u2192 '+(o3.output||'')+'<\/div>';
h4+='<div style="font-size:.72rem;color:#64748b;margin-bottom:8px">📊 KPI: '+(o3.kpi||'N/A')+'<\/div>';
if(o3.deliverables&&o3.deliverables.length){
h4+='<div style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:10px;padding:12px;margin:12px 0">';
h4+='<div style="font-weight:800;font-size:.72rem;color:#16a34a;margin-bottom:8px">📦 LIVRABLES REELS<\/div>';
o3.deliverables.forEach(function(dl){
h4+='<div style="font-size:.72rem;color:#15803d;padding:3px 0;display:flex;align-items:center;gap:6px">\u2705 '+dl+'<\/div>';
});
h4+='<\/div>';
}
h4+='<div style="font-size:.68rem;color:#94a3b8;margin:8px 0">'+ags.length+' agents dans ce departement<\/div>';
h4+='<table style="width:100%;border-collapse:collapse;font-size:.68rem;margin:8px 0">';
h4+='<tr style="background:#f8fafc"><th style="padding:4px 8px;text-align:left;border-bottom:1px solid #e2e8f0">Agent<\/th><th style="padding:4px;border-bottom:1px solid #e2e8f0">Role<\/th><th style="padding:4px;border-bottom:1px solid #e2e8f0">Freq<\/th><\/tr>';
ags.forEach(function(a){var m=AMETA[a.n]||{};h4+='<tr><td style="padding:3px 8px;font-weight:700">'+a.re+' '+a.n+'<\/td><td style="padding:3px 4px">'+a.d+'<\/td><td style="padding:3px 4px;font-family:monospace;font-size:.6rem">'+(m.fq||'-')+'<\/td><\/tr>';});
h4+='<\/table>';
// Download CSV button
h4+='<div style="display:flex;gap:8px;margin-top:12px">';
h4+='<button style="background:#2563eb;color:#fff;border:none;padding:8px 16px;border-radius:8px;cursor:pointer;font-weight:700;font-size:.75rem" onclick="(function(){var csv=\'Agent,Role,Freq\\n\';document.querySelectorAll(\'#agent-panel table tr\').forEach(function(r,i){if(i===0)return;var c=r.querySelectorAll(\'td\');csv+=c[0].textContent+\',\'+c[1].textContent+\',\'+c[2].textContent+\'\\n\'});csv+=\'\\nMetric,'+(o3.metric||'')+'\\n\';csv+=\'Output,'+(o3.output||'')+'\\n\';';
if(o3.deliverables)o3.deliverables.forEach(function(dl){h4+='csv+=\'Livrable,'+dl.replace(/'/g,'')+'\\n\';';});
h4+='var b=new Blob([csv],{type:\'text/csv\'});var u=URL.createObjectURL(b);var l=document.createElement(\'a\');l.href=u;l.download=\'weval-'+d3.id+'-output.csv\';l.click();})()">📥 CSV<\/button>';
h4+='<button style="background:#64748b;color:#fff;border:none;padding:8px 16px;border-radius:8px;cursor:pointer;font-weight:700;font-size:.75rem" onclick="this.closest(\'[id]\').remove()">Fermer<\/button>';
h4+='<\/div>';
p2.innerHTML=h4;document.body.appendChild(p2);
return;
}
}
AG.forEach(function(a){if(Math.abs(ex-a.x)<15&&Math.abs(ey-a.y)<25&&a.alertOn){a.alertOn=false;a.alert='';}});
});
C.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY+window.scrollY;C.style.cursor=hov?'pointer':'default';});
C.addEventListener('mouseleave',function(){mx=my=-1;});
requestAnimationFrame(loop);
</script></body></html>