Files
weval-consulting/ops-center.html.BROKEN-29mars

980 lines
87 KiB
Plaintext

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>WEVAL OPS</title>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=DM+Sans:wght@400;600;700&display=swap" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>
<style>
:root{--bg:#06080c;--b2:#0c1018;--b3:#121820;--bd:#1a2030;--fg:#e0e8f0;--dm:#4a5568;--ac:#00e5a0;--a2:#00b8ff;--wn:#ff6b35;--er:#ff3860;--pu:#8b5cf6}
*{margin:0;padding:0;box-sizing:border-box}
body{background:var(--bg);color:var(--fg);font-family:'DM Sans',sans-serif;height:100vh;overflow:hidden}
code,pre,.m{font-family:'IBM Plex Mono',monospace}
::-webkit-scrollbar{width:4px}::-webkit-scrollbar-thumb{background:#2a3040;border-radius:2px}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.4}}
button{font-family:inherit;cursor:pointer;transition:all .12s}
input,textarea{font-family:inherit}
a.ext{color:var(--a2);text-decoration:none;font-size:9px;padding:2px 6px;border-radius:3px;border:1px solid var(--bd);background:var(--b2)}
a.ext:hover{border-color:var(--a2)}
/* Typing reveal animation */
@keyframes typeReveal{from{max-height:0;opacity:0}to{max-height:5000px;opacity:1}}
.typing-reveal{animation:typeReveal 0.8s ease-out forwards;overflow:hidden}
</style>
<link rel=\stylesheet\ href=\/assets/manager-v2.css\>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" defer></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
<script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js" defer></script>
<script>setTimeout(function(){try{if(window.mermaid)mermaid.initialize({startOnLoad:false,theme:"dark",securityLevel:"loose",logLevel:5})}catch(e){}},2000)</script>
</head>
<body>
<div id="root"></div>
<script>
var h=React.createElement, useState=React.useState, useEffect=React.useEffect, useRef=React.useRef;
/* API */
function cx(c){return fetch("/api/cx",{method:"POST",body:"k=WEVADS2026&c="+btoa(c),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(r){return r.text()})}
function sentinel(c){return cx("curl -s 'http://10.1.0.3:5890/api/sentinel-brain.php?action=exec&cmd="+encodeURIComponent(c)+"'")}
function s151(c){var s=c.replace(/"/g,'\\"');return cx('sshpass -p MX8D3zSAty7k3243242 ssh -o StrictHostKeyChecking=no -o ConnectTimeout=8 ubuntu@151.80.235.110 "'+s+'"')}
function parse(r){try{var j=JSON.parse(r);return j.output||j.stdout||r}catch(e){return r}}
function apiGet(p){return fetch(p).then(function(r){return r.json()})}
/* Markdown-lite renderer */
function md(text){
if(!text||typeof text!=="string")return text;
var lines=text.split("\n");var out=[];var inCode=false;var codeBuf=[];var codeLang="";
for(var i=0;i<lines.length;i++){
var line=lines[i];
if(line.match(/^```/)){
if(inCode){if(codeLang==="mermaid"){var mid="mm"+i+Math.random().toString(36).slice(2,6);out.push(h("div",{key:"c"+i,ref:function(el){if(el&&window.mermaid){try{window.mermaid.render(mid,codeBuf.join("\n")).then(function(r){el.innerHTML=r.svg}).catch(function(e){el.textContent=codeBuf.join("\n")})}catch(e){el.textContent=codeBuf.join("\n")}}},style:{background:"#0d1117",border:"1px solid rgba(0,229,160,0.1)",borderRadius:10,padding:16,margin:"10px 0",minHeight:60}}))}else{out.push(h("pre",{key:"c"+i,className:"m",ref:function(el){if(el&&window.hljs){var code=el.querySelector("code");if(code&&!code.dataset.hl){try{window.hljs.highlightElement(code)}catch(e){}code.dataset.hl="1"}}},style:{background:"#0d1117",border:"1px solid rgba(0,229,160,0.08)",borderRadius:10,padding:14,margin:"10px 0",fontSize:11,color:"#e6edf3",overflowX:"auto",lineHeight:1.6}},h("code",{className:codeLang?"language-"+codeLang:""},codeBuf.join("\n"))))};codeBuf=[];inCode=false}
else{codeLang=line.slice(3);inCode=true}
}else if(inCode){codeBuf.push(line)}
else if(line.match(/^### /)){out.push(h("div",{key:"h"+i,style:{fontSize:11,fontWeight:700,color:"var(--a2)",margin:"8px 0 4px"}},line.slice(4)))}
else if(line.match(/^## /)){out.push(h("div",{key:"h"+i,style:{fontSize:12,fontWeight:700,color:"var(--ac)",margin:"8px 0 4px"}},line.slice(3)))}
else if(line.match(/^# /)){out.push(h("div",{key:"h"+i,style:{fontSize:13,fontWeight:700,color:"var(--ac)",margin:"8px 0 4px"}},line.slice(2)))}
else if(line.match(/^[-*] /)){out.push(h("div",{key:"l"+i,style:{paddingLeft:12,fontSize:11,lineHeight:1.5}},"\u2022 "+inlineFormat(line.slice(2))))}
else if(line.match(/^\d+\. /)){out.push(h("div",{key:"l"+i,style:{paddingLeft:12,fontSize:11,lineHeight:1.5}},inlineFormat(line)))}
else if(line.trim()===""){out.push(h("div",{key:"s"+i,style:{height:6}}))}
else{out.push(h("div",{key:"t"+i,style:{fontSize:11,lineHeight:1.5}},inlineFormat(line)))}
}
if(inCode&&codeBuf.length){out.push(h("pre",{key:"cf",className:"m",style:{background:"#0d1117",border:"1px solid var(--bd)",borderRadius:5,padding:8,margin:"6px 0",fontSize:10,color:"#e6edf3",overflowX:"auto"}},h("code",null,codeBuf.join("\n"))))}
return out;
}
function inlineFormat(s){
if(!s)return s;
var parts=[];var re=/(`[^`]+`|\*\*[^*]+\*\*)/g;var last=0;var m;
while((m=re.exec(s))!==null){
if(m.index>last)parts.push(s.slice(last,m.index));
var t=m[0];
if(t.startsWith("`"))parts.push(h("code",{key:"i"+m.index,className:"m",style:{background:"#1a2030",padding:"1px 4px",borderRadius:3,fontSize:10,color:"#f59e0b"}},t.slice(1,-1)));
else if(t.startsWith("**"))parts.push(h("strong",{key:"i"+m.index,style:{fontWeight:700,color:"var(--fg)"}},t.slice(2,-2)));
last=re.lastIndex;
}
if(last<s.length)parts.push(s.slice(last));
return parts.length?parts:s;
}
/* === LIVE METRICS === */
function LiveMetrics(){
var d=useState(null),data=d[0],setData=d[1];
useEffect(function(){
function load(){
fetch("/api/live-metrics.php").then(function(r){return r.json()}).then(setData).catch(function(){});
}
load();var t=setInterval(load,30000);return function(){clearInterval(t)};
},[]);
if(!data)return null;
var items=[
{l:"Disk",v:data.disk||"?",c:parseInt(data.disk)>85?"var(--er)":"var(--ac)"},
{l:"RAM",v:data.ram||"?",c:"var(--a2)"},
{l:"Ollama",v:(data.ollama||"?")+" mdl",c:"var(--pu)"},
{l:"Up",v:data.uptime||"?",c:"var(--ac)"}
];
return h("div",{style:{display:"flex",gap:8,alignItems:"center"}},
items.map(function(it,i){
return h("div",{key:i,className:"m",style:{fontSize:8,padding:"3px 8px",borderRadius:6,background:it.c+"11",border:"1px solid "+it.c+"33",color:it.c,letterSpacing:"0.3px",whiteSpace:"nowrap"}},
h("span",{style:{opacity:0.7}},it.l+": "),h("span",{style:{fontWeight:600}},it.v)
);
})
);
}
/* === STREAMING TEXT REVEAL === */
function StreamText(props){
var text=props.text||"";
var s=useState(""),displayed=s[0],setDisplayed=s[1];
var s2=useState(false),done=s2[0],setDone=s2[1];
var ref=useRef(null);
useEffect(function(){
if(!text)return;
var words=text.split(/(\s+)/);
var idx=0;var buf="";
var timer=setInterval(function(){
if(idx>=words.length){clearInterval(timer);setDone(true);return}
buf+=words[idx];idx++;
// Show 3 words at a time for speed
if(idx<words.length){buf+=words[idx];idx++}
if(idx<words.length){buf+=words[idx];idx++}
setDisplayed(buf);
},15);
return function(){clearInterval(timer)};
},[text]);
return done?props.children:h("div",{style:{fontSize:11,lineHeight:1.5}},displayed);
}
/* === ARTIFACT PANEL v1 === */
function ArtifactPanel(props){
var content=props.content||"";var type=props.type||"code";var onClose=props.onClose;
var panelStyle={position:"fixed",top:0,right:0,width:"45vw",height:"100vh",background:"#0a0f1a",borderLeft:"1px solid rgba(0,229,160,0.15)",zIndex:9999,display:"flex",flexDirection:"column",animation:"slideLeft 0.3s ease-out",boxShadow:"-10px 0 40px rgba(0,0,0,0.5)"};
var headerStyle={padding:"12px 16px",borderBottom:"1px solid rgba(255,255,255,0.06)",display:"flex",justifyContent:"space-between",alignItems:"center",flexShrink:0};
var bodyStyle={flex:1,overflow:"auto",padding:16};
var body=null;
if(type==="mermaid"){
var mid="art_mm_"+Math.random().toString(36).slice(2);
body=h("div",{ref:function(el){if(el&&window.mermaid){try{window.mermaid.render(mid,content).then(function(r){el.innerHTML=r.svg}).catch(function(){el.textContent=content})}catch(e){el.textContent=content}}},style:{padding:20,minHeight:200}});
}else if(type==="html"){
body=h("iframe",{srcDoc:content,style:{width:"100%",height:"100%",border:"none",borderRadius:8,background:"#fff"}});
}else{
body=h("pre",{className:"m",ref:function(el){if(el&&window.hljs){var code=el.querySelector("code");if(code)try{window.hljs.highlightElement(code)}catch(e){}}},style:{fontSize:12,lineHeight:1.6,color:"#e6edf3",whiteSpace:"pre-wrap",wordBreak:"break-all"}},h("code",{className:"language-"+type},content));
}
return h("div",{style:panelStyle},
h("div",{style:headerStyle},
h("div",{style:{display:"flex",alignItems:"center",gap:8}},
h("div",{style:{width:8,height:8,borderRadius:"50%",background:type==="mermaid"?"var(--ac)":type==="html"?"var(--a2)":"var(--pu)"}}),
h("span",{className:"m",style:{fontSize:11,color:"var(--fg)",fontWeight:600}},type.toUpperCase()+" Preview"),
h("span",{className:"m",style:{fontSize:9,color:"var(--dm)"}},content.length+" chars")
),
h("div",{style:{display:"flex",gap:6}},
h("button",{onClick:function(){navigator.clipboard.writeText(content)},className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:9}},"Copy"),
h("button",{onClick:onClose,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--er)",background:"transparent",color:"var(--er)",fontSize:9}},"Close")
)
),
h("div",{style:bodyStyle},body)
);
}
/* Extract code blocks from response for artifact panel */
function extractArtifact(text){
if(!text)return null;
var m=text.match(/```(mermaid|html|python|javascript|php|sql|bash|css|json|yaml|xml)([\s\S]*?)```/);
if(m)return{type:m[1],content:m[2].trim()};
return null;
}
/* TABS */
var TABS=[
{id:"manager",icon:"\u2605",label:"Manager"},{id:"monitor",icon:"\u25C9",label:"Monitor"},{id:"term",icon:">",label:"Terminal"},
{id:"ai",icon:"@",label:"AI Chat"},{id:"models",icon:"*",label:"Models"},
{id:"sql",icon:"$",label:"SQL"},{id:"git",icon:"&",label:"Git"},
{id:"docker",icon:"D",label:"Docker"},{id:"ethica",icon:"\u2764",label:"Ethica"},
{id:"nonreg",icon:"\u2713",label:"NonReg"},{id:"cli",icon:"K",label:"CLI"},
{id:"claude",icon:"C",label:"Claude"},{id:"tools",icon:"T",label:"ToolFK"},
{id:"files",icon:"/",label:"Files"},{id:"discover",icon:"!",label:"Discover"},{id:"caps",icon:"W",label:"WEVIA"},{id:"wevads",icon:"V",label:"WEVADS"},{id:"wevia-pub",icon:"W",label:"WEVIA+"}
];
/* Reusable ExecPanel */
function ExecPanel(props){
var s=useState(props.initial||"Ready.\n"),out=s[0],setOut=s[1];
var l=useState(false),ld=l[0],setLd=l[1];
var ref=useRef(null);
useEffect(function(){if(ref.current)ref.current.scrollTop=999999},[out]);
function run(label,fn){
setLd(true);setOut(function(p){return p+"\n> "+label+"...\n"});
fn().then(function(r){setOut(function(p){return p+parse(r)+"\n"});setLd(false)})
.catch(function(e){setOut(function(p){return p+"ERR: "+e.message+"\n"});setLd(false)});
}
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{flexShrink:0,marginBottom:8}},props.controls(run,ld)),
h("pre",{ref:ref,className:"m",style:{flex:1,background:"#000",borderRadius:6,padding:10,overflow:"auto",fontSize:10,color:"var(--ac)",whiteSpace:"pre-wrap",wordBreak:"break-all",lineHeight:1.5,border:"1px solid var(--bd)"}},out),
h("button",{onClick:function(){setOut("")},className:"m",style:{marginTop:4,padding:"3px 8px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8,alignSelf:"flex-start"}},"Clear")
);
}
/* Btn helper */
function Btn(p){return h("button",{onClick:p.onClick,disabled:p.disabled,className:"m",style:Object.assign({padding:"4px 10px",borderRadius:4,border:"1px solid "+(p.color||"var(--bd)"),background:(p.color||"var(--bd)")+"11",color:p.color||"var(--dm)",fontSize:9},p.style||{})},p.children)}
/* ===== WEVAL MANAGER - Unified AI Brain ===== */
function ManagerPanel(){
var MS=useState([]),msgs=MS[0],setMsgs=MS[1];
var IN=useState(""),inp=IN[0],setInp=IN[1];
var LD=useState(false),ld=LD[0],setLd=LD[1];
var EL=useState(0),elapsed=EL[0],setElapsed=EL[1];
var FL=useState(null),file=FL[0],setFile=FL[1];
var VC=useState(false),isRec=VC[0],setIsRec=VC[1];
var SH=useState("chat"),show=SH[0],setShow=SH[1];
// Capability toggles
var _kb=useState(true),kb=_kb[0],setKb=_kb[1];
var _git=useState(true),git=_git[0],setGit=_git[1];
var _infra=useState(true),infra=_infra[0],setInfra=_infra[1];
var _sql=useState(true),sql=_sql[0],setSql=_sql[1];
var _crm=useState(true),crm=_crm[0],setCrm=_crm[1];
var _deer=useState(true),deer=_deer[0],setDeer=_deer[1];
var _nuclei=useState(true),nuclei_t=_nuclei[0],setNuclei=_nuclei[1];
var _play=useState(true),play=_play[0],setPlay=_play[1];
var _harvest=useState(false),harvest=_harvest[0],setHarvest=_harvest[1];
var _crab=useState(false),crab=_crab[0],setCrab=_crab[1];
var _mm=useState(true),mm=_mm[0],setMm=_mm[1];
var _searx=useState(true),searx=_searx[0],setSearx=_searx[1];
var _toolfk=useState(true),toolfk=_toolfk[0],setToolfk=_toolfk[1];
var _pdf=useState(true),pdf=_pdf[0],setPdf=_pdf[1];
var _cons=useState(true),cons=_cons[0],setCons=_cons[1];
var _chain=useState(true),chain=_chain[0],setChain=_chain[1];
var _code=useState(true),codeExec=_code[0],setCodeExec=_code[1];
var _seq=useState(false),seq=_seq[0],setSeq=_seq[1];
var _wevads_t=useState(false),wevads_t=_wevads_t[0],setWevads=_wevads_t[1];
var _wevia_t=useState(false),wevia_t=_wevia_t[0],setWeviaPub=_wevia_t[1];
var _n8n_t=useState(true),n8n_t=_n8n_t[0],setN8n=_n8n_t[1];
var _hermes_t=useState(true),hermes_t=_hermes_t[0],setHermes=_hermes_t[1];
var _art=useState(null),artifact=_art[0],setArtifact=_art[1];
var ref=useRef(null),timerRef=useRef(null),fileRef=useRef(null),recRef=useRef(null);
useEffect(function(){if(ref.current)ref.current.scrollTop=999999},[msgs,elapsed]);
// Voice recognition
function toggleVoice(){
if(isRec){if(recRef.current){recRef.current.stop();recRef.current=null}setIsRec(false);return}
var SR=window.SpeechRecognition||window.webkitSpeechRecognition;
if(!SR){alert("Speech not supported");return}
var r=new SR();r.lang="fr-FR";r.continuous=false;r.interimResults=false;
r.onresult=function(e){var t=e.results[0][0].transcript;setInp(function(p){return p+(p?" ":"")+t});setIsRec(false)};
r.onerror=function(){setIsRec(false)};r.onend=function(){setIsRec(false)};
r.start();recRef.current=r;setIsRec(true);
}
// File handling
function onFileSelect(e){
var f=e.target.files[0];if(!f)return;
if(f.size>5*1024*1024){alert("Max 5MB");return}
var reader=new FileReader();
reader.onload=function(ev){
setFile({name:f.name,type:f.type,size:f.size,data:ev.target.result});
};
if(f.type.startsWith("image/")){reader.readAsDataURL(f)}
else{reader.readAsText(f)}
}
function send(){
if((!inp.trim()&&!file)||ld)return;
var m=inp;var fileCtx="";
if(file){
if(file.type.startsWith("image/")){
fileCtx="\n[ATTACHED IMAGE: "+file.name+" ("+Math.round(file.size/1024)+"KB)]\nImage data provided as base64.\n";
}else{
fileCtx="\n[ATTACHED FILE: "+file.name+" ("+Math.round(file.size/1024)+"KB)]\n"+file.data.substring(0,3000)+"\n[/FILE]\n";
}
m=(m||"Analyse ce fichier")+fileCtx;
}
setInp("");setFile(null);setLd(true);setElapsed(0);
setMsgs(function(p){return p.concat([{r:"u",t:inp||"[File: "+file.name+"]",f:file?file.name:null}])});
var start=Date.now();
timerRef.current=setInterval(function(){setElapsed(Math.floor((Date.now()-start)/1000))},500);
var ctrl=new AbortController();
var timer=setTimeout(function(){ctrl.abort()},120000);
fetch("/api/weval-manager.php",{
method:"POST",headers:{"Content-Type":"application/json"},signal:ctrl.signal,
body:JSON.stringify({message:m,caps:{kb:kb,git:git,infra:infra,sql:sql,crm:crm,deerflow:deer,nuclei:nuclei_t,playwright:play,harvester:harvest,coderabbit:crab,mattermost:mm,searxng:searx,toolfk:toolfk,pdf:pdf,consensus:cons,chain:chain,code_exec:codeExec,outbound:seq,wevads:wevads_t,wevia_pub:wevia_t,n8n:n8n_t,hermes:hermes_t}})
}).then(function(r){return r.json()}).then(function(data){
clearTimeout(timer);clearInterval(timerRef.current);
var meta=data.agent+" via "+data.provider;
if(data.sources&&data.sources.length)meta+=" ["+data.sources.join("+")+"]";
meta+=" | "+Math.floor((Date.now()-start)/1000)+"s";
setMsgs(function(p){return p.concat([{r:"a",t:data.response||data.error||"No response",isNew:true,p:meta,intent:data.intent,agent:data.agent,code:data.code_result}])});
setLd(false);setElapsed(0);
}).catch(function(e){
clearTimeout(timer);clearInterval(timerRef.current);
setMsgs(function(p){return p.concat([{r:"a",t:"ERR: "+(e.name==="AbortError"?"Timeout 120s":e.message),p:"error"}])});
setLd(false);setElapsed(0);
});
}
var agentColors={WEVIA:"var(--ac)",WEDROID:"#f97316",WEVCODE:"#22d3ee","WEVIA Life":"#a78bfa",BladeRazor:"#ef4444",Ethica:"var(--er)",Meditron:"#ef4444","Data Analyst":"var(--a2)","Tech Advisor":"#06b6d4","DeerFlow":"#10b981"};
var CAPS=[
{n:"Consensus",d:"3 providers en parallele (Alibaba+Cerebras+Groq)",c:"var(--pu)",on:true},
{n:"Chain Exec",d:"Multi-step autonome avec decomposition",c:"var(--wn)",on:true},
{n:"Code Sandbox",d:"Python, PHP, JS, Bash - execution isolee",c:"#22d3ee",on:true},
{n:"File Read",d:"Lecture auto des fichiers mentionnes",c:"var(--ac)",on:true},
{n:"File Write",d:"Ecriture securisee avec GOLD backup",c:"var(--ac)",on:true},
{n:"RAG Vectoriel",d:"Qdrant deep search sur 436 KB files",c:"var(--pu)",on:true},
{n:"Entity Memory",d:"Extraction entites pour contexte enrichi",c:"#f59e0b",on:true},
{n:"Self-Healing",d:"Health check + auto-repair services",c:"#ef4444",on:true},
{n:"Autofetch",d:"Contexte infra auto pour DevOps",c:"var(--a2)",on:true},
{n:"Live SQL",d:"PostgreSQL 50K+ HCPs, 6.5M contacts",c:"var(--a2)",on:true},
{n:"Live Infra",d:"Docker, Ollama, nginx, PMTA en temps reel",c:"var(--ac)",on:true},
{n:"OSS Discovery",d:"36 outils open source catalogues",c:"#06b6d4",on:true},
{n:"Voice Input",d:"Reconnaissance vocale FR/EN",c:"#ec4899",on:true},
{n:"File Upload",d:"Analyse de fichiers (texte, code, images)",c:"#f97316",on:true},
{n:"DeerFlow",d:"SuperAgent ByteDance: sub-agents, sandbox, memory",c:"#10b981",on:true},
{n:"Playwright",d:"E2E browser testing, screenshots, headless Chrome",c:"#22d3ee",on:true},
{n:"Nuclei",d:"Security scanner: CVE, XSS, SQLi, misconfig detection",c:"#ef4444",on:true},
{n:"CodeRabbit",d:"AI code review sur GitHub PRs automatique",c:"#a855f7",on:true},
{n:"theHarvester",d:"OSINT: emails, sous-domaines, DNS recon",c:"#f59e0b",on:true},
{n:"EmailFinder",d:"Decouverte emails depuis domaines cibles",c:"#f97316",on:true},
{n:"CRM Pipeline",d:"Deal tracker Kanban, contacts, enrichment, proposals PDF",c:"#10b981",on:true},
{n:"PDF Gen",d:"Propositions commerciales PDF via IA (DejaVu Unicode)",c:"var(--pu)",on:true},
{n:"Mattermost",d:"Team chat interne, webhooks, integrations",c:"#3b82f6",on:true},
{n:"Piebald/CARL",d:"24 system prompts Claude Code: infra, ethica, global",c:"#ec4899",on:true},
{n:"ToolFK",d:"12 tools: JS obfuscate, OCR, QR, PDF, image, regex, DNS",c:"#06b6d4",on:true},
{n:"TTS Voice",d:"Text-to-speech synthese vocale FR/EN/AR",c:"#ec4899",on:true},
{n:"SearXNG",d:"Meta-search souverain, 70+ moteurs, zero tracking",c:"var(--ac)",on:true},
{n:"Outbound Seq",d:"Sequences multicanal: email D1, LinkedIn D3, relance D5",c:"#f59e0b",on:true},
{n:"Cohere Embed",d:"Embeddings multilingues pour RAG (si cle dispo)",c:"#8b5cf6",on:true},
{n:"WEVADS Arsenal",d:"134KB SPA: 35 pages, 43 APIs, Graph API, PMTA, tracking",c:"#f97316",on:true},
{n:"WEVIA Public",d:"178KB fullscreen chatbot: widget+Centre Commande, 71 modules",c:"var(--ac)",on:true},
{n:"CARL/Piebald",d:"8 domain rules: infra, ethica, wevads, wevia, site, global, commands, context",c:"#ec4899",on:true},
{n:"Hermes 27 Skills",d:"Autonomous agent: file mgmt, web, code, DB, monitoring, crons",c:"#ec4899",on:true},
{n:"n8n Workflows",d:"3 automations: Health, AutoLearn, Error handler",c:"#f59e0b",on:true},
{n:"Twenty CRM",d:"Open source CRM crm.weval-consulting.com",c:"#3b82f6",on:true},
{n:"Vaultwarden",d:"Self-hosted Bitwarden password manager",c:"#10b981",on:true},
{n:"DaBaDoc Scrapers",d:"5 variants: city, multi, orl, v2 — MA/TN pharma",c:"#f97316",on:true},
{n:"Ethica Scrapers",d:"4 crons: collecte, enrich, richscraper, validator",c:"var(--er)",on:true},
{n:"Disk Monitor",d:"df -h auto-alert quand >85%",c:"#ef4444",on:true}
];
// Chat view
if(show==="caps") return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:8,flexShrink:0}},
h("div",{style:{fontSize:13,fontWeight:700,color:"var(--ac)"}},"Capabilities actives ("+CAPS.length+")"),
h("button",{onClick:function(){setShow("chat")},className:"m",style:{padding:"4px 12px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--ac)",fontSize:9}},"Back to Chat")
),
h("div",{style:{flex:1,overflow:"auto"}},
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill,minmax(250px,1fr))",gap:8}},
CAPS.map(function(cap){return h("div",{key:cap.n,style:{padding:12,borderRadius:8,background:"var(--b2)",border:"1px solid "+cap.c+"22"}},
h("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:4}},
h("span",{style:{fontSize:11,fontWeight:700,color:cap.c}},cap.n),
h("span",{className:"m",style:{fontSize:7,padding:"1px 6px",borderRadius:8,background:cap.on?"#22c55e11":"var(--er)11",color:cap.on?"#22c55e":"var(--er)",border:"1px solid "+(cap.on?"#22c55e22":"var(--er)22")}},cap.on?"ACTIVE":"OFF")
),
h("div",{className:"m",style:{fontSize:9,color:"var(--dm)",lineHeight:1.4}},cap.d)
)})
)
)
);
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
// Header
h("div",{style:{padding:"8px 12px",background:"var(--b2)",borderRadius:6,marginBottom:8,flexShrink:0,border:"1px solid var(--bd)",display:"flex",justifyContent:"space-between",alignItems:"center"}},
h("div",null,
h("div",{style:{fontSize:12,fontWeight:700,background:"linear-gradient(90deg,var(--ac),var(--a2))",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"}},"WEVAL Manager - Unified AI Brain"),
h("div",{className:"m",style:{fontSize:8,color:"var(--dm)",marginTop:2}},[kb,git,infra,sql,crm,deer,nuclei_t,play,harvest,crab,mm,searx,toolfk,pdf,cons,chain,codeExec,seq].filter(Boolean).length+" / 22 caps active | 9 agents | "+CAPS.length+" capabilities")
),
h("button",{onClick:function(){setShow("caps")},className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--pu)",background:"var(--pu)11",color:"var(--pu)",fontSize:8}},CAPS.length+" capabilities"),h(LiveMetrics,null)
),
// Capability toggles bar
artifact?h(ArtifactPanel,{content:artifact.content,type:artifact.type,onClose:function(){setArtifact(null)}}):null,
show==="caps"?capsOverlay:
h("div",{style:{display:"flex",gap:3,flexWrap:"wrap",marginBottom:6,flexShrink:0,padding:"4px 0"}},
[["KB",kb,setKb,"var(--ac)"],["GIT",git,setGit,"var(--a2)"],["INFRA",infra,setInfra,"#f97316"],["SQL",sql,setSql,"var(--a2)"],["CRM",crm,setCrm,"#10b981"],["DeerFlow",deer,setDeer,"#10b981"],["Nuclei",nuclei_t,setNuclei,"#ef4444"],["Playwright",play,setPlay,"#22d3ee"],["Harvester",harvest,setHarvest,"#f59e0b"],["CodeRabbit",crab,setCrab,"#a855f7"],["Mattermost",mm,setMm,"#3b82f6"],["SearXNG",searx,setSearx,"var(--ac)"],["ToolFK",toolfk,setToolfk,"#06b6d4"],["PDF",pdf,setPdf,"var(--pu)"],["Consensus",cons,setCons,"var(--pu)"],["Chain",chain,setChain,"var(--wn)"],["Code",codeExec,setCodeExec,"#22d3ee"],["Sequences",seq,setSeq,"#f59e0b"],["WEVADS",wevads_t,setWevads,"#f97316"],["WEVIA+",wevia_t,setWeviaPub,"var(--ac)"],["n8n",n8n_t,setN8n,"#f59e0b"],["Hermes",hermes_t,setHermes,"#ec4899"]].map(function(t){
return h("button",{key:t[0],onClick:function(){t[2](!t[1])},style:{padding:"2px 6px",borderRadius:3,border:"1px solid "+(t[1]?t[3]:"var(--bd)"),background:t[1]?t[3]+"22":"transparent",color:t[1]?t[3]:"var(--dm)",fontSize:8,fontWeight:t[1]?700:400,cursor:"pointer",transition:".2s"}},t[0])
})
),
// Agent pills
h("div",{style:{display:"flex",gap:4,flexWrap:"wrap",marginBottom:6,flexShrink:0}},
[["WEVIA","Business"],["WEDROID","DevOps"],["WEVCODE","Code"],["WEVIA Life","Wellbeing"],["BladeRazor","Security"],["Ethica","Pharma"],["Tech Advisor","OSS"],["Data Analyst","Data"],["Meditron","Medical"],["DeerFlow","SuperAgent"]].map(function(a){
var col=agentColors[a[0]]||"var(--dm)";
return h("span",{key:a[0],className:"m",style:{padding:"2px 8px",borderRadius:10,fontSize:7,background:col+"11",color:col,border:"1px solid "+col+"22"}},a[0])
})
),
// Messages
h("div",{ref:ref,style:{flex:1,overflow:"auto",paddingBottom:4}},
msgs.length===0?h("div",{style:{padding:24,textAlign:"center"}},
h("div",{style:{fontSize:13,fontWeight:600,color:"var(--fg)",marginBottom:8}},"Pose n'importe quelle question."),
h("div",{style:{fontSize:10,color:"var(--dm)",marginBottom:12}},"Le Manager detecte l'intent, active le meilleur agent, et enrichit avec les donnees live."),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(3,1fr)",gap:6,maxWidth:600,margin:"0 auto 16px"}},
[["Services WEVAL pour un prospect SAP","var(--ac)"],["Statut de S204 et ses Docker","#f97316"],["Fix un bug dans chat-proxy.php","#22d3ee"],["HCPs par pays dans Ethica","var(--er)"],["Scan sécurité de notre infra","#ef4444"],["Quel CRM open source choisir?","#06b6d4"],["Plan ma semaine, je suis fatigue","#a78bfa"],["Derniers commits du repo","#f97316"],["Stratégie WEVIA vs concurrence","var(--ac)"]].map(function(s){
return h("button",{key:s[0],onClick:function(){setInp(s[0])},style:{padding:"8px 10px",borderRadius:8,border:"1px solid "+s[1]+"22",background:s[1]+"08",color:"var(--fg)",fontSize:9,textAlign:"left",cursor:"pointer"}},s[0])
})
),
h("div",{style:{display:"flex",gap:6,justifyContent:"center",flexWrap:"wrap"}},
[["Consensus 3x","var(--pu)"],["Chain Exec","var(--wn)"],["Code Sandbox","#22d3ee"],["RAG Qdrant","var(--pu)"],["Entity Memory","#f59e0b"],["Voice FR","#ec4899"],["File Upload","#f97316"]].map(function(c){
return h("span",{key:c[0],className:"m",style:{padding:"2px 8px",borderRadius:10,fontSize:7,background:c[1]+"11",color:c[1],border:"1px solid "+c[1]+"22"}},c[0])
})
)
):null,
msgs.map(function(m,i){
var agentCol=m.agent?agentColors[m.agent]||"var(--dm)":"var(--dm)";
return h("div",{key:i,style:{display:"flex",justifyContent:m.r==="u"?"flex-end":"flex-start",marginBottom:6}},
h("div",{style:{maxWidth:"85%",padding:"8px 12px",borderRadius:8,fontSize:11,lineHeight:1.5,
background:m.r==="u"?"var(--ac)11":"var(--b2)",border:"1px solid "+(m.r==="u"?"var(--ac)22":"var(--bd)"),color:m.r==="u"?"var(--ac)":"var(--fg)"}},
m.f?h("div",{className:"m",style:{fontSize:8,color:"var(--wn)",marginBottom:4,padding:"2px 6px",background:"var(--wn)11",borderRadius:4,display:"inline-block"}},"FILE: "+m.f):null,
m.r==="a"?h("div",null,md(m.t)):h("pre",{style:{whiteSpace:"pre-wrap",fontFamily:"inherit",margin:0}},m.t),
m.code?h("div",{style:{marginTop:6,padding:6,background:"#0d1117",borderRadius:4,border:"1px solid var(--bd)"}},
h("div",{className:"m",style:{fontSize:8,color:"#22c55e",marginBottom:2}},"CODE OUTPUT:"),
h("pre",{className:"m",style:{fontSize:9,color:"#e6edf3",whiteSpace:"pre-wrap",margin:0}},m.code)
):null,
m.p?h("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginTop:4}},
h("span",{className:"m",style:{fontSize:7,color:agentCol}},m.p),
m.r==="a"?h("button",{onClick:function(){navigator.clipboard.writeText(m.t)},className:"m",style:{padding:"1px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:7}},"Copy"):null
):null
)
)
}),
ld?h("div",{style:{padding:8,display:"flex",alignItems:"center",gap:8}},
h("div",{style:{fontSize:11,color:"var(--ac)"}},["Analyzing intent...","Selecting agent...","Enriching context...","Generating response..."][Math.min(Math.floor(elapsed/3),3)]),
h("div",{className:"m",style:{fontSize:10,color:"var(--dm)",background:"var(--b2)",padding:"2px 10px",borderRadius:10,border:"1px solid var(--bd)"}},elapsed+"s"),
h("div",{style:{width:60,height:3,background:"var(--bd)",borderRadius:2,overflow:"hidden"}},h("div",{style:{width:Math.min(elapsed/30,1)*100+"%",height:"100%",background:"var(--ac)",transition:"width .5s"}}))
):null
),
// File preview
file?h("div",{style:{padding:"6px 10px",background:"var(--b2)",borderRadius:4,marginBottom:4,display:"flex",justifyContent:"space-between",alignItems:"center",flexShrink:0,border:"1px solid var(--wn)22"}},
h("div",{style:{display:"flex",alignItems:"center",gap:6}},
h("span",{style:{fontSize:16}},file.type.startsWith("image/")?"IMG":"DOC"),
h("span",{className:"m",style:{fontSize:9,color:"var(--wn)"}},file.name+" ("+Math.round(file.size/1024)+"KB)")
),
h("button",{onClick:function(){setFile(null)},className:"m",style:{padding:"2px 8px",borderRadius:3,border:"1px solid var(--er)",background:"transparent",color:"var(--er)",fontSize:8}},"X")
):null,
// Input bar
h("div",{style:{display:"flex",gap:4,flexShrink:0,alignItems:"center"}},
h("input",{type:"file",ref:fileRef,style:{display:"none"},onChange:onFileSelect,accept:".php,.js,.html,.css,.json,.py,.sh,.txt,.md,.csv,.log,.conf,.xml,.sql,.png,.jpg,.jpeg,.pdf"}),
h("button",{onClick:function(){fileRef.current.click()},title:"Attach file",style:{width:36,height:36,borderRadius:6,border:"1px solid var(--bd)",background:file?"var(--wn)11":"transparent",color:file?"var(--wn)":"var(--dm)",fontSize:14,display:"flex",alignItems:"center",justifyContent:"center"}},"+"),
h("button",{onClick:toggleVoice,title:"Voice input (FR)",style:{width:36,height:36,borderRadius:6,border:"1px solid "+(isRec?"var(--er)":"var(--bd)"),background:isRec?"var(--er)11":"transparent",color:isRec?"var(--er)":"var(--dm)",fontSize:14,display:"flex",alignItems:"center",justifyContent:"center",animation:isRec?"pulse 1s infinite":"none"}},isRec?"REC":"MIC"),
h("input",{value:inp,onChange:function(e){setInp(e.target.value)},onKeyDown:function(e){if(e.key==="Enter")send()},placeholder:"Ask anything... (auto-routes to best agent)",disabled:ld,
style:{flex:1,padding:"10px 14px",borderRadius:6,fontSize:12,color:"#fff",background:"var(--b2)",border:"1px solid var(--bd)",outline:"none"}}),
h("button",{onClick:send,disabled:ld||(!inp.trim()&&!file),style:{padding:"10px 20px",borderRadius:6,border:"none",background:"linear-gradient(135deg,var(--ac),var(--a2))",color:"#000",fontWeight:700,fontSize:12,opacity:(ld||(!inp.trim()&&!file))?0.5:1}},ld?"...":"Send")
)
);
}
/* ===== MONITOR (FIXED) ===== */
function Monitor(){
var s=useState({}),d=s[0],setD=s[1];
function chk(key,fn){fn().then(function(r){setD(function(p){var n={};for(var k in p)n[k]=p[k];n[key]=parse(r).trim();return n})}).catch(function(){setD(function(p){var n={};for(var k in p)n[k]=p[k];n[key]="ERR";return n})})}
function refreshAll(){
chk("s204_nginx",function(){return cx("systemctl is-active nginx")});
chk("s204_pmta",function(){return cx("systemctl is-active pmta")});
chk("s204_disk",function(){return cx("df -h / | tail -1 | awk '{print $5}'")});
chk("s204_ram",function(){return cx("free | awk 'NR==2{printf \"%.0f%%\",($3/$2)*100}'")});
chk("s204_docker",function(){return cx("sudo docker ps -q 2>/dev/null | wc -l")});
chk("s204_load",function(){return cx("cat /proc/loadavg | cut -d' ' -f1")});
chk("s204_ollama",function(){return cx("sudo ollama list 2>/dev/null | tail -n+2 | wc -l")});
chk("s95_apache",function(){return sentinel("systemctl is-active apache2")});
chk("s95_pg",function(){return sentinel("systemctl is-active postgresql")});
chk("s95_disk",function(){return sentinel("df / --output=pcent | tail -1")});
chk("s95_crons",function(){return sentinel("crontab -l 2>/dev/null | grep -v '^#' | grep -c .")});
chk("s151_oc",function(){return s151("curl -s http://127.0.0.1:3210/healthz 2>/dev/null | grep -o ok || echo DOWN")});
chk("s151_ollama",function(){return s151("docker exec ollama ollama list 2>/dev/null | tail -n+2 | wc -l || echo 0")});
chk("s151_disk",function(){return s151("df -h / | tail -1 | awk '{print $5}'")});
chk("site",function(){return cx("curl -sk -o /dev/null -w '%{http_code} %{time_total}s' https://weval-consulting.com/")});
chk("contacts",function(){return sentinel("sudo -u postgres psql -t -c 'SELECT count(*) FROM adx_clients.contacts' 2>/dev/null")});
apiGet("/api/wevia-capabilities.php?cap=health").then(function(r){chk("health",function(){return Promise.resolve(r.up+"/"+r.total)})}).catch(function(){});
apiGet("/api/ethica-stats-api.php").then(function(r){chk("ethica",function(){return Promise.resolve(String(r.total||0))})}).catch(function(){});
}
useEffect(function(){refreshAll();var i=setInterval(refreshAll,90000);return function(){clearInterval(i)}},[]);
var servers=[
{n:"S204",cl:"#00e5a0",rl:"PRIMARY",ip:"204.168.152.13",ms:[["nginx","s204_nginx"],["pmta","s204_pmta"],["disk","s204_disk"],["ram","s204_ram"],["docker","s204_docker"],["load","s204_load"],["ollama","s204_ollama"]]},
{n:"S95",cl:"#00b8ff",rl:"WEVADS",ip:"95.216.167.89",ms:[["apache","s95_apache"],["pg","s95_pg"],["disk","s95_disk"],["crons","s95_crons"]]},
{n:"S151",cl:"#ff6b35",rl:"OPENCLAW",ip:"151.80.235.110",ms:[["openclaw","s151_oc"],["ollama","s151_ollama"],["disk","s151_disk"]]}
];
function MBox(key,label,color){
var v=d[key]||"...";
var ok=v==="active"||v==="ok"||(v!=="ERR"&&v!=="0"&&v!=="..."&&v!=="DOWN"&&v.length<20);
return h("div",{key:key,style:{padding:6,borderRadius:4,background:"var(--bg)",textAlign:"center",border:"1px solid var(--bd)"}},
h("div",{className:"m",style:{fontSize:7,color:"var(--dm)",textTransform:"uppercase",letterSpacing:.5}},label),
h("div",{className:"m",style:{fontSize:11,fontWeight:600,color:ok?color:"var(--er)"}},v)
);
}
return h("div",null,
h("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:8,alignItems:"center",flexWrap:"wrap",gap:6}},
h("div",{style:{display:"flex",gap:8}},
h("span",{className:"m",style:{fontSize:8,color:"var(--dm)"}},"Services: "+(d.health||"...")),
h("span",{className:"m",style:{fontSize:8,color:"var(--dm)"}},"Ethica: "+(d.ethica||"...")),
h("span",{className:"m",style:{fontSize:8,color:"var(--dm)"}},"Site: "+(d.site||"...")),
h("span",{className:"m",style:{fontSize:8,color:"var(--dm)"}},"Contacts: "+(d.contacts||"..."))
),
h("div",{style:{display:"flex",gap:6,alignItems:"center"}},h("span",{className:"m",style:{fontSize:7,color:"var(--dm)"}},"Updated: "+new Date().toLocaleTimeString()),h("button",{onClick:refreshAll,className:"m",style:{padding:"3px 10px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--ac)",fontSize:9}},"Refresh"))
),
h("div",{style:{display:"flex",gap:12,flexWrap:"wrap"}},
servers.map(function(sv){return h("div",{key:sv.n,style:{flex:"1 1 220px",background:"var(--b2)",borderRadius:8,padding:10,border:"1px solid var(--bd)"}},
h("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:6}},
h("span",{style:{fontSize:12,fontWeight:700,color:sv.cl}},sv.n),
h("span",{className:"m",style:{fontSize:7,color:"var(--dm)"}},sv.rl+" \u00B7 "+sv.ip)
),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill,minmax(60px,1fr))",gap:4}},
sv.ms.map(function(m){return MBox(m[1],m[0],sv.cl)})
)
)})
)
);
}
/* ===== TERMINAL ===== */
function Terminal(){
var S=useState("s204"),srv=S[0],setSrv=S[1], C=useState(""),cmd=C[0],setCmd=C[1];
var O=useState(""),out=O[0],setOut=O[1], L=useState(false),ld=L[0],setLd=L[1];
var H=useState([]),hist=H[0],setHist=H[1], I=useState(-1),hi=I[0],setHi=I[1];
var ref=useRef(null);
useEffect(function(){if(ref.current)ref.current.scrollTop=999999},[out]);
function run(){
if(!cmd.trim()||ld)return;setLd(true);
setHist(function(p){return [cmd].concat(p).slice(0,50)});setHi(-1);
setOut(function(p){return p+"\n"+srv+"> "+cmd+"\n"});
var fn=srv==="s204"?cx:srv==="s95"?sentinel:s151;
fn(cmd).then(function(r){setOut(function(p){return p+parse(r)+"\n"});setLd(false);setCmd("")}).catch(function(e){setOut(function(p){return p+"ERR: "+e.message+"\n"});setLd(false)});
}
function onKey(e){
if(e.key==="Enter")run();
if(e.key==="ArrowUp"&&hist.length){var n=Math.min(hi+1,hist.length-1);setHi(n);setCmd(hist[n])}
if(e.key==="ArrowDown"){var n2=Math.max(hi-1,-1);setHi(n2);setCmd(n2>=0?hist[n2]:"")}
}
var shortcuts=[["uptime","uptime -p"],["disk","df -h / | tail -1"],["procs","ps aux --sort=-%mem | head -8"],["docker","sudo docker ps --format '{{.Names}} {{.Status}}'"],["nginx","tail -20 /var/log/nginx/error.log"],["cat","cat /var/www/html/index.html | head -20"]];
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",gap:3,marginBottom:4,flexShrink:0}},
["s204","s95","s151"].map(function(s){return h("button",{key:s,onClick:function(){setSrv(s)},className:"m",style:{padding:"4px 12px",borderRadius:4,border:"1px solid "+(srv===s?"var(--ac)":"var(--bd)"),background:srv===s?"var(--ac)11":"transparent",color:srv===s?"var(--ac)":"var(--dm)",fontSize:9}},s.toUpperCase())}),
h("span",{style:{flex:1}}),
shortcuts.map(function(s){return h("button",{key:s[0],onClick:function(){setCmd(s[1])},className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:7}},s[0])})
),
h("pre",{ref:ref,className:"m",style:{flex:1,background:"#000",borderRadius:6,padding:10,overflow:"auto",fontSize:10,color:"var(--ac)",whiteSpace:"pre-wrap",lineHeight:1.5,border:"1px solid var(--bd)"}},out||"Terminal ready.\n"),
h("div",{style:{display:"flex",gap:4,marginTop:4,flexShrink:0}},
h("span",{className:"m",style:{padding:"8px 6px",color:srv==="s204"?"var(--ac)":srv==="s95"?"var(--a2)":"var(--wn)",fontSize:10}},srv+"$"),
h("input",{value:cmd,onChange:function(e){setCmd(e.target.value)},onKeyDown:onKey,placeholder:"command...",disabled:ld,style:{flex:1,padding:"8px 10px",borderRadius:5,fontSize:11,color:"#fff",background:"var(--b2)",border:"1px solid var(--bd)",outline:"none"}}),
h("button",{onClick:run,disabled:ld,style:{padding:"8px 16px",borderRadius:5,border:"none",background:"var(--ac)",color:"#000",fontWeight:700,fontSize:11,opacity:ld?0.5:1}},ld?"...":"Run")
)
);
}
/* ===== AI CHAT (FIXED: 120s timeout + timer + 18 providers + GLM-5) ===== */
function AIChat(){
var ALL=[
{id:"openclaw",n:"OpenClaw",desc:"SOUL.md WEVIA",color:"var(--wn)",cat:"local"},
{id:"ollama-s204",n:"Ollama S204",desc:"9 models",color:"var(--ac)",cat:"local"},
{id:"ollama-s151",n:"Ollama S151",desc:"qwen2.5:3b",color:"var(--a2)",cat:"local"},
{id:"wedroid",n:"WEDROID",desc:"DevOps agent",color:"#f97316",cat:"agent"},
{id:"wevcode",n:"WEVCODE",desc:"Code PHP/JS/PY",color:"#22d3ee",cat:"agent"},
{id:"wevialife",n:"WEVIA Life",desc:"Productivity",color:"#a78bfa",cat:"agent"},
{id:"bladerazor",n:"BladeRazor",desc:"Pentest AI",color:"#ef4444",cat:"agent"},
{id:"groq",n:"Groq",desc:"llama-3.3-70b",color:"var(--pu)",cat:"cloud"},
{id:"cerebras",n:"Cerebras",desc:"Qwen3-235B",color:"#f59e0b",cat:"cloud"},
{id:"alibaba",n:"Alibaba",desc:"qwen-plus",color:"#34d399",cat:"cloud"},
{id:"openrouter",n:"OpenRouter",desc:"multi-models",color:"#f472b6",cat:"cloud"},
{id:"zhipu",n:"GLM-5",desc:"Zhipu Cloud",color:"#06b6d4",cat:"cloud"},
{id:"meditron",n:"Meditron",desc:"PubMed 3.8GB",color:"#ef4444",cat:"med"},
{id:"medllama",n:"MedLLaMA2",desc:"Diagnostics",color:"#f97316",cat:"med"},
{id:"granite",n:"Granite4",desc:"IBM RAG",color:"#3b82f6",cat:"med"},
{id:"glm4",n:"GLM4:9b",desc:"Zhipu local",color:"#a855f7",cat:"med"},
{id:"kilo",n:"Kilo CLI",desc:"500+ models",color:"#06b6d4",cat:"local"},
{id:"hermes",n:"Hermes",desc:"27 skills",color:"#ec4899",cat:"local"},
{id:"deerflow",n:"DeerFlow",desc:"SuperAgent",color:"#10b981",cat:"agent"},
{id:"sambanova",n:"SambaNova",desc:"Llama-3.3-70B",color:"#8b5cf6",cat:"cloud"}
];
var P=useState("alibaba"),prov=P[0],setProv=P[1];
var M=useState("mistral"),model=M[0],setModel=M[1];
var CT=useState("all"),cat=CT[0],setCat=CT[1];
var MS=useState([]),msgs=MS[0],setMsgs=MS[1];
var IN=useState(""),inp=IN[0],setInp=IN[1];
var LD=useState(false),ld=LD[0],setLd=LD[1];
var EL=useState(0),elapsed=EL[0],setElapsed=EL[1];
var KB=useState(true),kb=KB[0],setKb=KB[1];
var GI=useState(true),git=GI[0],setGit=GI[1];
var TL=useState(false),tools=TL[0],setTools=TL[1];
var ref=useRef(null),timerRef=useRef(null);
useEffect(function(){if(ref.current)ref.current.scrollTop=999999},[msgs,elapsed]);
var s204m=["mistral","qwen3:8b","qwen3:4b","glm4:9b","granite4","meditron:7b","medllama2","phi3:mini"];
var filtered=cat==="all"?ALL:ALL.filter(function(p){return p.cat===cat});
var cur=ALL.find(function(p){return p.id===prov})||ALL[0];
function sendMsg(){
if(!inp.trim()||ld)return;
var m=inp;setInp("");setLd(true);setElapsed(0);
setMsgs(function(p){return p.concat([{r:"u",t:m}])});
var start=Date.now();
timerRef.current=setInterval(function(){setElapsed(Math.floor((Date.now()-start)/1000))},500);
var ctrl=new AbortController();
var timer=setTimeout(function(){ctrl.abort()},120000);
fetch("/api/chat-proxy.php",{
method:"POST",headers:{"Content-Type":"application/json"},signal:ctrl.signal,
body:JSON.stringify({message:m,provider:prov,model:model,kb:kb,git:git,tools:tools})
}).then(function(r){return r.json()}).then(function(data){
clearTimeout(timer);clearInterval(timerRef.current);
var badges=[];if(data.kb)badges.push("KB");if(data.git)badges.push("GIT");if(data.tools)badges.push("TOOLS");
var secs=Math.floor((Date.now()-start)/1000);
setMsgs(function(p){return p.concat([{r:"a",t:data.response||data.error||"No response",isNew:true,p:cur.n+(badges.length?" ["+badges.join("+")+"]":"")+" \u2022 "+secs+"s"}])});
setLd(false);setElapsed(0);
}).catch(function(e){
clearTimeout(timer);clearInterval(timerRef.current);
setMsgs(function(p){return p.concat([{r:"a",t:"ERR: "+(e.name==="AbortError"?"Timeout 120s":e.message),p:cur.n}])});
setLd(false);setElapsed(0);
});
}
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",gap:3,marginBottom:4,flexShrink:0}},
[{id:"all",l:"All ("+ALL.length+")"},{id:"local",l:"LOCAL"},{id:"agent",l:"AGENTS"},{id:"cloud",l:"CLOUD"},{id:"med",l:"MEDICAL"}].map(function(c){
return h("button",{key:c.id,onClick:function(){setCat(c.id)},className:"m",style:{padding:"3px 8px",borderRadius:10,border:"1px solid "+(cat===c.id?"var(--ac)":"var(--bd)"),background:cat===c.id?"var(--ac)11":"transparent",color:cat===c.id?"var(--ac)":"var(--dm)",fontSize:8}},c.l)
})
),
h("div",{style:{display:"flex",gap:3,marginBottom:4,flexWrap:"wrap",flexShrink:0}},
filtered.map(function(p){return h("button",{key:p.id,onClick:function(){setProv(p.id)},className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid "+(prov===p.id?p.color:"var(--bd)"),background:prov===p.id?p.color+"11":"transparent",color:prov===p.id?p.color:"var(--dm)",fontSize:9}},p.n)})
),
prov==="ollama-s204"?h("div",{style:{display:"flex",gap:2,marginBottom:4,flexWrap:"wrap",flexShrink:0}},
s204m.map(function(m){return h("button",{key:m,onClick:function(){setModel(m)},className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid "+(model===m?"var(--ac)":"var(--bd)"),background:model===m?"var(--ac)11":"transparent",color:model===m?"var(--ac)":"var(--dm)",fontSize:8}},m)})
):null,
h("div",{style:{padding:"5px 10px",background:"var(--b2)",borderRadius:4,marginBottom:6,display:"flex",justifyContent:"space-between",flexShrink:0,flexWrap:"wrap",gap:3}},
h("span",{style:{fontSize:10,fontWeight:700,color:cur.color}},cur.n+(prov==="ollama-s204"?" > "+model:"")+" | "+cur.desc),
h("div",{style:{display:"flex",gap:4,alignItems:"center"}},
h("button",{onClick:function(){setKb(!kb)},className:"m",style:{padding:"2px 8px",borderRadius:10,border:"1px solid "+(kb?"#22c55e":"var(--bd)"),background:kb?"#22c55e11":"transparent",color:kb?"#22c55e":"var(--dm)",fontSize:8}},"KB "+(kb?"ON":"OFF")),
h("button",{onClick:function(){setGit(!git)},className:"m",style:{padding:"2px 8px",borderRadius:10,border:"1px solid "+(git?"#3b82f6":"var(--bd)"),background:git?"#3b82f611":"transparent",color:git?"#3b82f6":"var(--dm)",fontSize:8}},"GIT "+(git?"ON":"OFF")),
h("button",{onClick:function(){setTools(!tools)},className:"m",style:{padding:"2px 8px",borderRadius:10,border:"1px solid "+(tools?"#f59e0b":"var(--bd)"),background:tools?"#f59e0b11":"transparent",color:tools?"#f59e0b":"var(--dm)",fontSize:8}},"TOOLS "+(tools?"ON":"OFF")),
h("button",{onClick:function(){setMsgs([])},className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:7}},"Clear")
)
),
h("div",{ref:ref,style:{flex:1,overflow:"auto",paddingBottom:4}},
msgs.length===0?h("div",{style:{padding:16,textAlign:"center",color:"var(--dm)",fontSize:10}},
h("div",{style:{marginBottom:8,fontSize:11}},ALL.length+" AI providers connected to your infrastructure"),h("div",{style:{display:"grid",gridTemplateColumns:"repeat(3,1fr)",gap:6,marginBottom:12,maxWidth:500,margin:"0 auto 12px"}},[["KB ON","436 knowledge base files","#22c55e"],["GIT ON","Latest commits + modified files","#3b82f6"],["TOOLS ON","Infra state: Docker, Ollama, PG","#f59e0b"]].map(function(t){return h("div",{key:t[0],style:{padding:8,borderRadius:6,background:t[2]+"08",border:"1px solid "+t[2]+"22",textAlign:"center"}},h("div",{style:{fontSize:10,fontWeight:700,color:t[2]}},t[0]),h("div",{className:"m",style:{fontSize:7,color:"var(--dm)",marginTop:2}},t[1]))})),
h("div",{style:{display:"flex",flexWrap:"wrap",gap:3,justifyContent:"center",marginTop:10}},
["Présente WEVAL","Services SAP?","Stack technique","Derniers commits","HCPs France?","Scan security","Plan marketing B2B"].map(function(s){return h("button",{key:s,onClick:function(){setInp(s)},style:{padding:"5px 10px",borderRadius:12,border:"1px solid var(--bd)",background:"var(--b2)",color:"var(--fg)",fontSize:9}},s)})
)
):null,
msgs.map(function(m,i){return h("div",{key:i,style:{display:"flex",justifyContent:m.r==="u"?"flex-end":"flex-start",marginBottom:5}},
h("div",{style:{maxWidth:"82%",padding:"7px 11px",borderRadius:8,fontSize:11,lineHeight:1.5,background:m.r==="u"?cur.color+"11":"var(--b2)",border:"1px solid "+(m.r==="u"?cur.color+"22":"var(--bd)"),color:m.r==="u"?cur.color:"var(--fg)"}},
h("div",null,m.r==="a"?h("div",{style:{fontSize:11,lineHeight:1.5}},md(m.t)),extractArtifact(m.t)?h("button",{onClick:function(){setArtifact(extractArtifact(m.t))},className:"m",style:{marginTop:6,padding:"4px 12px",borderRadius:6,border:"1px solid var(--pu)",background:"var(--pu)11",color:"var(--pu)",fontSize:9,display:"flex",alignItems:"center",gap:4}},"\u25A1 Open in Panel"):null:h("pre",{style:{whiteSpace:"pre-wrap",fontFamily:"inherit",margin:0}},m.t),m.r==="a"?h("button",{onClick:function(){navigator.clipboard.writeText(m.t)},className:"m",style:{marginTop:4,padding:"1px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:7,cursor:"pointer"}},"Copy"):null),
m.p?h("div",{className:"m",style:{fontSize:7,color:"var(--dm)",marginTop:2}},"via "+m.p):null
)
)}),
ld?h("div",{style:{padding:6,display:"flex",alignItems:"center",gap:6}},
h("div",{style:{color:cur.color,fontSize:10}},"Thinking..."),
h("div",{className:"m",style:{fontSize:9,color:"var(--dm)",background:"var(--b2)",padding:"2px 8px",borderRadius:10,border:"1px solid var(--bd)"}},elapsed+"s"),
h("div",{style:{width:40,height:3,background:"var(--bd)",borderRadius:2,overflow:"hidden"}},h("div",{style:{width:Math.min(elapsed/60,1)*100+"%",height:"100%",background:cur.color,transition:"width .5s"}}))
):null
),
h("div",{style:{display:"flex",gap:4,flexShrink:0}},
h("input",{value:inp,onChange:function(e){setInp(e.target.value)},onKeyDown:function(e){if(e.key==="Enter")sendMsg()},placeholder:"Message...",disabled:ld,style:{flex:1,padding:"9px 12px",borderRadius:5,fontSize:11,color:"#fff",background:"var(--b2)",border:"1px solid var(--bd)",outline:"none"}}),
h("button",{onClick:sendMsg,disabled:ld,style:{padding:"9px 18px",borderRadius:5,border:"none",background:cur.color,color:"#000",fontWeight:700,fontSize:11,opacity:ld?0.5:1}},ld?"...":"Send")
)
);
}
/* ===== MODELS ===== */
function Models(){return ExecPanel({initial:"Models\n",controls:function(run,ld){
var M=[["GLM4:9b","5.5GB"],["Granite4","2.1GB"],["Meditron:7b","3.8GB"],["MedLLaMA2","3.8GB"],["Qwen3:8b","4.9GB"],["Qwen3:4b","2.6GB"],["Mistral","4.4GB"],["Phi3:mini","2.3GB"]];
return h("div",null,
h("div",{style:{display:"flex",gap:3,marginBottom:8}},
h("button",{onClick:function(){run("List S204",function(){return cx("sudo ollama list 2>&1")})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--ac)",background:"var(--ac)11",color:"var(--ac)",fontSize:9}},"List S204"),
h("button",{onClick:function(){run("List S151",function(){return s151("docker exec ollama ollama list 2>&1")})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--wn)",background:"var(--wn)11",color:"var(--wn)",fontSize:9}},"List S151"),
h("button",{onClick:function(){run("Running",function(){return cx("sudo ollama ps 2>&1")})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--a2)",background:"var(--a2)11",color:"var(--a2)",fontSize:9}},"Running"),
h("button",{onClick:function(){run("Registry",function(){return fetch("/api/wevia-providers.php").then(function(r){return r.text()})})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--pu)",background:"var(--pu)11",color:"var(--pu)",fontSize:9}},"Registry")
),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:4}},M.map(function(m){return h("div",{key:m[0],style:{padding:6,borderRadius:4,background:"var(--b2)",border:"1px solid var(--bd)",display:"flex",justifyContent:"space-between",alignItems:"center"}},h("div",null,h("div",{style:{fontSize:10,fontWeight:600}},m[0]),h("div",{style:{fontSize:7,color:"var(--dm)"}},m[1])),h("button",{onClick:function(){run(m[0],function(){return cx('sudo ollama run '+m[0].toLowerCase()+' "Hello" 2>&1 | head -3')})},disabled:ld,className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--ac)",fontSize:8,flexShrink:0}},"Test"))}))
);
}})}
/* ===== SQL ===== */
function SQLPanel(){
var Q=useState("SELECT count(*) FROM adx_clients.contacts;"),q=Q[0],setQ=Q[1];
var R=useState(""),r=R[0],setR=R[1];var L=useState(false),ld=L[0],setLd=L[1];
var presets=[["Contacts","SELECT count(*) FROM adx_clients.contacts;"],["DB sizes","SELECT datname,pg_size_pretty(pg_database_size(datname)) FROM pg_database ORDER BY pg_database_size(datname) DESC;"],["Winners","SELECT id,name FROM adx_system.send_configs WHERE is_winner=true;"],["Ethica pays","SELECT count(*),pays FROM ethica.medecins_real GROUP BY pays ORDER BY count DESC LIMIT 10;"],["Ethica spec","SELECT count(*),specialite FROM ethica.medecins_real GROUP BY specialite ORDER BY count DESC LIMIT 10;"],["Active cfgs","SELECT id,name,status FROM adx_system.send_configs WHERE status='active' LIMIT 15;"],["PG version","SELECT version();"]];
function run(){setLd(true);setR("");sentinel('sudo -u postgres psql -c "'+q.replace(/"/g,'\\"')+'" 2>&1').then(function(res){setR(parse(res));setLd(false)}).catch(function(e){setR("ERR: "+e.message);setLd(false)})}
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{className:"m",style:{fontSize:9,color:"var(--dm)",marginBottom:6}},"PostgreSQL S95 | adx_system + adx_clients + ethica"),
h("div",{style:{display:"flex",flexWrap:"wrap",gap:2,marginBottom:6,flexShrink:0}},presets.map(function(p){return h("button",{key:p[0],onClick:function(){setQ(p[1])},className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}},p[0])})),
h("textarea",{value:q,onChange:function(e){setQ(e.target.value)},className:"m",rows:2,style:{width:"100%",padding:7,borderRadius:4,fontSize:10,color:"var(--a2)",background:"#000",border:"1px solid var(--bd)",outline:"none",resize:"vertical",marginBottom:4,flexShrink:0}}),
h("div",{style:{display:"flex",gap:4,marginBottom:4,flexShrink:0}},
h("button",{onClick:run,disabled:ld,style:{padding:"5px 14px",borderRadius:4,border:"none",background:"var(--a2)",color:"#000",fontWeight:700,fontSize:10}},ld?"...":"Execute"),
h("button",{onClick:function(){setR("")},className:"m",style:{padding:"3px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}},"Clear")
),
h("pre",{className:"m",style:{flex:1,background:"#000",borderRadius:5,padding:8,overflow:"auto",fontSize:10,color:"#ccc",whiteSpace:"pre-wrap",lineHeight:1.4,border:"1px solid var(--bd)"}},r||"Results...")
);
}
/* ===== GIT + CodeRabbit ===== */
function GitPanel(){
var actions=[["Log","git log --oneline -15"],["Status","git status --short"],["Diff","git diff --stat"],["Branch","git branch -a"],["Last","git log -1 --format='%H%n%an%n%s'"],["Dirty","git status --short | wc -l"],["CF Purge","curl -s -X POST 'https://api.cloudflare.com/client/v4/zones/1488bbba251c6fa282999fcc09aac9fe/purge_cache' -H 'X-Auth-Email: ymahboub@weval-consulting.com' -H 'X-Auth-Key: 9eb8d1041e7faeae68d5017376871ba170291' -H 'Content-Type: application/json' --data '{\"purge_everything\":true}'"]];
return ExecPanel({initial:"Git + CodeRabbit\n",controls:function(run,ld){return h("div",null,
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:3,marginBottom:8}},actions.map(function(a){return h("button",{key:a[0],onClick:function(){run(a[0],function(){return cx("cd /var/www/html && "+a[1])})},disabled:ld,style:{padding:5,borderRadius:3,border:"1px solid var(--bd)",background:"var(--b2)",color:"var(--fg)",fontSize:9,textAlign:"center"}},a[0])})),
h("div",{style:{display:"flex",gap:4,alignItems:"center",padding:"6px 8px",background:"var(--b2)",borderRadius:4,border:"1px solid var(--bd)"}},
h("span",{style:{fontSize:9,fontWeight:600,color:"#a78bfa"}},"\uD83D\uDC30 CodeRabbit"),
h("a",{href:"https://app.coderabbit.ai",target:"_blank",className:"ext"},"Dashboard"),
h("span",{className:"m",style:{fontSize:7,color:"var(--dm)"}},"AI code review on GitHub PRs")
)
)}});
}
/* ===== DOCKER ===== */
function DockerPanel(){
var apps=[{n:"uptime-kuma",p:3088,u:"https://monitor.weval-consulting.com"},{n:"plausible",p:8787,u:"https://analytics.weval-consulting.com"},{n:"authentik",p:9100,u:"https://auth.weval-consulting.com"},{n:"n8n",p:5678},{n:"vaultwarden",p:8222},{n:"mattermost",p:8065},{n:"searxng",p:8080},{n:"qdrant",p:6333},{n:"loki",p:3100}];
return ExecPanel({initial:"Docker S204 (15 containers)\n",controls:function(run,ld){return h("div",null,
h("div",{style:{display:"flex",gap:3,marginBottom:6}},
h("button",{onClick:function(){run("PS",function(){return cx('sudo docker ps --format "table {{.Names}}\\t{{.Status}}" | head -18')})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--a2)",background:"var(--a2)11",color:"var(--a2)",fontSize:9}},"List All"),
h("button",{onClick:function(){run("Stats",function(){return cx('sudo docker stats --no-stream --format "table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}" | head -16')})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--wn)",background:"var(--wn)11",color:"var(--wn)",fontSize:9}},"Stats"),
h("button",{onClick:function(){run("Images",function(){return cx('sudo docker images --format "table {{.Repository}}\\t{{.Tag}}\\t{{.Size}}" | head -16')})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--pu)",background:"var(--pu)11",color:"var(--pu)",fontSize:9}},"Images")
),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(3,1fr)",gap:4}},apps.map(function(a){return h("div",{key:a.n,style:{padding:8,borderRadius:5,background:"var(--b2)",border:"1px solid var(--bd)",display:"flex",justifyContent:"space-between",alignItems:"center"}},
h("div",null,h("div",{style:{fontSize:10,fontWeight:600}},a.n),h("div",{className:"m",style:{fontSize:7,color:"var(--dm)"}},":"+a.p)),
h("div",{style:{display:"flex",gap:3}},
h("button",{onClick:function(){run(a.n,function(){return cx("sudo docker logs "+a.n+" --tail 8 2>&1 | tail -c 400")})},disabled:ld,className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--a2)",fontSize:7}},"logs"),h("button",{onClick:function(){run("restart "+a.n,function(){return cx("sudo docker restart "+a.n+" 2>&1")})},disabled:ld,className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--wn)",fontSize:7}},"restart"),
a.u?h("a",{href:a.u,target:"_blank",className:"ext",style:{fontSize:7}},"open"):null
)
)}))
)}});
}
/* ===== ETHICA (NEW) ===== */
function EthicaPanel(){
var S=useState(null),stats=S[0],setStats=S[1];
var V=useState("stats"),view=V[0],setView=V[1];
useEffect(function(){apiGet("/api/ethica-stats-api.php").then(setStats).catch(function(){})},[]);
var tabs=[["stats","Stats"],["hcp","HCP Manager"],["monitor","Monitor"],["sms","SMS"],["drill","Drill"]];
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",gap:3,marginBottom:8,flexShrink:0}},tabs.map(function(t){return h("button",{key:t[0],onClick:function(){setView(t[0])},className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid "+(view===t[0]?"var(--er)":"var(--bd)"),background:view===t[0]?"var(--er)11":"transparent",color:view===t[0]?"var(--er)":"var(--dm)",fontSize:9}},t[1])})),
view==="stats"?h("div",{style:{flex:1,display:"flex",flexDirection:"column"}},
stats?h("div",{style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:8,marginBottom:12}},
[["Total HCPs",String(stats.total||0),"var(--er)"],["With Email",String(stats.with_email||0),"var(--ac)"],["With Phone",String(stats.with_telephone||0),"var(--a2)"],["Coverage",(stats.with_email&&stats.total?Math.round(stats.with_email/stats.total*100):0)+"%","var(--pu)"]].map(function(s){return h("div",{key:s[0],style:{padding:12,borderRadius:6,background:"var(--b2)",border:"1px solid var(--bd)",textAlign:"center"}},
h("div",{className:"m",style:{fontSize:8,color:"var(--dm)",marginBottom:4}},s[0]),
h("div",{style:{fontSize:20,fontWeight:700,color:s[2]}},s[1])
)})
):null,
ExecPanel({initial:"Ethica B2B Pharma\n",controls:function(run,ld){
var queries=[["By Country","SELECT count(*),pays FROM ethica.medecins_real GROUP BY pays ORDER BY count DESC LIMIT 10;"],["By Specialty","SELECT count(*),specialite FROM ethica.medecins_real GROUP BY specialite ORDER BY count DESC LIMIT 10;"],["France","SELECT count(*),specialite FROM ethica.medecins_real WHERE pays='France' GROUP BY specialite ORDER BY count DESC LIMIT 8;"],["Morocco","SELECT count(*),specialite FROM ethica.medecins_real WHERE pays='Maroc' GROUP BY specialite ORDER BY count DESC LIMIT 8;"],["Recent","SELECT nom,prenom,specialite,pays FROM ethica.medecins_real ORDER BY id DESC LIMIT 10;"]];
return h("div",{style:{display:"flex",flexWrap:"wrap",gap:3}},queries.map(function(q){return h("button",{key:q[0],onClick:function(){run(q[0],function(){return sentinel('PGPASSWORD=admin123 psql -h 127.0.0.1 -U admin -d adx_system -c "'+q[1].replace(/"/g,'\\"')+'" 2>&1')})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--bd)",background:"var(--b2)",color:"var(--er)",fontSize:9}},q[0])}));
}})
):
view==="hcp"?h("iframe",{src:"/ethica-hcp-manager.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}}):
view==="monitor"?h("iframe",{src:"/ethica-monitor.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}}):
view==="sms"?h("iframe",{src:"/ethica-sms.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}}):
h("iframe",{src:"/ethica-drill.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}})
);
}
/* ===== NONREG (NEW) ===== */
function NonRegPanel(){
var V=useState("run"),view=V[0],setView=V[1];
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",gap:3,marginBottom:8,flexShrink:0}},
[["run","Run Tests"],["suite","Full Suite"],["dash","Full Dashboard"],["auth","Auth Battery"],["code","Code Review"]].map(function(t){return h("button",{key:t[0],onClick:function(){setView(t[0])},className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid "+(view===t[0]?"var(--ac)":"var(--bd)"),background:view===t[0]?"var(--ac)11":"transparent",color:view===t[0]?"var(--ac)":"var(--dm)",fontSize:9}},t[1])})
),
view==="run"?ExecPanel({initial:"NonReg Tests\n",controls:function(run,ld){
var tests=[["Site 200","curl -sk -o /dev/null -w '%{http_code}' https://weval-consulting.com/"],["Login","curl -sk -o /dev/null -w '%{http_code}' https://weval-consulting.com/login.html"],["API Health","curl -sk -o /dev/null -w '%{http_code}' https://weval-consulting.com/api/health-up.php"],["WEVIA Caps","curl -s 'http://localhost/api/wevia-capabilities.php?cap=health' -H 'Host: weval-consulting.com'"],["Arsenal","curl -s http://10.1.0.3:5890/ -o /dev/null -w '%{http_code}'"],["PMTA","systemctl is-active pmta"],["PG","sudo -u postgres psql -t -c 'SELECT 1' 2>/dev/null"],["SSL","curl -sk -o /dev/null -w '%{ssl_verify_result}' https://weval-consulting.com/"],["JS Bundle","curl -sk -o /dev/null -w '%{http_code} %{size_download}B' https://weval-consulting.com/$(grep -oP 'index-[^\"]+\\.js' /var/www/html/index.html | head -1)"],["Blog","curl -sk -o /dev/null -w '%{http_code}' https://weval-consulting.com/blog"],["Ethica API","curl -s https://weval-consulting.com/api/ethica-stats-api.php | python3 -c \"import sys,json;d=json.load(sys.stdin);print(d['total'],'HCPs')\""],["Ollama","curl -s http://localhost:11434/api/tags | python3 -c \"import sys,json;print(len(json.load(sys.stdin)['models']),'models')\""]];
return h("div",null,
h("button",{onClick:function(){tests.forEach(function(t){run(t[0],function(){return t[0]==="Arsenal"||t[0]==="PG"?sentinel(t[1]):cx(t[1])})})},disabled:ld,className:"m",style:{padding:"5px 14px",borderRadius:4,border:"none",background:"var(--ac)",color:"#000",fontWeight:700,fontSize:10,marginBottom:6}},"Run All ("+tests.length+")"),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:3}},tests.map(function(t){return h("button",{key:t[0],onClick:function(){run(t[0],function(){return t[0]==="Arsenal"||t[0]==="PG"?sentinel(t[1]):cx(t[1])})},disabled:ld,className:"m",style:{padding:4,borderRadius:3,border:"1px solid var(--bd)",background:"var(--b2)",color:"var(--fg)",fontSize:8,textAlign:"center"}},t[0])}))
);
}}):
view==="suite"?h("iframe",{src:"/nonreg.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}}):
view==="dash"?h("iframe",{src:"/test-report/full-nonreg-dashboard.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}}):view==="auth"?h("iframe",{src:"/test-report/auth-battery-test.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}}):h("iframe",{src:"/wevia-ia/code-review-22mars.html",style:{flex:1,border:"none",borderRadius:6,background:"#111"}})
);
}
/* ===== CLI TOOLS ===== */
function CLIPanel(){return ExecPanel({initial:"CLI tools S204\n",controls:function(run,ld){
var tools=[["Kilo","sudo HOME=/root kilo --version 2>&1"],["Hermes","sudo HOME=/root hermes skills list 2>&1 | head -10"],["Nuclei","nuclei -version 2>&1"],["Nuclei scan","nuclei -u https://weval-consulting.com -severity critical,high -silent 2>&1 | head -10"],["CARL","ls /var/www/weval/.carl/ 2>&1"],["Ollama","sudo ollama list 2>&1"],["Skills","curl -s 'http://localhost/api/wevia-skills.php?action=status' -H 'Host: weval-consulting.com'"],["Warmup","curl -s 'http://localhost/api/warmup-engine.php' -H 'Host: weval-consulting.com'"],["Playwright","npx playwright --version 2>&1"],["Nuclei full","sudo HOME=/root nuclei -u https://weval-consulting.com -severity critical,high,medium -silent 2>&1 | head -20"],["theHarvester","timeout 15 theHarvester -d weval-consulting.com -b crtsh 2>&1 | tail -10"],["EmailFinder","timeout 10 emailfinder -d weval-consulting.com 2>&1 | head -10"],["CRM Stats","curl -s 'http://localhost/api/crm-api.php?action=stats' -H 'Host: weval-consulting.com'"],["DeerFlow","curl -s http://localhost:2024/ok 2>&1"],["Mattermost","curl -s http://localhost:8065/api/v4/system/ping 2>&1"],["SearXNG","curl -s http://localhost:8080/ 2>&1 | head -c 50"],["Qdrant","curl -s http://localhost:6333/collections 2>&1 | head -c 80"],["Loki","curl -s http://localhost:3100/ready 2>&1"],["n8n","curl -s http://localhost:5678/healthz 2>&1"],["CodeRabbit","cat /var/www/html/.coderabbit.yaml 2>&1 | head -5"],["Piebald","ls /var/www/weval/.carl/ 2>&1"],["PDF Gen","curl -s http://localhost/api/weval-ia-pdf.php -H 'Host: weval-consulting.com' 2>&1 | head -c 50"],["ToolFK","curl -s 'http://localhost/api/wevia-capabilities-ext.php?action=list' -H 'Host: weval-consulting.com' 2>&1 | head -c 80"],["Ethica Stats","curl -s 'http://localhost/api/ethica-real-scraper-api.php?token=ETHICA_API_2026_SECURE&action=status' -H 'Host: ethica.wevup.app' 2>&1 | head -c 80"],["Docker","docker ps --format '{{.Names}} {{.Status}}' 2>&1 | head -15"],["Disk","df -h / | tail -1"],["PHP Pool","pgrep -c php-fpm8.5 2>&1"],["DaBaDoc","ls /opt/dabadoc*.py 2>&1 | wc -l && echo 'scrapers'"],["Mermaid Render","python3 /opt/mermaid-render.py --help 2>&1 | head -3"],["NonReg Visual","python3 /opt/nonreg-visual.py --help 2>&1 | head -3"],["Search Proxy","head -3 /opt/search-proxy.py 2>&1"],["n8n WF","curl -s http://localhost:5678/api/v1/workflows 2>/dev/null | python3 -c 'import sys,json;d=json.load(sys.stdin);print(d.get(\"count\",0),\"workflows\")' 2>/dev/null"],["Twenty CRM","curl -s -m 3 http://localhost:3002/ 2>/dev/null | head -c 30"],["Vaultwarden","curl -s -m 3 http://localhost:8222/ 2>/dev/null | head -c 30"],["Authentik","curl -s -m 3 http://localhost:9000/ 2>/dev/null | head -c 30"],["CARL Skills","cat /var/www/weval/.carl/manifest 2>/dev/null | head -5"],["CARL Domains","ls /var/www/weval/.carl/ 2>&1"],["Hermes Skills","sudo HOME=/root hermes skills list 2>&1 | head -10"],["Disk Monitor","bash /opt/disk-monitor.sh 2>&1 | head -5"],["WEVIA API","curl -s http://localhost/api/weval-ia -H 'Host: weval-consulting.com' 2>&1 | head -c 50"],["WEVADS Health","curl -s -m 3 http://localhost/wevads-ia/ -H 'Host: weval-consulting.com' -o /dev/null -w '%{http_code}' 2>&1"],["Crons S95","curl -s 'http://10.1.0.3:5890/api/sentinel-brain.php?action=exec&cmd=crontab+-l+-u+www-data+2>/dev/null+|+grep+-v+^%23+|+head+-15'"],["Cron count","curl -s 'http://10.1.0.3:5890/api/sentinel-brain.php?action=exec&cmd=crontab+-l+-u+www-data+2>/dev/null+|+grep+-c+.'"]];
return h("div",null,
h("div",{style:{display:"flex",flexWrap:"wrap",gap:3,marginBottom:8}},tools.map(function(t){return h("button",{key:t[0],onClick:function(){run(t[0],function(){return cx(t[1])})},disabled:ld,className:"m",style:{padding:"4px 10px",borderRadius:4,border:"1px solid var(--bd)",background:"var(--b2)",color:"var(--wn)",fontSize:9}},t[0])})),
h("div",{style:{display:"flex",gap:4,alignItems:"center",padding:"6px 8px",background:"var(--b2)",borderRadius:4,border:"1px solid var(--bd)"}},
h("a",{href:"https://app.coderabbit.ai",target:"_blank",className:"ext"},"CodeRabbit"),
h("a",{href:"https://toolfk.com",target:"_blank",className:"ext"},"ToolFK"),
h("a",{href:"https://github.com/Piebald-AI/claude-code-system-prompts",target:"_blank",className:"ext"},"Piebald"),
h("a",{href:"https://openrouter.ai/settings/keys",target:"_blank",className:"ext"},"OpenRouter")
)
);
}})}
/* ===== CLAUDE CODE ===== */
function WevadsPanel(){return h("iframe",{src:"/wevads-ia/",style:{width:"100%",height:"100%",border:"none",borderRadius:6,background:"#0b0d14"}})}
function WeviaPubPanel(){return h("iframe",{src:"/wevia",style:{width:"100%",height:"100%",border:"none",borderRadius:6,background:"#0b0d14"}})}
function ClaudePanel(){
var C=useState(""),copied=C[0],setCopied=C[1];
function cp(t){navigator.clipboard.writeText(t);setCopied(t);setTimeout(function(){setCopied("")},1200)}
var groups=[
{n:"Fix",cl:"var(--er)",items:[["/gsd:quick","Bug"],["/gsd:debug","Debug"],["*hotfix","Urgence"]]},
{n:"Plan",cl:"var(--pu)",items:[["/gsd:new-project","Init"],["/gsd:map-codebase","Scan"],["/paul:plan","Plan"]]},
{n:"Build",cl:"var(--ac)",items:[["/gsd:execute-phase N","Execute"],["/paul:apply","Apply"],["/paul:unify","Unify"]]},
{n:"Review",cl:"var(--a2)",items:[["/review","Review"],["/qa","QA"],["/cso","Security"]]},
{n:"Ship",cl:"var(--wn)",items:[["/gsd:ship","Ship"],["/ship","Release"],["*deploy","Deploy"]]},
{n:"CARL",cl:"#eab308",items:[["*carl activate wevads","WEVADS"],["*carl activate wevia","WEVIA"],["*carl activate site","SITE"],["*carl activate ethica","ETHICA"],["*carl activate infra","INFRA"]]},
{n:"GWS",cl:"#eab308",items:[["gws drive files list","Drive"],["gws gmail messages list","Gmail"],["gws workflow +standup-report","Standup"]]}
];
return h("div",null,
h("div",{className:"m",style:{fontSize:9,color:"var(--dm)",padding:"5px 8px",background:"var(--b2)",borderRadius:4,marginBottom:8,border:"1px solid var(--bd)"}},"Click = copy to clipboard"),
groups.map(function(g,i){return h("div",{key:i,style:{marginBottom:10}},
h("div",{style:{fontSize:10,fontWeight:700,color:g.cl,marginBottom:4,paddingBottom:3,borderBottom:"1px solid var(--bd)"}},g.n),
h("div",{style:{display:"flex",flexWrap:"wrap",gap:3}},g.items.map(function(item,j){return h("button",{key:j,onClick:function(){cp(item[0])},style:{padding:"4px 8px",borderRadius:4,background:copied===item[0]?g.cl+"11":"var(--b2)",border:"1px solid "+(copied===item[0]?g.cl+"33":"var(--bd)"),color:"var(--fg)",fontSize:9}},
h("code",{className:"m",style:{color:g.cl,fontSize:9}},item[0]),
h("span",{style:{color:"var(--dm)",fontSize:8,marginLeft:4}},item[1])
)}))
)})
);
}
/* ===== TOOLFK ===== */
function ToolsPanel(props){
var C=useState("All"),cat=C[0],setCat=C[1];
var T=[{n:"JS Obfusc",u:"https://www.toolfk.com/tools/online-js-obfuscator.html",c:"Code"},{n:"PHP Encrypt",u:"https://www.toolfk.com/tools/online-php-encrypt.html",c:"Code"},{n:"AI Image",u:"https://www.toolfk.com/tools/online-text-to-img.html",c:"AI"},{n:"AI Writer",u:"https://www.toolfk.com/tools/convert-text.html",c:"AI"},{n:"BG Remove",u:"https://www.toolfk.com/tools/online-removerized.html",c:"Image"},{n:"Compress",u:"https://www.toolfk.com/tools/online-images-compression.html",c:"Image"},{n:"OCR",u:"https://www.toolfk.com/tools/online-ocr.html",c:"Conv"},{n:"PDF>Word",u:"https://www.toolfk.com/tools/online-pdf2word.html",c:"Conv"},{n:"JSON",u:"https://www.toolfk.com/tools/format-json.html",c:"Dev"},{n:"Regex",u:"https://www.toolfk.com/tools/online-regex.html",c:"Dev"},{n:"DNS",u:"https://www.toolfk.com/tools/online-dns-check.html",c:"Dev"},{n:"Encrypt",u:"https://www.toolfk.com/tools/convert-encryption.html",c:"Dev"}];
if(props.tool){return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:4,flexShrink:0}},
h("div",{style:{display:"flex",alignItems:"center",gap:4}},h("button",{onClick:function(){props.setTool(null)},style:{padding:"4px 8px",borderRadius:3,border:"1px solid var(--bd)",background:"var(--b2)",color:"var(--fg)",fontSize:9}},"Back"),h("b",{style:{fontSize:11}},props.tool.n)),
h("a",{href:props.tool.u,target:"_blank",className:"ext",style:{fontWeight:700}},"New Tab")
),
h("iframe",{src:props.tool.u,style:{flex:1,border:"none",borderRadius:4,background:"#fff",minHeight:400}})
)}
var filtered=cat==="All"?T:T.filter(function(t){return t.c===cat});
return h("div",null,
h("div",{style:{display:"flex",gap:2,marginBottom:8}},["All","Code","AI","Image","Conv","Dev"].map(function(c){return h("button",{key:c,onClick:function(){setCat(c)},className:"m",style:{padding:"3px 8px",borderRadius:10,border:"1px solid "+(cat===c?"var(--ac)":"var(--bd)"),background:cat===c?"var(--ac)11":"transparent",color:cat===c?"var(--ac)":"var(--dm)",fontSize:8}},c)})),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:6}},filtered.map(function(t,i){return h("div",{key:i,onClick:function(){props.setTool(t)},style:{padding:10,borderRadius:6,background:"var(--b2)",border:"1px solid var(--bd)",cursor:"pointer",textAlign:"center"}},h("div",{style:{fontSize:11,fontWeight:600}},t.n),h("div",{className:"m",style:{fontSize:7,color:"var(--dm)",marginTop:2}},t.c))}))
);
}
/* ===== FILE VIEWER/EDITOR ===== */
function FilePanel(){
var S=useState("s204"),srv=S[0],setSrv=S[1];
var P=useState("/var/www/html"),path=P[0],setPath=P[1];
var C=useState(""),content=C[0],setContent=C[1];
var L=useState(false),ld=L[0],setLd=L[1];
var M=useState("view"),mode=M[0],setMode=M[1];
var presets=[
["/var/www/html","Site root"],["/var/www/html/api","APIs"],["/var/www/html/index.html","index"],
["/etc/nginx/sites-enabled","nginx"],["/var/www/weval/.carl","CARL"],
["/opt/wevads/vault","Vault S95"],["/opt/wevads/public","WEVADS S95"],
["/var/www/weval/wevia-ia","WEVIA brain"]
];
function exec(cmd){
setLd(true);
var fn=srv==="s204"?cx:srv==="s95"?sentinel:s151;
fn(cmd).then(function(r){setContent(parse(r));setLd(false)}).catch(function(e){setContent("ERR: "+e.message);setLd(false)});
}
function browse(){exec("ls -la "+path+" 2>&1 | head -40")}
function readFile(){exec("cat "+path+" 2>&1 | head -200")}
function readHead(){exec("head -50 "+path+" 2>&1")}
function readTail(){exec("tail -50 "+path+" 2>&1")}
function wordCount(){exec("wc -l "+path+" 2>&1 && file "+path+" 2>&1")}
function grepFile(){
var q=prompt("Search pattern:");
if(q)exec("grep -n '"+q.replace(/'/g,"")+"' "+path+" 2>&1 | head -30");
}
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",gap:3,marginBottom:4,flexShrink:0}},
["s204","s95","s151"].map(function(s){return h("button",{key:s,onClick:function(){setSrv(s)},className:"m",style:{padding:"3px 10px",borderRadius:4,border:"1px solid "+(srv===s?"var(--ac)":"var(--bd)"),background:srv===s?"var(--ac)11":"transparent",color:srv===s?"var(--ac)":"var(--dm)",fontSize:9}},s.toUpperCase())}),
h("span",{style:{flex:1}}),
presets.map(function(p){return h("button",{key:p[0],onClick:function(){setPath(p[0])},className:"m",style:{padding:"2px 6px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:7}},p[1])})
),
h("div",{style:{display:"flex",gap:4,marginBottom:6,flexShrink:0}},
h("input",{value:path,onChange:function(e){setPath(e.target.value)},onKeyDown:function(e){if(e.key==="Enter")browse()},className:"m",style:{flex:1,padding:"6px 10px",borderRadius:4,fontSize:10,color:"var(--ac)",background:"#000",border:"1px solid var(--bd)",outline:"none"}}),
h("button",{onClick:browse,disabled:ld,className:"m",style:{padding:"5px 10px",borderRadius:4,border:"none",background:"var(--ac)",color:"#000",fontWeight:700,fontSize:9}},"ls"),
h("button",{onClick:readFile,disabled:ld,className:"m",style:{padding:"5px 10px",borderRadius:4,border:"none",background:"var(--a2)",color:"#000",fontWeight:700,fontSize:9}},"cat"),
h("button",{onClick:readHead,disabled:ld,className:"m",style:{padding:"5px 8px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}},"head"),
h("button",{onClick:readTail,disabled:ld,className:"m",style:{padding:"5px 8px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}},"tail"),
h("button",{onClick:wordCount,disabled:ld,className:"m",style:{padding:"5px 8px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}},"wc"),
h("button",{onClick:grepFile,disabled:ld,className:"m",style:{padding:"5px 8px",borderRadius:4,border:"1px solid var(--pu)",background:"var(--pu)11",color:"var(--pu)",fontSize:8}},"grep")
),
h("pre",{className:"m",style:{flex:1,background:"#000",borderRadius:6,padding:10,overflow:"auto",fontSize:10,color:"var(--ac)",whiteSpace:"pre-wrap",wordBreak:"break-all",lineHeight:1.5,border:"1px solid var(--bd)"}},ld?"Loading...":content||"Browse files across 3 servers.\nClick a preset or type a path."),
h("div",{style:{display:"flex",gap:4,marginTop:4,flexShrink:0,alignItems:"center"}},
h("span",{className:"m",style:{fontSize:8,color:"var(--dm)"}},"Tip: click a directory entry name to navigate"),
h("button",{onClick:function(){var parts=path.split("/");parts.pop();setPath(parts.join("/")||"/")},className:"m",style:{padding:"2px 8px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}},".. up")
)
);
}
/* ===== OPEN SOURCE DISCOVERY (36 tools) ===== */
function DiscoverPanel(){
var D=useState(null),data=D[0],setData=D[1];
var F=useState("all"),filter=F[0],setFilter=F[1];
useEffect(function(){apiGet("/api/opensource-discovery.php?action=list").then(setData).catch(function(){})},[]);
if(!data)return h("div",{style:{padding:20,color:"var(--dm)"}},"Loading 36 open source tools...");
var tools=data.tools||[];
var cats=["all","ai","devops","security","business","data","communication","email"];
var filtered=filter==="all"?tools:tools.filter(function(t){return t.cat===filter});
var colors={critical:"var(--er)",high:"var(--wn)",medium:"var(--pu)",low:"var(--dm)"};
var statusColors={Recommended:"var(--ac)",Exploring:"var(--a2)","We Use":"#f59e0b"};
return h("div",{style:{height:"100%",display:"flex",flexDirection:"column"}},
h("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:8,flexShrink:0}},
h("div",{style:{display:"flex",gap:3,flexWrap:"wrap"}},cats.map(function(c){return h("button",{key:c,onClick:function(){setFilter(c)},className:"m",style:{padding:"3px 8px",borderRadius:10,border:"1px solid "+(filter===c?"var(--ac)":"var(--bd)"),background:filter===c?"var(--ac)11":"transparent",color:filter===c?"var(--ac)":"var(--dm)",fontSize:8,textTransform:"uppercase"}},c)})),
h("div",{className:"m",style:{fontSize:9,color:"var(--dm)"}},filtered.length+"/"+tools.length+" tools | "+(data.total||36)+" catalogued")
),
h("div",{style:{flex:1,overflow:"auto"}},
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill,minmax(280px,1fr))",gap:8}},
filtered.map(function(t){return h("div",{key:t.name,style:{padding:12,borderRadius:8,background:"var(--b2)",border:"1px solid var(--bd)"}},
h("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:6}},
h("div",null,
h("div",{style:{fontSize:12,fontWeight:700,color:"var(--fg)"}},t.name),
h("div",{className:"m",style:{fontSize:8,color:"var(--dm)",marginTop:2}},t.lang+" | "+t.license+" | "+t.stars+" stars")
),
h("div",{style:{display:"flex",gap:3}},
h("span",{className:"m",style:{padding:"1px 6px",borderRadius:8,fontSize:7,background:(colors[t.priority]||"var(--dm)")+"11",color:colors[t.priority]||"var(--dm)",border:"1px solid "+(colors[t.priority]||"var(--dm)")+"33"}},t.priority),
h("span",{className:"m",style:{padding:"1px 6px",borderRadius:8,fontSize:7,background:(statusColors[t.status]||"var(--dm)")+"11",color:statusColors[t.status]||"var(--dm)",border:"1px solid "+(statusColors[t.status]||"var(--dm)")+"33"}},t.status)
)
),
h("div",{style:{fontSize:10,color:"var(--fg)",lineHeight:1.4,marginBottom:6}},t.desc),
t.replaces?h("div",{className:"m",style:{fontSize:8,color:"var(--wn)",marginBottom:4}},"Replaces: "+t.replaces):null,
h("div",{style:{display:"flex",gap:4}},
h("a",{href:t.url,target:"_blank",className:"ext",style:{fontSize:8}},"GitHub"),
h("span",{className:"m",style:{padding:"2px 6px",borderRadius:10,fontSize:7,background:t.cat==="ai"?"#8b5cf611":t.cat==="security"?"#ef444411":t.cat==="devops"?"#3b82f611":"#22c55e11",color:t.cat==="ai"?"#8b5cf6":t.cat==="security"?"#ef4444":t.cat==="devops"?"#3b82f6":"#22c55e",border:"1px solid transparent"}},t.cat)
)
)})
)
)
);
}
/* ===== WEVIA CAPS (LIVE API) ===== */
function WEVIACaps(){
var H=useState(null),health=H[0],setHealth=H[1];
var C=useState(null),caps=C[0],setCaps=C[1];
var S=useState(null),skills=S[0],setSkills=S[1];
useEffect(function(){
apiGet("/api/wevia-capabilities.php?cap=health").then(setHealth).catch(function(){});
apiGet("/api/wevia-capabilities-ext.php?cap=list").then(setCaps).catch(function(){});
apiGet("/api/wevia-skills.php?action=status").then(setSkills).catch(function(){});
},[]);
return h("div",null,
health?h("div",{style:{marginBottom:12}},
h("div",{style:{fontSize:11,fontWeight:700,color:"var(--ac)",marginBottom:6}},"Core Services ("+health.up+"/"+health.total+" UP)"),
h("div",{style:{display:"grid",gridTemplateColumns:"repeat(5,1fr)",gap:4}},Object.keys(health.services||{}).map(function(name){var s=health.services[name];return h("div",{key:name,style:{padding:6,borderRadius:4,background:"var(--b2)",border:"1px solid var(--bd)",textAlign:"center"}},h("span",{style:{width:6,height:6,borderRadius:"50%",display:"inline-block",marginRight:4,background:s.up?"#22c55e":"var(--er)"}}),h("span",{style:{fontSize:9,color:s.up?"var(--ac)":"var(--er)"}},name))}))
):null,
skills?h("div",{style:{marginBottom:12}},
h("div",{style:{fontSize:11,fontWeight:700,color:"var(--pu)",marginBottom:6}},"Skills ("+((skills.skills&&skills.skills.total)||0)+" total)"),
h("div",{className:"m",style:{fontSize:9,color:"var(--dm)"}},"Sources: "+JSON.stringify((skills.skills&&skills.skills.sources)||{}))
):null,
caps?h("div",{style:{marginBottom:12}},
h("div",{style:{fontSize:11,fontWeight:700,color:"var(--wn)",marginBottom:6}},"Extended Capabilities ("+Object.keys(caps.capabilities||{}).length+")"),
h("div",{style:{display:"flex",flexWrap:"wrap",gap:3}},Object.keys(caps.capabilities||{}).map(function(k){return h("div",{key:k,title:caps.capabilities[k],style:{padding:"3px 8px",borderRadius:10,background:"var(--wn)11",border:"1px solid var(--wn)22",fontSize:8,color:"var(--wn)"}},h("span",{style:{fontWeight:700}},k))}))
):null,
h("div",{style:{display:"flex",gap:4,flexWrap:"wrap",marginTop:8,padding:"8px 10px",background:"var(--b2)",borderRadius:6,border:"1px solid var(--bd)"}},
h("span",{className:"m",style:{fontSize:9,color:"var(--dm)"}},"Pages:"),
[["Master Inventory","/weval-master-inventory.html"],["Command Center","/command-center.html"],["Mega CC","/mega-command-center.html"],["Apps","/apps.html"],["Infra","/infra-command.html"],["NonReg","/nonreg.html"],["Ethica Monitor","/ethica-monitor.html"],["Tools Hub","/tools-hub.html"],["Solution Finder","/solution-finder.html"],["Droid Terminal","/droid-terminal-hidden.html"],["Go Live","/wevia-go-live.html"],["Use Cases","/use-cases.html"],["Trust Center","/trust-center.html"],["Tech Radar","/technology-radar.html"],["Ecosysteme IA","/ecosysteme-ia-maroc.html"]].map(function(l){return h("a",{key:l[0],href:l[1],target:"_blank",className:"ext"},l[0])})
)
);
}
/* ===== MAIN APP ===== */
function App(){
var N=useState("monitor"),nav=N[0],setNav=N[1];
var SB=useState(null),sub=SB[0],setSub=SB[1];
var panels={manager:ManagerPanel,monitor:Monitor,term:Terminal,ai:AIChat,models:Models,sql:SQLPanel,git:GitPanel,docker:DockerPanel,ethica:EthicaPanel,nonreg:NonRegPanel,cli:CLIPanel,claude:ClaudePanel,tools:ToolsPanel,files:FilePanel,discover:DiscoverPanel,caps:WEVIACaps,wevads:WevadsPanel,"wevia-pub":WeviaPubPanel};
var Panel=panels[nav]||Monitor;
return h("div",{style:{height:"100vh",display:"flex"}},
h("div",{style:{width:56,background:"var(--b2)",borderRight:"1px solid var(--bd)",display:"flex",flexDirection:"column",alignItems:"center",padding:"8px 0",gap:2,flexShrink:0,overflowY:"auto"}},
h("div",{style:{width:28,height:28,borderRadius:6,background:"linear-gradient(135deg,var(--ac),var(--a2))",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:900,color:"#000",fontSize:13,marginBottom:8,flexShrink:0}},"W"),
TABS.map(function(t){return h("button",{key:t.id,onClick:function(){setNav(t.id);setSub(null)},title:t.label,style:{width:40,height:40,borderRadius:6,border:"none",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:1,flexShrink:0,background:nav===t.id?"var(--b3)":"transparent",color:nav===t.id?"var(--ac)":"var(--dm)",fontSize:12}},
h("span",{style:{fontSize:14}},t.icon),
h("span",{className:"m",style:{fontSize:5.5}},t.label.substring(0,5))
)})
),
h("div",{style:{flex:1,display:"flex",flexDirection:"column",overflow:"hidden"}},
h("div",{style:{padding:"7px 14px",borderBottom:"1px solid var(--bd)",display:"flex",justifyContent:"space-between",alignItems:"center",flexShrink:0}},
h("span",{className:"m",style:{fontSize:12,fontWeight:600,color:"var(--ac)",letterSpacing:1}},(TABS.find(function(t){return t.id===nav})||{}).label||""),
h("span",{className:"m",style:{fontSize:8,color:"#333"}},"WEVAL Mission Control v8.0")
),
h("div",{style:{flex:1,overflow:"auto",padding:12}},
nav==="tools"?h(Panel,{tool:sub,setTool:setSub}):h(Panel,null)
)
)
);
}
ReactDOM.createRoot(document.getElementById("root")).render(h(App,null));
</script>
</body>
</html>
<!-- v8.0 25mar2026 -->