737 lines
45 KiB
Plaintext
737 lines
45 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>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.23.9/babel.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}
|
|
button{font-family:inherit;cursor:pointer;transition:all .12s}
|
|
input,textarea{font-family:inherit}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="text/babel">
|
|
var useState = React.useState;
|
|
var useEffect = React.useEffect;
|
|
var 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 safe = c.replace(/"/g, '\\"');
|
|
return cx('sshpass -p MX8D3zSAty7k3243242 ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ubuntu@151.80.235.110 "' + safe + '"');
|
|
}
|
|
|
|
function parse(r) {
|
|
try { var j = JSON.parse(r); return j.output || j.stdout || r; } catch(e) { return r; }
|
|
}
|
|
|
|
var APIS = {s204: cx, s95: sentinel, s151: s151};
|
|
|
|
/* Main App */
|
|
function App() {
|
|
var navState = useState("monitor");
|
|
var nav = navState[0];
|
|
var setNav = navState[1];
|
|
var subState = useState(null);
|
|
var sub = subState[0];
|
|
var setSub = subState[1];
|
|
|
|
var TABS = [
|
|
{id:"monitor", icon:"#", 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:"cli", icon:"K", label:"CLI"},
|
|
{id:"claude", icon:"C", label:"Claude"},
|
|
{id:"tools", icon:"T", label:"ToolFK"},
|
|
{id:"caps", icon:"W", label:"WEVIA"}
|
|
];
|
|
|
|
return React.createElement("div", {style:{height:"100vh",display:"flex"}},
|
|
/* Sidebar */
|
|
React.createElement("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"}},
|
|
React.createElement("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 React.createElement("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
|
|
}
|
|
},
|
|
React.createElement("span", {style:{fontSize:13,fontWeight:700}}, t.icon),
|
|
React.createElement("span", {className:"m",style:{fontSize:5.5}}, t.label.substring(0,5))
|
|
);
|
|
})
|
|
),
|
|
|
|
/* Main Content */
|
|
React.createElement("div", {style:{flex:1,display:"flex",flexDirection:"column",overflow:"hidden"}},
|
|
React.createElement("div", {style:{padding:"7px 14px",borderBottom:"1px solid var(--bd)",display:"flex",justifyContent:"space-between",alignItems:"center",flexShrink:0}},
|
|
React.createElement("span", {className:"m",style:{fontSize:12,fontWeight:600,color:"var(--ac)",letterSpacing:1}}, (TABS.find(function(t){return t.id===nav}) || {}).label || ""),
|
|
React.createElement("span", {className:"m",style:{fontSize:8,color:"#333"}}, "WEVAL Mission Control")
|
|
),
|
|
React.createElement("div", {style:{flex:1,overflow:"auto",padding:12}},
|
|
nav === "monitor" && React.createElement(Monitor, null),
|
|
nav === "term" && React.createElement(Terminal, null),
|
|
nav === "ai" && React.createElement(AIChat, null),
|
|
nav === "models" && React.createElement(Models, null),
|
|
nav === "sql" && React.createElement(SQLPanel, null),
|
|
nav === "git" && React.createElement(GitPanel, null),
|
|
nav === "docker" && React.createElement(DockerPanel, null),
|
|
nav === "cli" && React.createElement(CLIPanel, null),
|
|
nav === "claude" && React.createElement(ClaudePanel, null),
|
|
nav === "tools" && React.createElement(ToolsPanel, {tool:sub, setTool:setSub}),
|
|
nav === "caps" && React.createElement(WEVIACaps, null)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
/* ===== EXEC PANEL (reusable) ===== */
|
|
function ExecPanel(props) {
|
|
var outState = useState(props.initial || "Ready. Click an action.\n");
|
|
var out = outState[0]; var setOut = outState[1];
|
|
var ldState = useState(false);
|
|
var ld = ldState[0]; var setLd = ldState[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 React.createElement("div", {style:{height:"100%",display:"flex",flexDirection:"column"}},
|
|
React.createElement("div", {style:{flexShrink:0,marginBottom:8}}, props.controls(run, ld)),
|
|
React.createElement("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),
|
|
React.createElement("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")
|
|
);
|
|
}
|
|
|
|
/* ===== MONITOR ===== */
|
|
function Monitor() {
|
|
var dState = useState({});
|
|
var d = dState[0]; var setD = dState[1];
|
|
var ldState = useState({});
|
|
|
|
function chk(key, fn) {
|
|
fn().then(function(r) {
|
|
setD(function(p) { var n = Object.assign({}, p); n[key] = parse(r).trim(); return n; });
|
|
}).catch(function() {
|
|
setD(function(p) { var n = Object.assign({}, p); 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 / | awk 'NR==2{print $5}'"); });
|
|
chk("s204_ram", function(){ return cx("free | awk 'NR==2{printf \"%.0f%%\",($3/$2)*100}'"); });
|
|
chk("s204_docker", function(){ return cx("docker ps -q | 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 -h / | awk 'NR==2{print $5}'"); });
|
|
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 | grep -o ok"); });
|
|
chk("s151_ollama", function(){ return s151("docker exec ollama ollama list 2>/dev/null | grep -c qwen"); });
|
|
chk("s151_disk", function(){ return s151("df -h / | awk 'NR==2{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"); });
|
|
}
|
|
|
|
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","pmta","disk","ram","docker","load","ollama"]},
|
|
{n:"S95",cl:"#00b8ff",rl:"WEVADS",ip:"95.216.167.89",ms:["apache","pg","disk","crons"]},
|
|
{n:"S151",cl:"#ff6b35",rl:"OPENCLAW",ip:"151.80.235.110",ms:["oc","ollama","disk"]}
|
|
];
|
|
|
|
function MetricBox(key, label, color) {
|
|
var v = d[key] || "...";
|
|
var ok = v === "active" || v === "ok" || (v !== "ERR" && v !== "0" && v !== "..." && v.length < 20);
|
|
return React.createElement("div", {key:key, style:{padding:6,borderRadius:4,background:"var(--bg)",textAlign:"center",border:"1px solid var(--bd)"}},
|
|
React.createElement("div", {className:"m",style:{fontSize:7,color:"var(--dm)",textTransform:"uppercase",letterSpacing:.5}}, label),
|
|
React.createElement("div", {className:"m",style:{fontSize:11,fontWeight:600,color:ok?color:"var(--er)"}}, v)
|
|
);
|
|
}
|
|
|
|
return React.createElement("div", null,
|
|
React.createElement("div", {style:{display:"flex",justifyContent:"flex-end",marginBottom:8}},
|
|
React.createElement("button", {onClick:refreshAll,className:"m",style:{padding:"3px 10px",borderRadius:4,border:"1px solid var(--bd)",background:"transparent",color:"var(--ac)",fontSize:9}}, "Refresh All")
|
|
),
|
|
React.createElement("div", {style:{display:"grid",gridTemplateColumns:"repeat(3,1fr)",gap:10,marginBottom:14}},
|
|
servers.map(function(s) {
|
|
return React.createElement("div", {key:s.n, style:{padding:12,borderRadius:8,background:"var(--b2)",border:"1px solid "+s.cl+"22"}},
|
|
React.createElement("div", {style:{display:"flex",justifyContent:"space-between",marginBottom:8}},
|
|
React.createElement("div", {style:{display:"flex",alignItems:"center",gap:5}},
|
|
React.createElement("div", {style:{width:6,height:6,borderRadius:3,background:s.cl}}),
|
|
React.createElement("b", {style:{fontSize:12}}, s.n),
|
|
React.createElement("span", {className:"m",style:{fontSize:8,color:"var(--dm)"}}, s.ip)
|
|
),
|
|
React.createElement("span", {className:"m",style:{fontSize:8,padding:"2px 8px",borderRadius:10,background:s.cl+"11",color:s.cl}}, s.rl)
|
|
),
|
|
React.createElement("div", {style:{display:"grid",gridTemplateColumns:"repeat("+Math.min(s.ms.length,4)+",1fr)",gap:4}},
|
|
s.ms.map(function(m) { return MetricBox(s.n.toLowerCase()+"_"+m, m, s.cl); })
|
|
)
|
|
);
|
|
})
|
|
),
|
|
React.createElement("div", {style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8}},
|
|
React.createElement("div", {style:{padding:10,borderRadius:6,background:"var(--b2)",border:"1px solid var(--bd)"}},
|
|
React.createElement("div", {className:"m",style:{fontSize:7,color:"var(--dm)",textTransform:"uppercase"}}, "Site"),
|
|
React.createElement("div", {className:"m",style:{fontSize:13,fontWeight:700,color:d.site && d.site.startsWith("200") ? "var(--ac)" : "var(--er)"}}, d.site || "...")
|
|
),
|
|
React.createElement("div", {style:{padding:10,borderRadius:6,background:"var(--b2)",border:"1px solid var(--bd)"}},
|
|
React.createElement("div", {className:"m",style:{fontSize:7,color:"var(--dm)",textTransform:"uppercase"}}, "Contacts WEVADS"),
|
|
React.createElement("div", {className:"m",style:{fontSize:13,fontWeight:700,color:"var(--a2)"}}, d.contacts ? Number(d.contacts.trim()).toLocaleString("fr") : "...")
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
/* ===== TERMINAL ===== */
|
|
function Terminal() {
|
|
var srvState = useState("s204");
|
|
var srv = srvState[0]; var setSrv = srvState[1];
|
|
var cmdState = useState("");
|
|
var cmd = cmdState[0]; var setCmd = cmdState[1];
|
|
var histState = useState([]);
|
|
var hist = histState[0]; var setHist = histState[1];
|
|
var ref = useRef(null);
|
|
useEffect(function() { if(ref.current) ref.current.scrollTop = 999999; }, [hist]);
|
|
|
|
var colors = {s204:"#00e5a0",s95:"#00b8ff",s151:"#ff6b35"};
|
|
|
|
function run() {
|
|
if (!cmd.trim()) return;
|
|
var c = cmd; setCmd("");
|
|
var entry = {s:srv, c:c, o:null, t:Date.now()};
|
|
setHist(function(p) { return p.concat([entry]); });
|
|
APIS[srv](c).then(function(r) {
|
|
setHist(function(p) { var h = p.slice(); h[h.length-1] = Object.assign({}, h[h.length-1], {o:parse(r)}); return h; });
|
|
}).catch(function(e) {
|
|
setHist(function(p) { var h = p.slice(); h[h.length-1] = Object.assign({}, h[h.length-1], {o:"ERR: "+e.message}); return h; });
|
|
});
|
|
}
|
|
|
|
var presets = ["hostname && uptime","df -h /","free -h","docker ps --format={{.Names}}:{{.Status}}","tail -5 /var/log/nginx/error.log","ps aux --sort=-%mem | head -6"];
|
|
|
|
return React.createElement("div", {style:{height:"100%",display:"flex",flexDirection:"column"}},
|
|
React.createElement("div", {style:{display:"flex",gap:4,marginBottom:6,flexShrink:0}},
|
|
["s204","s95","s151"].map(function(id) {
|
|
return React.createElement("button", {key:id, onClick:function(){setSrv(id)}, className:"m",
|
|
style:{padding:"5px 12px",borderRadius:4,border:"1px solid "+(srv===id?colors[id]:"var(--bd)"),background:srv===id?colors[id]+"11":"transparent",color:srv===id?colors[id]:"var(--dm)",fontSize:10}}, id.toUpperCase());
|
|
}),
|
|
React.createElement("div", {style:{flex:1}}),
|
|
React.createElement("button", {onClick:function(){setHist([])},className:"m",style:{padding:"3px 8px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--dm)",fontSize:8}}, "Clear")
|
|
),
|
|
React.createElement("div", {ref:ref, className:"m", style:{flex:1,background:"#000",borderRadius:6,padding:10,overflow:"auto",marginBottom:6,border:"1px solid var(--bd)",fontSize:10}},
|
|
hist.length === 0 && React.createElement("span", {style:{color:"#333"}}, srv.toUpperCase() + " ready"),
|
|
hist.map(function(h,i) {
|
|
return React.createElement("div", {key:i, style:{marginBottom:8}},
|
|
React.createElement("div", null,
|
|
React.createElement("span", {style:{color:"#444"}}, new Date(h.t).toLocaleTimeString("fr")), " ",
|
|
React.createElement("span", {style:{color:colors[h.s]}}, h.s + "$"), " ", h.c
|
|
),
|
|
React.createElement("pre", {style:{color:"#ccc",whiteSpace:"pre-wrap",wordBreak:"break-all",lineHeight:1.4,margin:"2px 0"}}, h.o === null ? "..." : h.o)
|
|
);
|
|
})
|
|
),
|
|
React.createElement("div", {style:{display:"flex",gap:4,flexShrink:0}},
|
|
React.createElement("span", {className:"m",style:{padding:"7px 8px",borderRadius:4,background:"var(--b2)",border:"1px solid var(--bd)",color:colors[srv],fontSize:10}}, srv+"$"),
|
|
React.createElement("input", {value:cmd, onChange:function(e){setCmd(e.target.value)}, onKeyDown:function(e){if(e.key==="Enter")run()},
|
|
placeholder:"Commande...", autoFocus:true, className:"m",
|
|
style:{flex:1,padding:7,borderRadius:4,fontSize:11,color:"#fff",background:"#000",border:"1px solid var(--bd)",outline:"none"}}),
|
|
React.createElement("button", {onClick:run, style:{padding:"7px 14px",borderRadius:4,border:"none",background:"var(--ac)",color:"#000",fontWeight:700,fontSize:11}}, "RUN")
|
|
),
|
|
React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:2,marginTop:4,flexShrink:0}},
|
|
presets.map(function(c) {
|
|
return React.createElement("button", {key:c, onClick:function(){setCmd(c)}, className:"m",
|
|
style:{padding:"2px 5px",borderRadius:2,border:"1px solid #1a2030",background:"transparent",color:"#4a5568",fontSize:7}}, c.split(" ")[0]);
|
|
})
|
|
)
|
|
);
|
|
}
|
|
|
|
/* ===== AI CHAT ===== */
|
|
function AIChat() {
|
|
/* --- PROVIDERS: LOCAL --- */
|
|
var localProviders = [
|
|
{id:"openclaw",n:"OpenClaw",desc:"SOUL.md WEVIA Gateway",color:"var(--wn)",cat:"local"},
|
|
{id:"ollama-s204",n:"Ollama S204",desc:"9 models 33GB",color:"var(--ac)",cat:"local"},
|
|
{id:"ollama-s151",n:"Ollama S151",desc:"qwen2.5:3b Docker",color:"var(--a2)",cat:"local"},
|
|
{id:"kilo",n:"Kilo CLI",desc:"500+ models orchestrator",color:"#06b6d4",cat:"local"},
|
|
{id:"hermes",n:"Hermes Agent",desc:"27 skills autonomous",color:"#ec4899",cat:"local"}
|
|
];
|
|
/* --- PROVIDERS: WEVAL AGENTS --- */
|
|
var agentProviders = [
|
|
{id:"wedroid",n:"WEDROID",desc:"DevOps agent S204/S95/S151",color:"#f97316",cat:"agent"},
|
|
{id:"wevcode",n:"WEVCODE",desc:"Code assistant PHP/JS/PY",color:"#22d3ee",cat:"agent"},
|
|
{id:"wevialife",n:"WEVIA Life",desc:"Productivity + planning",color:"#a78bfa",cat:"agent"},
|
|
{id:"bladerazor",n:"BladeRazor",desc:"Pentest AI + Nuclei",color:"#ef4444",cat:"agent"}
|
|
];
|
|
/* --- PROVIDERS: CLOUD --- */
|
|
var cloudProviders = [
|
|
{id:"groq",n:"Groq",desc:"llama-3.3-70b 500ms",color:"var(--pu)",cat:"cloud"},
|
|
{id:"cerebras",n:"Cerebras",desc:"Qwen3-235B ultrafast",color:"#f59e0b",cat:"cloud"},
|
|
{id:"openrouter",n:"OpenRouter",desc:"Multi-provider (key check)",color:"#f472b6",cat:"cloud"},
|
|
{id:"alibaba",n:"Alibaba/Qwen",desc:"qwen-plus multilingual",color:"#34d399",cat:"cloud"}
|
|
];
|
|
/* --- PROVIDERS: MEDICAL --- */
|
|
var medProviders = [
|
|
{id:"meditron",n:"Meditron",desc:"PubMed/clinical 3.8GB",color:"#ef4444",cat:"med"},
|
|
{id:"medllama",n:"MedLLaMA2",desc:"Diagnostics 3.8GB",color:"#f97316",cat:"med"},
|
|
{id:"granite",n:"Granite4",desc:"IBM RAG/tools 2.1GB",color:"#3b82f6",cat:"med"},
|
|
{id:"glm4",n:"GLM4:9b",desc:"Zhipu Chinese 5.5GB",color:"#a855f7",cat:"med"}
|
|
];
|
|
var allProviders = localProviders.concat(agentProviders).concat(cloudProviders).concat(medProviders);
|
|
|
|
var provState = useState("openclaw");
|
|
var prov = provState[0]; var setProv = provState[1];
|
|
var modelState = useState("mistral");
|
|
var model = modelState[0]; var setModel = modelState[1];
|
|
var catState = useState("all");
|
|
var provCat = catState[0]; var setProvCat = catState[1];
|
|
var msgsState = useState([]);
|
|
var msgs = msgsState[0]; var setMsgs = msgsState[1];
|
|
var inpState = useState("");
|
|
var inp = inpState[0]; var setInp = inpState[1];
|
|
var ldState = useState(false);
|
|
var ld = ldState[0]; var setLd = ldState[1];
|
|
var ref = useRef(null);
|
|
useEffect(function() { if(ref.current) ref.current.scrollTop = 999999; }, [msgs]);
|
|
|
|
var s204Models = ["qwen3:8b","qwen3:4b","qwen3.5:0.8b","glm4:9b","granite4","meditron:7b","medllama2","mistral","phi3:mini"];
|
|
var s151Models = ["qwen2.5:3b","qwen2.5:1.5b"];
|
|
var filteredProviders = provCat === "all" ? allProviders : allProviders.filter(function(p){return p.cat===provCat});
|
|
var cur = allProviders.find(function(p){return p.id===prov}) || allProviders[0];
|
|
|
|
var kbState = useState(true);
|
|
var useKB = kbState[0]; var setUseKB = kbState[1];
|
|
var gitState = useState(false);
|
|
var useGit = gitState[0]; var setUseGit = gitState[1];
|
|
var toolState = useState(false);
|
|
var useTool = toolState[0]; var setUseTool = toolState[1];
|
|
|
|
function sendMsg() {
|
|
if (!inp.trim() || ld) return;
|
|
var m = inp; setInp(""); setLd(true);
|
|
setMsgs(function(p) { return p.concat([{r:"u",t:m}]); });
|
|
|
|
fetch("/api/chat-proxy.php", {
|
|
method: "POST",
|
|
headers: {"Content-Type": "application/json"},
|
|
body: JSON.stringify({message: m, provider: prov, model: model, kb: useKB, git: useGit, tools: useTool})
|
|
})
|
|
.then(function(r) { return r.json(); })
|
|
.then(function(data) {
|
|
var badges = [];
|
|
if (data.kb) badges.push("KB");
|
|
if (data.git) badges.push("GIT");
|
|
if (data.tools) badges.push("TOOLS");
|
|
var suffix = badges.length ? " [" + badges.join("+") + "]" : "";
|
|
setMsgs(function(p) { return p.concat([{r:"a", t: data.response || data.error || "No response", p: cur.n + suffix}]); });
|
|
setLd(false);
|
|
})
|
|
.catch(function(e) {
|
|
setMsgs(function(p) { return p.concat([{r:"a", t:"ERR: "+e.message, p:cur.n}]); });
|
|
setLd(false);
|
|
});
|
|
}
|
|
|
|
return React.createElement("div", {style:{height:"100%",display:"flex",flexDirection:"column"}},
|
|
/* Category tabs */
|
|
React.createElement("div", {style:{display:"flex",gap:3,marginBottom:4,flexShrink:0}},
|
|
[{id:"all",l:"All ("+allProviders.length+")"},{id:"local",l:"LOCAL"},{id:"agent",l:"AGENTS"},{id:"cloud",l:"CLOUD"},{id:"med",l:"MEDICAL"}].map(function(c) {
|
|
return React.createElement("button", {key:c.id, onClick:function(){setProvCat(c.id)}, className:"m",
|
|
style:{padding:"3px 8px",borderRadius:10,border:"1px solid "+(provCat===c.id?"var(--ac)":"var(--bd)"),background:provCat===c.id?"var(--ac)11":"transparent",color:provCat===c.id?"var(--ac)":"var(--dm)",fontSize:8}}, c.l);
|
|
})
|
|
),
|
|
/* Provider selector */
|
|
React.createElement("div", {style:{display:"flex",gap:3,marginBottom:4,flexWrap:"wrap",flexShrink:0}},
|
|
filteredProviders.map(function(p) {
|
|
return React.createElement("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);
|
|
})
|
|
),
|
|
/* Model selector for S204 Ollama */
|
|
prov === "ollama-s204" && React.createElement("div", {style:{display:"flex",gap:2,marginBottom:4,flexWrap:"wrap",flexShrink:0}},
|
|
s204Models.map(function(m) {
|
|
return React.createElement("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);
|
|
})
|
|
),
|
|
/* Model selector for S151 Ollama */
|
|
prov === "ollama-s151" && React.createElement("div", {style:{display:"flex",gap:2,marginBottom:4,flexShrink:0}},
|
|
s151Models.map(function(m) {
|
|
return React.createElement("button", {key:m, onClick:function(){setModel(m)}, className:"m",
|
|
style:{padding:"2px 6px",borderRadius:3,border:"1px solid "+(model===m?"var(--a2)":"var(--bd)"),background:model===m?"var(--a2)11":"transparent",color:model===m?"var(--a2)":"var(--dm)",fontSize:8}}, m);
|
|
})
|
|
),
|
|
/* Header */
|
|
React.createElement("div", {style:{padding:"5px 10px",background:"var(--b2)",borderRadius:4,marginBottom:6,display:"flex",justifyContent:"space-between",flexShrink:0}},
|
|
React.createElement("span", {style:{fontSize:10,fontWeight:700,color:cur.color}}, cur.n + ((prov==="ollama-s204"||prov==="ollama-s151")?" > "+model:"") + " | " + cur.desc),
|
|
React.createElement("div", {style:{display:"flex",gap:4,alignItems:"center"}},
|
|
React.createElement("button", {onClick:function(){setUseKB(!useKB)}, className:"m",
|
|
style:{padding:"2px 8px",borderRadius:10,border:"1px solid "+(useKB?"#22c55e":"var(--bd)"),background:useKB?"#22c55e11":"transparent",color:useKB?"#22c55e":"var(--dm)",fontSize:8}}, "KB "+(useKB?"ON":"OFF")),
|
|
React.createElement("button", {onClick:function(){setUseGit(!useGit)}, className:"m",
|
|
style:{padding:"2px 8px",borderRadius:10,border:"1px solid "+(useGit?"#3b82f6":"var(--bd)"),background:useGit?"#3b82f611":"transparent",color:useGit?"#3b82f6":"var(--dm)",fontSize:8}}, "GIT "+(useGit?"ON":"OFF")),
|
|
React.createElement("button", {onClick:function(){setUseTool(!useTool)}, className:"m",
|
|
style:{padding:"2px 8px",borderRadius:10,border:"1px solid "+(useTool?"#f59e0b":"var(--bd)"),background:useTool?"#f59e0b11":"transparent",color:useTool?"#f59e0b":"var(--dm)",fontSize:8}}, "TOOLS "+(useTool?"ON":"OFF")),
|
|
React.createElement("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")
|
|
)
|
|
),
|
|
/* Messages */
|
|
React.createElement("div", {ref:ref, style:{flex:1,overflow:"auto",paddingBottom:4}},
|
|
msgs.length === 0 && React.createElement("div", {style:{padding:16,textAlign:"center",color:"var(--dm)",fontSize:10}},
|
|
React.createElement("div", {style:{marginBottom:6}}, "13 providers | KB = Knowledge Base WEVAL (2490 entries) | GIT = contexte repo"),
|
|
React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:3,justifyContent:"center",marginTop:10}},
|
|
["Presente WEVAL Consulting","Quels services SAP?","Liste les offres Ethica","Derniers commits du site","How many HCPs in France?","Diagnostic hypertension","Analyse notre stack technique","Recommande un plan marketing B2B"].map(function(s) {
|
|
return React.createElement("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);
|
|
})
|
|
)
|
|
),
|
|
msgs.map(function(m,i) {
|
|
return React.createElement("div", {key:i, style:{display:"flex",justifyContent:m.r==="u"?"flex-end":"flex-start",marginBottom:5}},
|
|
React.createElement("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)"}},
|
|
React.createElement("pre", {style:{whiteSpace:"pre-wrap",fontFamily:"inherit",margin:0}}, m.t),
|
|
m.p && React.createElement("div", {className:"m",style:{fontSize:7,color:"var(--dm)",marginTop:2}}, "via "+m.p)
|
|
)
|
|
);
|
|
}),
|
|
ld && React.createElement("div", {style:{padding:6,color:cur.color,fontSize:10}}, "...")
|
|
),
|
|
/* Input */
|
|
React.createElement("div", {style:{display:"flex",gap:4,flexShrink:0}},
|
|
React.createElement("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"}}),
|
|
React.createElement("button", {onClick:sendMsg, disabled:ld,
|
|
style:{padding:"9px 18px",borderRadius:5,border:"none",background:cur.color,color:"#000",fontWeight:700,fontSize:11,opacity:ld?.5:1}}, ld ? "..." : "Send")
|
|
)
|
|
);
|
|
}
|
|
|
|
/* ===== MODELS ===== */
|
|
function Models() {
|
|
return React.createElement(ExecPanel, {
|
|
initial: "Click List or Test to explore models.\n",
|
|
controls: function(run, ld) {
|
|
var LOCAL = [
|
|
["GLM4:9b","Zhipu Chinese 5.5GB","sudo ollama run glm4:9b"],
|
|
["Granite4","IBM RAG/tools 2.1GB","sudo ollama run granite4"],
|
|
["Meditron:7b","Medical 3.8GB","sudo ollama run meditron:7b"],
|
|
["MedLLaMA2","Diagnostics 3.8GB","sudo ollama run medllama2"],
|
|
["Qwen3:8b","Alibaba 201 lang 4.9GB","sudo ollama run qwen3:8b"],
|
|
["Qwen3:4b","Alibaba compact 2.6GB","sudo ollama run qwen3:4b"],
|
|
["Mistral","General 4.4GB","sudo ollama run mistral"],
|
|
["Phi3:mini","Microsoft 2.3GB","sudo ollama run phi3:mini"]
|
|
];
|
|
return React.createElement("div", null,
|
|
React.createElement("div", {style:{display:"flex",gap:3,marginBottom:8}},
|
|
React.createElement("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"),
|
|
React.createElement("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"),
|
|
React.createElement("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")
|
|
),
|
|
React.createElement("div", {style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:4}},
|
|
LOCAL.map(function(m) {
|
|
return React.createElement("div", {key:m[0], style:{padding:6,borderRadius:4,background:"var(--b2)",border:"1px solid var(--bd)",display:"flex",justifyContent:"space-between",alignItems:"center"}},
|
|
React.createElement("div", null,
|
|
React.createElement("div", {style:{fontSize:10,fontWeight:600}}, m[0]),
|
|
React.createElement("div", {style:{fontSize:7,color:"var(--dm)"}}, m[1])
|
|
),
|
|
React.createElement("button", {onClick:function(){run(m[0],function(){return cx(m[2]+' "Hello in 5 words" 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 qState = useState("SELECT count(*) FROM adx_clients.contacts;");
|
|
var q = qState[0]; var setQ = qState[1];
|
|
var rState = useState(""); var r = rState[0]; var setR = rState[1];
|
|
var ldState = useState(false); var ld = ldState[0]; var setLd = ldState[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;"],
|
|
["Tables","SELECT schemaname,tablename FROM pg_tables WHERE schemaname NOT IN ('pg_catalog','information_schema') ORDER BY schemaname;"],
|
|
["Connections","SELECT count(*) FROM pg_stat_activity;"],
|
|
["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 React.createElement("div", {style:{height:"100%",display:"flex",flexDirection:"column"}},
|
|
React.createElement("div", {className:"m",style:{fontSize:9,color:"var(--dm)",marginBottom:6}}, "PostgreSQL S95 | adx_system + adx_clients + ethica"),
|
|
React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:2,marginBottom:6,flexShrink:0}},
|
|
presets.map(function(p) {
|
|
return React.createElement("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]);
|
|
})
|
|
),
|
|
React.createElement("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}}),
|
|
React.createElement("div", {style:{display:"flex",gap:4,marginBottom:4,flexShrink:0}},
|
|
React.createElement("button", {onClick:run, disabled:ld, style:{padding:"5px 14px",borderRadius:4,border:"none",background:"var(--a2)",color:"#000",fontWeight:700,fontSize:10}}, ld ? "..." : "Execute"),
|
|
React.createElement("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")
|
|
),
|
|
React.createElement("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 ===== */
|
|
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}\' | python3 -c "import sys,json;print(json.load(sys.stdin).get(\'success\',\'FAIL\'))"'],
|
|
["GitHub",'curl -s -H "Authorization: token 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" "https://api.github.com/repos/Yacineutt/weval-consulting/commits?per_page=3" | python3 -c "import sys,json;[print(c[\'sha\'][:7],c[\'commit\'][\'message\'][:50]) for c in json.load(sys.stdin)]"']
|
|
];
|
|
return React.createElement(ExecPanel, {
|
|
initial: "Git actions for /var/www/html (weval-consulting)\n",
|
|
controls: function(run, ld) {
|
|
return React.createElement("div", {style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:3}},
|
|
actions.map(function(a) {
|
|
return React.createElement("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]);
|
|
})
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
/* ===== DOCKER ===== */
|
|
function DockerPanel() {
|
|
var apps = ["uptime-kuma:3088","plausible:8787","authentik:9100","n8n:5678","vaultwarden:8222","mattermost:8065","searxng:8080","qdrant:6333","loki:3100"];
|
|
return React.createElement(ExecPanel, {
|
|
initial: "Docker containers on S204\n",
|
|
controls: function(run, ld) {
|
|
return React.createElement("div", null,
|
|
React.createElement("div", {style:{display:"flex",gap:3,marginBottom:6}},
|
|
React.createElement("button", {onClick:function(){run("PS",function(){return cx('docker ps --format="table {{.Names}}\\t{{.Status}}\\t{{.Ports}}" | 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"),
|
|
React.createElement("button", {onClick:function(){run("Stats",function(){return cx('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"),
|
|
React.createElement("button", {onClick:function(){run("Images",function(){return cx('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")
|
|
),
|
|
React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:3}},
|
|
apps.map(function(a) {
|
|
var parts = a.split(":"); var name = parts[0];
|
|
return React.createElement("button", {key:name, onClick:function(){run("Logs "+name,function(){return cx("docker logs "+name+" --tail 8 2>&1 | tr -cd '[:print:][:space:]' | tail -c 400")})},
|
|
disabled:ld, className:"m", style:{padding:"3px 8px",borderRadius:3,border:"1px solid var(--bd)",background:"transparent",color:"var(--a2)",fontSize:8}}, name+":"+parts[1]);
|
|
})
|
|
)
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
/* ===== CLI TOOLS ===== */
|
|
function CLIPanel() {
|
|
return React.createElement(ExecPanel, {
|
|
initial: "CLI tools on S204\n",
|
|
controls: function(run, ld) {
|
|
var tools = [
|
|
["Kilo version","sudo HOME=/root kilo --version 2>&1"],
|
|
["Kilo models","sudo HOME=/root kilo models 2>&1 | head -10"],
|
|
["Hermes version","sudo HOME=/root hermes --version 2>&1"],
|
|
["Hermes skills","sudo HOME=/root hermes skills list 2>&1 | head -15"],
|
|
["Nuclei version","nuclei -version 2>&1"],
|
|
["Nuclei scan","nuclei -u https://weval-consulting.com -severity critical,high -silent 2>&1 | head -10"],
|
|
["CARL domains","ls /var/www/weval/.carl/ 2>&1"],
|
|
["Ollama S204","sudo ollama list 2>&1"]
|
|
];
|
|
return React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:3}},
|
|
tools.map(function(t) {
|
|
return React.createElement("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]);
|
|
})
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
/* ===== CLAUDE CODE ===== */
|
|
function ClaudePanel() {
|
|
var copiedState = useState("");
|
|
var copied = copiedState[0]; var setCopied = copiedState[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 fix"],["/gsd:debug","Debug"],["*hotfix","Urgence"]]},
|
|
{n:"Plan",cl:"var(--pu)",items:[["/gsd:new-project","Init"],["/gsd:map-codebase","Scan"],["/paul:plan","Plan"],["/plan-ceo-review","YC"],["/office-hours","Questions"]]},
|
|
{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"],["/browse goto URL","Browser"]]},
|
|
{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 React.createElement("div", null,
|
|
React.createElement("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. Paste in Claude Code or PowerShell."),
|
|
groups.map(function(g,i) {
|
|
return React.createElement("div", {key:i, style:{marginBottom:10}},
|
|
React.createElement("div", {style:{fontSize:10,fontWeight:700,color:g.cl,marginBottom:4,paddingBottom:3,borderBottom:"1px solid var(--bd)"}}, g.n),
|
|
React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:3}},
|
|
g.items.map(function(item,j) {
|
|
return React.createElement("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}},
|
|
React.createElement("code", {className:"m",style:{color:g.cl,fontSize:9}}, item[0]),
|
|
React.createElement("span", {style:{color:"var(--dm)",fontSize:8,marginLeft:4}}, item[1])
|
|
);
|
|
})
|
|
)
|
|
);
|
|
})
|
|
);
|
|
}
|
|
|
|
/* ===== TOOLFK ===== */
|
|
function ToolsPanel(props) {
|
|
var catState = useState("All");
|
|
var cat = catState[0]; var setCat = catState[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 React.createElement("div", {style:{height:"100%",display:"flex",flexDirection:"column"}},
|
|
React.createElement("div", {style:{display:"flex",justifyContent:"space-between",marginBottom:4,flexShrink:0}},
|
|
React.createElement("div", {style:{display:"flex",alignItems:"center",gap:4}},
|
|
React.createElement("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"),
|
|
React.createElement("b", {style:{fontSize:11}}, props.tool.n)
|
|
),
|
|
React.createElement("a", {href:props.tool.u,target:"_blank",rel:"noopener",style:{padding:"4px 10px",borderRadius:4,background:"var(--ac)",color:"#000",fontSize:9,fontWeight:700,textDecoration:"none"}}, "New Tab")
|
|
),
|
|
React.createElement("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 React.createElement("div", null,
|
|
React.createElement("div", {style:{display:"flex",gap:2,marginBottom:8}},
|
|
["All","Code","AI","Image","Conv","Dev"].map(function(c) {
|
|
return React.createElement("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);
|
|
})
|
|
),
|
|
React.createElement("div", {style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:6}},
|
|
filtered.map(function(t,i) {
|
|
return React.createElement("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"}},
|
|
React.createElement("div", {style:{fontSize:11,fontWeight:600}}, t.n),
|
|
React.createElement("div", {className:"m",style:{fontSize:7,color:"var(--dm)",marginTop:2}}, t.c)
|
|
);
|
|
})
|
|
)
|
|
);
|
|
}
|
|
|
|
/* ===== WEVIA CAPS ===== */
|
|
function WEVIACaps() {
|
|
var services = [
|
|
["SearXNG",8080],["Qdrant",6333],["Ollama S204",11435],["Plausible",8787],
|
|
["Uptime Kuma",3088],["Loki",3100],["n8n",5678],["Mattermost",8065],
|
|
["OpenClaw S151",3210],["Vaultwarden",8222]
|
|
];
|
|
var extended = ["TTS","Vision","PDF Gen","Charts","Repair","Consensus","Planner","GPU-Rotation","SSH Relay","Webhook","Nexus","French NLP","Web Scrape","OpenClaw Skills","ToolFK","NonReg OPUS","KB Ingestor"];
|
|
|
|
return React.createElement(ExecPanel, {
|
|
initial: "WEVIA Capabilities API\n",
|
|
controls: function(run, ld) {
|
|
return React.createElement("div", null,
|
|
React.createElement("button", {onClick:function(){
|
|
services.forEach(function(s) {
|
|
if (s[0].includes("S151")) {
|
|
run(s[0], function(){ return s151("curl -s http://127.0.0.1:"+s[1]+"/healthz 2>/dev/null || curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:"+s[1]+" 2>/dev/null"); });
|
|
} else {
|
|
run(s[0], function(){ return cx("curl -s -o /dev/null -w '%{http_code}' http://localhost:"+s[1]+" 2>/dev/null"); });
|
|
}
|
|
});
|
|
}, disabled:ld, className:"m", style:{padding:"4px 12px",borderRadius:4,border:"1px solid var(--ac)",background:"var(--ac)11",color:"var(--ac)",fontSize:9,marginBottom:8}}, "Health Check All ("+services.length+" services)"),
|
|
React.createElement("div", {className:"m",style:{fontSize:8,fontWeight:600,color:"var(--pu)",marginBottom:4}}, "EXTENDED ("+extended.length+")"),
|
|
React.createElement("div", {style:{display:"flex",flexWrap:"wrap",gap:3}},
|
|
extended.map(function(e,i) {
|
|
return React.createElement("span", {key:i, className:"m", style:{padding:"2px 7px",borderRadius:10,fontSize:7,background:"#8b5cf611",color:"#8b5cf6",border:"1px solid #8b5cf622"}}, e);
|
|
})
|
|
)
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
ReactDOM.createRoot(document.getElementById("root")).render(React.createElement(App));
|
|
</script>
|
|
</body>
|
|
</html>
|