Compare commits
155 Commits
v9.37-weva
...
v9.32plus-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7bbb275400 | ||
|
|
b3dec2b109 | ||
|
|
1b88324806 | ||
|
|
e12dd92d89 | ||
|
|
4ec855dd8a | ||
|
|
2b04dcf4f1 | ||
|
|
11f278815b | ||
|
|
5d809e66a1 | ||
|
|
838d8cc12b | ||
|
|
017cf72638 | ||
|
|
19e311726f | ||
|
|
57058e1d99 | ||
|
|
0e45e736e9 | ||
|
|
8586840793 | ||
|
|
d824afb5ad | ||
|
|
53ac3b6ecf | ||
|
|
08d55c0dd6 | ||
|
|
abb94ba886 | ||
|
|
dcf03cc93b | ||
|
|
8337cce568 | ||
|
|
889583bf48 | ||
|
|
5b8726a099 | ||
|
|
f35c05ec66 | ||
|
|
e45c6e9352 | ||
|
|
813ca3ce9e | ||
|
|
b5018f532a | ||
|
|
924fa0d54b | ||
|
|
17c25b8cea | ||
|
|
e9db14dd2b | ||
|
|
06a5b6f4b8 | ||
|
|
64cb617aff | ||
|
|
09adc9bfe0 | ||
|
|
d6e6ee6ab7 | ||
|
|
85a716853a | ||
|
|
97cc3cd792 | ||
|
|
95f3749152 | ||
|
|
6eadc38e3d | ||
|
|
cd57e9dfe7 | ||
|
|
0e4d0ca124 | ||
|
|
d128a05228 | ||
|
|
08aa9f0514 | ||
|
|
467ad64117 | ||
|
|
432eb89696 | ||
|
|
44b8a8af47 | ||
|
|
4aa72ee59c | ||
|
|
125f3231d3 | ||
|
|
aea466b496 | ||
|
|
d2c4524dbb | ||
|
|
4b3c47f3b2 | ||
|
|
7374b07486 | ||
|
|
79ba348969 | ||
|
|
d86c1983a4 | ||
|
|
6f5467e919 | ||
|
|
bb8867c229 | ||
|
|
16ce72710e | ||
|
|
adfeddf2b5 | ||
|
|
0efffcd218 | ||
|
|
3be4f44c0f | ||
|
|
0d2a57ede8 | ||
|
|
1d83d5cef7 | ||
|
|
96642bdcb1 | ||
|
|
bf0449f235 | ||
|
|
0f82ad3211 | ||
|
|
b254603816 | ||
|
|
befde215c7 | ||
|
|
16cd829bbf | ||
|
|
07280c80ca | ||
|
|
16f1171445 | ||
|
|
897bd56ae0 | ||
|
|
9b948cf4a9 | ||
|
|
f39c129c97 | ||
|
|
10237ae2cd | ||
|
|
feac261572 | ||
|
|
be8f1bd251 | ||
|
|
964a639290 | ||
|
|
7c4fac70cc | ||
|
|
4781f802a2 | ||
|
|
9ae5bbf533 | ||
|
|
aedd3b13f9 | ||
|
|
fb9b8a901d | ||
|
|
678f7f44cc | ||
|
|
19b59bcc3e | ||
|
|
9392c4fd0b | ||
|
|
714295c4d3 | ||
|
|
73752d2963 | ||
|
|
c1f034cc89 | ||
|
|
b13f90aaf5 | ||
|
|
5889c6e0e1 | ||
|
|
c31b8c5bc8 | ||
|
|
85e7dcd2d6 | ||
|
|
5d94ef5413 | ||
|
|
46f336bb6e | ||
|
|
b1bf1c19ba | ||
|
|
643ea75311 | ||
|
|
26b4bf7b5d | ||
|
|
027107be86 | ||
|
|
5f876a3057 | ||
|
|
0115125501 | ||
|
|
6b3890085b | ||
|
|
a422436e41 | ||
|
|
57bcc7a015 | ||
|
|
cd8efa1d05 | ||
|
|
ac6be59fc0 | ||
|
|
d722b82dfb | ||
|
|
54b8bd4c3d | ||
|
|
d1fd7b0652 | ||
|
|
b896e68ee0 | ||
|
|
aecfb8b820 | ||
|
|
c8c0c06d86 | ||
|
|
f32e100935 | ||
|
|
3e6e807075 | ||
|
|
9cce3dd346 | ||
|
|
488b46770d | ||
|
|
e2e1317881 | ||
|
|
129db8d0a4 | ||
|
|
bfd594a47c | ||
|
|
b1f83dbc0d | ||
|
|
087aedec2e | ||
|
|
6d4fe89c48 | ||
|
|
78d19a7f21 | ||
|
|
4766c8bf9a | ||
|
|
fd63353e66 | ||
|
|
07a7bf3e02 | ||
|
|
f723100741 | ||
|
|
97639e09eb | ||
|
|
978b5ac322 | ||
|
|
0bdd4a8636 | ||
|
|
1bca94b5c6 | ||
|
|
53228beadd | ||
|
|
63b228225e | ||
|
|
862c6d1be4 | ||
|
|
dd81f691cf | ||
|
|
65dcaf90ff | ||
|
|
a47a4f6604 | ||
|
|
d8f55bd626 | ||
|
|
8488ede3fe | ||
|
|
6c3ec928d7 | ||
|
|
e2d92a82aa | ||
|
|
794b1b10d9 | ||
|
|
282fcd0d41 | ||
|
|
05a325e481 | ||
|
|
01e80652d8 | ||
|
|
9f5eca917c | ||
|
|
a4f0c79057 | ||
|
|
86ecc60aa2 | ||
|
|
9bea325e2b | ||
|
|
9040790621 | ||
|
|
5d41cd277a | ||
|
|
4195e3a16e | ||
|
|
9b1ad0bc3d | ||
|
|
9b39f41652 | ||
|
|
f2cbdd5538 | ||
|
|
93ff5a1623 | ||
|
|
80de099a24 | ||
|
|
b502026f31 |
@@ -168,6 +168,8 @@ canvas{z-index:0!important}
|
||||
</style>
|
||||
<!-- WEVAL-D91-AGENTS-ARCHI-PERSONA -->
|
||||
<style id="d93c">.p-av{width:52px!important;height:52px!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;font-size:28px!important;line-height:1!important;border-radius:50%!important;background:rgba(255,255,255,.06)!important;border:2.5px solid rgba(34,211,238,.55)!important;flex-shrink:0!important;overflow:hidden!important;box-shadow:0 2px 6px rgba(0,0,0,.25)!important}.p-av[data-persona="tool"]{border-color:rgba(139,92,246,.55)!important;background:rgba(139,92,246,.12)!important}.p-av[data-persona="master"]{border-color:rgba(255,215,0,.65)!important;background:rgba(255,215,0,.1)!important;width:64px!important;height:64px!important;font-size:34px!important}.p-av[data-persona="human"]{border-color:rgba(74,222,128,.45)!important;background:rgba(74,222,128,.08)!important}</style>
|
||||
<!-- V109 Plausible Analytics -->
|
||||
<script defer data-domain="weval-consulting.com" src="https://analytics.weval-consulting.com/js/script.js"></script>
|
||||
</head><body><div id="liveStatusBar" style="display:none"></div>
|
||||
<noscript></noscript class="night">
|
||||
<div class="cockpit-live" id="cockpit-live"><div class="cockpit-pill" id="cp-health"><div class="cockpit-dot"></div><span class="lbl">STATUS</span><span class="val">...</span></div><div class="cockpit-pill" id="cp-l99"><span class="lbl">L99</span><span class="val">-</span></div><div class="cockpit-pill" id="cp-docker"><span class="lbl">DOCKER</span><span class="val">-</span></div><div class="cockpit-pill" id="cp-disk"><span class="lbl">DISK</span><span class="val">-</span></div><div class="cockpit-pill" id="cp-providers"><span class="lbl">PROVIDERS</span><span class="val">-</span></div><div class="cockpit-pill" id="cp-qdrant"><span class="lbl">RAG</span><span class="val">-</span></div><div class="cockpit-pill" id="cp-git"><span class="lbl">GIT</span><span class="val">-</span></div><div class="cockpit-pill" id="cp-refresh"><span class="lbl">REFRESH</span><span class="val">30s</span></div></div>
|
||||
@@ -475,11 +477,24 @@ A.forEach(function(a,i){
|
||||
x=0;z=0;
|
||||
} else {
|
||||
const R=(pw[a.t]/2)*0.92;
|
||||
// WAVE 190: Single circle — agents around meeting table
|
||||
const angle=(ti/cnt)*Math.PI*2 - Math.PI/2; // start from top
|
||||
const tableR=R*0.72; // agents sit at 72% of plateau radius
|
||||
let angle, tableR;
|
||||
if(cnt>=15){
|
||||
// WAVE 201: Two concentric rings for overcrowded tiers (T1/T2)
|
||||
// inner ring at 50% radius, outer at 90%, staggered by half-angle
|
||||
const half=Math.ceil(cnt/2);
|
||||
const isOuter=ti>=half;
|
||||
const localI=isOuter?(ti-half):ti;
|
||||
const localCnt=isOuter?(cnt-half):half;
|
||||
angle=(localI/localCnt)*Math.PI*2 - Math.PI/2;
|
||||
if(isOuter) angle+=Math.PI/localCnt; // stagger offset
|
||||
tableR=isOuter?R*0.92:R*0.48;
|
||||
} else {
|
||||
// Single circle for sparse tiers (T0, T3)
|
||||
angle=(ti/cnt)*Math.PI*2 - Math.PI/2;
|
||||
tableR=R*0.72;
|
||||
}
|
||||
x=tableR*Math.cos(angle);
|
||||
z=tableR*Math.sin(angle)*0.65; // 65% Z for perspective
|
||||
z=tableR*Math.sin(angle)*0.65;
|
||||
}
|
||||
|
||||
const url=_pk[a.n]||(a.r?'https://robohash.org/'+encodeURIComponent(a.n)+'?set=set1&size=200x200':'https://api.dicebear.com/9.x/adventurer/svg?seed='+encodeURIComponent(a.n));
|
||||
@@ -488,7 +503,7 @@ A.forEach(function(a,i){
|
||||
card.className='ag-card'+(a.m?' master':'');card.dataset.agent=a.n;card.dataset.tier=a.t;
|
||||
card.innerHTML=(a.m?'<div class="crown">👑</div>':'')+
|
||||
'<div class="bubble" data-a="'+a.n+'"></div>'+
|
||||
(window.WevalAvatar && WevalAvatar.isReady && WevalAvatar.isReady() ? '<span class="p-av" data-agent="'+a.n+'" data-persona="'+WevalAvatar.persona(a.n)+'" title="'+a.n+'">'+WevalAvatar.emoji(a.n)+'</span>' : '<img src="'+url+'" loading="lazy" data-agent="'+a.n+'">')+
|
||||
((function(n){var r=(window.WevalAvatar&&WevalAvatar.isReady&&WevalAvatar.isReady())?WevalAvatar.get(n):{persona:'human',emoji:'👤'};return '<span class="p-av" data-agent="'+n+'" data-persona="'+(r.persona||'human')+'" title="'+n+'">'+(r.emoji||'👤')+'</span>';})(a.n))+
|
||||
'<div class="name">'+a.n+'</div>';
|
||||
card.onclick=function(){
|
||||
document.getElementById('mImg').src=url;
|
||||
@@ -1265,7 +1280,7 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
|
||||
</style>
|
||||
<div class="wtp-gapfill-banner" id="wtpGapFillBanner">
|
||||
<span>🎯 <strong>WEVAL Agents Gap-Fill ERP</strong></span>
|
||||
<span class="pill hot">45 gaps</span>
|
||||
<span class="pill hot" id="gaps-banner-count">17 gaps live</span>
|
||||
<span class="pill">SAP · Oracle · NetSuite · Dynamics</span>
|
||||
<span class="pill new">🆕 Meeting Rooms</span>
|
||||
<span class="pill new">🆕 Lean 6 Sigma</span>
|
||||
@@ -1326,36 +1341,32 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
|
||||
|
||||
<script id="d91-archi-rerender">
|
||||
(function(){
|
||||
// Once the helper is ready, re-run the card build so persona emojis appear.
|
||||
// The card build is scene-side (Three.js / CSS2DObject) — easiest: find all existing
|
||||
// <img data-agent="X"> inside CSS2D layer and swap them for p-av spans.
|
||||
function swap(){
|
||||
// V120 SSOT — Update existing p-av spans with WevalAvatar emoji once helper is ready.
|
||||
// Also remove any legacy <img dicebear/robohash> that might have leaked through.
|
||||
function refresh(){
|
||||
if (!window.WevalAvatar || !WevalAvatar.isReady || !WevalAvatar.isReady()) return false;
|
||||
const nodes = document.querySelectorAll('.ag-card img[src*="robohash"],.ag-card img[src*="dicebear"]');
|
||||
if (!nodes.length) return true;
|
||||
nodes.forEach(img => {
|
||||
const name = img.closest('.ag-card')?.dataset.agent || img.dataset.agent;
|
||||
// Update spans (created with default 👤 if helper wasn't ready at render time)
|
||||
document.querySelectorAll('.ag-card .p-av[data-agent]').forEach(span => {
|
||||
const name = span.dataset.agent;
|
||||
if (!name) return;
|
||||
const e = WevalAvatar.get(name);
|
||||
const span = document.createElement('span');
|
||||
span.className = 'p-av';
|
||||
span.dataset.agent = name;
|
||||
span.dataset.persona = e.persona || 'human';
|
||||
span.title = name;
|
||||
span.textContent = e.emoji || '👤';
|
||||
// copy sizing classes implicit via parent selector
|
||||
img.parentNode.replaceChild(span, img);
|
||||
if (e && e.emoji) {
|
||||
span.textContent = e.emoji;
|
||||
if (e.persona) span.dataset.persona = e.persona;
|
||||
}
|
||||
});
|
||||
// Cleanup legacy imgs
|
||||
document.querySelectorAll('.ag-card img[src*="robohash"],.ag-card img[src*="dicebear"]').forEach(img => img.remove());
|
||||
return true;
|
||||
}
|
||||
let tries = 0;
|
||||
const iv = setInterval(() => {
|
||||
tries++;
|
||||
if (swap() || tries > 40) clearInterval(iv);
|
||||
if (refresh() || tries > 40) clearInterval(iv);
|
||||
}, 250);
|
||||
})();
|
||||
</script>
|
||||
<script id="d93cj">(function(){function e(){var s=["[data-agent]",".agent",".agent-card",".card-agent",".node",".gap-agent"];s.forEach(function(q){document.querySelectorAll(q).forEach(function(c){if(c.querySelector(".p-av")||c.dataset.d93c)return;c.dataset.d93c=1;var p=document.createElement("span");p.className="p-av";p.setAttribute("data-persona","human");p.textContent="\ud83d\udc64";if(window.WevalAvatar&&WevalAvatar.get){var n=(c.dataset.agent||c.getAttribute("data-name")||(c.querySelector("h3,h4,.name")||{}).textContent||"").trim();if(n){try{var r=WevalAvatar.get(n);if(r&&r.emoji){p.textContent=r.emoji;if(r.persona)p.setAttribute("data-persona",r.persona);}}catch(e){}}}c.insertBefore(p,c.firstChild);});});}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",e);else e();setTimeout(e,500);setTimeout(e,1500);setTimeout(e,3500);})();</script>
|
||||
<script id="d93cj">/* DISABLED 20260420 — was double heads vs Three.js CSS2DRenderer. d91 swap suffices. */</script>
|
||||
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
|
||||
<script>
|
||||
@@ -1470,5 +1481,24 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
|
||||
<script>
|
||||
// Opus v9.32 gaps banner live
|
||||
(async function(){
|
||||
try {
|
||||
const r = await fetch('/api/weval-agents-gap-fill-manifest.json');
|
||||
const d = await r.json();
|
||||
const erp = d.erp_gaps_covered || {};
|
||||
let total = 0;
|
||||
for (const k in erp) {
|
||||
const v = erp[k];
|
||||
if (Array.isArray(v)) total += v.length;
|
||||
else if (v && Array.isArray(v.gaps)) total += v.gaps.length;
|
||||
}
|
||||
const el = document.getElementById('gaps-banner-count');
|
||||
if (el && total > 0) el.textContent = total + ' ERP gaps';
|
||||
} catch(e) {}
|
||||
})();
|
||||
</script>
|
||||
</body></html>
|
||||
|
||||
|
||||
580
all-ia-hub.html
Normal file
@@ -0,0 +1,580 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr" data-theme="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>All-IA Hub — Remplacement Claude Code + Opus (Souverain)</title>
|
||||
<meta name="description" content="Hub unifié combinant WEVIA Master streaming, WEVCODE modes, Arena multi-provider. Indépendance Opus.">
|
||||
<style>
|
||||
:root{--bg:#0a0a0f;--bg2:#111119;--bg3:#181825;--rim:#2a2a3a;--t:#e2e8f0;--mu:#94a3b8;--dm:#64748b;--cy:#22d3ee;--gr:#10b981;--vl:#a78bfa;--am:#f59e0b;--rd:#ef4444}
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
body{font-family:'JetBrains Mono','Menlo',monospace;background:var(--bg);color:var(--t);min-height:100vh;display:flex;flex-direction:column}
|
||||
.hdr{padding:10px 18px;background:var(--bg2);border-bottom:1px solid var(--rim);display:flex;align-items:center;justify-content:space-between;gap:14px}
|
||||
.hdr .brand{display:flex;align-items:center;gap:10px}
|
||||
.hdr .logo{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,var(--cy),var(--vl));display:flex;align-items:center;justify-content:center;color:var(--bg);font-weight:700;font-size:14px}
|
||||
.hdr h1{font-size:14px;font-weight:700;letter-spacing:.4px}
|
||||
.hdr .sub{font-size:10px;color:var(--mu);letter-spacing:.3px;margin-top:2px}
|
||||
.hdr .stats{display:flex;gap:14px;font-size:10px;color:var(--dm);letter-spacing:.3px}
|
||||
.hdr .stats span b{color:var(--cy);font-weight:700}
|
||||
.tabs{display:flex;gap:2px;padding:0 18px;background:var(--bg2);border-bottom:1px solid var(--rim);overflow-x:auto}
|
||||
.tab{padding:10px 16px;background:transparent;border:0;color:var(--mu);font-family:inherit;font-size:11px;font-weight:600;cursor:pointer;letter-spacing:.4px;border-bottom:2px solid transparent;transition:all .2s;white-space:nowrap}
|
||||
.tab:hover{color:var(--t)}
|
||||
.tab.on{color:var(--cy);border-bottom-color:var(--cy)}
|
||||
main{flex:1;display:flex;flex-direction:column;padding:16px 20px;max-width:1400px;width:100%;margin:0 auto;min-height:0}
|
||||
.view{display:none;flex-direction:column;flex:1;min-height:0}
|
||||
.view.on{display:flex}
|
||||
/* Chat/Code shared layout */
|
||||
.modes{display:flex;gap:4px;margin-bottom:10px;flex-wrap:wrap}
|
||||
.mode{padding:6px 12px;border:1px solid var(--rim);border-radius:6px;background:transparent;color:var(--mu);font-family:inherit;font-size:10px;font-weight:600;cursor:pointer;transition:all .15s;letter-spacing:.3px}
|
||||
.mode:hover{border-color:var(--cy);color:var(--t)}
|
||||
.mode.on{background:var(--cy);color:var(--bg);border-color:var(--cy)}
|
||||
.stbar{display:flex;gap:14px;margin-bottom:10px;font-size:10px;color:var(--dm);letter-spacing:.4px}
|
||||
.stbar span{display:flex;align-items:center;gap:5px}
|
||||
.stbar .dot{width:6px;height:6px;border-radius:50%;background:var(--gr)}
|
||||
.out{flex:1;background:var(--bg2);border:1px solid var(--rim);border-radius:8px;padding:14px 18px;overflow-y:auto;font-size:12px;line-height:1.65;min-height:240px}
|
||||
.out .msg{margin-bottom:14px}
|
||||
.out .msg.u{color:var(--cy)}
|
||||
.out .msg.a{color:var(--t)}
|
||||
.out .msg.sys{color:var(--dm);font-size:10px;letter-spacing:.3px}
|
||||
.out .msg .meta{font-size:9px;color:var(--dm);letter-spacing:.4px;margin-top:4px}
|
||||
.out .msg pre{background:var(--bg3);padding:10px 12px;border-radius:6px;overflow-x:auto;font-size:11px;margin:6px 0}
|
||||
.inp-wrap{display:flex;gap:8px;margin-top:10px;background:var(--bg2);border:1px solid var(--rim);border-radius:8px;padding:8px}
|
||||
.inp-wrap:focus-within{border-color:var(--cy)}
|
||||
.inp{flex:1;background:transparent;border:0;color:var(--t);font-family:inherit;font-size:12px;padding:8px;resize:none;outline:none;min-height:46px;max-height:140px}
|
||||
.inp-wrap button{background:var(--cy);color:var(--bg);border:0;border-radius:6px;padding:0 18px;font-family:inherit;font-size:11px;font-weight:700;cursor:pointer;letter-spacing:.4px;transition:opacity .15s}
|
||||
.inp-wrap button:hover{opacity:.85}
|
||||
.inp-wrap button:disabled{opacity:.4;cursor:not-allowed}
|
||||
/* Capabilities grid */
|
||||
.caps-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;padding:4px 0}
|
||||
.cap{background:var(--bg2);border:1px solid var(--rim);border-radius:8px;padding:14px 16px;transition:all .2s}
|
||||
.cap:hover{border-color:var(--cy);transform:translateY(-1px)}
|
||||
.cap h3{font-size:12px;color:var(--cy);margin-bottom:6px;letter-spacing:.5px}
|
||||
.cap p{font-size:10px;color:var(--mu);line-height:1.55;letter-spacing:.2px}
|
||||
.cap .tag{display:inline-block;margin-top:8px;padding:2px 7px;background:var(--bg3);border:1px solid var(--rim);border-radius:4px;font-size:9px;color:var(--dm);letter-spacing:.4px}
|
||||
.cap .tag.r{color:var(--gr);border-color:var(--gr)}
|
||||
/* Training panel */
|
||||
.train-stats{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;margin-bottom:14px}
|
||||
.train-stat{background:var(--bg2);border:1px solid var(--rim);border-radius:8px;padding:12px 14px}
|
||||
.train-stat .k{font-size:9px;color:var(--dm);letter-spacing:.5px;text-transform:uppercase}
|
||||
.train-stat .v{font-size:20px;color:var(--cy);font-weight:700;margin-top:3px}
|
||||
.train-stat .s{font-size:9px;color:var(--mu);margin-top:3px;letter-spacing:.3px}
|
||||
.train-log{background:var(--bg3);border:1px solid var(--rim);border-radius:6px;padding:10px 14px;font-size:10px;line-height:1.6;color:var(--mu);max-height:280px;overflow-y:auto}
|
||||
.train-log b{color:var(--cy)}
|
||||
/* Orchestrator compact */
|
||||
.orch-agents{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px;max-height:280px;overflow-y:auto}
|
||||
.orch-agent{background:var(--bg2);border:1px solid var(--rim);border-radius:5px;padding:6px 9px;font-size:10px;color:var(--mu);display:flex;align-items:center;gap:6px;transition:all .2s}
|
||||
.orch-agent:hover{border-color:var(--cy);color:var(--t)}
|
||||
.orch-agent .d{width:5px;height:5px;border-radius:50%;background:var(--gr);flex-shrink:0}
|
||||
footer{padding:8px 18px;background:var(--bg2);border-top:1px solid var(--rim);font-size:9px;color:var(--dm);letter-spacing:.3px;display:flex;justify-content:space-between}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="hdr">
|
||||
<div class="brand">
|
||||
<div class="logo">A</div>
|
||||
<div>
|
||||
<h1>ALL-IA HUB</h1>
|
||||
<div class="sub">Remplacement Claude Code + Opus · Souverain</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats">
|
||||
<span>Agents <b id="h-ag">726</b></span>
|
||||
<span>Providers <b id="h-pr">14</b></span>
|
||||
<span>NonReg <b id="h-nr">201/201</b></span>
|
||||
<span>Mode <b id="h-md">Chat</b></span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<nav class="tabs">
|
||||
<button class="tab on" data-view="chat">CHAT MULTIAGENT</button>
|
||||
<button class="tab" data-view="code">CODE (WEVCODE)</button>
|
||||
<button class="tab" data-view="arena">ARENA 14 PROVIDERS</button>
|
||||
<button class="tab" data-view="capabilities">IA CAPABILITIES</button>
|
||||
<button class="tab" data-view="training">TRAINING HUB</button>
|
||||
<button class="tab" data-view="orchestrator">ORCHESTRATOR</button>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
<!-- CHAT MULTIAGENT (wevia-master pattern) -->
|
||||
<section class="view on" id="v-chat">
|
||||
<div class="stbar">
|
||||
<span><span class="dot"></span>sovereign:4000</span>
|
||||
<span>streaming SSE 1h</span>
|
||||
<span>multi-agent auto</span>
|
||||
<span style="cursor:pointer;user-select:none;color:var(--vl)" id="human-toggle" onclick="toggleHumanMode()" title="Mode humain: bypass stubs/intents, route vers LLM pure (llm-direct.php) avec prompt /etc/wevia/system-prompt.txt">
|
||||
<input type="checkbox" id="human-chk" style="vertical-align:middle" checked> 💖 Mode Humain (LLM pure)
|
||||
</span>
|
||||
<span id="s-chat"></span>
|
||||
</div>
|
||||
<div class="out" id="out-chat">
|
||||
<div class="msg sys">> CHAT multi-agent prêt. Natural language router V103 actif. Tape "orchestrate", "bilan complet", "tous les agents" pour multi-agent parallèle.</div>
|
||||
</div>
|
||||
<div class="inp-wrap">
|
||||
<textarea class="inp" id="inp-chat" placeholder="Décris ce que tu veux faire, orchestrer, analyser..."></textarea>
|
||||
<button onclick="sendChat()" id="btn-chat">ENVOYER</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CODE (wevcode pattern) -->
|
||||
<section class="view" id="v-code">
|
||||
<div class="modes" id="code-modes">
|
||||
<button class="mode on" data-mode="code"></> CODE</button>
|
||||
<button class="mode" data-mode="analyze">ANALYZE</button>
|
||||
<button class="mode" data-mode="plan">PLAN</button>
|
||||
<button class="mode" data-mode="execute">EXECUTE</button>
|
||||
<button class="mode" data-mode="git">GIT</button>
|
||||
<button class="mode" data-mode="rag">RAG</button>
|
||||
</div>
|
||||
<div class="stbar">
|
||||
<span><span class="dot"></span>cerebras qwen-3-235b</span>
|
||||
<span>Qdrant RAG</span>
|
||||
<span>Cognitive 635fn</span>
|
||||
<span id="s-code"></span>
|
||||
</div>
|
||||
<div class="out" id="out-code">
|
||||
<div class="msg sys">> WEVCODE v2 · Sovereign Coding Agent · 6 modes disponibles</div>
|
||||
</div>
|
||||
<div class="inp-wrap">
|
||||
<textarea class="inp" id="inp-code" placeholder="Décris le code à générer, analyser, debug, planifier..."></textarea>
|
||||
<button onclick="sendCode()" id="btn-code">ENVOYER</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ARENA (weval-arena pattern) -->
|
||||
<section class="view" id="v-arena">
|
||||
<div class="stbar">
|
||||
<span><span class="dot"></span>14 providers cascade</span>
|
||||
<span>auto fallback</span>
|
||||
<span id="s-arena"></span>
|
||||
</div>
|
||||
<div class="out" id="out-arena">
|
||||
<div class="msg sys">> ARENA · Multi-provider intelligent routing</div>
|
||||
<div class="msg sys">> Providers: cerebras, groq, gemini, sambanova, nvidia, mistral, hf, openrouter, github, cf, deepseek, anthropic, ollama, maestro</div>
|
||||
</div>
|
||||
<div class="inp-wrap">
|
||||
<textarea class="inp" id="inp-arena" placeholder="Question → routage auto vers meilleur provider disponible"></textarea>
|
||||
<button onclick="sendArena()" id="btn-arena">ENVOYER</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CAPABILITIES -->
|
||||
<section class="view" id="v-caps">
|
||||
<div class="caps-grid" id="caps-grid">
|
||||
<!-- V111-BLADE-ENRICH: live blade tasks + quick actions -->
|
||||
<div class="cap" style="grid-column:1 / -1;background:linear-gradient(135deg,#1e293b,#0f172a);border-color:var(--cy)">
|
||||
<h3>📸 Blade Tasks Queue — Chrome yacineutt pilote temps-reel</h3>
|
||||
<p style="margin-bottom:10px">Tasks pending: <b id="blade-pending">...</b> · Tasks done: <b id="blade-done">...</b> · MCP port 8765 Bearer actif</p>
|
||||
<div style="display:flex;gap:6px;flex-wrap:wrap;margin-top:8px">
|
||||
<button class="mode" onclick="pushBladeTask('office_create',{})">+ Office Create</button>
|
||||
<button class="mode" onclick="pushBladeTask('deepseek_renew',{})">+ DeepSeek Renew</button>
|
||||
<button class="mode" onclick="pushBladeTask('thuggie_login',{})">+ Thuggie Login</button>
|
||||
<button class="mode" onclick="pushBladeTask('token_github_renew',{})">+ GitHub Token</button>
|
||||
<button class="mode" onclick="pushBladeTask('token_whatsapp_renew',{})">+ WhatsApp Token</button>
|
||||
<button class="mode" onclick="refreshBladeStats()">Refresh</button>
|
||||
</div>
|
||||
<div id="blade-log" style="margin-top:10px;font-size:10px;color:var(--mu);max-height:120px;overflow-y:auto;background:var(--bg3);padding:8px;border-radius:4px;display:none"></div>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🌐 DeepSeek Web Access</h3>
|
||||
<p>DeepSeek R1 reasoning + V3 chat · acces cookies + API · session rotee auto · gratuit via Thuggie Web integration.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>💻 Selenium Chrome Autonomy</h3>
|
||||
<p>Blade user yacineutt TOUJOURS connecte · Chrome persistent context · WEVIA pilote via Playwright CDP · zero login manuel.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>📁 Office 365 Enterprise</h3>
|
||||
<p>Microsoft Graph API · 34 tenants · create/delete users · MFA · Office recovery · backdoor admin · audit complet.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🔌 Token Renewal Engine</h3>
|
||||
<p>Auto-refresh OAuth · GitHub PAT · WhatsApp Meta · Calendly · Cloudflare · rotation anti-rate-limit.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🔎 Cyber Tips 6 mois</h3>
|
||||
<p>CF-Bypass Phase 1+2 · PowerMTA warmup · O365 via PMTA 97% inbox · SMTP smuggling · seeds rotation.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🎥 Video + Screenshot E2E</h3>
|
||||
<p>Playwright record_video_dir WEBM · full-page 1920x1080 · 16/16 tests visuels · auto-validation.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>⚡ WEVIA Master Streaming</h3>
|
||||
<p>fetch+getReader() + AbortSignal.timeout(3600000ms). Pattern identique Claude Code SDK. SSE parsing 5 types événements.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🛠 Multi-Agent Orchestrator</h3>
|
||||
<p>15 agents parallèles SSE · V102 regex étendu · V103 natural language router · 10 patterns détectés.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>💻 WEVCODE 6 Modes</h3>
|
||||
<p>code / analyze / plan / execute / git / rag. CodeAnalyzer + Planner + ToolUseV2 + Cognitive 635 fn.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🌐 Arena Multi-Provider</h3>
|
||||
<p>14 providers cascade: cerebras qwen-3-235b, groq llama 3.3, gemini, sambanova, nvidia nim, mistral large, HF, OpenRouter, GitHub, CF Workers AI, DeepSeek, Anthropic, Ollama, Maestro.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🧠 Qdrant RAG</h3>
|
||||
<p>Knowledge base vectoriel · 14,368 vectors · 1181 files vault · wiki + GOLD indexed.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>📚 HF Fine-Tune</h3>
|
||||
<p>yace222/weval-brain-v4 · continuous training · auto-learning loop via cron.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🌝 Blade IA (Razer)</h3>
|
||||
<p>34 capabilities locales · hamid-fullscreen.php · Selenium + Playwright persistent context.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>👑 Director Agent</h3>
|
||||
<p>312 services monitored · wevia-director.php · wevia-fiability.php · autofix docker.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🏁 NonReg 6sigma</h3>
|
||||
<p>201/201 tests passants · L99 daily · Playwright visual 16/16.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>📡 Tool Use</h3>
|
||||
<p>wevia-full-exec.php · bash exec · file r/w · DB query · git push · cron · CF purge · GOLD.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>👨 Session + Files</h3>
|
||||
<p>Session ID persistant · history 10 last · attachments base64 · long-running tasks.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
<div class="cap">
|
||||
<h3>🔄 Cognitive 635fn</h3>
|
||||
<p>cognitive-opus46 · 635 functions · CoT decompose · Reasoning + Creative + Analysis chains.</p>
|
||||
<span class="tag r">READY</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- TRAINING -->
|
||||
<section class="view" id="v-train">
|
||||
<div class="train-stats" id="train-stats">
|
||||
<div class="train-stat"><div class="k">HF Model</div><div class="v" style="font-size:13px;color:var(--cy)">weval-brain-v4</div><div class="s">yace222/weval-brain-v4</div></div>
|
||||
<div class="train-stat"><div class="k">Qdrant Vectors</div><div class="v" id="t-qv">14368</div><div class="s">KB indexed</div></div>
|
||||
<div class="train-stat"><div class="k">Wiki entries</div><div class="v" id="t-wi">1861</div><div class="s">markdown files</div></div>
|
||||
<div class="train-stat"><div class="k">Vault files</div><div class="v" id="t-vf">4738</div><div class="s">GOLD: 105</div></div>
|
||||
<div class="train-stat"><div class="k">Agents</div><div class="v" id="t-ag">726</div><div class="s">8 categories</div></div>
|
||||
<div class="train-stat"><div class="k">Cognitive fn</div><div class="v">635</div><div class="s">cognitive-opus46</div></div>
|
||||
</div>
|
||||
<div class="train-log" id="train-log">
|
||||
<div><b>> TRAINING HUB</b> · Continuous learning loop active</div>
|
||||
<div>> Cron WeviaAutoLrn · toutes les 2h</div>
|
||||
<div>> Cron WeviaDream · auto-expansion nocturne</div>
|
||||
<div>> Cron WeviaEmbed · Qdrant embedding auto</div>
|
||||
<div>> Source: chat history + wiki + vault + GOLD backups</div>
|
||||
<div>> Pipeline: collect → dedupe → embed → fine-tune → deploy</div>
|
||||
<div>> Fallback: si HF indispo → LocalAI (Ollama port 11434)</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ORCHESTRATOR -->
|
||||
<section class="view" id="v-orch">
|
||||
<div class="stbar">
|
||||
<span>726 agents dans le catalog</span>
|
||||
<span id="s-orch-cat">8 categories</span>
|
||||
<span id="s-orch-load"></span>
|
||||
</div>
|
||||
<div class="orch-agents" id="orch-agents"></div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<span>All-IA Hub · Souverain · Opus-indépendant</span>
|
||||
<span>© WEVAL Consulting · V107 · 2026</span>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
// Tab switching
|
||||
document.querySelectorAll('.tab').forEach(t=>t.addEventListener('click',()=>{
|
||||
document.querySelectorAll('.tab').forEach(x=>x.classList.remove('on'));
|
||||
document.querySelectorAll('.view').forEach(x=>x.classList.remove('on'));
|
||||
t.classList.add('on');
|
||||
const v=t.dataset.view;
|
||||
const map={chat:'v-chat',code:'v-code',arena:'v-arena',capabilities:'v-caps',training:'v-train',orchestrator:'v-orch'};
|
||||
document.getElementById(map[v]).classList.add('on');
|
||||
document.getElementById('h-md').textContent=t.textContent.split(' ')[0];
|
||||
if(v==='orchestrator') loadAgents();
|
||||
}));
|
||||
|
||||
// Code modes
|
||||
let codeMode='code';
|
||||
document.querySelectorAll('#code-modes .mode').forEach(m=>m.addEventListener('click',()=>{
|
||||
document.querySelectorAll('#code-modes .mode').forEach(x=>x.classList.remove('on'));
|
||||
m.classList.add('on');
|
||||
codeMode=m.dataset.mode;
|
||||
}));
|
||||
|
||||
// V108-HUMAN: Extract natural text from any JSON structure
|
||||
function extractText(obj, depth){
|
||||
depth = depth || 0;
|
||||
if(depth>3) return '';
|
||||
if(typeof obj==='string') return obj;
|
||||
if(!obj || typeof obj!=='object') return '';
|
||||
var keys=['content','response','text','answer','message','output','reply','result','code'];
|
||||
for(var i=0;i<keys.length;i++){
|
||||
var v=obj[keys[i]];
|
||||
if(v) return typeof v==='string'?v:extractText(v,depth+1);
|
||||
}
|
||||
if(obj.choices && obj.choices[0]){
|
||||
var c=obj.choices[0];
|
||||
if(c.message && c.message.content) return c.message.content;
|
||||
if(c.text) return c.text;
|
||||
}
|
||||
var vals=Object.values(obj);
|
||||
for(var j=0;j<vals.length;j++){ if(typeof vals[j]==='string' && vals[j].length>10) return vals[j]; }
|
||||
return '';
|
||||
}
|
||||
|
||||
// V108-HUMAN: Humanize robotic output
|
||||
function humanize(txt){
|
||||
if(!txt) return '';
|
||||
if(typeof txt!=='string') txt=String(txt);
|
||||
txt=txt.trim();
|
||||
// Strip wrapping quotes
|
||||
if(txt.length>1 && txt[0]==='"' && txt[txt.length-1]==='"'){
|
||||
try{ txt=JSON.parse(txt); }catch(e){}
|
||||
}
|
||||
// Unescape common sequences
|
||||
txt=txt.replace(/\\n/g,'\n').replace(/\\t/g,'\t').replace(/\\"/g,'"');
|
||||
return txt;
|
||||
}
|
||||
|
||||
// Add message helper
|
||||
function addMsg(target,txt,cls,meta){
|
||||
const out=document.getElementById(target);
|
||||
const d=document.createElement('div');
|
||||
d.className='msg '+(cls||'a');
|
||||
d.innerHTML='<div>'+txt.replace(/</g,'<').replace(/\n/g,'<br>')+'</div>'+(meta?'<div class="meta">'+meta+'</div>':'');
|
||||
out.appendChild(d);
|
||||
out.scrollTop=out.scrollHeight;
|
||||
}
|
||||
|
||||
// V108-HUMAN-MODE state
|
||||
let humanMode = true;
|
||||
function toggleHumanMode(){
|
||||
humanMode = !humanMode;
|
||||
document.getElementById('human-chk').checked = humanMode;
|
||||
}
|
||||
|
||||
// SEND CHAT (wevia-master pattern - streaming SSE + human bypass)
|
||||
async function sendChat(){
|
||||
const inp=document.getElementById('inp-chat');
|
||||
const text=inp.value.trim();
|
||||
if(!text) return;
|
||||
addMsg('out-chat',text,'u');
|
||||
inp.value='';
|
||||
const btn=document.getElementById('btn-chat');
|
||||
btn.disabled=true;
|
||||
const t0=Date.now();
|
||||
try{
|
||||
// V108C-HUMAN-ROUTE: pure LLM bypass stubs/intents
|
||||
const shortMsg = text.length < 120 && !/multiagent|orchestr|parallel|bilan complet|exhaustif|tous les agents/i.test(text);
|
||||
/* V109-LLM-DIRECT: human mode hits llm-direct.php (pure LLM, returns JSON {content}) */
|
||||
let res;
|
||||
if(humanMode && shortMsg){
|
||||
// Route to llm-direct which reads stdin body as message
|
||||
res = await fetch('/api/llm-direct.php',{
|
||||
method:'POST',
|
||||
headers:{'Content-Type':'text/plain; charset=utf-8'},
|
||||
body: text,
|
||||
signal:AbortSignal.timeout(60000)
|
||||
});
|
||||
} else {
|
||||
res = await fetch('/api/wevia-master-api.php',{
|
||||
method:'POST',
|
||||
headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({message:text,session_id:'all-ia-hub-'+Date.now()}),
|
||||
signal:AbortSignal.timeout(300000)
|
||||
});
|
||||
}
|
||||
const d=await res.json();
|
||||
const t=((Date.now()-t0)/1000).toFixed(1);
|
||||
/* V108-HUMAN: extract natural text */
|
||||
let txt=d.content||d.response||d.text||d.answer||d.message||d.output||d.reply||'';
|
||||
if(!txt && typeof d==='object'){ txt=extractText(d); }
|
||||
if(!txt) txt=JSON.stringify(d,null,2);
|
||||
addMsg('out-chat',humanize(txt),'a',(d.provider||d.tool||'?')+' · '+t+'s'+(d.agents_count?' · '+d.agents_count+' agents':''));
|
||||
}catch(e){
|
||||
addMsg('out-chat','Error: '+e.message,'a','error');
|
||||
}
|
||||
btn.disabled=false;
|
||||
}
|
||||
|
||||
// SEND CODE (wevcode pattern)
|
||||
async function sendCode(){
|
||||
const inp=document.getElementById('inp-code');
|
||||
const text=inp.value.trim();
|
||||
if(!text) return;
|
||||
addMsg('out-code','['+codeMode+'] '+text,'u');
|
||||
inp.value='';
|
||||
const btn=document.getElementById('btn-code');
|
||||
btn.disabled=true;
|
||||
const t0=Date.now();
|
||||
try{
|
||||
const res=await fetch('/api/wevcode-superclaude.php',{
|
||||
method:'POST',
|
||||
headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({action:codeMode,prompt:text,message:text})
|
||||
});
|
||||
const d=await res.json();
|
||||
const t=((Date.now()-t0)/1000).toFixed(1);
|
||||
let out=d.content||d.result||d.response||d.text||d.answer||d.output||d.code||'';
|
||||
if(!out && typeof d==='object'){ out=extractText(d); }
|
||||
if(!out) out=JSON.stringify(d,null,2);
|
||||
addMsg('out-code',humanize(out),'a',codeMode+' · '+(d.model||d.provider||'sovereign')+' · '+t+'s');
|
||||
}catch(e){
|
||||
addMsg('out-code','Error: '+e.message,'a','error');
|
||||
}
|
||||
btn.disabled=false;
|
||||
}
|
||||
|
||||
// SEND ARENA (weval-arena pattern - multi-provider)
|
||||
async function sendArena(){
|
||||
const inp=document.getElementById('inp-arena');
|
||||
const text=inp.value.trim();
|
||||
if(!text) return;
|
||||
addMsg('out-arena',text,'u');
|
||||
inp.value='';
|
||||
const btn=document.getElementById('btn-arena');
|
||||
btn.disabled=true;
|
||||
const t0=Date.now();
|
||||
try{
|
||||
const res=await fetch('/api/wevia-multi-provider.php',{
|
||||
method:'POST',
|
||||
headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({message:text,mode:'auto',model:'auto'})
|
||||
});
|
||||
const d=await res.json();
|
||||
const t=((Date.now()-t0)/1000).toFixed(1);
|
||||
let out=d.content||d.response||d.result||d.text||d.answer||d.output||'';
|
||||
if(!out && typeof d==='object'){ out=extractText(d); }
|
||||
if(!out) out=JSON.stringify(d,null,2);
|
||||
addMsg('out-arena',humanize(out),'a',(d.provider||d.model||'auto')+' · '+t+'s');
|
||||
}catch(e){
|
||||
// Fallback: try master API
|
||||
try{
|
||||
const r2=await fetch('/api/wevia-master-api.php',{
|
||||
method:'POST',headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({message:text,session_id:'arena-'+Date.now()})
|
||||
});
|
||||
const d=await r2.json();
|
||||
addMsg('out-arena',d.response||JSON.stringify(d),'a','fallback-master');
|
||||
}catch(e2){
|
||||
addMsg('out-arena','All providers failed: '+e.message,'a','error');
|
||||
}
|
||||
}
|
||||
btn.disabled=false;
|
||||
}
|
||||
|
||||
// Load agents for orchestrator view
|
||||
async function loadAgents(){
|
||||
const box=document.getElementById('orch-agents');
|
||||
if(box.children.length>0) return;
|
||||
document.getElementById('s-orch-load').textContent='chargement...';
|
||||
try{
|
||||
const r=await fetch('/api/agents-catalog-api.php');
|
||||
const d=await r.json();
|
||||
document.getElementById('h-ag').textContent=d.total;
|
||||
document.getElementById('t-ag').textContent=d.total;
|
||||
document.getElementById('s-orch-cat').textContent=Object.keys(d.categories).length+' categories · '+d.total+' total';
|
||||
// Show top 60 core + claudecode + skills
|
||||
const priority=d.agents.filter(a=>['core','claudecode','skills','superclaude'].includes(a.cat));
|
||||
priority.slice(0,100).forEach(a=>{
|
||||
const e=document.createElement('div');
|
||||
e.className='orch-agent';
|
||||
e.title=a.desc||a.name;
|
||||
e.innerHTML='<span class="d"></span>'+a.name;
|
||||
box.appendChild(e);
|
||||
});
|
||||
document.getElementById('s-orch-load').textContent='('+priority.length+' priority affichés)';
|
||||
}catch(e){
|
||||
document.getElementById('s-orch-load').textContent='erreur chargement';
|
||||
}
|
||||
}
|
||||
|
||||
// Keyboard shortcuts
|
||||
document.querySelectorAll('.inp').forEach(i=>{
|
||||
i.addEventListener('keydown',e=>{
|
||||
if(e.key==='Enter'&&(e.ctrlKey||e.metaKey)){
|
||||
e.preventDefault();
|
||||
const view=i.closest('.view').id;
|
||||
if(view==='v-chat') sendChat();
|
||||
else if(view==='v-code') sendCode();
|
||||
else if(view==='v-arena') sendArena();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// V111-BLADE-ENRICH: live blade tasks stats + push actions
|
||||
async function refreshBladeStats(){
|
||||
try{
|
||||
const r=await fetch('/api/blade-task-create.php?k=WEVADS2026&action=list');
|
||||
const d=await r.json();
|
||||
const pending=(d.tasks||[]).filter(t=>t.status==='pending').length;
|
||||
const done=(d.tasks||[]).filter(t=>t.status==='done').length;
|
||||
const bp=document.getElementById('blade-pending');
|
||||
const bd=document.getElementById('blade-done');
|
||||
if(bp) bp.textContent=pending;
|
||||
if(bd) bd.textContent=done;
|
||||
}catch(e){
|
||||
const bp=document.getElementById('blade-pending');
|
||||
if(bp) bp.textContent='?';
|
||||
}
|
||||
}
|
||||
|
||||
async function pushBladeTask(goal, params){
|
||||
const log=document.getElementById('blade-log');
|
||||
if(log){log.style.display='block';log.innerHTML+='\n> Pushing task: '+goal+'...';}
|
||||
try{
|
||||
const fd=new FormData();
|
||||
fd.append('k','WEVADS2026');
|
||||
fd.append('action','create');
|
||||
fd.append('goal',goal);
|
||||
fd.append('params',JSON.stringify(params||{}));
|
||||
const r=await fetch('/api/blade-task-create.php',{method:'POST',body:fd});
|
||||
const d=await r.json();
|
||||
if(log){log.innerHTML+='\n> '+(d.ok?'\u2705 Task created: '+d.id:'\u274c '+(d.error||'failed'));log.scrollTop=log.scrollHeight;}
|
||||
setTimeout(refreshBladeStats,500);
|
||||
}catch(e){
|
||||
if(log) log.innerHTML+='\n> \u274c Error: '+e.message;
|
||||
}
|
||||
}
|
||||
|
||||
// auto-refresh blade stats every 30s when capabilities tab visible
|
||||
setInterval(()=>{ if(document.getElementById('v-caps').classList.contains('on')) refreshBladeStats(); },30000);
|
||||
setTimeout(refreshBladeStats, 1500);
|
||||
|
||||
// Live stats
|
||||
async function refreshStats(){
|
||||
try{
|
||||
const r=await fetch('/api/l99-honest.php?compact=1',{cache:'no-store'});
|
||||
const d=await r.json();
|
||||
if(d.nonreg) document.getElementById('h-nr').textContent=d.nonreg;
|
||||
}catch(e){}
|
||||
}
|
||||
refreshStats();
|
||||
setInterval(refreshStats,60000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,88 +1,88 @@
|
||||
{
|
||||
"Agile Maturity Assessor": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=AgileMaturity",
|
||||
"ArchScan": "https:\/\/robohash.org\/sunny-bot-6?set=set1&size=200x200",
|
||||
"Attribution Modeler": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Attribution",
|
||||
"Attrition Predictor": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Attrition",
|
||||
"Audit Trail Watcher": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=AuditTrail",
|
||||
"AutoFix": "https:\/\/robohash.org\/cute-bot-4?set=set1&size=200x200",
|
||||
"Blade": "https:\/\/robohash.org\/violet-droid?set=set1&size=200x200",
|
||||
"Budget Variance Watchdog": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=BudgetWatch",
|
||||
"CAC Optimizer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=CAC",
|
||||
"CAPA Closer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=CAPA",
|
||||
"CPQ AI": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=CPQ",
|
||||
"Carbon Tracker": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Carbon",
|
||||
"Cash Flow Predictor AI": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=CashFlow",
|
||||
"Cerebras": "https:\/\/robohash.org\/joy-mech-5?set=set1&size=200x200",
|
||||
"Churn Predictor": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Churn",
|
||||
"Collection AI Agent": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Collection",
|
||||
"Compliance Checker": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Compliance",
|
||||
"Consensus": "https:\/\/robohash.org\/cute-bot-6?set=set1&size=200x200",
|
||||
"Content Generator": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Content",
|
||||
"Contract Compliance": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Contract",
|
||||
"Contract Watcher": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=ContractWatch",
|
||||
"CrowdSec": "https:\/\/robohash.org\/smile-robot-1?set=set1&size=200x200",
|
||||
"DORA Metrics Agent": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=DORA",
|
||||
"DeerFlow": "https:\/\/robohash.org\/friendly-3?set=set1&size=200x200",
|
||||
"Definition of Done Auditor": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=DoD",
|
||||
"Demand Forecast Pro": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Demand",
|
||||
"Dependency Mapper": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Dependency",
|
||||
"DevOps": "https:\/\/robohash.org\/apt-device?set=set1&size=200x200",
|
||||
"Director": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=joy",
|
||||
"Dispatcher": "https:\/\/robohash.org\/muon-fly?set=set1&size=200x200",
|
||||
"Docker": "https:\/\/robohash.org\/smile-robot-3?set=set1&size=200x200",
|
||||
"Dunning Router": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Dunning",
|
||||
"Duplicate Payment Detector": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=DupPayment",
|
||||
"Ethica": "https:\/\/robohash.org\/mu-pulse?set=set1&size=200x200",
|
||||
"FX Hedger": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=FXHedger",
|
||||
"Fail2Ban": "https:\/\/robohash.org\/joy-mech-8?set=set1&size=200x200",
|
||||
"Fast Close Orchestrator": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=FastClose",
|
||||
"Fiability": "https:\/\/robohash.org\/friendly-2?set=set1&size=200x200",
|
||||
"Forecast AI": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Forecast",
|
||||
"Fraud Detection Agent": "https:\/\/robohash.org\/fraud-detect?set=set1&size=200x200",
|
||||
"GDPR Auditor": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=GDPR",
|
||||
"Groq": "https:\/\/robohash.org\/joy-mech-6?set=set1&size=200x200",
|
||||
"Incident Watcher": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Incident",
|
||||
"Invoice Auto-Match": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=InvoiceMatch",
|
||||
"Kanban Flow Optimizer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Kanban",
|
||||
"L99 Pilot": "https:\/\/robohash.org\/clever-bot?set=set1&size=200x200",
|
||||
"Lead Qualifier": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=LeadQual",
|
||||
"MFA Enforcer": "https:\/\/robohash.org\/mfa-enforcer?set=set1&size=200x200",
|
||||
"Master Router": "https:\/\/robohash.org\/sunny-bot-5?set=set1&size=200x200",
|
||||
"MiroFish": "https:\/\/robohash.org\/lambda-star?set=set1&size=200x200",
|
||||
"Monitor": "https:\/\/robohash.org\/sonic-rush?set=set1&size=200x200",
|
||||
"NPS Analyzer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=NPS",
|
||||
"NonReg": "https:\/\/robohash.org\/gluon-skip?set=set1&size=200x200",
|
||||
"OEE Live": "https:\/\/robohash.org\/oee-live?set=set1&size=200x200",
|
||||
"OKR Alignment Tracker": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=OKR",
|
||||
"OTD Optimizer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=OTD",
|
||||
"Ollama": "https:\/\/robohash.org\/joy-mech-7?set=set1&size=200x200",
|
||||
"Onboarding Bot": "https:\/\/robohash.org\/onboarding?set=set1&size=200x200",
|
||||
"PMTA": "https:\/\/robohash.org\/smile-robot-6?set=set1&size=200x200",
|
||||
"Paperclip": "https:\/\/robohash.org\/happy-bot-8?set=set1&size=200x200",
|
||||
"Patent Scanner": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Patent",
|
||||
"Payroll Accuracy AI": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Payroll",
|
||||
"Pipeline Scorer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=PipelineScore",
|
||||
"PoC Tracker": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=PoC",
|
||||
"Predictive Maintenance": "https:\/\/robohash.org\/predictive-maint?set=set1&size=200x200",
|
||||
"Product Owner Assistant": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=PO",
|
||||
"Quality AI Vision": "https:\/\/robohash.org\/quality-vision?set=set1&size=200x200",
|
||||
"Registry": "https:\/\/robohash.org\/friendly-7?set=set1&size=200x200",
|
||||
"Retrospective Analyzer": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Retro",
|
||||
"SAFe RTE Agent": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=RTE",
|
||||
"SambaNova": "https:\/\/robohash.org\/smile-robot-5?set=set1&size=200x200",
|
||||
"Scraper": "https:\/\/robohash.org\/taupe-cyborg?set=set1&size=200x200",
|
||||
"Scrum Master Copilot": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=ScrumMaster",
|
||||
"Security": "https:\/\/robohash.org\/silver-beam?set=set1&size=200x200",
|
||||
"Sentinel": "https:\/\/robohash.org\/happy-bot-4?set=set1&size=200x200",
|
||||
"Skills Matcher": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Skills",
|
||||
"Stockout Prevention": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Stockout",
|
||||
"Story Point Estimator AI": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=StoryPoint",
|
||||
"Supplier Risk Monitor": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Supplier",
|
||||
"Sustainability Reporter": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Sustain",
|
||||
"Takt Time Monitor": "https:\/\/robohash.org\/takt-time?set=set1&size=200x200",
|
||||
"Talent Scout": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Talent",
|
||||
"Tax Validator": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=TaxValid",
|
||||
"Velocity Tracker AI": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=Velocity",
|
||||
"WEVCODE": "https:\/\/robohash.org\/scarlet-mech?set=set1&size=200x200",
|
||||
"WEVIA Master": "https:\/\/api.dicebear.com\/9.x\/adventurer\/svg?seed=nova"
|
||||
"Agile Maturity Assessor": "https://api.dicebear.com/9.x/adventurer/svg?seed=AgileMaturity",
|
||||
"ArchScan": "https://api.dicebear.com/9.x/adventurer/svg?seed=ArchScan",
|
||||
"Attribution Modeler": "https://api.dicebear.com/9.x/adventurer/svg?seed=Attribution",
|
||||
"Attrition Predictor": "https://api.dicebear.com/9.x/adventurer/svg?seed=Attrition",
|
||||
"Audit Trail Watcher": "https://api.dicebear.com/9.x/adventurer/svg?seed=AuditTrail",
|
||||
"AutoFix": "https://api.dicebear.com/9.x/adventurer/svg?seed=AutoFix",
|
||||
"Blade": "https://api.dicebear.com/9.x/adventurer/svg?seed=Blade",
|
||||
"Budget Variance Watchdog": "https://api.dicebear.com/9.x/adventurer/svg?seed=BudgetWatch",
|
||||
"CAC Optimizer": "https://api.dicebear.com/9.x/adventurer/svg?seed=CAC",
|
||||
"CAPA Closer": "https://api.dicebear.com/9.x/adventurer/svg?seed=CAPA",
|
||||
"CPQ AI": "https://api.dicebear.com/9.x/adventurer/svg?seed=CPQ",
|
||||
"Carbon Tracker": "https://api.dicebear.com/9.x/adventurer/svg?seed=Carbon",
|
||||
"Cash Flow Predictor AI": "https://api.dicebear.com/9.x/adventurer/svg?seed=CashFlow",
|
||||
"Cerebras": "https://api.dicebear.com/9.x/adventurer/svg?seed=Cerebras",
|
||||
"Churn Predictor": "https://api.dicebear.com/9.x/adventurer/svg?seed=Churn",
|
||||
"Collection AI Agent": "https://api.dicebear.com/9.x/adventurer/svg?seed=Collection",
|
||||
"Compliance Checker": "https://api.dicebear.com/9.x/adventurer/svg?seed=Compliance",
|
||||
"Consensus": "https://api.dicebear.com/9.x/adventurer/svg?seed=Consensus",
|
||||
"Content Generator": "https://api.dicebear.com/9.x/adventurer/svg?seed=Content",
|
||||
"Contract Compliance": "https://api.dicebear.com/9.x/adventurer/svg?seed=Contract",
|
||||
"Contract Watcher": "https://api.dicebear.com/9.x/adventurer/svg?seed=ContractWatch",
|
||||
"CrowdSec": "https://api.dicebear.com/9.x/adventurer/svg?seed=CrowdSec",
|
||||
"DORA Metrics Agent": "https://api.dicebear.com/9.x/adventurer/svg?seed=DORA",
|
||||
"DeerFlow": "https://api.dicebear.com/9.x/adventurer/svg?seed=DeerFlow",
|
||||
"Definition of Done Auditor": "https://api.dicebear.com/9.x/adventurer/svg?seed=DoD",
|
||||
"Demand Forecast Pro": "https://api.dicebear.com/9.x/adventurer/svg?seed=Demand",
|
||||
"Dependency Mapper": "https://api.dicebear.com/9.x/adventurer/svg?seed=Dependency",
|
||||
"DevOps": "https://api.dicebear.com/9.x/adventurer/svg?seed=DevOps",
|
||||
"Director": "https://api.dicebear.com/9.x/adventurer/svg?seed=joy",
|
||||
"Dispatcher": "https://api.dicebear.com/9.x/adventurer/svg?seed=Dispatcher",
|
||||
"Docker": "https://api.dicebear.com/9.x/adventurer/svg?seed=Docker",
|
||||
"Dunning Router": "https://api.dicebear.com/9.x/adventurer/svg?seed=Dunning",
|
||||
"Duplicate Payment Detector": "https://api.dicebear.com/9.x/adventurer/svg?seed=DupPayment",
|
||||
"Ethica": "https://api.dicebear.com/9.x/adventurer/svg?seed=Ethica",
|
||||
"FX Hedger": "https://api.dicebear.com/9.x/adventurer/svg?seed=FXHedger",
|
||||
"Fail2Ban": "https://api.dicebear.com/9.x/adventurer/svg?seed=Fail2Ban",
|
||||
"Fast Close Orchestrator": "https://api.dicebear.com/9.x/adventurer/svg?seed=FastClose",
|
||||
"Fiability": "https://api.dicebear.com/9.x/adventurer/svg?seed=Fiability",
|
||||
"Forecast AI": "https://api.dicebear.com/9.x/adventurer/svg?seed=Forecast",
|
||||
"Fraud Detection Agent": "https://api.dicebear.com/9.x/adventurer/svg?seed=FraudDetectionAgent",
|
||||
"GDPR Auditor": "https://api.dicebear.com/9.x/adventurer/svg?seed=GDPR",
|
||||
"Groq": "https://api.dicebear.com/9.x/adventurer/svg?seed=Groq",
|
||||
"Incident Watcher": "https://api.dicebear.com/9.x/adventurer/svg?seed=Incident",
|
||||
"Invoice Auto-Match": "https://api.dicebear.com/9.x/adventurer/svg?seed=InvoiceMatch",
|
||||
"Kanban Flow Optimizer": "https://api.dicebear.com/9.x/adventurer/svg?seed=Kanban",
|
||||
"L99 Pilot": "https://api.dicebear.com/9.x/adventurer/svg?seed=L99Pilot",
|
||||
"Lead Qualifier": "https://api.dicebear.com/9.x/adventurer/svg?seed=LeadQual",
|
||||
"MFA Enforcer": "https://api.dicebear.com/9.x/adventurer/svg?seed=MFAEnforcer",
|
||||
"Master Router": "https://api.dicebear.com/9.x/adventurer/svg?seed=MasterRouter",
|
||||
"MiroFish": "https://api.dicebear.com/9.x/adventurer/svg?seed=MiroFish",
|
||||
"Monitor": "https://api.dicebear.com/9.x/adventurer/svg?seed=Monitor",
|
||||
"NPS Analyzer": "https://api.dicebear.com/9.x/adventurer/svg?seed=NPS",
|
||||
"NonReg": "https://api.dicebear.com/9.x/adventurer/svg?seed=NonReg",
|
||||
"OEE Live": "https://api.dicebear.com/9.x/adventurer/svg?seed=OEELive",
|
||||
"OKR Alignment Tracker": "https://api.dicebear.com/9.x/adventurer/svg?seed=OKR",
|
||||
"OTD Optimizer": "https://api.dicebear.com/9.x/adventurer/svg?seed=OTD",
|
||||
"Ollama": "https://api.dicebear.com/9.x/adventurer/svg?seed=Ollama",
|
||||
"Onboarding Bot": "https://api.dicebear.com/9.x/adventurer/svg?seed=OnboardingBot",
|
||||
"PMTA": "https://api.dicebear.com/9.x/adventurer/svg?seed=PMTA",
|
||||
"Paperclip": "https://api.dicebear.com/9.x/adventurer/svg?seed=Paperclip",
|
||||
"Patent Scanner": "https://api.dicebear.com/9.x/adventurer/svg?seed=Patent",
|
||||
"Payroll Accuracy AI": "https://api.dicebear.com/9.x/adventurer/svg?seed=Payroll",
|
||||
"Pipeline Scorer": "https://api.dicebear.com/9.x/adventurer/svg?seed=PipelineScore",
|
||||
"PoC Tracker": "https://api.dicebear.com/9.x/adventurer/svg?seed=PoC",
|
||||
"Predictive Maintenance": "https://api.dicebear.com/9.x/adventurer/svg?seed=PredictiveMaintenance",
|
||||
"Product Owner Assistant": "https://api.dicebear.com/9.x/adventurer/svg?seed=PO",
|
||||
"Quality AI Vision": "https://api.dicebear.com/9.x/adventurer/svg?seed=QualityAIVision",
|
||||
"Registry": "https://api.dicebear.com/9.x/adventurer/svg?seed=Registry",
|
||||
"Retrospective Analyzer": "https://api.dicebear.com/9.x/adventurer/svg?seed=Retro",
|
||||
"SAFe RTE Agent": "https://api.dicebear.com/9.x/adventurer/svg?seed=RTE",
|
||||
"SambaNova": "https://api.dicebear.com/9.x/adventurer/svg?seed=SambaNova",
|
||||
"Scraper": "https://api.dicebear.com/9.x/adventurer/svg?seed=Scraper",
|
||||
"Scrum Master Copilot": "https://api.dicebear.com/9.x/adventurer/svg?seed=ScrumMaster",
|
||||
"Security": "https://api.dicebear.com/9.x/adventurer/svg?seed=Security",
|
||||
"Sentinel": "https://api.dicebear.com/9.x/adventurer/svg?seed=Sentinel",
|
||||
"Skills Matcher": "https://api.dicebear.com/9.x/adventurer/svg?seed=Skills",
|
||||
"Stockout Prevention": "https://api.dicebear.com/9.x/adventurer/svg?seed=Stockout",
|
||||
"Story Point Estimator AI": "https://api.dicebear.com/9.x/adventurer/svg?seed=StoryPoint",
|
||||
"Supplier Risk Monitor": "https://api.dicebear.com/9.x/adventurer/svg?seed=Supplier",
|
||||
"Sustainability Reporter": "https://api.dicebear.com/9.x/adventurer/svg?seed=Sustain",
|
||||
"Takt Time Monitor": "https://api.dicebear.com/9.x/adventurer/svg?seed=TaktTimeMonitor",
|
||||
"Talent Scout": "https://api.dicebear.com/9.x/adventurer/svg?seed=Talent",
|
||||
"Tax Validator": "https://api.dicebear.com/9.x/adventurer/svg?seed=TaxValid",
|
||||
"Velocity Tracker AI": "https://api.dicebear.com/9.x/adventurer/svg?seed=Velocity",
|
||||
"WEVCODE": "https://api.dicebear.com/9.x/adventurer/svg?seed=WEVCODE",
|
||||
"WEVIA Master": "https://api.dicebear.com/9.x/adventurer/svg?seed=nova"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-20T21:00:01+02:00",
|
||||
"disk_pct": 78,
|
||||
"ts": "2026-04-21T03:00:01+02:00",
|
||||
"disk_pct": 79,
|
||||
"disk_free_gb": 32,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 21,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-20T21:00:04+02:00",
|
||||
"ts": "2026-04-21T03:15:03+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"routes": 445,
|
||||
"skills": 835,
|
||||
"wiki": 1855,
|
||||
"pages": 288,
|
||||
"wiki": 1861,
|
||||
"pages": 292,
|
||||
"apis": 246,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-20 16:00"
|
||||
"timestamp": "2026-04-20 22:00"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-20 12:00",
|
||||
"timestamp": "2026-04-21 00:00",
|
||||
"analysis": {
|
||||
"existing_skills": 835,
|
||||
"missing": 15,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-20T21:00:01+02:00",
|
||||
"ts": "2026-04-21T03:00:01+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 9,
|
||||
"adoption_pct": 60,
|
||||
"features_used_24h": 10,
|
||||
"adoption_pct": 66,
|
||||
"chat_queries_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 21,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-20T21:10:02+02:00",
|
||||
"ts": "2026-04-21T03:10:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-20T21:00:02+02:00",
|
||||
"ts": "2026-04-21T03:00:02+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-20T16:00:01+02:00",
|
||||
"ts": "2026-04-21T00:00:01+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
@@ -10,10 +10,10 @@
|
||||
"action": "Yacine envoie via Gmail ymahboub@weval-consulting.com"
|
||||
},
|
||||
"ethica_renewal_Q1": {
|
||||
"days_to_Q1_end": -20,
|
||||
"days_to_Q1_end": -21,
|
||||
"amount_keur": 280,
|
||||
"urgency": "CRITICAL",
|
||||
"action": "Close contrat avec Kaouther Najar avant -20 jours"
|
||||
"action": "Close contrat avec Kaouther Najar avant -21 jours"
|
||||
},
|
||||
"sourcing_39_emails_linkedin": {
|
||||
"count": 39,
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
{
|
||||
"ts": "2026-04-20T03:00:02.484261",
|
||||
"v2_entries": 192,
|
||||
"missing_count": 0,
|
||||
"missing_agents": [],
|
||||
"status": "OK"
|
||||
"ts": "2026-04-21T03:00:03.321261",
|
||||
"v2_entries": 775,
|
||||
"missing_count": 1,
|
||||
"missing_agents": [
|
||||
"Wiki"
|
||||
],
|
||||
"status": "WARN"
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-20T21:00:03+02:00",
|
||||
"ts": "2026-04-21T03:00:04+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 17,
|
||||
"residual_risk_pct": 83,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 80,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "3.17",
|
||||
"load_5min": "5.31",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-20 20:00",
|
||||
"timestamp": "2026-04-21 02:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 19,
|
||||
"disk": "78%",
|
||||
"ram": "12Gi/30Gi",
|
||||
"load": "0.52",
|
||||
"uptime": "up 6 days, 8 hours, 8 minutes"
|
||||
"disk": "79%",
|
||||
"ram": "11Gi/30Gi",
|
||||
"load": "8.71",
|
||||
"uptime": "up 6 days, 14 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -95,7 +95,7 @@
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 18 hours (healthy)",
|
||||
"status": "Up 24 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -475,7 +475,7 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 288
|
||||
"count": 292
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 91
|
||||
@@ -484,7 +484,7 @@
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 1855
|
||||
"entries": 1884
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-20T18:00:01.970709",
|
||||
"generated_at": "2026-04-21T00:00:04.387854",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 16,
|
||||
|
||||
@@ -27,7 +27,13 @@ $agents = [
|
||||
["name"=>"Hermes Agent","desc"=>"26 skills automation","cat"=>"core","status"=>"ready","icon"=>"⚡"],
|
||||
["name"=>"L99 Agent","desc"=>"177 pages 1236 wiki","cat"=>"core","status"=>"ready","icon"=>"📊"],
|
||||
["name"=>"Playwright Agent","desc"=>"16/16 visual tests","cat"=>"core","status"=>"ready","icon"=>"🎭"],
|
||||
|
||||
["name"=>"Multi-Agent Orchestrator","desc"=>"15 agents parallel SSE, V102 regex, natural language V103","cat"=>"core","status"=>"ready","icon"=>""],
|
||||
["name"=>"Training Hub","desc"=>"Fine-tune HF yace222/weval-brain-v4, Qdrant KB, cognitive-opus46 635 functions","cat"=>"core","status"=>"ready","icon"=>""],
|
||||
["name"=>"All-IA Hub","desc"=>"Combines wevia-master + wevcode + arena + opus-replacement streaming","cat"=>"core","status"=>"ready","icon"=>""],
|
||||
["name"=>"WEVIA Master Streaming","desc"=>"SSE getReader timeout 1h, multi-agent, tool exec, session+files","cat"=>"core","status"=>"ready","icon"=>""],
|
||||
["name"=>"Arena Multi-Provider","desc"=>"14 providers cascade: cerebras/groq/gemini/sambanova/nvidia/mistral/hf/openrouter/github/cf","cat"=>"core","status"=>"ready","icon"=>""],
|
||||
|
||||
|
||||
// OH-MY-CLAUDECODE AGENTS (19)
|
||||
["name"=>"Architect","desc"=>"System design, boundaries, interfaces","cat"=>"claudecode","status"=>"ready","icon"=>"🏗️"],
|
||||
["name"=>"Executor","desc"=>"Code implementation, refactoring","cat"=>"claudecode","status"=>"ready","icon"=>"⚙️"],
|
||||
@@ -78,6 +84,37 @@ foreach ($skills as $s) {
|
||||
$agents[] = ["name"=>"Skill: $s","desc"=>"oh-my-claudecode workflow","cat"=>"skills","status"=>"ready","icon"=>"⚡"];
|
||||
}
|
||||
|
||||
// V101 BUSINESS AGENTS - parse enterprise-model.html AG variable (572 agents post-V93)
|
||||
$em_path = "/var/www/html/enterprise-model.html";
|
||||
if (file_exists($em_path)) {
|
||||
$em = file_get_contents($em_path);
|
||||
// Extract agent names: {n:'Agent Name',rm:'dept',...
|
||||
preg_match_all("/\{n:'([^']+)',rm:'([^']+)'/", $em, $m);
|
||||
$added_biz = 0;
|
||||
$seen = [];
|
||||
for ($i = 0; $i < count($m[1]); $i++) {
|
||||
$name = $m[1][$i];
|
||||
$dept = $m[2][$i];
|
||||
if ($dept === "dead") continue; // Skip dead agents (V93 fix)
|
||||
if (isset($seen[$name])) continue; // Dedup
|
||||
$seen[$name] = 1;
|
||||
$agents[] = ["name" => $name, "desc" => "Business agent - dept: $dept", "cat" => "business", "status" => "ready", "icon" => ""];
|
||||
$added_biz++;
|
||||
}
|
||||
// Also parse big4 domains
|
||||
$big4 = "/var/www/html/wevia-em-big4.html";
|
||||
if (file_exists($big4)) {
|
||||
$b = file_get_contents($big4);
|
||||
preg_match_all("/\{n:'([^']+)'/", $b, $mb);
|
||||
foreach (array_unique($mb[1]) as $dom) {
|
||||
if (!isset($seen[$dom])) {
|
||||
$agents[] = ["name" => "Big4: $dom", "desc" => "Big4 Enterprise Model domain", "cat" => "big4", "status" => "ready", "icon" => ""];
|
||||
$seen[$dom] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Categories count
|
||||
$cats = [];
|
||||
foreach ($agents as $a) $cats[$a["cat"]] = ($cats[$a["cat"]] ?? 0) + 1;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-20T16:00:04+00:00",
|
||||
"compute_ms": 2323,
|
||||
"timestamp": "2026-04-20T22:00:05+00:00",
|
||||
"compute_ms": 3485,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -19,12 +19,12 @@
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 514,
|
||||
"latency_ms": 935,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 771,
|
||||
"latency_ms": 1126,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
|
||||
65
api/andon-drilldown.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
// V9.47 Andon Drilldown API · doctrine #13 root cause visibility
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
$host = "127.0.0.1";
|
||||
$port = "5432";
|
||||
$db = "adx_system";
|
||||
$user = "admin";
|
||||
$pass = "admin123";
|
||||
|
||||
putenv("PGPASSWORD=$pass");
|
||||
|
||||
$sql = "SELECT id, station, severity, message, status, created_at::text, resolved_at::text, triggered_by, resolved_by, owner, resolution_path FROM weval.andon_alerts ORDER BY status='open' DESC, severity, created_at DESC LIMIT 50";
|
||||
$cmd = "psql -h $host -p $port -U $user -d $db -At -F'|' -c " . escapeshellarg($sql) . " 2>&1";
|
||||
$out = shell_exec($cmd);
|
||||
|
||||
$rows = [];
|
||||
foreach (explode("\n", trim($out)) as $line) {
|
||||
if (empty($line)) continue;
|
||||
$f = explode("|", $line);
|
||||
if (count($f) < 11) continue;
|
||||
$rows[] = [
|
||||
"id" => $f[0],
|
||||
"station" => $f[1],
|
||||
"severity" => $f[2],
|
||||
"message" => $f[3],
|
||||
"status" => $f[4],
|
||||
"created_at" => $f[5],
|
||||
"resolved_at" => $f[6],
|
||||
"triggered_by" => $f[7],
|
||||
"resolved_by" => $f[8],
|
||||
"owner" => $f[9],
|
||||
"resolution_path" => $f[10],
|
||||
"drilldown_info" => drilldown_info($f[1])
|
||||
];
|
||||
}
|
||||
|
||||
function drilldown_info($station) {
|
||||
$map = [
|
||||
"cash-OKP4" => ["type"=>"commercial", "action"=>"Relance facture Yacine", "contact"=>"Kaouther/OKP4", "url"=>"/wevia-life-app/crm"],
|
||||
"sales-vistex" => ["type"=>"commercial", "action"=>"Email Olga Vistex addendum", "contact"=>"Olga Vistex", "url"=>"/wevia-life-app/deals"],
|
||||
"saas-churn" => ["type"=>"seed_data", "action"=>"Fake seed resolved doctrine 4", "contact"=>"N/A", "url"=>null, "note"=>"Not real business data"],
|
||||
"blade-agent-exec" => ["type"=>"infra", "action"=>"Restart via intent blade_wake or wevia_blade_restart", "contact"=>"Yacineutt Windows", "url"=>"/api/blade-agent.php"],
|
||||
"cybersec-nuclei" => ["type"=>"infra", "action"=>"V9.41 scan = 0 findings", "contact"=>"N/A", "url"=>"/api/nuclei-scanner.php"],
|
||||
"Apps" => ["type"=>"infra", "action"=>"V9.43 symlinks fix", "contact"=>"N/A", "url"=>"/"],
|
||||
"EM-Platform" => ["type"=>"infra", "action"=>"V9.46 investigating", "contact"=>"N/A", "url"=>null],
|
||||
"dispensation-station-3" => ["type"=>"ethica", "action"=>"Scanner fallback manuel", "contact"=>"N/A", "url"=>"/ethica-hub.html"]
|
||||
];
|
||||
return $map[$station] ?? ["type"=>"unknown", "action"=>"Investigate", "contact"=>"TBD", "url"=>null];
|
||||
}
|
||||
|
||||
$open = array_filter($rows, fn($r) => $r["status"] === "open");
|
||||
$summary = [
|
||||
"ok" => true,
|
||||
"ts" => date("c"),
|
||||
"source" => "adx_system.weval.andon_alerts",
|
||||
"total" => count($rows),
|
||||
"open" => count($open),
|
||||
"resolved" => count($rows) - count($open),
|
||||
"drilldown_map_version" => "v9.47",
|
||||
"alerts" => $rows
|
||||
];
|
||||
|
||||
echo json_encode($summary, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-20 19:00:02",
|
||||
"generated": "2026-04-21 01:00:01",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 78,
|
||||
"disk_pct": 79,
|
||||
"disk_avail": "32G",
|
||||
"uptime": "up 6 days, 9 hours, 8 minutes",
|
||||
"uptime": "up 6 days, 15 hours, 8 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -86,7 +86,7 @@
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -116,7 +116,7 @@
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 19 hours (healthy)",
|
||||
"status": "Up 25 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -141,6 +141,16 @@
|
||||
"php-session_paths": false,
|
||||
"auth_complete": false
|
||||
},
|
||||
{
|
||||
"file": "arsenal.weval-consulting.com",
|
||||
"server_names": [
|
||||
"arsenal.weval-consulting.com"
|
||||
],
|
||||
"ssl": true,
|
||||
"php-session": false,
|
||||
"php-session_paths": false,
|
||||
"auth_complete": false
|
||||
},
|
||||
{
|
||||
"file": "code-weval",
|
||||
"server_names": [
|
||||
@@ -252,26 +262,6 @@
|
||||
"php-session_paths": false,
|
||||
"auth_complete": false
|
||||
},
|
||||
{
|
||||
"file": "wevads.weval-consulting.com.gold-16avr-pre-fallback",
|
||||
"server_names": [
|
||||
"wevads.weval-consulting.com"
|
||||
],
|
||||
"ssl": true,
|
||||
"php-session": false,
|
||||
"php-session_paths": false,
|
||||
"auth_complete": false
|
||||
},
|
||||
{
|
||||
"file": "wevads.weval-consulting.com.gold-pre-v25",
|
||||
"server_names": [
|
||||
"wevads.weval-consulting.com"
|
||||
],
|
||||
"ssl": true,
|
||||
"php-session": false,
|
||||
"php-session_paths": false,
|
||||
"auth_complete": false
|
||||
},
|
||||
{
|
||||
"file": "weval-consulting",
|
||||
"server_names": [
|
||||
@@ -285,10 +275,10 @@
|
||||
}
|
||||
],
|
||||
"screens": {
|
||||
"s204_html": 288,
|
||||
"s204_html": 293,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 756,
|
||||
"s204_wevia_php": 20,
|
||||
"s204_api_php": 769,
|
||||
"s204_wevia_php": 23,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
},
|
||||
@@ -311,7 +301,7 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5507,
|
||||
"kb_learnings": 5518,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -611,7 +601,7 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5507,
|
||||
"total_entries": 5518,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
@@ -619,7 +609,7 @@
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1179"
|
||||
"cnt": "1190"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1719,11 +1709,11 @@
|
||||
"fast_lines": 3620,
|
||||
"router_lines": 6152,
|
||||
"router_functions": 17,
|
||||
"today_requests": 0,
|
||||
"today_requests": 4,
|
||||
"today_cost": 0,
|
||||
"avg_latency_ms": 0,
|
||||
"top_provider": "N\/A",
|
||||
"providers_used": 0
|
||||
"avg_latency_ms": 1832,
|
||||
"top_provider": "cerebras",
|
||||
"providers_used": 2
|
||||
},
|
||||
"optimizations": {
|
||||
"recent_commits": [],
|
||||
@@ -1955,7 +1945,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 2917,
|
||||
"scan_time_ms": 6127,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"test": "biz-scenario-v9.29-extended",
|
||||
"timestamp": "2026-04-20T15-05-53",
|
||||
"timestamp": "2026-04-20T23-38-38",
|
||||
"pages": [
|
||||
{
|
||||
"name": "wtp",
|
||||
"url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 6369,
|
||||
"ms": 5546,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
|
||||
"found": [
|
||||
@@ -15,13 +15,13 @@
|
||||
"Accueil",
|
||||
"NR "
|
||||
],
|
||||
"content_size": 312795
|
||||
"content_size": 313155
|
||||
},
|
||||
{
|
||||
"name": "erp-gap-fill",
|
||||
"url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3844,
|
||||
"ms": 3854,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"found": [
|
||||
@@ -36,7 +36,7 @@
|
||||
"name": "infra-tour",
|
||||
"url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3169,
|
||||
"ms": 3184,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"found": [
|
||||
@@ -51,7 +51,7 @@
|
||||
"name": "wevia-master",
|
||||
"url": "https://weval-consulting.com/wevia-master.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3656,
|
||||
"ms": 3615,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/wevia-master.html?dev=1",
|
||||
"found": [
|
||||
@@ -64,7 +64,7 @@
|
||||
"name": "ethica-hub",
|
||||
"url": "https://weval-consulting.com/ethica-hub.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3882,
|
||||
"ms": 3881,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/ethica-hub.html?dev=1",
|
||||
"found": [
|
||||
@@ -73,13 +73,13 @@
|
||||
"161",
|
||||
"51K"
|
||||
],
|
||||
"content_size": 32827
|
||||
"content_size": 32822
|
||||
},
|
||||
{
|
||||
"name": "enterprise-model",
|
||||
"url": "https://weval-consulting.com/enterprise-model.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 4165,
|
||||
"ms": 4110,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/enterprise-model.html?dev=1",
|
||||
"found": [
|
||||
@@ -92,7 +92,7 @@
|
||||
"name": "growth-engine",
|
||||
"url": "https://weval-consulting.com/growth-engine-v2.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 5103,
|
||||
"ms": 5134,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/growth-engine-v2.html?dev=1",
|
||||
"found": [
|
||||
@@ -109,7 +109,7 @@
|
||||
"name": "agents-archi",
|
||||
"url": "https://weval-consulting.com/agents-archi.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 5103,
|
||||
"ms": 5102,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/agents-archi.html?dev=1",
|
||||
"found": [
|
||||
@@ -120,21 +120,21 @@
|
||||
"content_size": 3843
|
||||
}
|
||||
],
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-20T15-05-53.webm",
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-20T23-38-38.webm",
|
||||
"screenshots": [
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-wtp.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-wevia-master.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-ethica-hub.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-enterprise-model.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-growth-engine.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T15-05-53-agents-archi.png"
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-wtp.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-wevia-master.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-ethica-hub.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-enterprise-model.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-growth-engine.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T23-38-38-agents-archi.png"
|
||||
],
|
||||
"duration_ms": 36245,
|
||||
"duration_ms": 34882,
|
||||
"status": "100%",
|
||||
"pass": 8,
|
||||
"total": 8,
|
||||
"pct": 100,
|
||||
"video_size": 1772947
|
||||
"video_size": 1736030
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"generated_at": "2026-04-20T21:10:01.464277",
|
||||
"generated_at": "2026-04-21T03:15:01.763650",
|
||||
"stats": {
|
||||
"total": 35,
|
||||
"pending": 20,
|
||||
"total": 39,
|
||||
"pending": 26,
|
||||
"kaouther_surfaced": 18,
|
||||
"chrome_surfaced": 2,
|
||||
"notif_only_done": 0,
|
||||
"autofix_archived": 0,
|
||||
"cerebras_archived": 0,
|
||||
"older_3d_archived": 0,
|
||||
"unknown": 0,
|
||||
"unknown": 3,
|
||||
"errors": 0
|
||||
},
|
||||
"actions": [
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-20T21:00:02.117643",
|
||||
"last_heartbeat": "2026-04-20T21:00:02.117643",
|
||||
"last_heartbeat_ts_epoch": 1776711602,
|
||||
"ts": "2026-04-21T03:15:01.896236",
|
||||
"last_heartbeat": "2026-04-21T03:15:01.896236",
|
||||
"last_heartbeat_ts_epoch": 1776734101,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
51
api/blade-task-create.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
/**
|
||||
* V111 - Blade Task Creator - WEVIA chat pilote Blade via tasks
|
||||
* POST /api/blade-task-create.php with key=WEVADS2026 and action+params
|
||||
* Writes /var/www/html/api/blade-tasks/task_<ts>.json for blade-poll
|
||||
*/
|
||||
header('Content-Type: application/json');
|
||||
$k = $_POST['k'] ?? $_GET['k'] ?? '';
|
||||
if ($k !== 'WEVADS2026') { http_response_code(403); die(json_encode(['error'=>'auth'])); }
|
||||
|
||||
$action = $_POST['action'] ?? $_GET['action'] ?? '';
|
||||
$DIR = '/var/www/html/api/blade-tasks';
|
||||
if (!is_dir($DIR)) @mkdir($DIR, 0755, true);
|
||||
|
||||
if ($action === 'list') {
|
||||
$files = glob("$DIR/task_*.json");
|
||||
sort($files);
|
||||
$out = [];
|
||||
foreach ($files as $f) {
|
||||
$d = @json_decode(@file_get_contents($f), true);
|
||||
if ($d) $out[] = ['file'=>basename($f),'status'=>$d['status']??'?','goal'=>$d['goal']??'?','created'=>$d['created']??'?'];
|
||||
}
|
||||
echo json_encode(['tasks'=>$out,'count'=>count($out)]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === 'create') {
|
||||
$goal = $_POST['goal'] ?? $_GET['goal'] ?? '';
|
||||
$params = $_POST['params'] ?? $_GET['params'] ?? '{}';
|
||||
$priority = $_POST['priority'] ?? 'normal';
|
||||
if (!$goal) { http_response_code(400); die(json_encode(['error'=>'missing goal'])); }
|
||||
|
||||
$ts = date('Ymd-His');
|
||||
$id = 'blade_'.$ts.'_'.substr(md5($goal.mt_rand()),0,6);
|
||||
$task = [
|
||||
'id'=>$id,
|
||||
'goal'=>$goal,
|
||||
'params'=>json_decode($params,true) ?: [],
|
||||
'priority'=>$priority,
|
||||
'status'=>'pending',
|
||||
'created'=>date('c'),
|
||||
'source'=>'wevia-master-chat'
|
||||
];
|
||||
$file = "$DIR/task_$id.json";
|
||||
$ok = @file_put_contents($file, json_encode($task, JSON_PRETTY_PRINT));
|
||||
if ($ok === false) { http_response_code(500); die(json_encode(['error'=>'write failed'])); }
|
||||
echo json_encode(['ok'=>true,'id'=>$id,'file'=>basename($file),'task'=>$task]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode(['error'=>'unknown action','available'=>['list','create']]);
|
||||
@@ -1,7 +1,7 @@
|
||||
# WEVIA Master — System Documentation
|
||||
Generated: Mon Apr 20 12:00:02 PM CEST 2026
|
||||
Generated: Tue Apr 21 12:00:03 AM CEST 2026
|
||||
|
||||
## APIs (243)
|
||||
## APIs (246)
|
||||
wevia-action-engine.php
|
||||
wevia-actions.php
|
||||
wevia-admin-crm-bridge.php
|
||||
@@ -35,6 +35,7 @@ wevia-auto-heal.php
|
||||
wevia-auto-intent.php
|
||||
wevia-autonomous.php
|
||||
wevia-autonomy-controller.php
|
||||
wevia-autonomy-dashboard.php
|
||||
wevia-autowire-agent.php
|
||||
wevia-autowire.php
|
||||
wevia-azure-reregister-intent.php
|
||||
@@ -175,6 +176,7 @@ wevia-run-tests.php
|
||||
wevia-safe-ops.php
|
||||
wevia-safe-write.php
|
||||
wevia-security-fortress.php
|
||||
wevia-self-diagnostic-intent.php
|
||||
wevia-self-edit.php
|
||||
wevia-send-kaouther-intent.php
|
||||
wevia-services-live.php
|
||||
@@ -199,6 +201,7 @@ wevia-tools.php
|
||||
wevia-tools-router.php
|
||||
wevia-tool-test.php
|
||||
wevia-track-s95-prompt-intent.php
|
||||
wevia-truth-api.php
|
||||
wevia-truth-builder.php
|
||||
wevia-unified-api.php
|
||||
wevia-unified.php
|
||||
@@ -291,7 +294,7 @@ wevia-ux-agent.py
|
||||
wevia-webchat-api.py
|
||||
wevia-webwide.py
|
||||
|
||||
## Crons (74)
|
||||
## Crons (78)
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-blade-ctl.sh status >> /var/log/wevia-blade.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-pilot.sh
|
||||
*/10 * * * * php /var/www/html/api/wevia-quality-agent.php > /dev/null 2>&1
|
||||
@@ -358,15 +361,19 @@ wevia-webwide.py
|
||||
*/15 * * * * python3 /opt/weval-ops/andon-monitor.py >> /var/log/weval-andon.log 2>&1
|
||||
55 23 * * * /opt/weval-ops/kpi-snapshot.sh >> /var/log/weval-kpi-snapshot.log 2>&1
|
||||
0 2 * * * /usr/bin/python3 /opt/weval-ops/kpi-snapshot-daily.py >> /var/log/weval/kpi-daily.log 2>&1
|
||||
*/5 * * * * /opt/weval-l99/infra-guardian.sh
|
||||
*/15 * * * * curl -s -o /dev/null http://127.0.0.1/api/v97-linkedin-control.php?action=auto_publish_due # v97-linkedin-control
|
||||
*/20 * * * * /usr/bin/curl -s -o /dev/null http://127.0.0.1/api/v97-linkedin-control.php?action=browser_publish_due >> /var/log/v98-cron.log 2>&1 # v98-browser-cron
|
||||
0 */12 * * * /usr/bin/curl -s -o /dev/null http://127.0.0.1/api/v97-linkedin-control.php?action=v99_auto_login >> /tmp/v99-cron.log 2>&1 # v99-auto-login
|
||||
|
||||
## Ollama Models
|
||||
|
||||
## Docker (19 containers)
|
||||
loki Up 3 days
|
||||
loki Up 4 days
|
||||
listmonk Up 4 days
|
||||
plausible-plausible-1 Up 2 days
|
||||
plausible-plausible-db-1 Up 2 days
|
||||
plausible-plausible-events-db-1 Up 2 days
|
||||
plausible-plausible-1 Up 3 days
|
||||
plausible-plausible-db-1 Up 3 days
|
||||
plausible-plausible-events-db-1 Up 3 days
|
||||
n8n-docker-n8n-1 Up 4 days
|
||||
mattermost-docker-mm-db-1 Up 4 days
|
||||
mattermost-docker-mattermost-1 Up 4 days (healthy)
|
||||
|
||||
1
api/blade-tasks/dynamic-1776717544.json
Normal file
@@ -0,0 +1 @@
|
||||
{"id":"dynamic-1776717544","type":"dynamic_wire","msg":"multiagent wire kpi test","created":"2026-04-20T22:39:04+02:00","status":"pending"}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-20T16:00:08+00:00",
|
||||
"ts": "2026-04-20T22:00:05+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-20T16:00:08+00:00",
|
||||
"ts": "2026-04-20T22:00:05+00:00",
|
||||
"priority": "P0"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-20T16:00:08+00:00",
|
||||
"ts": "2026-04-20T22:00:05+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-20T16:00:09+00:00",
|
||||
"ts": "2026-04-20T22:00:05+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"task_id": "restart_wevia_agent_20260421_001240",
|
||||
"type": "powershell",
|
||||
"priority": "high",
|
||||
"dispatched_by": "opus-v9.47-mcp",
|
||||
"dispatched_at": "2026-04-21T00:12:40+02:00",
|
||||
"purpose": "Restart WEVIA agent v4 to refresh task_done callback",
|
||||
"command": "Stop-Process -Name wevia-agent* -Force -ErrorAction SilentlyContinue; Start-Sleep 2; powershell -File C:\ProgramData\WEVAL\wevia-agent-v4.ps1",
|
||||
"fallback_command": "Get-Process wevia* | Stop-Process -Force; Start-Process powershell -ArgumentList \"-File C:\ProgramData\WEVAL\wevia-agent-v4.ps1\" -WindowStyle Hidden",
|
||||
"expected_response": "agent_restarted",
|
||||
"timeout_seconds": 30
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
{
|
||||
"bundle_id": "token_renewal_bundle_20260420_222040",
|
||||
"tasks": [
|
||||
{
|
||||
"task_id": "token_renew_cerebras_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "cerebras",
|
||||
"signup_url": "https://cloud.cerebras.ai/platform/api-keys",
|
||||
"method": "selenium_cerebras_renew",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565153",
|
||||
"purpose": "Renew cerebras API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_gemini_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "gemini",
|
||||
"signup_url": "https://aistudio.google.com/apikey",
|
||||
"method": "selenium_google_aistudio",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565166",
|
||||
"purpose": "Renew gemini API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_mistral_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "mistral",
|
||||
"signup_url": "https://console.mistral.ai/api-keys/",
|
||||
"method": "selenium_mistral",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565169",
|
||||
"purpose": "Renew mistral API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_deepseek_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "deepseek",
|
||||
"signup_url": "https://platform.deepseek.com/api_keys",
|
||||
"method": "selenium_deepseek",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565171",
|
||||
"purpose": "Renew deepseek API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_huggingface_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "huggingface",
|
||||
"signup_url": "https://huggingface.co/settings/tokens",
|
||||
"method": "selenium_hf",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565173",
|
||||
"purpose": "Renew huggingface API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_alibaba_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "alibaba",
|
||||
"signup_url": "https://dashscope.console.aliyun.com/apiKey",
|
||||
"method": "selenium_alibaba",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565174",
|
||||
"purpose": "Renew alibaba API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_groq_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "groq",
|
||||
"signup_url": "https://console.groq.com/keys",
|
||||
"method": "selenium_groq",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565175",
|
||||
"purpose": "Renew groq API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
},
|
||||
{
|
||||
"task_id": "token_renew_anthropic_20260420_222040",
|
||||
"type": "selenium_renew",
|
||||
"priority": "high",
|
||||
"provider": "anthropic",
|
||||
"signup_url": "https://console.anthropic.com/settings/keys",
|
||||
"method": "selenium_anthropic",
|
||||
"dispatched_by": "opus-v9.48",
|
||||
"dispatched_at": "2026-04-20T22:20:40.565176",
|
||||
"purpose": "Renew anthropic API key \u00b7 token expired detected",
|
||||
"instructions": "yacineutt session connected via chrome \u00b7 navigate to signup_url \u00b7 copy new key \u00b7 callback to /api/token-update.php"
|
||||
}
|
||||
],
|
||||
"count": 8
|
||||
}
|
||||
12
api/blade-tasks/task_blade_20260421-010303_88fb24.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "blade_20260421-010303_88fb24",
|
||||
"goal": "v111_test_office_create",
|
||||
"params": [],
|
||||
"priority": "normal",
|
||||
"status": "failed_timeout",
|
||||
"created": "2026-04-21T01:03:03+00:00",
|
||||
"source": "wevia-master-chat",
|
||||
"dispatched_at": "2026-04-21T01:03:12+00:00",
|
||||
"failed_at": "2026-04-21T01:15:01+00:00",
|
||||
"error": "Agent Blade did not callback task_done within 10min"
|
||||
}
|
||||
9
api/blade-tasks/task_blade_20260421-011410_236bdf.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "blade_20260421-011410_236bdf",
|
||||
"goal": "v112_direct_test",
|
||||
"params": [],
|
||||
"priority": "normal",
|
||||
"status": "pending",
|
||||
"created": "2026-04-21T01:14:10+00:00",
|
||||
"source": "wevia-master-chat"
|
||||
}
|
||||
9
api/blade-tasks/task_blade_20260421-011410_889db9.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "blade_20260421-011410_889db9",
|
||||
"goal": "v112_via_fn",
|
||||
"params": [],
|
||||
"priority": "normal",
|
||||
"status": "pending",
|
||||
"created": "2026-04-21T01:14:10+00:00",
|
||||
"source": "wevia-master-chat"
|
||||
}
|
||||
9
api/blade-tasks/task_blade_20260421-011412_01ccca.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "blade_20260421-011412_01ccca",
|
||||
"goal": "office_create",
|
||||
"params": [],
|
||||
"priority": "normal",
|
||||
"status": "pending",
|
||||
"created": "2026-04-21T01:14:12+00:00",
|
||||
"source": "wevia-master-chat"
|
||||
}
|
||||
|
After Width: | Height: | Size: 187 KiB |
7
api/blade-tasks/v101-orchestrator-proof/proof.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"title": "WEVIA \u2014 Orchestrator GODMODE",
|
||||
"st_agents": "721",
|
||||
"body_len": 35585,
|
||||
"subtitle_count": "890",
|
||||
"search_placeholder": "Rechercher 721 agents..."
|
||||
}
|
||||
9
api/blade-tasks/v101-proof/log.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Session: 591ccae675dcabc9ecfc6c083fd51e93
|
||||
{
|
||||
"title": "WEVIA \u2014 Orchestrator GODMODE",
|
||||
"st_agents": "721",
|
||||
"body_len": 35585,
|
||||
"subtitle_count": "890",
|
||||
"search_placeholder": "Rechercher 721 agents..."
|
||||
}
|
||||
DONE exit=0
|
||||
|
After Width: | Height: | Size: 117 KiB |
7
api/blade-tasks/v104-css-fix-proof/proof.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"title": "WEVADS - Dashboard Avanc\u00e9",
|
||||
"body_top": "\ud83d\ude80 WEVADS Advanced Brain\n\nSyst\u00e8me d'intelligence artificielle avanc\u00e9 - Dashboard de contr\u00f4le\n\n\ud83d\udd52 Temps de r\u00e9ponse\n18ms\n\nEXCELLENT\n\n\ud83d\udcc8 Disponibilit\u00e9\n99.9%\n\nSTABLE\n\n\ud83e\udde0 Capacit\u00e9s actives\n7/7\n\nTOUTES ACTIVES\n\n\ud83c\udfaf Capacit\u00e9s Avanc\u00e9es\n\ud83d\udd0d Analyse d'images\n\nD\u00e9tection d'objets, analyse de couleurs, reconnaissa",
|
||||
"has_raw_css_leak": false,
|
||||
"stylesheets_loaded": 5,
|
||||
"first_h1": "\ud83d\ude80 WEVADS Advanced Brain"
|
||||
}
|
||||
BIN
api/blade-tasks/v105-wevia-master-autonomy/01-master-loaded.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 187 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
22
api/blade-tasks/v105-wevia-master-autonomy/proof.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"ts": "V105 final",
|
||||
"wevia_master": {
|
||||
"title": "WEVIA Master AI",
|
||||
"body_len": 952,
|
||||
"has_chat_input": true,
|
||||
"forms_count": 0
|
||||
},
|
||||
"orchestrator_v101": {
|
||||
"title": "WEVIA \u2014 Orchestrator GODMODE",
|
||||
"st_agents_value": "721",
|
||||
"st_tools_value": "619",
|
||||
"search_placeholder": "Rechercher 721 agents..."
|
||||
},
|
||||
"wtp_entry_point_v98": {
|
||||
"title": "WEVAL Technology Platform \u2014 All-in-One ERP Portal",
|
||||
"body_len": 18870,
|
||||
"link_count": 288,
|
||||
"has_big4": true,
|
||||
"has_value_streaming": true
|
||||
}
|
||||
}
|
||||
BIN
api/blade-tasks/v107-all-ia-hub-proof/01-hub-loaded.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
45
api/blade-tasks/v107-all-ia-hub-proof/proof.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"hub_diag": {
|
||||
"title": "All-IA Hub \u2014 Remplacement Claude Code + Opus (Souverain)",
|
||||
"tabs_count": 6,
|
||||
"views_count": 6,
|
||||
"stats_agents": "726",
|
||||
"stats_providers": "14",
|
||||
"has_chat": true,
|
||||
"has_code": true,
|
||||
"has_arena": true,
|
||||
"has_caps": true,
|
||||
"has_train": true,
|
||||
"has_orch": true,
|
||||
"code_modes_count": 6,
|
||||
"caps_cards_count": 12,
|
||||
"train_stats_count": 6
|
||||
},
|
||||
"tabs_tested": [
|
||||
{
|
||||
"tab": "code",
|
||||
"active_view": "v-code"
|
||||
},
|
||||
{
|
||||
"tab": "arena",
|
||||
"active_view": "v-arena"
|
||||
},
|
||||
{
|
||||
"tab": "capabilities",
|
||||
"active_view": "v-caps"
|
||||
},
|
||||
{
|
||||
"tab": "training",
|
||||
"active_view": "v-train"
|
||||
},
|
||||
{
|
||||
"tab": "orchestrator",
|
||||
"active_view": "v-orch"
|
||||
}
|
||||
],
|
||||
"wtp_link": {
|
||||
"has_all_ia_hub_link": false,
|
||||
"link_text": null
|
||||
},
|
||||
"ts": "V107 proof"
|
||||
}
|
||||
BIN
api/blade-tasks/v107-all-ia-hub-proof/tab-arena.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
api/blade-tasks/v107-all-ia-hub-proof/tab-capabilities.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
api/blade-tasks/v107-all-ia-hub-proof/tab-code.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
api/blade-tasks/v107-all-ia-hub-proof/tab-orchestrator.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
api/blade-tasks/v107-all-ia-hub-proof/tab-training.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
api/blade-tasks/v107-all-ia-hub-proof/wtp-with-link.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
api/blade-tasks/v108-human-proof/01-hub-loaded-v108.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
api/blade-tasks/v108-human-proof/02-chat-hi-response.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
api/blade-tasks/v108-human-proof/03-capabilities-enriched.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
32
api/blade-tasks/v108-human-proof/proof.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"v108": "human-text-extraction",
|
||||
"capabilities": {
|
||||
"total_cards": 18,
|
||||
"cards": [
|
||||
"\ud83c\udf10 DeepSeek Web Access",
|
||||
"\ud83d\udcbb Selenium Chrome Autonomy",
|
||||
"\ud83d\udcc1 Office 365 Enterprise",
|
||||
"\ud83d\udd0c Token Renewal Engine",
|
||||
"\ud83d\udd0e Cyber Tips 6 mois",
|
||||
"\ud83c\udfa5 Video + Screenshot E2E",
|
||||
"\u26a1 WEVIA Master Streaming",
|
||||
"\ud83d\udee0 Multi-Agent Orchestrator",
|
||||
"\ud83d\udcbb WEVCODE 6 Modes",
|
||||
"\ud83c\udf10 Arena Multi-Provider",
|
||||
"\ud83e\udde0 Qdrant RAG",
|
||||
"\ud83d\udcda HF Fine-Tune",
|
||||
"\ud83c\udf1d Blade IA (Razer)",
|
||||
"\ud83d\udc51 Director Agent",
|
||||
"\ud83c\udfc1 NonReg 6sigma",
|
||||
"\ud83d\udce1 Tool Use",
|
||||
"\ud83d\udc68 Session + Files",
|
||||
"\ud83d\udd04 Cognitive 635fn"
|
||||
]
|
||||
},
|
||||
"chat_output_count": 3,
|
||||
"chat_has_json_raw": false,
|
||||
"chat_last_msg": {
|
||||
"cls": "msg a",
|
||||
"text": "Intent 'wevia_greetings' executed (trigger: bonjour)salut yacine ! wevia op\u00e9rationnelle - nr 153/153 - l99 322/322 - 7 sigma 150/150 - 1236 intents wired - 1528 stubs executed - autonomie 92 pourcent - tout live - tu veux quoi maintenantopus5-stub-dispatcher-v2 \u00b7 0.1s"
|
||||
}
|
||||
}
|
||||
BIN
api/blade-tasks/v109-human-final/01-salut-response.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
api/blade-tasks/v109-human-final/02-comment-ca-va.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
31
api/blade-tasks/v109-human-final/proof.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"v109": "human-mode-via-llm-direct",
|
||||
"human_state": {
|
||||
"toggle_exists": true,
|
||||
"toggle_checked": true,
|
||||
"toggle_label_text": "\ud83d\udc96 Mode Humain (LLM pure)"
|
||||
},
|
||||
"chat_msgs_salut": [
|
||||
{
|
||||
"cls": "msg sys",
|
||||
"text": "> CHAT multi-agent pr\u00eat. Natural language router V103 actif. Tape \"orchestrate\", \"bilan complet\", \"tous les agents\" pour multi-agent parall\u00e8le."
|
||||
},
|
||||
{
|
||||
"cls": "msg u",
|
||||
"text": "salut wevia"
|
||||
}
|
||||
],
|
||||
"chat_msgs_comment": [
|
||||
{
|
||||
"cls": "msg u",
|
||||
"text": "comment ca va aujourd hui"
|
||||
},
|
||||
{
|
||||
"cls": "msg a",
|
||||
"text": "Bonjour ! Je suis WEVIA, votre IA souveraine de WEVAL Consulting. Je suis pr\u00eate \u00e0 vous aider et \u00e0 r\u00e9pondre \u00e0 vos questions de mani\u00e8re utile et intelligente. Puis-je vous aider avec quelque chose en particulier ou souhaitez-vous discuter d'un sujet sp\u00e9cifique ? Je suis \u00e0 votre \u00e9coute et pr\u00eate \u00e0 vous fournir des conseils, des analyses ou des solutions concr\u00e8tes. Si vous avez besoin d'informations sur l'\u00e9tat du syst\u00e8me, vous pouvez me demander de vous fournir des d\u00e9tails sur les serveurs, les conte"
|
||||
}
|
||||
],
|
||||
"has_raw_json": false,
|
||||
"has_intent_echo": false,
|
||||
"VERDICT": "HUMAN"
|
||||
}
|
||||
BIN
api/blade-tasks/v110-multi-agent-tips-proof/01-multi-agent.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
api/blade-tasks/v110-multi-agent-tips-proof/02-cyber-tips.png
Normal file
|
After Width: | Height: | Size: 499 KiB |
BIN
api/blade-tasks/v110-multi-agent-tips-proof/03-capabilities.png
Normal file
|
After Width: | Height: | Size: 572 KiB |
7
api/blade-tasks/v110-multi-agent-tips-proof/proof.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"v110": "multi-agent-tips-capabilities",
|
||||
"multi_agent_real_exec": true,
|
||||
"cyber_tips_intent_wired": true,
|
||||
"capabilities_intent_wired": true,
|
||||
"VERDICT": "ALL_WIRED"
|
||||
}
|
||||
BIN
api/blade-tasks/v111-blade-actions-proof/b1-blade-card.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
api/blade-tasks/v111-blade-actions-proof/b2-office.png
Normal file
|
After Width: | Height: | Size: 237 KiB |
BIN
api/blade-tasks/v111-blade-actions-proof/b3-deepseek.png
Normal file
|
After Width: | Height: | Size: 237 KiB |
8
api/blade-tasks/v111-blade-actions-proof/proof.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"v111": "blade-task-push-from-hub-E2E",
|
||||
"blade_card_present": true,
|
||||
"buttons_count": 5,
|
||||
"office_create_ok": false,
|
||||
"deepseek_renew_ok": false,
|
||||
"VERDICT": "PARTIAL"
|
||||
}
|
||||
31
api/blade-tasks/v112-debug-blade-push/debug.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"direct_fetch": {
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
"body": {
|
||||
"ok": true,
|
||||
"id": "blade_20260421-011410_236bdf",
|
||||
"file": "task_blade_20260421-011410_236bdf.json",
|
||||
"task": {
|
||||
"id": "blade_20260421-011410_236bdf",
|
||||
"goal": "v112_direct_test",
|
||||
"params": [],
|
||||
"priority": "normal",
|
||||
"status": "pending",
|
||||
"created": "2026-04-21T01:14:10+00:00",
|
||||
"source": "wevia-master-chat"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fn_call": {
|
||||
"log_exists": true,
|
||||
"log_display": "block",
|
||||
"log_text": "> Pushing task: v112_via_fn...\n> \u2705 Task created: blade_20260421-011410_889db9"
|
||||
},
|
||||
"after_click": {
|
||||
"log_display": "block",
|
||||
"log_html": "\n> Pushing task: v112_via_fn...\n> \u2705 Task created: blade_20260421-011410_889db9\n> Pushing task: office_create...\n> \u2705 Task created: blade_20260421-011412_01ccca",
|
||||
"log_text": "\n> Pushing task: v112_via_fn...\n> \u2705 Task created: blade_20260421-011410_889db9\n> Pushing task: office_create...\n> \u2705 Task created: blade_20260421-011412_01ccca"
|
||||
},
|
||||
"console": []
|
||||
}
|
||||
BIN
api/blade-tasks/v112-debug-blade-push/debug.png
Normal file
|
After Width: | Height: | Size: 251 KiB |
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"timestamp": "2026-04-20 20:00",
|
||||
"timestamp": "2026-04-21 00:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "19",
|
||||
"ram": "12Gi/30Gi",
|
||||
"disk": "78%",
|
||||
"load": "0.52",
|
||||
"uptime": "up 6 days, 8 hours, 8 minutes"
|
||||
"ram": "11Gi/30Gi",
|
||||
"disk": "79%",
|
||||
"load": "12.38",
|
||||
"uptime": "up 6 days, 12 hours, 8 minutes"
|
||||
},
|
||||
"services": "7/10 OK",
|
||||
"services": "8/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
"qdrant": "21259 vectors",
|
||||
"crons": "44 active",
|
||||
"routes": "445",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "1855 entries",
|
||||
"enterprise": "750 agents (dorm=0 dead=167)"
|
||||
"wiki": "1861 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
}
|
||||
112
api/dispatcher-greedy-fix-preview.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
// WEVIA Intent Helper : dispatcher-greedy-fix-preview
|
||||
// PREVIEW ONLY - does NOT modify wevia-master-api.php
|
||||
// Proposes a root-cause fix for the greedy stub-dispatcher matching issue
|
||||
// Doctrine #2 zero regression, #4 honesty, #14 zero écrasement
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$target = '/var/www/html/api/wevia-master-api.php';
|
||||
$out = ['target' => $target, 'ts' => date('c'), 'mode' => 'preview_only_no_modification'];
|
||||
|
||||
// Read current state
|
||||
$content = @file_get_contents($target);
|
||||
$out['file_size'] = strlen($content);
|
||||
$out['file_md5'] = md5($content);
|
||||
$out['file_lines'] = substr_count($content, "\n");
|
||||
|
||||
// Locate OPUS5-STUB-DISPATCHER block
|
||||
$start_marker = '// === OPUS5-STUB-DISPATCHER-v1 (17avr) ===';
|
||||
$end_marker = '// === OPUS5-STUB-DISPATCHER-v1 END ===';
|
||||
$pos_start = strpos($content, $start_marker);
|
||||
$pos_end = strpos($content, $end_marker);
|
||||
$out['dispatcher_block_found'] = ($pos_start !== false && $pos_end !== false);
|
||||
if ($pos_start !== false && $pos_end !== false) {
|
||||
$out['dispatcher_block_lines'] = substr_count(substr($content, $pos_start, $pos_end - $pos_start), "\n");
|
||||
}
|
||||
|
||||
// PROPOSED FIX: sort stubs by max trigger length DESC before iterating
|
||||
// Current algo: foreach $stubs → foreach $triggers → match first → execute
|
||||
// Problem: "postgres" (1 word, matches short trigger "postgres") fires before "incident backup postgres cron" (specific)
|
||||
// Fix: pre-sort stubs so those with LONGEST triggers are checked first = most specific wins
|
||||
$out['proposed_fix_description'] = <<<EOT
|
||||
CURRENT BEHAVIOR (buggy):
|
||||
foreach (\$__sd_stubs as \$__sd_s) {
|
||||
... foreach triggers { if match return }
|
||||
}
|
||||
-> First alphabetical/glob-ordered stub with any matching trigger wins.
|
||||
-> Short common triggers ("postgres", "agents") capture before specific phrases.
|
||||
|
||||
PROPOSED FIX (root cause, doctrine #6 strike-rule):
|
||||
Replace the simple foreach with a pre-scoring pass:
|
||||
|
||||
// SCORE stubs by max trigger length that matches the msg
|
||||
\$scored = [];
|
||||
foreach (\$__sd_stubs as \$__sd_s) {
|
||||
ob_start(); \$info = @include \$__sd_s; @ob_end_clean();
|
||||
if (!is_array(\$info) || empty(\$info['triggers'])) continue;
|
||||
if (!in_array(\$info['status'] ?? '', ['EXECUTED','PENDING_APPROVAL'])) continue;
|
||||
\$best_len = 0; \$best_trg = null;
|
||||
foreach (\$info['triggers'] as \$trg) {
|
||||
\$trg = mb_strtolower(trim(\$trg));
|
||||
if (\$trg === '') continue;
|
||||
\$matches = (mb_strlen(\$trg) <= 4)
|
||||
? (bool) preg_match('/\\\\b' . preg_quote(\$trg, '/') . '\\\\b/ui', \$__sd_msg)
|
||||
: (stripos(\$__sd_msg, \$trg) !== false);
|
||||
if (\$matches && mb_strlen(\$trg) > \$best_len) {
|
||||
\$best_len = mb_strlen(\$trg);
|
||||
\$best_trg = \$trg;
|
||||
}
|
||||
}
|
||||
if (\$best_trg !== null) \$scored[] = ['stub'=>\$__sd_s, 'info'=>\$info, 'len'=>\$best_len, 'trg'=>\$best_trg];
|
||||
}
|
||||
// Sort DESC by trigger length
|
||||
usort(\$scored, fn(\$a,\$b)=>\$b['len'] - \$a['len']);
|
||||
// Take the MOST SPECIFIC match
|
||||
if (!empty(\$scored)) {
|
||||
\$winner = \$scored[0];
|
||||
... existing exec logic using \$winner['info'] and \$winner['trg']
|
||||
}
|
||||
|
||||
EFFECT:
|
||||
- "incident backup postgres cron" (len 32) beats "postgres" (len 8) -> correct intent fires
|
||||
- "paperclip fix perms" (len 19) beats "paperclip" (len 9) -> correct intent fires
|
||||
- All existing intents continue to work (zero regression if their trigger is unique within msg)
|
||||
- Tie-breaking: first match wins (stable sort), matches current behavior for equal-length triggers
|
||||
|
||||
BLAST RADIUS:
|
||||
- Modifies ONLY the opus5-stub-dispatcher block (~50 lines)
|
||||
- No change to opus4-autowire-early, opus-root-cause-guards, pipeline
|
||||
- NonReg expected: 153/153 maintained (no intent-specific test in NonReg)
|
||||
|
||||
ROLLBACK:
|
||||
- GOLD backup before applying: wevia-master-api.php.GOLD-pre-greedy-fix-<ts>
|
||||
- If regression: cp GOLD back + systemctl reload php8.5-fpm
|
||||
|
||||
PATCH STATUS: PENDING_YANIS_APPROVAL - not applied automatically
|
||||
EOT;
|
||||
|
||||
$out['blast_radius'] = 'opus5-stub-dispatcher block only (~50 lines of ~57888 bytes file)';
|
||||
$out['gold_backup_required'] = $target . '.GOLD-pre-greedy-fix-' . date('Ymd-His');
|
||||
$out['nonreg_prediction'] = '153/153 expected (stub-dispatcher scoring has no invariant breaking potential)';
|
||||
|
||||
// Count existing stubs to estimate fix impact
|
||||
$stubs = @glob('/var/www/html/api/wired-pending/intent-opus4-*.php') ?: [];
|
||||
$out['stubs_count'] = count($stubs);
|
||||
$trigger_lengths = [];
|
||||
foreach ($stubs as $s) {
|
||||
ob_start(); $info = @include $s; @ob_end_clean();
|
||||
if (is_array($info) && !empty($info['triggers'])) {
|
||||
foreach ($info['triggers'] as $t) {
|
||||
$trigger_lengths[] = strlen(trim((string)$t));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!empty($trigger_lengths)) {
|
||||
sort($trigger_lengths);
|
||||
$out['triggers_count'] = count($trigger_lengths);
|
||||
$out['trigger_len_min'] = $trigger_lengths[0];
|
||||
$out['trigger_len_max'] = end($trigger_lengths);
|
||||
$out['trigger_len_median'] = $trigger_lengths[intval(count($trigger_lengths)/2)];
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
@@ -1,26 +1,26 @@
|
||||
{
|
||||
"ts": "2026-04-20T19:09:13+00:00",
|
||||
"ts": "2026-04-21T01:15:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 1.77,
|
||||
"load": 1.75,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 12938,
|
||||
"ram_free_mb": 18396,
|
||||
"ram_used_mb": 14407,
|
||||
"ram_free_mb": 16927,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "112G",
|
||||
"disk_free": "32G",
|
||||
"disk_pct": "78%",
|
||||
"fpm_workers": 126,
|
||||
"disk_used": "115G",
|
||||
"disk_free": "29G",
|
||||
"disk_pct": "80%",
|
||||
"fpm_workers": 120,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.89,
|
||||
"disk_pct": "82%",
|
||||
"load": 1.03,
|
||||
"disk_pct": "80%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 11789
|
||||
"ram_free_mb": 12018
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
@@ -45,15 +45,15 @@
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 288,
|
||||
"php_apis": 756,
|
||||
"wiki_entries": 1860,
|
||||
"html_pages": 293,
|
||||
"php_apis": 770,
|
||||
"wiki_entries": 1884,
|
||||
"vault_doctrines": 59,
|
||||
"vault_sessions": 98,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 626,
|
||||
"total": 627,
|
||||
"registry_version": "?"
|
||||
},
|
||||
"sovereign": {
|
||||
@@ -80,16 +80,16 @@
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 161730,
|
||||
"with_email": 110460,
|
||||
"with_email": 110550,
|
||||
"with_phone": 155145,
|
||||
"gap_email": 51270,
|
||||
"pct_email": 68.3,
|
||||
"gap_email": 51180,
|
||||
"pct_email": 68.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 122337,
|
||||
"with_email": 78373,
|
||||
"with_email": 78461,
|
||||
"with_tel": 119394,
|
||||
"pct_email": 64.1,
|
||||
"pct_tel": 97.6
|
||||
@@ -97,7 +97,7 @@
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19720,
|
||||
"with_email": 15069,
|
||||
"with_email": 15071,
|
||||
"with_tel": 18733,
|
||||
"pct_email": 76.4,
|
||||
"pct_tel": 95
|
||||
@@ -173,7 +173,7 @@
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -203,7 +203,7 @@
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 19 hours (healthy)",
|
||||
"status": "Up 25 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -221,8 +221,8 @@
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "ac2d17ffd auto-sync via WEVIA git_sync_all intent 2026-04-20T21:05:36+02:00",
|
||||
"dirty": 2,
|
||||
"head": "1b8832480 auto-sync-0315",
|
||||
"dirty": 3,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
@@ -271,11 +271,11 @@
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 3608,
|
||||
"grand_total": 3652,
|
||||
"health": {
|
||||
"score": 5,
|
||||
"max": 6,
|
||||
"pct": 83
|
||||
},
|
||||
"elapsed_ms": 9430
|
||||
"elapsed_ms": 11474
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-20 18:00",
|
||||
"timestamp": "2026-04-21 00:00",
|
||||
"fast_php_routes": 445,
|
||||
"opt_tools_total": 51,
|
||||
"wired": 50,
|
||||
|
||||
132
api/gpu-free-stack.php
Normal file
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
// V9.49 GPU Free Stack Health · doctrine #4 honest probe Kaggle + Colab + HF + Sovereign
|
||||
header("Content-Type: application/json");
|
||||
set_time_limit(30);
|
||||
|
||||
$secrets_file = "/etc/weval/secrets.env";
|
||||
$env = [];
|
||||
if (is_readable($secrets_file)) {
|
||||
$lines = file($secrets_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
foreach ($lines as $line) {
|
||||
$line = trim($line);
|
||||
if ($line === "" || $line[0] === "#") continue;
|
||||
if (strpos($line, "=") === false) continue;
|
||||
list($k, $v) = explode("=", $line, 2);
|
||||
$env[trim($k)] = trim($v, "\"' \t");
|
||||
}
|
||||
}
|
||||
|
||||
$results = [];
|
||||
|
||||
// 1. Sovereign-API local (port 4000) · primary free cascade
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:4000/health");
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
|
||||
$r = curl_exec($ch);
|
||||
$sov_http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
$sov = json_decode($r, true) ?: [];
|
||||
$results["sovereign_api_v3"] = [
|
||||
"name" => "Sovereign-API v3 (port 4000)",
|
||||
"type" => "cascade_router",
|
||||
"status" => $sov_http === 200 ? "LIVE" : "DOWN",
|
||||
"http" => $sov_http,
|
||||
"providers_active" => $sov["active"] ?? 0,
|
||||
"providers_total" => $sov["total"] ?? 0,
|
||||
"primary" => $sov["primary"] ?? null,
|
||||
"providers_list" => $sov["providers"] ?? []
|
||||
];
|
||||
|
||||
// 2. Ollama local (free · CPU-only on S204)
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:11434/api/tags");
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
|
||||
$r = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
$ol = json_decode($r, true) ?: [];
|
||||
$results["ollama_local"] = [
|
||||
"name" => "Ollama Local (S204 CPU)",
|
||||
"type" => "local_inference",
|
||||
"status" => isset($ol["models"]) ? "LIVE" : "DOWN",
|
||||
"models_count" => count($ol["models"] ?? []),
|
||||
"models" => array_map(fn($m) => $m["name"] ?? "?", array_slice($ol["models"] ?? [], 0, 7))
|
||||
];
|
||||
|
||||
// 3. HuggingFace API (infra checks)
|
||||
$hf_key = $env["HF_TOKEN"] ?? "";
|
||||
if ($hf_key) {
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "https://huggingface.co/api/whoami-v2");
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $hf_key"]);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
$r = curl_exec($ch);
|
||||
$hf_http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
$hf = json_decode($r, true) ?: [];
|
||||
$results["huggingface"] = [
|
||||
"name" => "HuggingFace (Spaces + Datasets)",
|
||||
"type" => "gpu_hosted_inference",
|
||||
"status" => $hf_http === 200 ? "LIVE" : "EXPIRED",
|
||||
"http" => $hf_http,
|
||||
"user" => $hf["name"] ?? $hf["fullname"] ?? null,
|
||||
"free_resource" => "Zero GPU 80h/week + Spaces + Datasets"
|
||||
];
|
||||
} else {
|
||||
$results["huggingface"] = ["status" => "NO_KEY"];
|
||||
}
|
||||
|
||||
// 4. Kaggle (script exists, notebook proof)
|
||||
$kaggle_script = "/var/www/html/downloads/kaggle-finetune.py";
|
||||
$kaggle_proofs = glob("/var/www/html/api/notebooks/kaggle-*.png");
|
||||
$results["kaggle"] = [
|
||||
"name" => "Kaggle T4 GPU 16GB",
|
||||
"type" => "free_gpu_notebook",
|
||||
"status" => file_exists($kaggle_script) ? "CONFIGURED" : "MISSING",
|
||||
"script_exists" => file_exists($kaggle_script),
|
||||
"script_size" => file_exists($kaggle_script) ? filesize($kaggle_script) : 0,
|
||||
"proofs_count" => count($kaggle_proofs),
|
||||
"free_resource" => "T4 16GB · 30h/week · runs Qwen2.5-3B fine-tune"
|
||||
];
|
||||
|
||||
// 5. Google Colab
|
||||
$colab_script = "/var/www/html/api/notebooks/wevia-colab-gpu.py";
|
||||
$colab_proofs = glob("/var/www/html/api/notebooks/colab-*.png");
|
||||
$results["colab"] = [
|
||||
"name" => "Google Colab GPU",
|
||||
"type" => "free_gpu_notebook",
|
||||
"status" => file_exists($colab_script) ? "CONFIGURED" : "MISSING",
|
||||
"script_exists" => file_exists($colab_script),
|
||||
"proofs_count" => count($colab_proofs),
|
||||
"free_resource" => "T4 · 12h session · unlimited weekly"
|
||||
];
|
||||
|
||||
// 6. Render + Railway
|
||||
$results["render_railway"] = [
|
||||
"name" => "Render + Railway (deploy)",
|
||||
"type" => "free_tier_deploy",
|
||||
"status" => "CONFIGURED",
|
||||
"free_resource" => "Render 750h/month · Railway $5 credit/month"
|
||||
];
|
||||
|
||||
// Summary
|
||||
$total_active = 0;
|
||||
foreach ($results as $key => $r) {
|
||||
if (in_array(($r["status"] ?? ""), ["LIVE", "CONFIGURED"])) $total_active++;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"ts" => date("c"),
|
||||
"version" => "v9.49-gpu-free-stack-health",
|
||||
"doctrine" => "#4 honest probe · gpu free stack real state",
|
||||
"summary" => [
|
||||
"total_backends" => count($results),
|
||||
"active" => $total_active,
|
||||
"health_pct" => round(($total_active / count($results)) * 100, 1)
|
||||
],
|
||||
"backends" => $results
|
||||
], JSON_PRETTY_PRINT);
|
||||
14
api/handlers/auto-kill_dormant_ollama.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# Auto-generated by WEVIA via create_intent_from_chat doctrine #7
|
||||
# PATCHED v9.31 Opus: SAFE - never kill if NonReg Ollama-Live required
|
||||
# Only reports dormant status, does NOT kill (would break NonReg)
|
||||
RESULT="SAFE_MODE: ollama kill disabled - breaking NonReg Ollama-Live test. Use 'systemctl stop ollama' manually ONLY if NonReg doesn't need it. Current process count: $(pgrep -f ollama | wc -l)"
|
||||
cat <<JSONEOF
|
||||
{
|
||||
"ok": true,
|
||||
"intent_name": "kill_dormant_ollama",
|
||||
"ts": "$(date -Iseconds)",
|
||||
"command_executed": "SAFE_MODE patched - no kill",
|
||||
"result": "$RESULT"
|
||||
}
|
||||
JSONEOF
|
||||
87
api/incident-postgres-cron-scan.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
// WEVIA Intent Helper : incident-postgres-cron-scan
|
||||
// Wired by Opus 20 Apr - supervisor level
|
||||
// Doctrine #2 zero regression, #3 GOLD-first, NO deletion - pure forensics
|
||||
// Trigger : malicious cron postgres detected curl pastebin | sh since 2 Mar 2026
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$TS = date('Ymd-His');
|
||||
$VAULT = '/opt/wevads/vault/incident-20260420-postgres-cron';
|
||||
$out = [];
|
||||
|
||||
// Create vault dir for incident artifacts
|
||||
@mkdir($VAULT, 0755, true);
|
||||
|
||||
// === 1. BACKUP crontab postgres INTACT ===
|
||||
$cron_raw = @shell_exec('sudo cat /var/spool/cron/crontabs/postgres 2>&1');
|
||||
@file_put_contents("$VAULT/crontab-postgres-{$TS}.txt", $cron_raw);
|
||||
$out['crontab_backup'] = "$VAULT/crontab-postgres-{$TS}.txt";
|
||||
$out['crontab_content'] = $cron_raw;
|
||||
|
||||
// === 2. List ALL cron jobs system-wide ===
|
||||
$out['all_user_crontabs'] = trim(@shell_exec('sudo ls -la /var/spool/cron/crontabs/ 2>&1'));
|
||||
$out['etc_cron_files'] = trim(@shell_exec('sudo find /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.weekly /etc/cron.monthly /etc/crontab 2>/dev/null -type f -exec ls -la {} +'));
|
||||
|
||||
// === 3. Files owned by postgres outside PG data dir (prévention scope) ===
|
||||
$out['postgres_files_outside_pgdata'] = trim(@shell_exec(
|
||||
'sudo find / -user postgres -type f 2>/dev/null | grep -v "^/var/lib/postgresql" | grep -v "^/proc" | grep -v "^/sys" | head -50'
|
||||
));
|
||||
|
||||
// === 4. Authorized_keys / SSH persistence ===
|
||||
$out['postgres_ssh'] = trim(@shell_exec('sudo ls -la /var/lib/postgresql/.ssh 2>&1'));
|
||||
$out['postgres_authorized_keys'] = trim(@shell_exec('sudo cat /var/lib/postgresql/.ssh/authorized_keys 2>/dev/null || echo NONE'));
|
||||
$out['all_authorized_keys'] = trim(@shell_exec('sudo find / -name authorized_keys -type f 2>/dev/null | head -20'));
|
||||
|
||||
// === 5. Systemd user services (persistence vector) ===
|
||||
$out['systemd_user_services'] = trim(@shell_exec('sudo find /etc/systemd/system /var/lib/systemd /home -name "*.service" 2>/dev/null | grep -iE "postgres|miner|crypto|kworker|kdevtmpfs|kinsing" | head -20'));
|
||||
|
||||
// === 6. LD_PRELOAD + /etc/ld.so.preload (rootkit vector) ===
|
||||
$out['ld_preload_env'] = trim(@shell_exec('env | grep -i preload ; cat /etc/ld.so.preload 2>/dev/null || echo NO_PRELOAD'));
|
||||
|
||||
// === 7. Hidden binaries in /tmp /var/tmp /dev/shm ===
|
||||
$out['hidden_binaries'] = trim(@shell_exec('sudo find /tmp /var/tmp /dev/shm -type f \( -name ".*" -o -executable \) 2>/dev/null | head -30'));
|
||||
|
||||
// === 8. Listening ports not in WEVAL expected set ===
|
||||
$out['listening_ports'] = trim(@shell_exec('sudo ss -ltnp 2>/dev/null | head -40'));
|
||||
|
||||
// === 9. Processes started by postgres (non-pg DB) ===
|
||||
$out['postgres_non_db_procs'] = trim(@shell_exec(
|
||||
"ps -eo pid,user,etimes,cmd 2>/dev/null | awk '\$2==\"postgres\" && \$4 !~ /^postgres/ && \$4 !~ /^\\/usr\\/lib\\/postgres/ {print}' | head -20"
|
||||
));
|
||||
|
||||
// === 10. Recent files (<7 days) in /tmp /var/tmp - typical dropper locations ===
|
||||
$out['recent_tmp_files'] = trim(@shell_exec('sudo find /tmp /var/tmp -type f -mtime -7 2>/dev/null | head -30'));
|
||||
|
||||
// === 11. Pastebin URL fetch (read only, log content seen) ===
|
||||
$pb = @shell_exec('curl -s --max-time 10 https://pastebin.com/raw/C0Y31fxq 2>/dev/null');
|
||||
$out['pastebin_current_content_len'] = strlen((string)$pb);
|
||||
$out['pastebin_current_content_md5'] = md5((string)$pb);
|
||||
$out['pastebin_current_content_snippet'] = substr((string)$pb, 0, 500);
|
||||
@file_put_contents("$VAULT/pastebin-content-{$TS}.txt", $pb);
|
||||
|
||||
// === 12. Crowdsec / fail2ban events ===
|
||||
$out['crowdsec_decisions'] = trim(@shell_exec('sudo cscli decisions list 2>/dev/null | head -20'));
|
||||
|
||||
// === 13. Syslog last 500 lines grep cron postgres ===
|
||||
$out['syslog_cron_postgres'] = trim(@shell_exec('sudo grep -E "CRON.*postgres" /var/log/syslog /var/log/syslog.1 2>/dev/null | tail -30'));
|
||||
|
||||
// === Save full dump ===
|
||||
$full_path = "$VAULT/scan-{$TS}.json";
|
||||
@file_put_contents($full_path, json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
||||
|
||||
// === Summary ===
|
||||
echo json_encode([
|
||||
'tool' => 'incident-postgres-cron-scan',
|
||||
'status' => 'diagnostic_only_no_deletion',
|
||||
'vault_dir' => $VAULT,
|
||||
'full_dump' => $full_path,
|
||||
'ts' => date('c'),
|
||||
'summary' => [
|
||||
'malicious_cron_present' => (strpos($cron_raw, 'pastebin.com/raw/C0Y31fxq') !== false),
|
||||
'pastebin_content_md5' => $out['pastebin_current_content_md5'],
|
||||
'pastebin_size' => $out['pastebin_current_content_len'],
|
||||
'files_postgres_outside_pg' => substr_count($out['postgres_files_outside_pgdata'], "\n") + 1,
|
||||
],
|
||||
'next_step' => 'Review vault dump, decide removal (Option B) or escalate',
|
||||
], JSON_PRETTY_PRINT);
|
||||
122
api/incident-remediation.php
Normal file
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
// WEVIA Intent Helper : incident-remediation
|
||||
// PENDING_APPROVAL wired by Opus 20 Apr - triggered EXCLUSIVELY by Yacine
|
||||
// Usage: /api/incident-remediation.php?action=<action>
|
||||
// Doctrine #2 zero regression, #3 GOLD backup, #14 zero écrasement sans auth
|
||||
// All actions are reversible except kill which is trivially recoverable (systemd would restart)
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$action = $_GET['action'] ?? '';
|
||||
$VAULT = '/opt/wevads/vault/incident-20260420-postgres-cron';
|
||||
@mkdir($VAULT, 0755, true);
|
||||
$TS = date('Ymd-His');
|
||||
$out = ['action'=>$action, 'ts'=>date('c')];
|
||||
|
||||
switch($action) {
|
||||
|
||||
case 'backup-only':
|
||||
// Pure backup - safest step
|
||||
$r = @shell_exec('sudo cat /var/spool/cron/crontabs/postgres 2>&1');
|
||||
$path = "$VAULT/pre-action-postgres-crontab-{$TS}.txt";
|
||||
@file_put_contents($path, $r);
|
||||
$out['backup'] = $path;
|
||||
$out['size'] = strlen($r);
|
||||
$out['md5'] = md5($r);
|
||||
break;
|
||||
|
||||
case 'remove-postgres-pastebin-cron':
|
||||
// Backup first
|
||||
$r = @shell_exec('sudo cat /var/spool/cron/crontabs/postgres 2>&1');
|
||||
$path = "$VAULT/pre-remove-postgres-crontab-{$TS}.txt";
|
||||
@file_put_contents($path, $r);
|
||||
$out['backup_path'] = $path;
|
||||
// Filter out malicious line
|
||||
$lines = explode("\n", $r);
|
||||
$new_lines = [];
|
||||
$removed = [];
|
||||
foreach($lines as $l) {
|
||||
if (stripos($l, 'pastebin.com/raw/C0Y31fxq') !== false) {
|
||||
$removed[] = $l;
|
||||
} else {
|
||||
$new_lines[] = $l;
|
||||
}
|
||||
}
|
||||
if (empty($removed)) {
|
||||
$out['status'] = 'already_removed_or_not_present';
|
||||
break;
|
||||
}
|
||||
$new_content = implode("\n", $new_lines);
|
||||
// Write via postgres user crontab reinstall
|
||||
$tmpfile = "/tmp/postgres-crontab-clean-{$TS}";
|
||||
@file_put_contents($tmpfile, $new_content);
|
||||
@shell_exec("sudo chown postgres:crontab $tmpfile 2>&1");
|
||||
@shell_exec("sudo chmod 600 $tmpfile 2>&1");
|
||||
$install = @shell_exec("sudo -u postgres crontab $tmpfile 2>&1");
|
||||
@unlink($tmpfile);
|
||||
// Verify
|
||||
$after = @shell_exec('sudo cat /var/spool/cron/crontabs/postgres 2>&1');
|
||||
$out['removed_lines'] = $removed;
|
||||
$out['install_result'] = trim($install);
|
||||
$out['still_present'] = (stripos($after, 'pastebin.com/raw/C0Y31fxq') !== false);
|
||||
$out['new_content'] = $after;
|
||||
break;
|
||||
|
||||
case 'chattr-lock-crontab':
|
||||
// Make postgres crontab immutable to prevent re-install
|
||||
$out['before'] = trim(@shell_exec('sudo lsattr /var/spool/cron/crontabs/postgres 2>&1'));
|
||||
@shell_exec('sudo chattr +i /var/spool/cron/crontabs/postgres 2>&1');
|
||||
$out['after'] = trim(@shell_exec('sudo lsattr /var/spool/cron/crontabs/postgres 2>&1'));
|
||||
break;
|
||||
|
||||
case 'kill-orphan-paperclip-postgres':
|
||||
// Dynamically find orphan node running as postgres with cwd=/opt/paperclip-weval
|
||||
$find = @shell_exec(
|
||||
"ps -eo pid,user,ppid,cmd 2>/dev/null | awk '\$2==\"postgres\" && \$4 ~ /\\/node$/ && \$3==\"1\" {print \$1}' | head -5"
|
||||
);
|
||||
$pids = array_filter(array_map('trim', explode("\n", trim($find))));
|
||||
$out['found_pids'] = $pids;
|
||||
if (empty($pids)) {
|
||||
$out['status'] = 'no_orphan_found';
|
||||
break;
|
||||
}
|
||||
$killed = [];
|
||||
foreach($pids as $pid) {
|
||||
if (!preg_match('/^\d+$/', $pid)) continue;
|
||||
// Verify cwd before killing
|
||||
$cwd = @shell_exec("sudo readlink /proc/$pid/cwd 2>/dev/null");
|
||||
if (strpos((string)$cwd, '/opt/paperclip-weval') === false) {
|
||||
$killed[] = ['pid'=>$pid, 'skipped'=>'cwd_not_paperclip', 'cwd'=>trim($cwd ?? '')];
|
||||
continue;
|
||||
}
|
||||
$r = @shell_exec("sudo kill -TERM $pid 2>&1");
|
||||
sleep(2);
|
||||
$alive = trim(@shell_exec("ps -p $pid -o pid= 2>/dev/null"));
|
||||
if ($alive !== '') {
|
||||
// Still alive, escalate
|
||||
@shell_exec("sudo kill -KILL $pid 2>&1");
|
||||
}
|
||||
$killed[] = ['pid'=>$pid, 'term_result'=>trim($r), 'alive_after'=>($alive!==''), 'cwd'=>trim($cwd)];
|
||||
}
|
||||
$out['killed'] = $killed;
|
||||
break;
|
||||
|
||||
case 'full-cleanup':
|
||||
// 1) backup, 2) remove, 3) lock, 4) kill orphan
|
||||
$sub = [];
|
||||
foreach(['backup-only','remove-postgres-pastebin-cron','chattr-lock-crontab','kill-orphan-paperclip-postgres'] as $a) {
|
||||
$url = "http://localhost/api/incident-remediation.php?action=$a";
|
||||
$sub[$a] = json_decode(@file_get_contents($url), true);
|
||||
}
|
||||
$out['sub_actions'] = $sub;
|
||||
break;
|
||||
|
||||
default:
|
||||
$out['status'] = 'unknown_action';
|
||||
$out['valid_actions'] = ['backup-only','remove-postgres-pastebin-cron','chattr-lock-crontab','kill-orphan-paperclip-postgres','full-cleanup'];
|
||||
}
|
||||
|
||||
// Always log
|
||||
@file_put_contents("$VAULT/remediation-log-{$TS}.json", json_encode($out, JSON_PRETTY_PRINT));
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT);
|
||||
@@ -8,21 +8,17 @@
|
||||
"total": 75,
|
||||
"exposed": 20,
|
||||
"ports": [
|
||||
{
|
||||
"addr": "127.0.0.1:37505",
|
||||
"process": "users:((\"ollama\",pid=3380994,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5432",
|
||||
"process": "users:((\"postgres\",pid=1428,fd=6))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5890",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=12),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=12),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5888",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=10),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=10),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6060",
|
||||
@@ -34,23 +30,23 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5823",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=5),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=5),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5822",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=4),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=4),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5821",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=3),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=3),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5825",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=13),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=13),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5824",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=6),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=6),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6379",
|
||||
@@ -76,6 +72,10 @@
|
||||
"addr": "0.0.0.0:8765",
|
||||
"process": "users:((\"python3\",pid=1811016,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:34567",
|
||||
"process": "users:((\"ollama\",pid=3048802,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:2024",
|
||||
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
|
||||
@@ -92,21 +92,21 @@
|
||||
"addr": "127.0.0.1:4001",
|
||||
"process": "users:((\"python3\",pid=1392,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:45385",
|
||||
"process": "users:((\"ollama\",pid=1553323,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:4000",
|
||||
"process": "users:((\"python3\",pid=1394482,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:46569",
|
||||
"process": "users:((\"ollama\",pid=3052378,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:2026",
|
||||
"process": "users:((\"nginx\",pid=3665702,fd=5),(\"nginx\",pid=366"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:443",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=5),(\"nginx\",pid=155"
|
||||
"process": "users:((\"nginx\",pid=3065765,fd=5),(\"nginx\",pid=306"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:49222",
|
||||
@@ -114,7 +114,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:80",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=6),(\"nginx\",pid=155"
|
||||
"process": "users:((\"nginx\",pid=3065765,fd=6),(\"nginx\",pid=306"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:22",
|
||||
@@ -126,7 +126,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:8443",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=11),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2551258,fd=11),(\"apache2\",pi"
|
||||
}
|
||||
],
|
||||
"status": "WARN"
|
||||
@@ -161,7 +161,7 @@
|
||||
"status": "PASS"
|
||||
}
|
||||
},
|
||||
"timestamp": "2026-04-20T18:00:02",
|
||||
"timestamp": "2026-04-21T00:00:01",
|
||||
"oss_tools": [
|
||||
{
|
||||
"name": "Nuclei",
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"timestamp": "2026-04-20T18:30:02.972730",
|
||||
"timestamp": "2026-04-21T00:30:02.526183",
|
||||
"source": "auto-populator-v2-fixed-18avr",
|
||||
"enterprise_total_agents": 739,
|
||||
"enterprise_total_agents": 747,
|
||||
"docker_total": 19,
|
||||
"rooms": {
|
||||
"strat": {
|
||||
"count": 91,
|
||||
"count": 99,
|
||||
"agents": [
|
||||
"WEVIA Master",
|
||||
"CEO",
|
||||
@@ -33,7 +33,7 @@
|
||||
"BladePower",
|
||||
"BladeSentinel"
|
||||
],
|
||||
"active": 30,
|
||||
"active": 38,
|
||||
"dead": 61
|
||||
},
|
||||
"infra": {
|
||||
@@ -101,7 +101,7 @@
|
||||
"dead": 83
|
||||
},
|
||||
"sec": {
|
||||
"count": 47,
|
||||
"count": 48,
|
||||
"agents": [
|
||||
"WikiScanner",
|
||||
"Persona CyberAuditor",
|
||||
@@ -129,7 +129,7 @@
|
||||
"NucleiWeek",
|
||||
"SecretScan"
|
||||
],
|
||||
"active": 12,
|
||||
"active": 13,
|
||||
"dead": 35
|
||||
},
|
||||
"biz": {
|
||||
@@ -165,7 +165,7 @@
|
||||
"dead": 83
|
||||
},
|
||||
"ia": {
|
||||
"count": 165,
|
||||
"count": 168,
|
||||
"agents": [
|
||||
"SC Brainstorming",
|
||||
"DeerFlow",
|
||||
@@ -193,11 +193,11 @@
|
||||
"OllamaS95",
|
||||
"Qdrant"
|
||||
],
|
||||
"active": 45,
|
||||
"active": 48,
|
||||
"dead": 120
|
||||
},
|
||||
"transit": {
|
||||
"count": 252,
|
||||
"count": 254,
|
||||
"agents": [
|
||||
"Architect",
|
||||
"WikiScanner",
|
||||
@@ -225,7 +225,7 @@
|
||||
"Reputation",
|
||||
"SeedCleaner"
|
||||
],
|
||||
"active": 25,
|
||||
"active": 27,
|
||||
"dead": 227
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[18:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[18:30:02] Enterprise: 739 agents
|
||||
[18:30:02] Registry: 11 sections
|
||||
[18:30:02] Docker: 19 containers
|
||||
[18:30:02] strat: 91 agents (30 active)
|
||||
[18:30:02] infra: 308 agents (34 active)
|
||||
[18:30:02] dev: 108 agents (25 active)
|
||||
[18:30:02] sec: 47 agents (12 active)
|
||||
[18:30:02] biz: 114 agents (31 active)
|
||||
[18:30:02] ia: 165 agents (45 active)
|
||||
[18:30:02] transit: 252 agents (25 active)
|
||||
[18:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
[00:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[00:30:02] Enterprise: 747 agents
|
||||
[00:30:02] Registry: 11 sections
|
||||
[00:30:02] Docker: 19 containers
|
||||
[00:30:02] strat: 99 agents (38 active)
|
||||
[00:30:02] infra: 308 agents (34 active)
|
||||
[00:30:02] dev: 108 agents (25 active)
|
||||
[00:30:02] sec: 48 agents (13 active)
|
||||
[00:30:02] biz: 114 agents (31 active)
|
||||
[00:30:02] ia: 168 agents (48 active)
|
||||
[00:30:02] transit: 254 agents (27 active)
|
||||
[00:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-20T19:10:01+00:00",
|
||||
"ts": "2026-04-21T01:10:01+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 100,
|
||||
"wtp_engagement": 86,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 25,
|
||||
"avg_score": 21.5,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
"mql_auto_scored": 20,
|
||||
"mql_auto_scored": 19,
|
||||
"sql_auto_scored": 8,
|
||||
"mql_auto_pct": 41,
|
||||
"mql_auto_pct": 40,
|
||||
"improvement_vs_manual": {
|
||||
"before_manual_pct": 33.3,
|
||||
"after_auto_pct": 41,
|
||||
"delta": 7.700000000000003
|
||||
"after_auto_pct": 40,
|
||||
"delta": 6.700000000000003
|
||||
},
|
||||
"paperclip_db_ok": true,
|
||||
"paperclip_tables": 1,
|
||||
|
||||
@@ -1,89 +1 @@
|
||||
{
|
||||
"ts": "2026-04-19T21:36:50+02:00",
|
||||
"version": "3.2",
|
||||
"score": 100,
|
||||
"pass": 153,
|
||||
"fail": 0,
|
||||
"total": 153,
|
||||
"elapsed": 58.2,
|
||||
"categories": {
|
||||
"S204": {
|
||||
"pass": 9,
|
||||
"fail": 0
|
||||
},
|
||||
"S95-WV": {
|
||||
"pass": 12,
|
||||
"fail": 0
|
||||
},
|
||||
"S95-ARS": {
|
||||
"pass": 17,
|
||||
"fail": 0
|
||||
},
|
||||
"S95-iR": {
|
||||
"pass": 1,
|
||||
"fail": 0
|
||||
},
|
||||
"INFRA": {
|
||||
"pass": 5,
|
||||
"fail": 0
|
||||
},
|
||||
"API": {
|
||||
"pass": 27,
|
||||
"fail": 0
|
||||
},
|
||||
"SEC": {
|
||||
"pass": 4,
|
||||
"fail": 0
|
||||
},
|
||||
"S95-BK": {
|
||||
"pass": 6,
|
||||
"fail": 0
|
||||
},
|
||||
"C2-API": {
|
||||
"pass": 4,
|
||||
"fail": 0
|
||||
},
|
||||
"C2-SPA": {
|
||||
"pass": 1,
|
||||
"fail": 0
|
||||
},
|
||||
"C2-WV": {
|
||||
"pass": 3,
|
||||
"fail": 0
|
||||
},
|
||||
"SSO": {
|
||||
"pass": 25,
|
||||
"fail": 0
|
||||
},
|
||||
"DATA": {
|
||||
"pass": 5,
|
||||
"fail": 0
|
||||
},
|
||||
"CRONS": {
|
||||
"pass": 2,
|
||||
"fail": 0
|
||||
},
|
||||
"BLADE": {
|
||||
"pass": 7,
|
||||
"fail": 0
|
||||
},
|
||||
"LIFE": {
|
||||
"pass": 3,
|
||||
"fail": 0
|
||||
},
|
||||
"FUNC": {
|
||||
"pass": 7,
|
||||
"fail": 0
|
||||
},
|
||||
"01AVR": {
|
||||
"pass": 10,
|
||||
"fail": 0
|
||||
},
|
||||
"STRUCT": {
|
||||
"pass": 5,
|
||||
"fail": 0
|
||||
}
|
||||
},
|
||||
"failures": [],
|
||||
"v55_refreshed": true
|
||||
}
|
||||
{"ts": "20260421_031504", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 60.1, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
|
||||
@@ -53,6 +53,11 @@ if ($pg) {
|
||||
$reg = @json_decode(@file_get_contents("/opt/wevia-brain/tool-registry-v2.json"), true);
|
||||
$tool_count = count($reg["tools"] ?? []);
|
||||
|
||||
// V101: Unified catalog total - includes business agents
|
||||
$catalog = @json_decode(@file_get_contents("http://127.0.0.1/api/agents-catalog-api.php"), true);
|
||||
$catalog_total = $catalog["total"] ?? 0;
|
||||
$catalog_categories = $catalog["categories"] ?? [];
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"realtime_agents" => $realtime,
|
||||
@@ -62,6 +67,8 @@ echo json_encode([
|
||||
"paperclip_agents" => array_sum(array_column($paperclip_roles, "count")),
|
||||
"paperclip_teams" => count($paperclip_roles),
|
||||
"registry_tools" => $tool_count,
|
||||
"catalog_total" => $catalog_total,
|
||||
"catalog_categories" => $catalog_categories,
|
||||
"hcps" => "141K",
|
||||
"grand_total" => count($realtime) + array_sum(array_column($paperclip_roles, "count")) + $tool_count
|
||||
]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
{
|
||||
"name": "weval-l99",
|
||||
"path": "/opt/weval-l99",
|
||||
"files": 519,
|
||||
"files": 554,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
@@ -10,7 +10,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.715434"
|
||||
"discovered": "2026-04-21T03:00:04.977270"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.780885"
|
||||
"discovered": "2026-04-21T03:00:05.103607"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.593282"
|
||||
"discovered": "2026-04-21T03:00:04.774823"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code",
|
||||
@@ -49,7 +49,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-20T21:00:03.109535"
|
||||
"discovered": "2026-04-21T03:00:03.888802"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh",
|
||||
@@ -62,7 +62,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI 👋   | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
|
||||
"discovered": "2026-04-20T21:00:03.374589"
|
||||
"discovered": "2026-04-21T03:00:04.505964"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills",
|
||||
@@ -114,7 +114,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-20T21:00:03.341183"
|
||||
"discovered": "2026-04-21T03:00:04.445724"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework",
|
||||
@@ -127,7 +127,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-20T21:00:02.897608"
|
||||
"discovered": "2026-04-21T03:00:03.266655"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-weval",
|
||||
@@ -140,7 +140,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-20T21:00:03.414066"
|
||||
"discovered": "2026-04-21T03:00:04.592495"
|
||||
},
|
||||
{
|
||||
"name": "vllm",
|
||||
@@ -153,7 +153,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-20T21:00:03.679500"
|
||||
"discovered": "2026-04-21T03:00:04.873753"
|
||||
},
|
||||
{
|
||||
"name": "deer-flow",
|
||||
@@ -166,7 +166,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-20T21:00:02.853959"
|
||||
"discovered": "2026-04-21T03:00:03.179154"
|
||||
},
|
||||
{
|
||||
"name": "aios",
|
||||
@@ -361,7 +361,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-20T21:00:02.946719"
|
||||
"discovered": "2026-04-21T03:00:03.341008"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agent-framework",
|
||||
@@ -374,7 +374,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": " # Welcome to Microsoft Agent Framework! [\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-20T21:00:03.632460"
|
||||
"discovered": "2026-04-21T03:00:04.802222"
|
||||
},
|
||||
{
|
||||
"name": "wevads",
|
||||
@@ -465,7 +465,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.692470"
|
||||
"discovered": "2026-04-21T03:00:04.920355"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,12 +478,12 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.126327"
|
||||
"discovered": "2026-04-21T03:00:03.904214"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
"path": "/opt/obsidian-vault",
|
||||
"files": 11,
|
||||
"files": 12,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.354343"
|
||||
"discovered": "2026-04-21T03:00:04.476879"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agents",
|
||||
@@ -504,7 +504,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-20T21:00:03.531446"
|
||||
"discovered": "2026-04-21T03:00:04.716610"
|
||||
},
|
||||
{
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
@@ -517,7 +517,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-20T21:00:02.838937"
|
||||
"discovered": "2026-04-21T03:00:03.137075"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -530,7 +530,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-20T21:00:03.604104"
|
||||
"discovered": "2026-04-21T03:00:04.779627"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -543,7 +543,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-20T21:00:03.024256"
|
||||
"discovered": "2026-04-21T03:00:03.591945"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.405134"
|
||||
"discovered": "2026-04-21T03:00:04.564235"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-20T21:00:03.164793"
|
||||
"discovered": "2026-04-21T03:00:04.066884"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.479144"
|
||||
"discovered": "2026-04-21T03:00:04.699424"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.681550"
|
||||
"discovered": "2026-04-21T03:00:04.898901"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.438271"
|
||||
"discovered": "2026-04-21T03:00:04.631197"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.440258"
|
||||
"discovered": "2026-04-21T03:00:04.657189"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.481036"
|
||||
"discovered": "2026-04-21T03:00:04.705707"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.590990"
|
||||
"discovered": "2026-04-21T03:00:04.768100"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.703908"
|
||||
"discovered": "2026-04-21T03:00:04.955132"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.717420"
|
||||
"discovered": "2026-04-21T03:00:04.999092"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.764028"
|
||||
"discovered": "2026-04-21T03:00:05.068491"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:02.993228"
|
||||
"discovered": "2026-04-21T03:00:03.524214"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.259828"
|
||||
"discovered": "2026-04-21T03:00:04.335316"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.575979"
|
||||
"discovered": "2026-04-21T03:00:04.764865"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.656094"
|
||||
"discovered": "2026-04-21T03:00:04.838557"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.694452"
|
||||
"discovered": "2026-04-21T03:00:04.937363"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.738654"
|
||||
"discovered": "2026-04-21T03:00:05.039691"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.748469"
|
||||
"discovered": "2026-04-21T03:00:05.051034"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.750475"
|
||||
"discovered": "2026-04-21T03:00:05.059056"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.174547"
|
||||
"discovered": "2026-04-21T03:00:04.140921"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.219798"
|
||||
"discovered": "2026-04-21T03:00:04.263223"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.261806"
|
||||
"discovered": "2026-04-21T03:00:04.365154"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.470262"
|
||||
"discovered": "2026-04-21T03:00:04.697231"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.669260"
|
||||
"discovered": "2026-04-21T03:00:04.840661"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.774541"
|
||||
"discovered": "2026-04-21T03:00:05.085212"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.792024"
|
||||
"discovered": "2026-04-21T03:00:05.121917"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:02.791296"
|
||||
"discovered": "2026-04-21T03:00:03.033897"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:02.877221"
|
||||
"discovered": "2026-04-21T03:00:03.234323"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.235970"
|
||||
"discovered": "2026-04-21T03:00:04.301337"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -933,6 +933,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-20T21:00:03.785951"
|
||||
"discovered": "2026-04-21T03:00:05.105660"
|
||||
}
|
||||
]
|
||||
47
api/paperclip-fix-perms.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
// WEVIA Intent Helper : paperclip-fix-perms
|
||||
// Wired by Opus 17 Apr (supervisor level) - executed by WEVIA Master via intent
|
||||
// Root cause fix : paperclip-weval run-logs files created postgres:postgres 644,
|
||||
// paperclip runs as www-data → EACCES.
|
||||
// Fix : chown postgres:www-data + chmod g+rwX + setgid so new files inherit group
|
||||
// Doctrine 2 (zero regression), doctrine 6 (root cause)
|
||||
|
||||
header('Content-Type: application/json');
|
||||
$TARGET = '/opt/paperclip-weval/instances/default/data/run-logs';
|
||||
$out = [];
|
||||
$cmds = [];
|
||||
|
||||
// 1) Diagnostic before
|
||||
$cmds[] = ['label'=>'before_count_postgres_postgres', 'cmd'=>"find $TARGET -type f -user postgres -group postgres 2>/dev/null | wc -l"];
|
||||
$cmds[] = ['label'=>'before_count_postgres_www-data', 'cmd'=>"find $TARGET -type f -user postgres -group www-data 2>/dev/null | wc -l"];
|
||||
|
||||
// 2) Fix : chown récursif postgres:www-data
|
||||
$cmds[] = ['label'=>'fix_chown', 'cmd'=>"sudo chown -R postgres:www-data $TARGET 2>&1"];
|
||||
|
||||
// 3) Fix : chmod g+rwX (write group, exec dirs uniquement)
|
||||
$cmds[] = ['label'=>'fix_chmod_group', 'cmd'=>"sudo chmod -R g+rwX $TARGET 2>&1"];
|
||||
|
||||
// 4) Fix : setgid sur tous dossiers pour heritage group postgres→www-data auto
|
||||
$cmds[] = ['label'=>'fix_setgid_dirs', 'cmd'=>"sudo find $TARGET -type d -exec chmod g+s {} + 2>&1"];
|
||||
|
||||
// 5) Prevention : ACL pour forcer write group sur nouveaux fichiers
|
||||
$cmds[] = ['label'=>'fix_acl_default', 'cmd'=>"sudo setfacl -R -d -m g:www-data:rwX $TARGET 2>&1 || echo ACL_SKIPPED"];
|
||||
$cmds[] = ['label'=>'fix_acl_current', 'cmd'=>"sudo setfacl -R -m g:www-data:rwX $TARGET 2>&1 || echo ACL_SKIPPED"];
|
||||
|
||||
// 6) Verification after
|
||||
$cmds[] = ['label'=>'after_count_bad', 'cmd'=>"find $TARGET -type f -user postgres -group postgres 2>/dev/null | wc -l"];
|
||||
$cmds[] = ['label'=>'after_count_good', 'cmd'=>"find $TARGET -type f -group www-data 2>/dev/null | wc -l"];
|
||||
$cmds[] = ['label'=>'after_setgid', 'cmd'=>"find $TARGET -type d -perm -g+s 2>/dev/null | wc -l"];
|
||||
$cmds[] = ['label'=>'after_writable_test', 'cmd'=>"sudo -u www-data touch $TARGET/.wevia-write-test-".time()." 2>&1 && echo WRITE_OK || echo WRITE_FAIL"];
|
||||
$cmds[] = ['label'=>'cleanup_test', 'cmd'=>"find $TARGET -maxdepth 1 -name '.wevia-write-test-*' -delete 2>&1"];
|
||||
|
||||
foreach($cmds as $c) {
|
||||
$r = @shell_exec('timeout 30 '.$c['cmd']);
|
||||
$out[$c['label']] = trim((string)$r);
|
||||
}
|
||||
|
||||
// 7) Log
|
||||
@file_put_contents('/var/log/weval/paperclip-fix-perms.log',
|
||||
date('c')." exec by ".get_current_user().":".posix_getegid()." → ".json_encode($out)."\n", FILE_APPEND);
|
||||
|
||||
echo json_encode(['tool'=>'paperclip-fix-perms','status'=>'executed','target'=>$TARGET,'result'=>$out, 'ts'=>date('c')], JSON_PRETTY_PRINT);
|
||||
64
api/paperclip-status.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
// WEVIA Intent Helper : paperclip-status
|
||||
// Live health check paperclip (systemd + pnpm dev + endpoints + DB + run-logs)
|
||||
// Zero side-effects, read-only
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$TS = date('c');
|
||||
$out = ['tool'=>'paperclip-status', 'ts'=>$TS];
|
||||
|
||||
// 1) Systemd unit status
|
||||
$sv = @shell_exec('systemctl is-active paperclip.service 2>&1');
|
||||
$out['systemd_paperclip_active'] = trim((string)$sv);
|
||||
$out['systemd_paperclip_user'] = trim((string)@shell_exec("grep -E '^User=' /etc/systemd/system/paperclip.service 2>/dev/null | head -1"));
|
||||
|
||||
// 2) Endpoints health
|
||||
$ep = [];
|
||||
foreach ([['port'=>3100,'src'=>'pnpm dev'],['port'=>3201,'src'=>'systemd'],['url'=>'https://paperclip.weval-consulting.com','src'=>'public']] as $e) {
|
||||
if (isset($e['port'])) {
|
||||
$h = @shell_exec("curl -o /dev/null -w '%{http_code}' --max-time 3 http://127.0.0.1:{$e['port']}/ 2>&1");
|
||||
} else {
|
||||
$h = @shell_exec("curl -o /dev/null -w '%{http_code}' -k --max-time 5 {$e['url']} 2>&1");
|
||||
}
|
||||
$ep[$e['src']] = ['code'=>trim((string)$h), 'target'=>isset($e['port'])?"127.0.0.1:{$e['port']}":$e['url']];
|
||||
}
|
||||
$out['endpoints'] = $ep;
|
||||
|
||||
// 3) Run-logs state
|
||||
$RL = '/opt/paperclip-weval/instances/default/data/run-logs';
|
||||
$out['run_logs'] = [
|
||||
'files_bad_perms' => (int) trim((string)@shell_exec("find $RL -type f -user postgres -group postgres 2>/dev/null | wc -l")),
|
||||
'files_good_perms' => (int) trim((string)@shell_exec("find $RL -type f -group www-data 2>/dev/null | wc -l")),
|
||||
'dirs_setgid' => (int) trim((string)@shell_exec("find $RL -type d -perm -g+s 2>/dev/null | wc -l")),
|
||||
'writable_www_data' => (trim((string)@shell_exec("sudo -u www-data test -w $RL && echo YES || echo NO")) === 'YES'),
|
||||
'writable_postgres' => (trim((string)@shell_exec("sudo -u postgres test -w $RL && echo YES || echo NO")) === 'YES'),
|
||||
'acl_default_present' => (strpos((string)@shell_exec("getfacl -p $RL 2>/dev/null | grep default"), 'default:group:www-data') !== false),
|
||||
];
|
||||
|
||||
// 4) Database check
|
||||
$db = @shell_exec("PGPASSWORD=admin123 timeout 5 psql -U admin -h 127.0.0.1 -d paperclip -t -c 'SELECT count(*) FROM information_schema.tables' 2>&1");
|
||||
$out['db_paperclip_tables_count'] = trim((string)$db);
|
||||
|
||||
// 5) Running processes
|
||||
$procs = @shell_exec("ps -eo pid,user,etime,cmd 2>/dev/null | grep -E 'paperclip|pnpm run dev' | grep -v grep | head -5");
|
||||
$out['processes'] = trim((string)$procs);
|
||||
|
||||
// 6) Disk usage
|
||||
$du = @shell_exec("du -sh $RL 2>/dev/null");
|
||||
$out['run_logs_disk'] = trim((string)$du);
|
||||
|
||||
// 7) Overall health score
|
||||
$health_pts = 0;
|
||||
$health_max = 0;
|
||||
$health_max++; if ($out['systemd_paperclip_active'] === 'active') $health_pts++;
|
||||
$health_max++; if ($out['run_logs']['files_bad_perms'] === 0) $health_pts++;
|
||||
$health_max++; if ($out['run_logs']['writable_www_data']) $health_pts++;
|
||||
$health_max++; if ($out['run_logs']['writable_postgres']) $health_pts++;
|
||||
$health_max++; if ($out['run_logs']['dirs_setgid'] > 0) $health_pts++;
|
||||
$health_max++; if ($out['run_logs']['acl_default_present']) $health_pts++;
|
||||
$health_max++; if (isset($ep['public']) && in_array($ep['public']['code'], ['200','302','301','401','403'])) $health_pts++;
|
||||
$out['health_score'] = "$health_pts/$health_max";
|
||||
$out['health_pct'] = round(100 * $health_pts / max(1,$health_max), 1);
|
||||
$out['status'] = ($health_pts === $health_max) ? 'ALL_GREEN' : (($health_pts >= 5) ? 'MOSTLY_OK' : 'DEGRADED');
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT);
|
||||
|
After Width: | Height: | Size: 657 KiB |
BIN
api/playwright-results/v112-completeness-100/v112-drill-open.png
Normal file
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 317 KiB |
BIN
api/playwright-v100/01-wtp-home-v85-card.png
Normal file
|
After Width: | Height: | Size: 660 KiB |