1060 lines
89 KiB
HTML
1060 lines
89 KiB
HTML
<!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)}
|
|
</style>
|
|
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-143816 -->
|
|
<style id="doctrine60-ux-direct">
|
|
|
|
/* DOCTRINE-60-UX-ENRICH injected-direct */
|
|
body::before {
|
|
content: '';
|
|
position: fixed;
|
|
top: 0; left: 0; width: 100vw; height: 100vh;
|
|
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
|
|
pointer-events: none;
|
|
z-index: -1;
|
|
}
|
|
.card, .kpi, .panel, .btn {
|
|
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
|
|
}
|
|
.card:hover, .kpi:hover, .panel:hover {
|
|
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
|
|
border-color: rgba(100,180,255,0.5);
|
|
}
|
|
@keyframes pulseD60 {
|
|
0%,100% { opacity: 1; transform: scale(1); }
|
|
50% { opacity: 0.7; transform: scale(1.05); }
|
|
}
|
|
.pulse, .live-indicator, .active, .online {
|
|
animation: pulseD60 3s ease-in-out infinite;
|
|
}
|
|
.modal, .chat, .speech, .overlay {
|
|
backdrop-filter: blur(12px);
|
|
-webkit-backdrop-filter: blur(12px);
|
|
}
|
|
.enter-stagger {
|
|
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
|
|
}
|
|
@keyframes enterStagD60 {
|
|
from { opacity: 0; transform: translateY(20px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
</style>
|
|
</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){
|
|
// doctrine_178b_s151_real_check: replace stub with real dispatch
|
|
// c = command hint (openclaw|ollama|disk) - on retourne UP/DOWN selon endpoint reel
|
|
return fetch("/api/wevia-dispatch.php", {
|
|
method: "POST",
|
|
headers: {"Content-Type":"application/json"},
|
|
body: JSON.stringify({task: "healthcheck", servers: ["s151"]})
|
|
}).then(function(r){return r.json()}).then(function(j){
|
|
var srv = (j.results || []).find(function(x){return x.server === "s151"});
|
|
if (!srv || !srv.ok) return "DOWN";
|
|
var out = srv.output || "";
|
|
// Si commande openclaw/oc demandee
|
|
if (c && c.indexOf("openclaw") > -1) return out.indexOf("HTTP 200") > -1 ? "UP" : "DOWN";
|
|
if (c && c.indexOf("ollama") > -1) return out.indexOf("HTTP 200") > -1 || out.indexOf("ok") > -1 ? "UP" : "DOWN";
|
|
if (c && c.indexOf("disk") > -1) return out.indexOf("disk") > -1 ? "OK" : "n/a";
|
|
// Default: UP si tracking + open repondent 200
|
|
return out.indexOf("HTTP 200") > -1 ? "UP" : "DOWN";
|
|
}).catch(function(){return "DOWN"});
|
|
}
|
|
function parse(r){/* PARSE_HTML_GUARD_V1 */
|
|
if(typeof r==='string'){
|
|
var t=r.trim();
|
|
if(t.startsWith('<!DOCTYPE')||t.startsWith('<html')||t.startsWith('<?xml')){
|
|
// HTML response = nginx/Cloudflare error page
|
|
if(t.indexOf('502')>-1||t.indexOf('Bad Gateway')>-1) return '[Serveur surcharge - 502 Bad Gateway, reessayez dans quelques secondes]';
|
|
if(t.indexOf('503')>-1||t.indexOf('Service Unavailable')>-1) return '[Service indisponible - 503, reessayez]';
|
|
if(t.indexOf('504')>-1||t.indexOf('Gateway Timeout')>-1) return '[Timeout - 504, la requete a pris trop de temps]';
|
|
if(t.indexOf('404')>-1||t.indexOf('Not Found')>-1) return '[Endpoint introuvable - 404]';
|
|
return '[Reponse HTML inattendue - backend probablement indisponible]';
|
|
}
|
|
}
|
|
try{var j=JSON.parse(r);return j.output||j.stdout||j.response||j.content||r}catch(e){return r}
|
|
}
|
|
function safeJsonV2(resp){
|
|
/* Safe response parser: detect HTML errors before JSON.parse */
|
|
return resp.text().then(function(t){
|
|
var tt=t.trim();
|
|
if(tt.startsWith('<!DOCTYPE')||tt.startsWith('<html')){
|
|
var code=resp.status||'???';
|
|
return {error:'[HTTP '+code+'] Backend retourne HTML au lieu de JSON. Serveur probablement surcharge.', isHtmlError:true};
|
|
}
|
|
try{return JSON.parse(tt)}catch(e){return{error:'[JSON parse] '+e.message,raw:tt.substring(0,150)}}
|
|
});
|
|
}
|
|
function safeJson(r){return safeJsonV2(r)}
|
|
function apiGet(p){return fetch(p).then(safeJson)}
|
|
|
|
|
|
/* 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){out.push(h("pre",{key:"c"+i,className:"m",style:{background:"#0d1117",border:"1px solid var(--bd)",borderRadius:5,padding:8,margin:"6px 0",fontSize:10,color:"#e6edf3",overflowX:"auto",lineHeight:1.5}},h("code",null,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;
|
|
}
|
|
|
|
/* 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(false),n8n_t=_n8n_t[0],setN8n=_n8n_t[1];
|
|
var _hermes_t=useState(false),hermes_t=_hermes_t[0],setHermes=_hermes_t[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(safeJson).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",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")
|
|
),
|
|
// Capability toggles bar
|
|
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 securite de notre infra","#ef4444"],["Quel CRM open source choisir?","#06b6d4"],["Plan ma semaine, je suis fatigue","#a78bfa"],["Derniers commits du repo","#f97316"],["Strategie 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("curl -s -o /dev/null -w %{http_code} http://127.0.0.1:11434/api/tags")});
|
|
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(safeJson).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",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}},
|
|
["Presente 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)):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 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};
|
|
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>
|
|
<script defer src=/assets/manager-enhance.js></script><!-- CARTO_REMOVED -->
|
|
<!-- CARTO_BANNER_V1 -->
|
|
<div style="position:fixed;bottom:20px;right:20px;z-index:9999;background:linear-gradient(135deg,#141931,#2d1b5e);border:1px solid #64ffda;border-radius:12px;padding:12px 18px;box-shadow:0 4px 20px rgba(100,255,218,.3);font-family:-apple-system,Segoe UI,sans-serif;font-size:13px">
|
|
<a href="/cartographie-screens.html" style="color:#64ffda;text-decoration:none;font-weight:600;display:flex;align-items:center;gap:8px" title="Cartographie exhaustive de tous les ecrans live">
|
|
<span style="font-size:18px">🗺</span> Cartographie live
|
|
<span id="carto-banner-count" style="color:#8892b0;font-size:11px">3914 ecrans</span>
|
|
</a>
|
|
</div>
|
|
<script>
|
|
(function(){
|
|
fetch('/api/screens-health.php?_='+Date.now(),{cache:'no-store'}).then(r=>r.json()).then(d=>{
|
|
const c=d.counts||{}; const up=c.UP||0; const slow=c.SLOW||0; const br=c.BROKEN||0;
|
|
const el=document.getElementById('carto-banner-count');
|
|
if(el) el.innerHTML=`<span style="color:#22c55e">${up} UP</span> / <span style="color:#f59e0b">${slow} Lent</span> / <span style="color:#ef4444">${br} 5xx</span>`;
|
|
}).catch(()=>{});
|
|
})();
|
|
</script>
|
|
<!-- /CARTO_BANNER_V1 -->
|
|
|
|
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
|
|
<script>
|
|
(function(){
|
|
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
|
|
var d = document;
|
|
var m = d.createElement('div');
|
|
m.id = 'opus-udrill';
|
|
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
|
|
var inner = d.createElement('div');
|
|
inner.id = 'opus-udrill-in';
|
|
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
|
|
inner.addEventListener('click', function(e){ e.stopPropagation(); });
|
|
m.appendChild(inner);
|
|
m.addEventListener('click', function(){ m.style.display='none'; });
|
|
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
|
|
(d.body || d.documentElement).appendChild(m);
|
|
|
|
function openCard(card) {
|
|
// Clone card content + show close btn + increase font-size
|
|
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
|
|
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
|
|
inner.innerHTML = html;
|
|
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
|
|
m.style.display = 'flex';
|
|
}
|
|
|
|
function wire(root) {
|
|
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
|
|
var cards = root.querySelectorAll(sels);
|
|
for (var i = 0; i < cards.length; i++) {
|
|
var c = cards[i];
|
|
if (c.__opusWired) continue;
|
|
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
|
|
var r = c.getBoundingClientRect();
|
|
if (r.width < 60 || r.height < 40) continue;
|
|
c.__opusWired = true;
|
|
c.style.cursor = 'pointer';
|
|
c.setAttribute('role','button');
|
|
c.setAttribute('tabindex','0');
|
|
c.addEventListener('click', function(ev){
|
|
// If a more-specific drill is already active (e.g. pp-card custom), let it handle
|
|
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
|
|
if (ev.target.closest('a,button,input,select')) return;
|
|
ev.preventDefault(); ev.stopPropagation();
|
|
openCard(this);
|
|
});
|
|
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
|
|
}
|
|
}
|
|
|
|
// Initial + mutation observer
|
|
var initRun = function(){ wire(d.body || d.documentElement); };
|
|
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
|
|
else initRun();
|
|
var mo = new MutationObserver(function(muts){
|
|
var newCard = false;
|
|
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
|
|
if (newCard) initRun();
|
|
});
|
|
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
|
|
})();
|
|
</script>
|
|
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
|
|
|
<script src="/api/archi-meta-badge.js" defer></script>
|
|
|
|
<script src="/api/a11y-auto-enhancer.js" defer></script>
|
|
<!-- WTP_UDOCK_V1 (Opus 21-avr tour29) --><script src="/wtp-unified-dock.js" defer></script>
|
|
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
|
|
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
|
|
|
|
// DOCTRINE-60-UX-JS staggered entrance
|
|
(function(){
|
|
if (!('IntersectionObserver' in window)) return;
|
|
const obs = new IntersectionObserver((entries) => {
|
|
entries.forEach((e, i) => {
|
|
if (e.isIntersecting) {
|
|
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
|
|
obs.unobserve(e.target);
|
|
}
|
|
});
|
|
});
|
|
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
|
|
})();
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|
|
<!-- v8.0 25mar2026 -->
|