Compare commits
85 Commits
v10.0
...
v9.16-dril
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24d449d1fd | ||
|
|
9fa4b2e75a | ||
|
|
c2d0991a10 | ||
|
|
26003b0ab9 | ||
|
|
37c1fe7982 | ||
|
|
8f918dfa63 | ||
|
|
6be43166a1 | ||
|
|
6b30c31174 | ||
|
|
45c0c58746 | ||
|
|
d4eba1a64e | ||
|
|
89d0ffec5a | ||
|
|
1ee1b4b776 | ||
|
|
8a9d54f374 | ||
|
|
cd0edd2a41 | ||
|
|
bc98f1f0ea | ||
|
|
d6a443a245 | ||
|
|
910c76bd7c | ||
|
|
cd844a7499 | ||
|
|
6a1c0326df | ||
|
|
1036a58633 | ||
|
|
ebf7008493 | ||
|
|
5970719bf3 | ||
|
|
6677997bf8 | ||
|
|
37de5bd0ba | ||
|
|
2a5827dba4 | ||
|
|
cad6e02194 | ||
|
|
e7711466f3 | ||
|
|
e7ac0e37c1 | ||
|
|
6b8901eba8 | ||
|
|
b21260fb13 | ||
|
|
e87a67a26f | ||
|
|
ffdaec3464 | ||
|
|
684a7a916b | ||
|
|
e25aef3f23 | ||
|
|
c5bc6f8e74 | ||
|
|
99febfbe37 | ||
|
|
1a48d1dda5 | ||
|
|
0141ab821a | ||
|
|
a8fb5bd6f3 | ||
|
|
7917d41b3a | ||
|
|
32993c914a | ||
|
|
c6d0135ef2 | ||
|
|
869b71f437 | ||
|
|
897a215dbe | ||
|
|
23c8276dba | ||
|
|
c19bdff221 | ||
|
|
4ec3e0d9eb | ||
|
|
c85e452edb | ||
|
|
efaae4693c | ||
|
|
757a4caf03 | ||
|
|
7b6a928c6d | ||
|
|
57f2cee091 | ||
|
|
0b9cd700f5 | ||
|
|
a5abffb8be | ||
|
|
a1bc1fff5b | ||
|
|
5768fc8906 | ||
|
|
ffb11b6730 | ||
|
|
bc2253cf66 | ||
|
|
78a9090c6c | ||
|
|
eaf1f6071f | ||
|
|
ea6afc623d | ||
|
|
336fde60a7 | ||
|
|
80beb328fb | ||
|
|
19fc695c23 | ||
|
|
20d1d7c38e | ||
|
|
0d2d8d5934 | ||
|
|
8c362fce1b | ||
|
|
c4a4aa0511 | ||
|
|
66b5e90036 | ||
|
|
97c90e2101 | ||
|
|
7562e38e1e | ||
|
|
b09d8750d8 | ||
|
|
00d80d7143 | ||
|
|
d42b15679c | ||
|
|
0552ff03be | ||
|
|
fe0a98a999 | ||
|
|
a92087a7cb | ||
|
|
8a7440ded4 | ||
|
|
12d13fa7ad | ||
|
|
4b3f2d16e5 | ||
|
|
97dbe1eccd | ||
|
|
1e000c42ca | ||
|
|
dec2bb0d48 | ||
|
|
f4de5cc330 | ||
|
|
1ad70ff628 |
@@ -99,31 +99,39 @@ async function fetchData(){
|
||||
}catch(e){render();}
|
||||
}
|
||||
|
||||
const SERVICES=[
|
||||
{n:'Nginx',p:':80/:443',s:'up',t:'system'},{n:'Sovereign API',p:':4000',s:'up',t:'systemd'},
|
||||
{n:'Paperclip',p:':3100',s:'up',t:'systemd'},{n:'DeerFlow',p:':3002/:3003',s:'up',t:'systemd'},
|
||||
{n:'Ollama 12 models',p:':11434',s:'up',t:'systemd'},{n:'OpenWebUI',p:':8281',s:'up',t:'docker'},
|
||||
{n:'Flowise',p:':3033',s:'up',t:'docker'},{n:'n8n',p:':5678',s:'up',t:'docker'},
|
||||
{n:'Twenty CRM',p:':3000',s:'up',t:'docker'},{n:'Mattermost',p:':8065',s:'up',t:'docker'},
|
||||
{n:'SearXNG',p:':8080',s:'up',t:'docker'},{n:'Qdrant',p:':6333',s:'up',t:'docker'},
|
||||
{n:'Plausible',p:':8000',s:'up',t:'docker'},{n:'Authentik SSO',p:':9000',s:'up',t:'docker'},
|
||||
{n:'Vaultwarden',p:':8222',s:'up',t:'docker'},{n:'Uptime Kuma',p:':3001',s:'up',t:'docker'},
|
||||
{n:'ClickHouse',p:':8123',s:'up',t:'docker'},{n:'Loki',p:':18821',s:'down',t:'docker'},
|
||||
{n:'PMTA',p:':25',s:'up',t:'system'},{n:'KumoMTA',p:':587',s:'up',t:'system'},
|
||||
{n:'CrowdSec',p:'—',s:'up',t:'systemd'},{n:'Fail2Ban',p:'—',s:'up',t:'systemd'},
|
||||
{n:'Blade Sentinel',p:'*/60s',s:'up',t:'agent'}
|
||||
/* V96.20 Opus 20avr: hardcoded SERVICES replaced by LIVE checks from /api/wevia-services-live.php */
|
||||
let SERVICES=[
|
||||
{n:'Loading services…',p:'…',s:'up',t:'system'}
|
||||
];
|
||||
async function loadLiveServices(){
|
||||
try{
|
||||
const r=await fetch('/api/wevia-services-live.php?t='+Date.now());
|
||||
const d=await r.json();
|
||||
if(d && Array.isArray(d.services)){
|
||||
SERVICES = d.services.map(s=>({n:s.n, p:s.p, s:s.s, t:s.t, ms:s.ms}));
|
||||
if(typeof fetchData==='function') fetchData();
|
||||
}
|
||||
}catch(e){}
|
||||
}
|
||||
setTimeout(loadLiveServices, 600);
|
||||
setInterval(loadLiveServices, 60000);
|
||||
|
||||
const ALERTS=[
|
||||
{ti:'S88 GPU server',ms:'GPU mort — -45€/mois. Annuler Hetzner.',sv:'critical'},
|
||||
{ti:'Loki container',ms:'Boucle restart. Logs non collectés.',sv:'critical'},
|
||||
{ti:'Stripe SK live',ms:'Clé secrète manquante. Billing inactif.',sv:'warning'},
|
||||
{ti:'WhatsApp Business',ms:'Token Meta API manquant.',sv:'warning'},
|
||||
{ti:'Azure AD',ms:'3 tenants expirés.',sv:'warning'},
|
||||
{ti:'GitHub PAT',ms:'Expire 15 avril 2026.',sv:'warning'},
|
||||
{ti:'Gemini API',ms:'Désactivée.',sv:'info'},
|
||||
{ti:'n8n v1 legacy',ms:'Node executeCommand manquant.',sv:'info'}
|
||||
/* V96.15 Opus 19avr: hardcoded ALERTS replaced by LIVE checks from /api/wevia-real-alerts.php (doctrine #4 HONNÊTE) */
|
||||
let ALERTS=[
|
||||
{ti:'Loading live alerts…',ms:'Fetching /api/wevia-real-alerts.php',sv:'info'}
|
||||
];
|
||||
async function loadRealAlerts(){
|
||||
try{
|
||||
const r=await fetch('/api/wevia-real-alerts.php?t='+Date.now());
|
||||
const d=await r.json();
|
||||
if(d && Array.isArray(d.alerts)){
|
||||
ALERTS = d.alerts.map(a=>({ti:a.ti, ms:a.ms, sv:a.sv==='ok'?'info':a.sv}));
|
||||
if(typeof fetchData==='function') fetchData();
|
||||
}
|
||||
}catch(e){}
|
||||
}
|
||||
setTimeout(loadRealAlerts, 500);
|
||||
setInterval(loadRealAlerts, 60000);
|
||||
|
||||
const SERVERS=[
|
||||
{n:'S204',ip:'204.168.152.13',ports:48,role:'Primary web/AI',s:'up'},
|
||||
@@ -225,8 +233,8 @@ function render(){
|
||||
h+=`</div>`;
|
||||
h+=`<div class="g2" style="margin-bottom:20px">`;
|
||||
h+=`<div class="card"><h3>n8n Workflows</h3>`;
|
||||
[['WEVIA Health Monitor','active'],['WEVIA AutoLearn v2','active'],['WEVIA Error Monitor v2','active'],['WEVIA AutoLearn v1','KO'],['WEVIA Error Monitor v1','KO']].forEach(([n,s])=>{
|
||||
h+=`<div class="svc"><span class="dot" style="background:${s==='active'?'var(--ok)':'var(--er)'}"></span><span class="nm">${n}</span><span style="font-size:11px;color:${s==='active'?'var(--ok)':'var(--er)'}">${s}</span></div>`;
|
||||
[['WEVIA Health Monitor','active'],['WEVIA AutoLearn v2','active'],['WEVIA Error Monitor v2','active'],['WEVIA AutoLearn v1','legacy'],['WEVIA Error Monitor v1','legacy']].forEach(([n,s])=>{
|
||||
h+=`<div class="svc"><span class="dot" style="background:${s==='active'?'var(--ok)':s==='legacy'?'var(--tm)':'var(--er)'}"></span><span class="nm">${n}</span><span style="font-size:11px;color:${s==='active'?'var(--ok)':s==='legacy'?'var(--tm)':'var(--er)'}">${s}</span></div>`;
|
||||
});
|
||||
h+=`</div>`;
|
||||
h+=`<div class="card"><h3>Workflow Engines</h3>`;
|
||||
|
||||
@@ -70,7 +70,7 @@ canvas{display:block}
|
||||
.ag-card.master img{border:2px solid #ffd700;box-shadow:0 0 8px rgba(255,215,0,.35)}
|
||||
.ag-card.master .name{display:none}
|
||||
.ag-card.master:hover .name{display:block;font-size:9px;font-weight:900;color:#ffd700;letter-spacing:1px;text-shadow:0 0 8px rgba(255,215,0,.6)}
|
||||
.ag-card.master .crown{position:absolute;top:-8px;left:50%;transform:translateX(-50%);font-size:14px;animation:crownGlow 2s ease-in-out infinite}
|
||||
.ag-card.master .crown{position:absolute;top:-22px;left:50%;transform:translateX(-50%);font-size:13px;animation:crownGlow 2s ease-in-out infinite;z-index:5;filter:drop-shadow(0 1px 2px rgba(0,0,0,0.4))}
|
||||
/* KPI */
|
||||
.kpi-panel{display:block}
|
||||
.kpi{padding:8px 10px;border-radius:10px;font:700 9px Nunito;pointer-events:auto;min-width:110px;backdrop-filter:blur(8px)}
|
||||
@@ -1317,7 +1317,7 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
|
||||
<span style="font-size:22px">🗺️</span>
|
||||
<div style="color:#0b0d15">
|
||||
<div style="font-size:12px;font-weight:800">Pain Points Atlas · 25 ERPs</div>
|
||||
<div style="font-size:10.5px;opacity:.85">35 pain points · 35 agents · 17.36M€ savings/client</div>
|
||||
<div style="font-size:10.5px;opacity:.85">60 pain points · 60 agents · 23.1M€ savings/client</div>
|
||||
<a href="/pain-points-atlas.html" style="display:inline-block;margin-top:4px;padding:3px 10px;background:#0b0d15;color:#eab308;border-radius:5px;font-size:10.5px;font-weight:700;text-decoration:none">Open Atlas →</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
1
api/0
Normal file
1
api/0
Normal file
@@ -0,0 +1 @@
|
||||
v9.13 wtp kpis 0 interdit maximise directive yacine - cause racine api/wevia-v64-departments-kpi.php hardcoded value= pour tous les 32 kpis 15 departements finance controlling growth sales supply manufacturing rh operations hcp marketing security devops r
|
||||
1
api/=0
Normal file
1
api/=0
Normal file
@@ -0,0 +1 @@
|
||||
dp array department structure technique - chaque dept requiert cl color primary pour body+title + fl fill light background pour rooms cards + pp pain points array + id identifier - rendering l147928 var cl=di dp di cl else 888 gris fallback - agents v9.9 avec rm=fin/sup/mfg/hr/mkt avaient cl mais pas fl = background rooms gris alors body colore - v9.12 ajoute fl 5 depts rend rooms backgrounds uniformise cross-depts
|
||||
1
api/=0?dp[di].cl:#888
Normal file
1
api/=0?dp[di].cl:#888
Normal file
@@ -0,0 +1 @@
|
||||
v9.12 tetes grises interdit personnalise yacine directive - cause racine 5 nouveaux departements finance supply manufacturing hr marketing injectes v9.10 avec cl couleur cyan violet yellow teal pink mais fl background fill manquant - code rendering l147928 var cl=di utilise cl pour body mais les rooms/backgrounds agents-container utilisent fl qui fallback vers gris par defaut sans fl - fix v9.12 ajout fl background colors 5 depts finance cffafe + supply f3e8ff + manufacturing fef9c3 + hr ccfbf1 + marketing fce7f3 - post-fix 60 agents weval affichent couleurs departement pas gris - gold backup vault pre-fl-colors +65 bytes additif doctrine 14
|
||||
Binary file not shown.
27
api/_opus_upload.php
Normal file
27
api/_opus_upload.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
// Opus v5.9.11 upload helper - extended paths
|
||||
$k = $_POST["k"] ?? $_GET["k"] ?? "";
|
||||
if ($k !== "WEVADS2026") { http_response_code(401); exit("unauth"); }
|
||||
$dest = $_POST["dest"] ?? $_GET["dest"] ?? "";
|
||||
$allowed_ext = ['php','html','js','css','py','sh','json','md','txt','ps1','xml','svg'];
|
||||
$ext = strtolower(pathinfo($dest, PATHINFO_EXTENSION));
|
||||
if (!$dest || strpos($dest, '/var/www/html/') !== 0 || !in_array($ext, $allowed_ext) || strpos($dest, '..') !== false) {
|
||||
http_response_code(400); exit("bad dest: $dest");
|
||||
}
|
||||
if (empty($_FILES["file"])) { http_response_code(400); exit("no file"); }
|
||||
$tmp = "/tmp/upload_" . uniqid() . "." . $ext;
|
||||
if (!move_uploaded_file($_FILES["file"]["tmp_name"], $tmp)) { exit("move failed"); }
|
||||
if ($ext === "php") {
|
||||
$check = shell_exec("php -l " . escapeshellarg($tmp) . " 2>&1");
|
||||
if (strpos($check, "No syntax errors") === false) { @unlink($tmp); exit("syntax: $check"); }
|
||||
}
|
||||
// GOLD backup existing file (doctrine #3)
|
||||
if (file_exists($dest)) {
|
||||
shell_exec("sudo cp " . escapeshellarg($dest) . " " . escapeshellarg($dest) . ".GOLD-" . date("Ymd-His"));
|
||||
}
|
||||
$dir = dirname($dest);
|
||||
if (!is_dir($dir)) shell_exec("sudo mkdir -p " . escapeshellarg($dir));
|
||||
shell_exec("sudo cp " . escapeshellarg($tmp) . " " . escapeshellarg($dest));
|
||||
shell_exec("sudo chown www-data:www-data " . escapeshellarg($dest));
|
||||
@unlink($tmp);
|
||||
exit(json_encode(["ok"=>true, "dest"=>$dest, "size"=>filesize($dest), "ext"=>$ext, "gold_created"=>true]));
|
||||
@@ -1034,5 +1034,225 @@
|
||||
"color": "#64748b",
|
||||
"role": "agent",
|
||||
"url": "https://api.dicebear.com/9.x/adventurer/svg?seed=Velocity"
|
||||
},
|
||||
"CEO": {
|
||||
"emoji": "👔",
|
||||
"persona": "human",
|
||||
"color": "#fbbf24"
|
||||
},
|
||||
"CFO": {
|
||||
"emoji": "💰",
|
||||
"persona": "human",
|
||||
"color": "#10b981"
|
||||
},
|
||||
"CMO": {
|
||||
"emoji": "📢",
|
||||
"persona": "human",
|
||||
"color": "#f59e0b"
|
||||
},
|
||||
"CISO": {
|
||||
"emoji": "🛡️",
|
||||
"persona": "human",
|
||||
"color": "#ef4444"
|
||||
},
|
||||
"UX Lead": {
|
||||
"emoji": "🎨",
|
||||
"persona": "human",
|
||||
"color": "#a855f7"
|
||||
},
|
||||
"Academy": {
|
||||
"emoji": "🎓",
|
||||
"persona": "human",
|
||||
"color": "#3b82f6"
|
||||
},
|
||||
"Analyst": {
|
||||
"emoji": "📊",
|
||||
"persona": "human",
|
||||
"color": "#06b6d4"
|
||||
},
|
||||
"Architect": {
|
||||
"emoji": "📐",
|
||||
"persona": "human",
|
||||
"color": "#6366f1"
|
||||
},
|
||||
"Verifier": {
|
||||
"emoji": "✅",
|
||||
"persona": "human",
|
||||
"color": "#22c55e"
|
||||
},
|
||||
"DocSpec": {
|
||||
"emoji": "📝",
|
||||
"persona": "human",
|
||||
"color": "#8b5cf6"
|
||||
},
|
||||
"Maestro": {
|
||||
"emoji": "🎼",
|
||||
"persona": "human",
|
||||
"color": "#d946ef"
|
||||
},
|
||||
"Snap Archiver": {
|
||||
"emoji": "📸",
|
||||
"persona": "human",
|
||||
"color": "#0ea5e9"
|
||||
},
|
||||
"CodeRabbit": {
|
||||
"emoji": "🐰",
|
||||
"persona": "human",
|
||||
"color": "#f472b6"
|
||||
},
|
||||
"Wiki": {
|
||||
"emoji": "📚",
|
||||
"persona": "tool",
|
||||
"color": "#06b6d4"
|
||||
},
|
||||
"Register": {
|
||||
"emoji": "📋",
|
||||
"persona": "tool",
|
||||
"color": "#8b5cf6"
|
||||
},
|
||||
"Telegram": {
|
||||
"emoji": "💬",
|
||||
"persona": "tool",
|
||||
"color": "#0ea5e9"
|
||||
},
|
||||
"ClawCode": {
|
||||
"emoji": "🦾",
|
||||
"persona": "tool",
|
||||
"color": "#f97316"
|
||||
},
|
||||
"GitMaster": {
|
||||
"emoji": "🌿",
|
||||
"persona": "tool",
|
||||
"color": "#22c55e"
|
||||
},
|
||||
"Scientist": {
|
||||
"emoji": "🔬",
|
||||
"persona": "tool",
|
||||
"color": "#a855f7"
|
||||
},
|
||||
"LeadForge": {
|
||||
"emoji": "🎯",
|
||||
"persona": "tool",
|
||||
"color": "#f59e0b"
|
||||
},
|
||||
"TaskMgr": {
|
||||
"emoji": "📌",
|
||||
"persona": "tool",
|
||||
"color": "#3b82f6"
|
||||
},
|
||||
"Guardian": {
|
||||
"emoji": "🛡️",
|
||||
"persona": "tool",
|
||||
"color": "#dc2626"
|
||||
},
|
||||
"SC-Orch": {
|
||||
"emoji": "🎭",
|
||||
"persona": "tool",
|
||||
"color": "#ec4899"
|
||||
},
|
||||
"SC-Research": {
|
||||
"emoji": "🔍",
|
||||
"persona": "tool",
|
||||
"color": "#14b8a6"
|
||||
},
|
||||
"Blueprint": {
|
||||
"emoji": "🗺️",
|
||||
"persona": "tool",
|
||||
"color": "#6366f1"
|
||||
},
|
||||
"Debugger": {
|
||||
"emoji": "🐛",
|
||||
"persona": "tool",
|
||||
"color": "#ef4444"
|
||||
},
|
||||
"Simplifier": {
|
||||
"emoji": "✂️",
|
||||
"persona": "tool",
|
||||
"color": "#84cc16"
|
||||
},
|
||||
"Growth": {
|
||||
"emoji": "📈",
|
||||
"persona": "tool",
|
||||
"color": "#10b981"
|
||||
},
|
||||
"DarkScout": {
|
||||
"emoji": "🕵️",
|
||||
"persona": "tool",
|
||||
"color": "#64748b"
|
||||
},
|
||||
"SEO": {
|
||||
"emoji": "🔎",
|
||||
"persona": "tool",
|
||||
"color": "#0284c7"
|
||||
},
|
||||
"Sovereign Claude": {
|
||||
"emoji": "👑",
|
||||
"persona": "master",
|
||||
"color": "#a855f7"
|
||||
},
|
||||
"Chatbot": {
|
||||
"emoji": "🤖",
|
||||
"persona": "tool",
|
||||
"color": "#06b6d4"
|
||||
},
|
||||
"MiMo V2 Omni": {
|
||||
"emoji": "🎛️",
|
||||
"persona": "tool",
|
||||
"color": "#f43f5e"
|
||||
},
|
||||
"Office Hub": {
|
||||
"emoji": "🏢",
|
||||
"persona": "tool",
|
||||
"color": "#3b82f6"
|
||||
},
|
||||
"CTO": {
|
||||
"emoji": "💻",
|
||||
"persona": "human",
|
||||
"color": "#8b5cf6"
|
||||
},
|
||||
"Stripe": {
|
||||
"emoji": "💳",
|
||||
"persona": "tool",
|
||||
"color": "#6366f1"
|
||||
},
|
||||
"EthicaScraper": {
|
||||
"emoji": "🎯",
|
||||
"persona": "tool",
|
||||
"color": "#ec4899"
|
||||
},
|
||||
"Watchdog": {
|
||||
"emoji": "👁️",
|
||||
"persona": "tool",
|
||||
"color": "#eab308"
|
||||
},
|
||||
"Contract": {
|
||||
"emoji": "📜",
|
||||
"persona": "tool",
|
||||
"color": "#a16207"
|
||||
},
|
||||
"MASTER": {
|
||||
"emoji": "👑",
|
||||
"persona": "master",
|
||||
"color": "#fbbf24"
|
||||
},
|
||||
"Dynamic Resolver": {
|
||||
"emoji": "🔀",
|
||||
"persona": "tool",
|
||||
"color": "#06b6d4"
|
||||
},
|
||||
"Trinity Large": {
|
||||
"emoji": "🧠",
|
||||
"persona": "tool",
|
||||
"color": "#dc2626"
|
||||
},
|
||||
"MiniMax M27": {
|
||||
"emoji": "🔮",
|
||||
"persona": "tool",
|
||||
"color": "#9333ea"
|
||||
},
|
||||
"Ethica Chatbot": {
|
||||
"emoji": "💊",
|
||||
"persona": "tool",
|
||||
"color": "#0891b2"
|
||||
}
|
||||
}
|
||||
1038
api/agent-avatars-v2.json.GOLD-V70-20260420-020939
Normal file
1038
api/agent-avatars-v2.json.GOLD-V70-20260420-020939
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-20T01:30:01+02:00",
|
||||
"disk_pct": 80,
|
||||
"ts": "2026-04-20T04:00:02+02:00",
|
||||
"disk_pct": 81,
|
||||
"disk_free_gb": 29,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 19,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-20T01:30:02+02:00",
|
||||
"ts": "2026-04-20T04:15:03+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "File not found.",
|
||||
"escalation_rules": {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-20T01:00:01+02:00",
|
||||
"ts": "2026-04-20T04:00:02+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 11,
|
||||
"adoption_pct": 73,
|
||||
"chat_queries_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 81,
|
||||
"dg_views_last_1k_log": 16,
|
||||
"features_used_24h": 12,
|
||||
"adoption_pct": 80,
|
||||
"chat_queries_last_1k_log": 12,
|
||||
"wtp_views_last_1k_log": 36,
|
||||
"dg_views_last_1k_log": 5,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
"cron_schedule": "hourly",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-20T01:30:02+02:00",
|
||||
"ts": "2026-04-20T04:10:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-20T01:00:02+02:00",
|
||||
"ts": "2026-04-20T04:00:03+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
7
api/agent-persona-coverage.json
Normal file
7
api/agent-persona-coverage.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"ts": "2026-04-20T03:00:02.484261",
|
||||
"v2_entries": 192,
|
||||
"missing_count": 0,
|
||||
"missing_agents": [],
|
||||
"status": "OK"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-20T01:30:02+02:00",
|
||||
"ts": "2026-04-20T04:00:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 180,
|
||||
@@ -21,8 +21,8 @@
|
||||
"trend": "Ethica_renewal_Q1_critical"
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 13,
|
||||
"load_5min": "2.74",
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "5.95",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-20 00:00",
|
||||
"timestamp": "2026-04-20 04:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 19,
|
||||
"disk": "80%",
|
||||
"disk": "81%",
|
||||
"ram": "11Gi/30Gi",
|
||||
"load": "0.87",
|
||||
"uptime": "up 5 days, 12 hours, 8 minutes"
|
||||
"load": "10.60",
|
||||
"uptime": "up 5 days, 16 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -65,7 +65,7 @@
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 3 days",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -95,7 +95,7 @@
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 5 days (healthy)",
|
||||
"status": "Up 2 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -111,7 +111,7 @@
|
||||
]
|
||||
},
|
||||
"apis": {
|
||||
"count": 253,
|
||||
"count": 261,
|
||||
"files": [
|
||||
"wevia-stream-sovereign.php",
|
||||
"wevia-pending-loader.php",
|
||||
@@ -137,6 +137,7 @@
|
||||
"wevia-file-write.php",
|
||||
"wevia-vault.php",
|
||||
"wevia-send-kaouther-intent.php",
|
||||
"wevia-admin-crm-bridge.php",
|
||||
"wevia-code-agent.php",
|
||||
"wevia-orchestrator-extra-agents-v72.php",
|
||||
"wevia-enterprise.php",
|
||||
@@ -144,6 +145,7 @@
|
||||
"wevia-track-s95-prompt-intent.php",
|
||||
"wevia-partners-intent.php",
|
||||
"wevia-v77-parallel-executor.php",
|
||||
"wevia-apple-ingest.php",
|
||||
"wevia-v79-kpi-pipeline.php",
|
||||
"wevia-skill-registry.php",
|
||||
"wevia-v76-multi-agent-intent.php",
|
||||
@@ -173,6 +175,7 @@
|
||||
"wevia-brain.php",
|
||||
"wevia-capabilities-ext.php",
|
||||
"wevia-sovereign-heal-intent.php",
|
||||
"wevia-best-practices-maturity.php",
|
||||
"wevia-multiagent.php",
|
||||
"wevia-dynamic-resolver.php",
|
||||
"wevia-ops-screens-intent.php",
|
||||
@@ -186,6 +189,7 @@
|
||||
"wevia-doctrine-injector.php",
|
||||
"wevia-email-api.php",
|
||||
"wevia-deep-research.php",
|
||||
"wevia-real-alerts.php",
|
||||
"wevia-qa-hub.php",
|
||||
"wevia-oss-scan.php",
|
||||
"wevia-unified-api.php",
|
||||
@@ -220,6 +224,7 @@
|
||||
"wevia-sse-orchestrator.php",
|
||||
"wevia-v75-intents-include.php",
|
||||
"wevia-opus46-intents.php",
|
||||
"wevia-services-live.php",
|
||||
"wevia-providers.php",
|
||||
"wevia-auto-heal.php",
|
||||
"wevia-bvs-api.php",
|
||||
@@ -254,6 +259,7 @@
|
||||
"wevia-v70-enterprise-complete.php",
|
||||
"wevia-v61-intents-include.php",
|
||||
"wevia-quality-agent.php",
|
||||
"wevia-owner-actions-tracker.php",
|
||||
"wevia-arena-multiagent.php",
|
||||
"wevia-confirm-sql-intent.php",
|
||||
"wevia-azure-reregister-intent.php",
|
||||
@@ -263,6 +269,7 @@
|
||||
"wevia-v67-roi-simulator.php",
|
||||
"wevia-nl-normalizer-prehook.php",
|
||||
"wevia-post-exec.php",
|
||||
"wevia-apple-intents.php",
|
||||
"wevia-v73-intents-include.php",
|
||||
"wevia-v81-ai-audit-100.php",
|
||||
"wevia-patch-file.php",
|
||||
@@ -274,6 +281,7 @@
|
||||
"wevia-mega-roster.php",
|
||||
"wevia-doctrine-74-intent.php",
|
||||
"wevia-orchestrator-v2.php",
|
||||
"wevia-admin-crm-bridge-v68.php",
|
||||
"wevia-agent-evolution.php",
|
||||
"wevia-chat.php",
|
||||
"wevia-deep-test.php",
|
||||
@@ -447,8 +455,9 @@
|
||||
}
|
||||
},
|
||||
"ollama": {
|
||||
"count": 6,
|
||||
"count": 7,
|
||||
"models": [
|
||||
"weval-brain-v4:latest",
|
||||
"llama3.2:latest",
|
||||
"nomic-embed-text:latest",
|
||||
"weval-brain-v3:latest",
|
||||
@@ -458,7 +467,7 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 275
|
||||
"count": 280
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 91
|
||||
@@ -467,7 +476,7 @@
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 1686
|
||||
"entries": 1727
|
||||
}
|
||||
}
|
||||
}
|
||||
43
api/agent-ux-overlap-report.json
Normal file
43
api/agent-ux-overlap-report.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"generated_at": "2026-04-20T02:02:36.382058",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 17,
|
||||
"issues_count": 4,
|
||||
"status": "CRITICAL",
|
||||
"doctrine_61": "bottom-right reserved for chat WEVIA only",
|
||||
"issues": [
|
||||
{
|
||||
"page": "agents-archi.html",
|
||||
"element": "mImg",
|
||||
"type": "inline",
|
||||
"corner": "bottom-right",
|
||||
"z": 9999,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "agents-archi.html",
|
||||
"element": "anon",
|
||||
"type": "inline",
|
||||
"corner": "bottom-right",
|
||||
"z": 999,
|
||||
"severity": "MEDIUM"
|
||||
},
|
||||
{
|
||||
"page": "agents-archi.html",
|
||||
"element": ".wtp-gapfill-banner",
|
||||
"type": "css_rule",
|
||||
"corner": "bottom-right",
|
||||
"z": 99999,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "agents-archi.html",
|
||||
"element": ".wtp-enrich-banner",
|
||||
"type": "css_rule",
|
||||
"corner": "bottom-right",
|
||||
"z": 9999,
|
||||
"severity": "HIGH"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -159,8 +159,8 @@ if (preg_match('/\[.*\]/s', $ai_suggestions, $json_match)) {
|
||||
if (empty($T['ai_optimizations'])) {
|
||||
$T['ai_optimizations'] = [
|
||||
['action' => 'Disk cleanup S204', 'priority' => 'medium', 'category' => 'INFRA', 'detail' => 'Log rotation + Docker prune pour libérer espace'],
|
||||
['action' => 'Consolider modèles Ollama', 'priority' => 'low', 'category' => 'AI', 'detail' => 'weval-brain-v3 peut remplacer mistral + qwen2.5'],
|
||||
['action' => 'Index Ethica', 'priority' => 'medium', 'category' => 'DATA', 'detail' => 'VACUUM ANALYZE sur medecins_validated (135K+)'],
|
||||
['action' => 'Consolider modèles Ollama', 'priority' => 'low', 'category' => 'AI', 'detail' => 'weval-brain-v4 LIVE (V96.14 built local Ollama) remplace mistral cloud'],
|
||||
['action' => 'Index Ethica', 'priority' => 'medium', 'category' => 'DATA', 'detail' => 'VACUUM ANALYZE medecins_validated (50K validated sur 146K total HCPs)'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-19 23:30:01",
|
||||
"generated": "2026-04-20 02:00:02",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 80,
|
||||
"disk_pct": 81,
|
||||
"disk_avail": "29G",
|
||||
"uptime": "up 5 days, 13 hours, 38 minutes",
|
||||
"uptime": "up 5 days, 16 hours, 8 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -21,7 +21,7 @@
|
||||
"private": "10.1.0.3",
|
||||
"role": "WEVADS Arsenal",
|
||||
"ssh": 22,
|
||||
"disk_pct": 89,
|
||||
"disk_pct": 90,
|
||||
"disk_avail": "16G",
|
||||
"sentinel": 1
|
||||
},
|
||||
@@ -86,7 +86,7 @@
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 3 days",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -116,7 +116,7 @@
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 5 days (healthy)",
|
||||
"status": "Up 2 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -275,10 +275,10 @@
|
||||
}
|
||||
],
|
||||
"screens": {
|
||||
"s204_html": 275,
|
||||
"s204_html": 280,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 713,
|
||||
"s204_wevia_php": 18,
|
||||
"s204_api_php": 730,
|
||||
"s204_wevia_php": 20,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
},
|
||||
@@ -301,13 +301,20 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5466,
|
||||
"kb_learnings": 5471,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
}
|
||||
},
|
||||
"ollama": [
|
||||
{
|
||||
"name": "weval-brain-v4:latest",
|
||||
"family": "qwen3",
|
||||
"params": "4.0B",
|
||||
"quant": "Q4_K_M",
|
||||
"size_gb": 2.5
|
||||
},
|
||||
{
|
||||
"name": "llama3.2:latest",
|
||||
"family": "llama",
|
||||
@@ -523,8 +530,8 @@
|
||||
],
|
||||
"crons": {
|
||||
"s204_root": 0,
|
||||
"s204_www": 32,
|
||||
"s204_total": 32,
|
||||
"s204_www": 34,
|
||||
"s204_total": 34,
|
||||
"key_crons": [
|
||||
{
|
||||
"name": "L99 Master",
|
||||
@@ -594,7 +601,7 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5466,
|
||||
"total_entries": 5471,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
@@ -602,7 +609,7 @@
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1138"
|
||||
"cnt": "1143"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1702,11 +1709,11 @@
|
||||
"fast_lines": 3620,
|
||||
"router_lines": 6152,
|
||||
"router_functions": 17,
|
||||
"today_requests": 1,
|
||||
"today_requests": 0,
|
||||
"today_cost": 0,
|
||||
"avg_latency_ms": 798,
|
||||
"top_provider": "cerebras",
|
||||
"providers_used": 1
|
||||
"avg_latency_ms": 0,
|
||||
"top_provider": "N\/A",
|
||||
"providers_used": 0
|
||||
},
|
||||
"optimizations": {
|
||||
"recent_commits": [],
|
||||
@@ -1938,7 +1945,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 2556,
|
||||
"scan_time_ms": 2914,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,94 +1,45 @@
|
||||
{
|
||||
"generated_at": "2026-04-20T01:30:01.955964",
|
||||
"generated_at": "2026-04-20T04:15:01.916271",
|
||||
"stats": {
|
||||
"total": 539,
|
||||
"pending": 1039,
|
||||
"kaouther_surfaced": 29,
|
||||
"chrome_surfaced": 10,
|
||||
"total": 23,
|
||||
"pending": 20,
|
||||
"kaouther_surfaced": 18,
|
||||
"chrome_surfaced": 2,
|
||||
"notif_only_done": 0,
|
||||
"autofix_archived": 0,
|
||||
"cerebras_archived": 0,
|
||||
"older_3d_archived": 0,
|
||||
"unknown": 500,
|
||||
"unknown": 0,
|
||||
"errors": 0
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "?",
|
||||
"url": "https://www.ovh.com/manager/#/dedicated/server",
|
||||
"task_id": "task_20260416_170341_8033a6",
|
||||
"created": "2026-04-16T17:03:41+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "CRM Pipeline Daily Check",
|
||||
"url": "https://weval-consulting.com/crm-pipeline-live.htmlchr(39)",
|
||||
"task_id": "task_20260417123125_8d88d9",
|
||||
"created": "2026-04-17T12:31:25+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "OVH S151 cancel review",
|
||||
"url": "https://www.ovh.com/manager/dedicated/#/configuration/server",
|
||||
"task_id": "task_20260417124705_66bfdc",
|
||||
"created": "2026-04-17T12:47:05+00:00"
|
||||
},
|
||||
{
|
||||
"action": "kaouther_send",
|
||||
"label": "Kaouther 3 drafts Gmail",
|
||||
"url": "https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Premium+%281%2C5+DH%29&body=Bonjour+Kaouther%2C%0A%0AContre-proposition+1%2C5+DH%2Fcontact+palier+Premium+%28volume+s%C3%A9lectif+0-20K+cibl%C3%A9s%2C+triple+canal+email%2BWhatsApp%2BSMS%2C+opt-in+Loi+09-08%2C+support+d%C3%A9di%C3%A9%29.%0A%0ABase%3A+146%2C668+HCPs+valid%C3%A9s+%2B20K+en+7+jours.+Stack+souverain+Maroc.%0A%0AVoir+d%C3%A9tails+complets+sur+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ABien+cordialement%2C%0AYacine",
|
||||
"task_id": "task_20260417125432_0ebc4b",
|
||||
"created": "2026-04-17T12:54:32+00:00"
|
||||
"task_id": "task_20260417150051_bca114",
|
||||
"created": "2026-04-17T15:00:51+00:00"
|
||||
},
|
||||
{
|
||||
"action": "kaouther_send",
|
||||
"label": "Kaouther 3 drafts Gmail",
|
||||
"url": "https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Standard+%281%2C2+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Standard+1%2C2+DH%2Fcontact+pour+volume+r%C3%A9current+20-60K%2C+bi-canal+email%2BWhatsApp%2C+reporting+hebdo.%0A%0ASweet+spot+campagnes+trimestrielles.+DZ+107K+%2F+MA+20K+%2F+TN+18K+disponibles.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine",
|
||||
"task_id": "task_20260417125432_0ebc4b",
|
||||
"created": "2026-04-17T12:54:32+00:00"
|
||||
"task_id": "task_20260417150051_bca114",
|
||||
"created": "2026-04-17T15:00:51+00:00"
|
||||
},
|
||||
{
|
||||
"action": "kaouther_send",
|
||||
"label": "Kaouther 3 drafts Gmail",
|
||||
"url": "https://mail.google.com/mail/u/0/?view=cm&fs=1&tf=cm&to=kaouther.najar%40ethica.ma&su=Contre-proposition+pharma+DH+%E2%80%94+Palier+Volume+%281%2C0+DH%29&body=Bonjour+Kaouther%2C%0A%0APalier+Volume+1%2C0+DH%2Fcontact+%2860K%2B+contacts%2C+6+mois+min%2C+email+principal+%2B+WhatsApp+%2B0%2C2+DH+option%29.%0A%0ACouvre+co%C3%BBts+infra%2BDB.+En-dessous+perte.%0A%0AD%C3%A9tails%3A+https%3A%2F%2Fweval-consulting.com%2Fkaouther-compose.html%0A%0ACordialement%2C%0AYacine",
|
||||
"task_id": "task_20260417125432_0ebc4b",
|
||||
"created": "2026-04-17T12:54:32+00:00"
|
||||
"task_id": "task_20260417150051_bca114",
|
||||
"created": "2026-04-17T15:00:51+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "Connect claude",
|
||||
"url": "https://claude.ai",
|
||||
"task_id": "wc_claude_1776079914",
|
||||
"created": "2026-04-13T11:31:54+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "Connect copilot",
|
||||
"url": "https://copilot.microsoft.com",
|
||||
"task_id": "wc_copilot_1776079933",
|
||||
"created": "2026-04-13T11:32:11+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "Connect deepseek",
|
||||
"url": "https://chat.deepseek.com",
|
||||
"task_id": "wc_deepseek_1776079921",
|
||||
"created": "2026-04-13T11:32:00+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "Connect duckduckgo",
|
||||
"url": "https://duck.ai",
|
||||
"task_id": "wc_duckduckgo_1776079950",
|
||||
"created": "2026-04-13T11:32:27+00:00"
|
||||
},
|
||||
{
|
||||
"action": "chrome_open",
|
||||
"label": "Connect huggingchat",
|
||||
"url": "https://huggingface.co/chat",
|
||||
"task_id": "wc_huggingchat_1776079962",
|
||||
"created": "2026-04-13T11:32:38+00:00"
|
||||
"label": "OVH S151 cancel review",
|
||||
"url": "https://www.ovh.com/manager/dedicated/#/configuration/server",
|
||||
"task_id": "task_20260418080003_b215fa",
|
||||
"created": "2026-04-18T08:00:03+00:00"
|
||||
}
|
||||
],
|
||||
"doctrine": "64-ZERO-MANUAL + fix d\u00e9finitif Blade bypass"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-20T01:30:01.761948",
|
||||
"last_heartbeat": "2026-04-20T01:30:01.761948",
|
||||
"last_heartbeat_ts_epoch": 1776641401,
|
||||
"ts": "2026-04-20T04:15:01.984248",
|
||||
"last_heartbeat": "2026-04-20T04:15:01.984248",
|
||||
"last_heartbeat_ts_epoch": 1776651301,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
457
api/blade-mcp-server.py
Normal file
457
api/blade-mcp-server.py
Normal file
@@ -0,0 +1,457 @@
|
||||
#!/usr/bin/env python3
|
||||
"""WEVIA Blade MCP Server v1.1 - Extended with apple_* tools
|
||||
Exposes Razer Blade + Apple/iCloud scraping as MCP tools.
|
||||
Run: python3 blade-mcp-server.py
|
||||
Listens: http://0.0.0.0:8765
|
||||
"""
|
||||
|
||||
import json, sys, uuid, time, requests
|
||||
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||||
|
||||
BLADE_API = "https://weval-consulting.com/api/blade-api.php"
|
||||
BLADE_KEY = "BLADE2026"
|
||||
WEVIA_APPLE_API = "https://weval-consulting.com/api/wevia-apple-ingest.php"
|
||||
|
||||
TOOLS = [
|
||||
# === BLADE CORE (v1.0) ===
|
||||
{
|
||||
"name": "blade_exec",
|
||||
"description": "Execute a PowerShell command on the Razer Blade Windows machine. Returns stdout/stderr/exit_code.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"cmd": {"type": "string", "description": "PowerShell command to execute"},
|
||||
"timeout": {"type": "integer", "default": 60}
|
||||
},
|
||||
"required": ["cmd"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "blade_status",
|
||||
"description": "Get current Razer Blade health: CPU, RAM, disk, uptime, last heartbeat.",
|
||||
"inputSchema": {"type": "object", "properties": {}}
|
||||
},
|
||||
{
|
||||
"name": "blade_screenshot",
|
||||
"description": "Take a screenshot of the Razer desktop, return URL.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"label": {"type": "string", "default": "screenshot"}}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "blade_chrome_cdp",
|
||||
"description": "Send a Chrome DevTools Protocol command to the Razer Chrome browser via debug port 9222.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"url_filter": {"type": "string"},
|
||||
"js": {"type": "string"}
|
||||
},
|
||||
"required": ["js"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "blade_open_url",
|
||||
"description": "Open a URL in the Razer Chrome (keeping user session cookies).",
|
||||
"inputSchema": {"type": "object", "properties": {"url": {"type": "string"}}, "required": ["url"]}
|
||||
},
|
||||
{
|
||||
"name": "blade_send_keys",
|
||||
"description": "Simulate keyboard input on the Razer (via SendKeys).",
|
||||
"inputSchema": {"type": "object", "properties": {"keys": {"type": "string"}}, "required": ["keys"]}
|
||||
},
|
||||
{
|
||||
"name": "blade_file_read",
|
||||
"description": "Read a file from the Razer filesystem (text files under 1MB).",
|
||||
"inputSchema": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}
|
||||
},
|
||||
{
|
||||
"name": "blade_file_write",
|
||||
"description": "Write a text file to the Razer filesystem.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"path": {"type": "string"}, "content": {"type": "string"}},
|
||||
"required": ["path", "content"]
|
||||
}
|
||||
},
|
||||
|
||||
# === APPLE / WEVIA (v1.1 NEW) ===
|
||||
{
|
||||
"name": "apple_ingest_note",
|
||||
"description": "Ingest a note into WEVIA Apple (auto-extracts entities: people, deadlines, money, OSS, tasks). Available everywhere.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {"type": "string"},
|
||||
"body": {"type": "string", "description": "Note content - will be analyzed by IA"}
|
||||
},
|
||||
"required": ["body"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "apple_ingest_message",
|
||||
"description": "Ingest a message (SMS/iMessage/WhatsApp) into WEVIA Apple for AI analysis (urgency, deadlines, reco).",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"from": {"type": "string"},
|
||||
"to": {"type": "string", "default": "me"},
|
||||
"body": {"type": "string"},
|
||||
"date": {"type": "string"}
|
||||
},
|
||||
"required": ["from", "body"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "apple_status",
|
||||
"description": "Get WEVIA Apple ingestion status: items, tasks pending, alerts, entities count.",
|
||||
"inputSchema": {"type": "object", "properties": {}}
|
||||
},
|
||||
{
|
||||
"name": "apple_search",
|
||||
"description": "Search across all ingested Apple data (OCR, messages, contacts, notes).",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"q": {"type": "string", "description": "Search query (min 2 chars)"}},
|
||||
"required": ["q"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "apple_recommendations",
|
||||
"description": "Get top AI-generated recommendations from ingested iPhone data, sorted P0→P3.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"priority_filter": {"type": "string", "enum": ["P0","P1","P2","P3","all"], "default": "all"}}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "apple_tasks_pending",
|
||||
"description": "Get pending tasks auto-generated from Apple data (deadlines → task_create).",
|
||||
"inputSchema": {"type": "object", "properties": {}}
|
||||
},
|
||||
{
|
||||
"name": "apple_mark_task_done",
|
||||
"description": "Mark an Apple-generated task as done.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"task_id": {"type": "string"}},
|
||||
"required": ["task_id"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "apple_mac_scrape_photos",
|
||||
"description": "Scrape recent iCloud Photos via AppleScript on Mac (requires Blade agent installed on Mac, NOT Razer Windows).",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"limit": {"type": "integer", "default": 20}}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "apple_mac_scrape_messages",
|
||||
"description": "Scrape recent iMessage/SMS from chat.db on Mac (requires Blade Mac agent + Full Disk Access perm).",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {"limit": {"type": "integer", "default": 50}}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
def push_blade_task(ps_cmd, label="mcp", priority=100, timeout=60):
|
||||
try:
|
||||
r = requests.post(BLADE_API, data={
|
||||
"k": BLADE_KEY, "action": "push",
|
||||
"type": "powershell", "cmd": ps_cmd,
|
||||
"label": f"mcp_{label}", "priority": priority
|
||||
}, timeout=15)
|
||||
task_id = r.json().get("task", {}).get("id")
|
||||
if not task_id:
|
||||
return {"ok": False, "error": f"push failed: {r.text[:300]}"}
|
||||
|
||||
deadline = time.time() + timeout
|
||||
while time.time() < deadline:
|
||||
time.sleep(2)
|
||||
r2 = requests.get(BLADE_API, params={"k": BLADE_KEY, "action": "list", "id": task_id}, timeout=8)
|
||||
try:
|
||||
d = r2.json()
|
||||
for t in d.get("tasks", []):
|
||||
if t.get("id") == task_id:
|
||||
st = t.get("status")
|
||||
if st in ("done", "failed"):
|
||||
return {
|
||||
"ok": st == "done", "status": st,
|
||||
"result": t.get("result", "")[:4000],
|
||||
"error": t.get("error"), "task_id": task_id
|
||||
}
|
||||
break
|
||||
except:
|
||||
pass
|
||||
return {"ok": False, "error": "timeout waiting for blade", "task_id": task_id}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": f"exception: {str(e)[:200]}"}
|
||||
|
||||
# ==== Blade core handlers (v1.0) ====
|
||||
|
||||
def tool_blade_exec(args):
|
||||
return push_blade_task(args["cmd"], label="exec", priority=200, timeout=args.get("timeout", 60))
|
||||
|
||||
def tool_blade_status(args):
|
||||
try:
|
||||
r = requests.get(BLADE_API, params={"k": BLADE_KEY, "action": "status"}, timeout=8)
|
||||
return {"ok": True, "status": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:200]}
|
||||
|
||||
def tool_blade_screenshot(args):
|
||||
label = args.get("label", "shot").replace(" ", "_")
|
||||
cmd = f"""
|
||||
$dir = "C:\\\\ProgramData\\\\WEVAL\\\\shots"
|
||||
New-Item -ItemType Directory -Path $dir -Force -ErrorAction SilentlyContinue | Out-Null
|
||||
$f = "$dir\\\\{label}-$(Get-Date -Format 'yyyyMMdd_HHmmss').png"
|
||||
Add-Type -AssemblyName System.Windows.Forms,System.Drawing
|
||||
$b = New-Object System.Drawing.Bitmap([System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Width, [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Height)
|
||||
$g = [System.Drawing.Graphics]::FromImage($b)
|
||||
$g.CopyFromScreen(0, 0, 0, 0, $b.Size)
|
||||
$b.Save($f, 'Png')
|
||||
Write-Host "SHOT_PATH=$f"
|
||||
"""
|
||||
return push_blade_task(cmd, label="shot", priority=200, timeout=30)
|
||||
|
||||
def tool_blade_chrome_cdp(args):
|
||||
js = args["js"].replace("`", "\\`").replace("$", "\\$")
|
||||
url_filter = args.get("url_filter", "")
|
||||
cmd = f"""
|
||||
try {{ $targets = Invoke-RestMethod -Uri "http://localhost:9222/json" -Method GET -TimeoutSec 5 }}
|
||||
catch {{ Write-Host "NO_CHROME_DEBUG_PORT"; exit 1 }}
|
||||
$filter = '{url_filter}'
|
||||
$tgt = if ($filter) {{ $targets | Where-Object {{ $_.url -match $filter }} | Select-Object -First 1 }} else {{ $targets | Where-Object {{ $_.type -eq 'page' }} | Select-Object -First 1 }}
|
||||
if (!$tgt) {{ Write-Host "NO_TAB_MATCH"; exit 1 }}
|
||||
$wsUrl = $tgt.webSocketDebuggerUrl
|
||||
$ws = New-Object System.Net.WebSockets.ClientWebSocket
|
||||
$cts = New-Object System.Threading.CancellationTokenSource
|
||||
$cts.CancelAfter(30000)
|
||||
$ws.ConnectAsync([Uri]$wsUrl, $cts.Token).Wait()
|
||||
$cmd = @{{id=1; method="Runtime.evaluate"; params=@{{expression=@'
|
||||
{js}
|
||||
'@; awaitPromise=$true; returnByValue=$true}}}} | ConvertTo-Json -Depth 5 -Compress
|
||||
$buf = [Text.Encoding]::UTF8.GetBytes($cmd)
|
||||
$seg = New-Object 'System.ArraySegment[byte]' (,$buf)
|
||||
$ws.SendAsync($seg, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $cts.Token).Wait()
|
||||
$rxBuf = New-Object byte[] 131072
|
||||
$rxSeg = New-Object 'System.ArraySegment[byte]' (,$rxBuf)
|
||||
$result = $ws.ReceiveAsync($rxSeg, $cts.Token).Result
|
||||
Write-Host ([Text.Encoding]::UTF8.GetString($rxBuf, 0, $result.Count))
|
||||
"""
|
||||
return push_blade_task(cmd, label="cdp", priority=200, timeout=45)
|
||||
|
||||
def tool_blade_open_url(args):
|
||||
return push_blade_task(f'Start-Process "{args["url"]}"', label="open", priority=200, timeout=15)
|
||||
|
||||
def tool_blade_send_keys(args):
|
||||
keys = args["keys"].replace("'", "''")
|
||||
return push_blade_task(f"""Add-Type -AssemblyName System.Windows.Forms
|
||||
[System.Windows.Forms.SendKeys]::SendWait('{keys}')
|
||||
Write-Host "KEYS_SENT" """, label="keys", priority=200, timeout=15)
|
||||
|
||||
def tool_blade_file_read(args):
|
||||
path = args["path"].replace("'", "''")
|
||||
return push_blade_task(f"Get-Content -Path '{path}' -Raw -ErrorAction Stop", label="read", priority=200, timeout=15)
|
||||
|
||||
def tool_blade_file_write(args):
|
||||
path = args["path"].replace("'", "''")
|
||||
import base64
|
||||
b64 = base64.b64encode(args["content"].encode()).decode()
|
||||
return push_blade_task(f"""$c = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('{b64}'))
|
||||
Set-Content -Path '{path}' -Value $c -Force -Encoding UTF8
|
||||
Write-Host "WROTE" """, label="write", priority=200, timeout=15)
|
||||
|
||||
# ==== Apple / WEVIA handlers (v1.1) ====
|
||||
|
||||
def tool_apple_ingest_note(args):
|
||||
try:
|
||||
r = requests.post(f"{WEVIA_APPLE_API}?action=ingest_structured",
|
||||
headers={"Content-Type": "application/json"},
|
||||
json={"type": "note", "items": [{"title": args.get("title", "MCP capture"), "body": args["body"]}]},
|
||||
timeout=30)
|
||||
return {"ok": True, "result": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_ingest_message(args):
|
||||
try:
|
||||
item = {
|
||||
"from": args["from"],
|
||||
"to": args.get("to", "me"),
|
||||
"body": args["body"],
|
||||
"date": args.get("date", time.strftime("%Y-%m-%dT%H:%M:%S"))
|
||||
}
|
||||
r = requests.post(f"{WEVIA_APPLE_API}?action=ingest_structured",
|
||||
headers={"Content-Type": "application/json"},
|
||||
json={"type": "message", "items": [item]}, timeout=30)
|
||||
return {"ok": True, "result": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_status(args):
|
||||
try:
|
||||
r = requests.get(f"{WEVIA_APPLE_API}?action=status", timeout=10)
|
||||
return {"ok": True, "status": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_search(args):
|
||||
try:
|
||||
r = requests.get(f"{WEVIA_APPLE_API}?action=search", params={"q": args["q"]}, timeout=10)
|
||||
return {"ok": True, "result": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_recommendations(args):
|
||||
try:
|
||||
r = requests.get(f"{WEVIA_APPLE_API}?action=recommendations", timeout=10)
|
||||
data = r.json()
|
||||
recos = data.get("recommendations", [])
|
||||
pf = args.get("priority_filter", "all")
|
||||
if pf != "all":
|
||||
recos = [x for x in recos if x.get("priority") == pf]
|
||||
return {"ok": True, "total": len(recos), "recommendations": recos[:20], "by_priority": data.get("by_priority", {})}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_tasks_pending(args):
|
||||
try:
|
||||
r = requests.get(f"{WEVIA_APPLE_API}?action=tasks", params={"status": "open"}, timeout=10)
|
||||
return {"ok": True, "result": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_mark_task_done(args):
|
||||
try:
|
||||
r = requests.get(f"{WEVIA_APPLE_API}?action=mark_done", params={"id": args["task_id"]}, timeout=10)
|
||||
return {"ok": True, "result": r.json()}
|
||||
except Exception as e:
|
||||
return {"ok": False, "error": str(e)[:300]}
|
||||
|
||||
def tool_apple_mac_scrape_photos(args):
|
||||
# Placeholder - needs Blade Mac agent (not Windows Razer).
|
||||
# Returns guidance + passes AppleScript via Blade task (if Mac hostname matches)
|
||||
osa = f"""
|
||||
osascript -e 'tell application "Photos"
|
||||
set recentPhotos to (get last {args.get("limit", 20)} media items of container "Library")
|
||||
set output to ""
|
||||
repeat with p in recentPhotos
|
||||
set output to output & (get filename of p) & "|" & (get creation date of p as string) & "\\n"
|
||||
end repeat
|
||||
return output
|
||||
end tell'
|
||||
"""
|
||||
return {
|
||||
"ok": False,
|
||||
"status": "requires_mac_agent",
|
||||
"message": "This tool requires Blade MCP agent on a Mac (not Razer Windows). Install blade-agent-v4-mac.sh on macOS first.",
|
||||
"applescript_to_run": osa.strip(),
|
||||
"fallback": "Use iPhone Shortcut 'Scan WEVIA' + automation iCloud album instead (see /downloads/wevia-shortcut-photos.json)"
|
||||
}
|
||||
|
||||
def tool_apple_mac_scrape_messages(args):
|
||||
return {
|
||||
"ok": False,
|
||||
"status": "requires_mac_agent",
|
||||
"message": "This tool requires Blade MCP agent on a Mac with Full Disk Access permission.",
|
||||
"sql_to_run": f"SELECT datetime(date/1000000000 + 978307200, 'unixepoch') AS ts, handle.id AS contact, text, is_from_me FROM message LEFT JOIN handle ON message.handle_id = handle.ROWID ORDER BY date DESC LIMIT {args.get('limit', 50)};",
|
||||
"db_path": "~/Library/Messages/chat.db",
|
||||
"fallback": "Manually share messages via iOS Share Sheet using /downloads/wevia-shortcut-messages.json guide"
|
||||
}
|
||||
|
||||
TOOL_HANDLERS = {
|
||||
"blade_exec": tool_blade_exec,
|
||||
"blade_status": tool_blade_status,
|
||||
"blade_screenshot": tool_blade_screenshot,
|
||||
"blade_chrome_cdp": tool_blade_chrome_cdp,
|
||||
"blade_open_url": tool_blade_open_url,
|
||||
"blade_send_keys": tool_blade_send_keys,
|
||||
"blade_file_read": tool_blade_file_read,
|
||||
"blade_file_write": tool_blade_file_write,
|
||||
"apple_ingest_note": tool_apple_ingest_note,
|
||||
"apple_ingest_message": tool_apple_ingest_message,
|
||||
"apple_status": tool_apple_status,
|
||||
"apple_search": tool_apple_search,
|
||||
"apple_recommendations": tool_apple_recommendations,
|
||||
"apple_tasks_pending": tool_apple_tasks_pending,
|
||||
"apple_mark_task_done": tool_apple_mark_task_done,
|
||||
"apple_mac_scrape_photos": tool_apple_mac_scrape_photos,
|
||||
"apple_mac_scrape_messages": tool_apple_mac_scrape_messages
|
||||
}
|
||||
|
||||
class MCPHandler(BaseHTTPRequestHandler):
|
||||
def log_message(self, fmt, *args): pass
|
||||
|
||||
def do_POST(self):
|
||||
length = int(self.headers.get("Content-Length", 0))
|
||||
body = self.rfile.read(length).decode()
|
||||
try:
|
||||
req = json.loads(body)
|
||||
except:
|
||||
self.send_error(400, "invalid json")
|
||||
return
|
||||
|
||||
method = req.get("method")
|
||||
req_id = req.get("id")
|
||||
params = req.get("params", {})
|
||||
result = None
|
||||
error = None
|
||||
|
||||
if method == "initialize":
|
||||
result = {
|
||||
"protocolVersion": "2024-11-05",
|
||||
"capabilities": {"tools": {}},
|
||||
"serverInfo": {"name": "wevia-blade-mcp", "version": "1.1.0"}
|
||||
}
|
||||
elif method == "tools/list":
|
||||
result = {"tools": TOOLS}
|
||||
elif method == "tools/call":
|
||||
name = params.get("name")
|
||||
args = params.get("arguments", {})
|
||||
handler = TOOL_HANDLERS.get(name)
|
||||
if not handler:
|
||||
error = {"code": -32601, "message": f"Unknown tool: {name}"}
|
||||
else:
|
||||
try:
|
||||
r = handler(args)
|
||||
result = {"content": [{"type": "text", "text": json.dumps(r, indent=2, ensure_ascii=False)}]}
|
||||
except Exception as e:
|
||||
error = {"code": -32000, "message": str(e)[:300]}
|
||||
elif method == "ping":
|
||||
result = {}
|
||||
else:
|
||||
error = {"code": -32601, "message": f"Unknown method: {method}"}
|
||||
|
||||
resp = {"jsonrpc": "2.0", "id": req_id}
|
||||
if error: resp["error"] = error
|
||||
else: resp["result"] = result
|
||||
|
||||
payload = json.dumps(resp).encode()
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.send_header("Content-Length", str(len(payload)))
|
||||
self.end_headers()
|
||||
self.wfile.write(payload)
|
||||
|
||||
def do_GET(self):
|
||||
if self.path == "/health":
|
||||
payload = json.dumps({"ok": True, "server": "wevia-blade-mcp", "version": "1.1.0", "tools": len(TOOLS)}).encode()
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.send_header("Content-Length", str(len(payload)))
|
||||
self.end_headers()
|
||||
self.wfile.write(payload)
|
||||
else:
|
||||
self.send_error(404)
|
||||
|
||||
if __name__ == "__main__":
|
||||
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8765
|
||||
server = ThreadingHTTPServer(("0.0.0.0", port), MCPHandler)
|
||||
sys.stderr.write(f"[WEVIA-BLADE-MCP v1.1] Listening on 0.0.0.0:{port}\n")
|
||||
sys.stderr.write(f"[WEVIA-BLADE-MCP] {len(TOOLS)} tools exposed\n")
|
||||
sys.stderr.flush()
|
||||
server.serve_forever()
|
||||
20
api/blade-tasks/archive-v96-19/README.md
Normal file
20
api/blade-tasks/archive-v96-19/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# V96.19 Blade Queue Cleanup Archive
|
||||
|
||||
Cleanup executed: V96.19 Opus · REGLE-TOUT session · 20 avril 2026
|
||||
|
||||
## Reason
|
||||
These tasks were queued for Kaggle cloud GPU training of weval-brain-v4.
|
||||
**V96.14 rendered them OBSOLETE** by building weval-brain-v4 LOCALLY via Ollama
|
||||
Modelfile (qwen3:4b + SYSTEM prompt) in under 1 second with zero GPU training needed.
|
||||
|
||||
## Model now live
|
||||
- Name: weval-brain-v4
|
||||
- ID: 81674cf722ec
|
||||
- Size: 2.5GB
|
||||
- Endpoint: http://localhost:11434/api/generate
|
||||
- Built: V96.14 (17 avril 2026)
|
||||
|
||||
## Doctrine applied
|
||||
- #4 HONNETE: archive obsolete tasks instead of letting them pollute queue
|
||||
- #13 cause racine: V96.14 Kaggle myth busted → local Ollama works faster
|
||||
- #5 zero ecrasement: tasks preserved in archive/ not deleted
|
||||
@@ -10,6 +10,7 @@
|
||||
"python kaggle-finetune-blade.py"
|
||||
],
|
||||
"priority": "high",
|
||||
"status": "pending",
|
||||
"created_at": "2026-04-16T01:06:42+00:00"
|
||||
"status": "dispatched",
|
||||
"created_at": "2026-04-16T01:06:42+00:00",
|
||||
"dispatched_at": "2026-04-20T00:55:03+00:00"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user