Compare commits
187 Commits
v2.3-blade
...
v9.19-hard
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2cb97f19b | ||
|
|
93d5c619c9 | ||
|
|
7938c95ade | ||
|
|
c47e23ae4e | ||
|
|
992a54425e | ||
|
|
711f69fddf | ||
|
|
294b58c579 | ||
|
|
50685e0d64 | ||
|
|
9a616d0e6e | ||
|
|
dec2ee7f8c | ||
|
|
2fc005e305 | ||
|
|
477ae48166 | ||
|
|
1968996243 | ||
|
|
e14c3da8f9 | ||
|
|
572a66a27b | ||
|
|
94aa98fb66 | ||
|
|
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 | ||
|
|
229c4d3572 | ||
|
|
8156cfc597 | ||
|
|
e7fb9db2ee | ||
|
|
0899cac487 | ||
|
|
c07714d8c0 | ||
|
|
f0ae6cb15f | ||
|
|
598b24b3bf | ||
|
|
33bb4eac3d | ||
|
|
eda0f2a5fe | ||
|
|
131a4e2d16 | ||
|
|
7775295e18 | ||
|
|
87096ff8d6 | ||
|
|
ca3670308d | ||
|
|
601f018b5d | ||
|
|
b929d65af1 | ||
|
|
172e87f1e7 | ||
|
|
9784f39b98 | ||
|
|
5417231bf6 | ||
|
|
ac44722de6 | ||
|
|
05512c1bf0 | ||
|
|
564c9278c6 | ||
|
|
a23ef5eb23 | ||
|
|
1655b047f2 | ||
|
|
06fa8c80bb | ||
|
|
3868bedc30 | ||
|
|
416bd09ad7 | ||
|
|
51bacd5eea | ||
|
|
061575c276 | ||
|
|
a56f4ba6f0 | ||
|
|
6bf20e58a3 | ||
|
|
51fa4f86e2 | ||
|
|
7e3a4e9c82 | ||
|
|
5d6bccde27 | ||
|
|
036c7ac8e6 | ||
|
|
18397cf0e9 | ||
|
|
ea3e5e948d | ||
|
|
1fecf8670b | ||
|
|
a041cf260b | ||
|
|
cbbebc7720 | ||
|
|
9a13d1fbd8 | ||
|
|
276175cfcb | ||
|
|
334c32a8b2 | ||
|
|
7375c83c9c | ||
|
|
02c4989d3c | ||
|
|
64e15ff326 | ||
|
|
cfc7486b33 | ||
|
|
5a55375e63 | ||
|
|
8a08f9f458 | ||
|
|
1d7a8c3114 | ||
|
|
7cc9f5f075 | ||
|
|
2ca3ac43eb | ||
|
|
ef12bb988b | ||
|
|
d2dbe73961 | ||
|
|
35f5e60a77 | ||
|
|
3b931093e8 | ||
|
|
4e5671d160 | ||
|
|
5d4663df43 | ||
|
|
bae71bc094 | ||
|
|
9ceb1476af | ||
|
|
298bedde19 | ||
|
|
544b653250 | ||
|
|
fa85d09265 | ||
|
|
f8ebf3b6e1 | ||
|
|
228a84729a | ||
|
|
ec88d899e3 | ||
|
|
df5fd99886 | ||
|
|
45222701bb | ||
|
|
019af6679a | ||
|
|
c4f9419f59 | ||
|
|
06e95374e0 | ||
|
|
b50572b362 | ||
|
|
217ba763ab | ||
|
|
f39256949c | ||
|
|
ac280ddbc4 | ||
|
|
2b44e2a4a1 | ||
|
|
d5ae1ed0bb | ||
|
|
2d5c067491 | ||
|
|
7fe511ef37 | ||
|
|
3634a30ebd | ||
|
|
d42dbcf00b | ||
|
|
1a2452eb8e | ||
|
|
b1ad32279a | ||
|
|
1d41c2e818 | ||
|
|
99aca6ebc0 | ||
|
|
9a9c962a68 | ||
|
|
cc8def0c6c |
18
.claude-plugin/manifest.json
Normal file
18
.claude-plugin/manifest.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "wevia-arsenal",
|
||||
"version": "5.6.0",
|
||||
"description": "WEVIA Master intents + 421 tools + 78 doctrines — WEVAL Consulting Arsenal (Casablanca)",
|
||||
"author": "Yacine Mahboub <yacine@weval-consulting.com>",
|
||||
"license": "proprietary",
|
||||
"entry_points": {
|
||||
"intents_dir": "/var/www/html/api/wired-pending/",
|
||||
"handlers_dir": "/var/www/html/api/handlers/",
|
||||
"tools_registry": "/var/www/html/api/wevia-tool-registry.json",
|
||||
"kb_dir": "/opt/wevia-brain/knowledge/",
|
||||
"vault_dir": "/opt/wevads/vault/"
|
||||
},
|
||||
"chat_endpoint": "/api/wevia-master-api.php",
|
||||
"doctrines_file": "/var/www/html/wiki/doctrine-wevia-master-v3.html",
|
||||
"installation": "WEVIA Master is embedded in weval-consulting.com Apache vhost",
|
||||
"inspired_by": "marketingskills repo (IMG_5034)"
|
||||
}
|
||||
59
404.html
59
404.html
@@ -50,5 +50,64 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
|
||||
var d = document;
|
||||
var m = d.createElement('div');
|
||||
m.id = 'opus-udrill';
|
||||
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
|
||||
var inner = d.createElement('div');
|
||||
inner.id = 'opus-udrill-in';
|
||||
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
|
||||
inner.addEventListener('click', function(e){ e.stopPropagation(); });
|
||||
m.appendChild(inner);
|
||||
m.addEventListener('click', function(){ m.style.display='none'; });
|
||||
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
|
||||
(d.body || d.documentElement).appendChild(m);
|
||||
function openCard(card) {
|
||||
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
|
||||
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
|
||||
inner.innerHTML = html;
|
||||
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
|
||||
m.style.display = 'flex';
|
||||
}
|
||||
function wire(root) {
|
||||
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
|
||||
var cards = root.querySelectorAll(sels);
|
||||
for (var i = 0; i < cards.length; i++) {
|
||||
var c = cards[i];
|
||||
if (c.__opusWired) continue;
|
||||
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
|
||||
var r = c.getBoundingClientRect();
|
||||
if (r.width < 60 || r.height < 40) continue;
|
||||
c.__opusWired = true;
|
||||
c.style.cursor = 'pointer';
|
||||
c.setAttribute('role','button');
|
||||
c.setAttribute('tabindex','0');
|
||||
c.addEventListener('click', function(ev){
|
||||
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
|
||||
if (ev.target.closest('a,button,input,select')) return;
|
||||
ev.preventDefault(); ev.stopPropagation();
|
||||
openCard(this);
|
||||
});
|
||||
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
|
||||
}
|
||||
}
|
||||
var initRun = function(){ wire(d.body || d.documentElement); };
|
||||
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
|
||||
else initRun();
|
||||
var mo = new MutationObserver(function(muts){
|
||||
var newCard = false;
|
||||
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
|
||||
if (newCard) initRun();
|
||||
});
|
||||
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -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>`;
|
||||
|
||||
49
admin.html
49
admin.html
@@ -901,4 +901,53 @@ renderAlerts();
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
|
||||
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
||||
async function updateHonestValues(){
|
||||
try {
|
||||
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
||||
const d = await r.json();
|
||||
if (!d.ok) return;
|
||||
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
||||
const realSigma = d.sigma;
|
||||
// Find elements showing the myth values
|
||||
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
||||
// Walk text nodes
|
||||
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
||||
const toReplace = [];
|
||||
let node;
|
||||
while (node = walker.nextNode()) {
|
||||
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
||||
}
|
||||
toReplace.forEach(textNode => {
|
||||
const parent = textNode.parentNode;
|
||||
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
||||
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
||||
textNode.nodeValue = newText;
|
||||
parent.setAttribute('data-opus-honest-applied', '1');
|
||||
});
|
||||
// Add a small badge bottom-right showing honest live status
|
||||
if (!document.getElementById('opus-honest-badge')) {
|
||||
const b = document.createElement('div');
|
||||
b.id = 'opus-honest-badge';
|
||||
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
||||
b.title = 'Cliquer pour détails';
|
||||
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
||||
b.onclick = () => {
|
||||
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
||||
};
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
} catch(e){console.error('L99-honest fetch error:', e);}
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
||||
else updateHonestValues();
|
||||
setInterval(updateHonestValues, 90000);
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
</body></html>
|
||||
|
||||
@@ -549,5 +549,64 @@ function exportJSON(){
|
||||
|
||||
load();
|
||||
</script>
|
||||
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
|
||||
var d = document;
|
||||
var m = d.createElement('div');
|
||||
m.id = 'opus-udrill';
|
||||
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
|
||||
var inner = d.createElement('div');
|
||||
inner.id = 'opus-udrill-in';
|
||||
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
|
||||
inner.addEventListener('click', function(e){ e.stopPropagation(); });
|
||||
m.appendChild(inner);
|
||||
m.addEventListener('click', function(){ m.style.display='none'; });
|
||||
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
|
||||
(d.body || d.documentElement).appendChild(m);
|
||||
function openCard(card) {
|
||||
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
|
||||
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
|
||||
inner.innerHTML = html;
|
||||
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
|
||||
m.style.display = 'flex';
|
||||
}
|
||||
function wire(root) {
|
||||
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
|
||||
var cards = root.querySelectorAll(sels);
|
||||
for (var i = 0; i < cards.length; i++) {
|
||||
var c = cards[i];
|
||||
if (c.__opusWired) continue;
|
||||
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
|
||||
var r = c.getBoundingClientRect();
|
||||
if (r.width < 60 || r.height < 40) continue;
|
||||
c.__opusWired = true;
|
||||
c.style.cursor = 'pointer';
|
||||
c.setAttribute('role','button');
|
||||
c.setAttribute('tabindex','0');
|
||||
c.addEventListener('click', function(ev){
|
||||
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
|
||||
if (ev.target.closest('a,button,input,select')) return;
|
||||
ev.preventDefault(); ev.stopPropagation();
|
||||
openCard(this);
|
||||
});
|
||||
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
|
||||
}
|
||||
}
|
||||
var initRun = function(){ wire(d.body || d.documentElement); };
|
||||
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
|
||||
else initRun();
|
||||
var mo = new MutationObserver(function(muts){
|
||||
var newCard = false;
|
||||
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
|
||||
if (newCard) initRun();
|
||||
});
|
||||
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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)}
|
||||
@@ -167,7 +167,7 @@ canvas{z-index:0!important}
|
||||
.ag-card:hover .p-av{transform:scale(1.08);filter:brightness(1.1)}
|
||||
</style>
|
||||
<!-- WEVAL-D91-AGENTS-ARCHI-PERSONA -->
|
||||
<style id="d93c">.p-av{width:40px!important;height:40px!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;font-size:22px!important;line-height:1!important;border-radius:50%!important;background:rgba(255,255,255,.06)!important;border:1.5px solid rgba(255,255,255,.18)!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:48px!important;height:48px!important;font-size:26px!important}.p-av[data-persona="human"]{border-color:rgba(74,222,128,.45)!important;background:rgba(74,222,128,.08)!important}</style>
|
||||
<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>
|
||||
</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>
|
||||
@@ -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>
|
||||
@@ -1421,5 +1421,54 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
|
||||
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
||||
async function updateHonestValues(){
|
||||
try {
|
||||
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
||||
const d = await r.json();
|
||||
if (!d.ok) return;
|
||||
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
||||
const realSigma = d.sigma;
|
||||
// Find elements showing the myth values
|
||||
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
||||
// Walk text nodes
|
||||
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
||||
const toReplace = [];
|
||||
let node;
|
||||
while (node = walker.nextNode()) {
|
||||
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
||||
}
|
||||
toReplace.forEach(textNode => {
|
||||
const parent = textNode.parentNode;
|
||||
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
||||
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
||||
textNode.nodeValue = newText;
|
||||
parent.setAttribute('data-opus-honest-applied', '1');
|
||||
});
|
||||
// Add a small badge bottom-right showing honest live status
|
||||
if (!document.getElementById('opus-honest-badge')) {
|
||||
const b = document.createElement('div');
|
||||
b.id = 'opus-honest-badge';
|
||||
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
||||
b.title = 'Cliquer pour détails';
|
||||
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
||||
b.onclick = () => {
|
||||
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
||||
};
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
} catch(e){console.error('L99-honest fetch error:', e);}
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
||||
else updateHonestValues();
|
||||
setInterval(updateHonestValues, 90000);
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
</body></html>
|
||||
|
||||
|
||||
@@ -337,5 +337,54 @@ setInterval(load, 30000);
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
|
||||
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
||||
async function updateHonestValues(){
|
||||
try {
|
||||
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
||||
const d = await r.json();
|
||||
if (!d.ok) return;
|
||||
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
||||
const realSigma = d.sigma;
|
||||
// Find elements showing the myth values
|
||||
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
||||
// Walk text nodes
|
||||
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
||||
const toReplace = [];
|
||||
let node;
|
||||
while (node = walker.nextNode()) {
|
||||
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
||||
}
|
||||
toReplace.forEach(textNode => {
|
||||
const parent = textNode.parentNode;
|
||||
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
||||
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
||||
textNode.nodeValue = newText;
|
||||
parent.setAttribute('data-opus-honest-applied', '1');
|
||||
});
|
||||
// Add a small badge bottom-right showing honest live status
|
||||
if (!document.getElementById('opus-honest-badge')) {
|
||||
const b = document.createElement('div');
|
||||
b.id = 'opus-honest-badge';
|
||||
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
||||
b.title = 'Cliquer pour détails';
|
||||
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
||||
b.onclick = () => {
|
||||
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
||||
};
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
} catch(e){console.error('L99-honest fetch error:', e);}
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
||||
else updateHonestValues();
|
||||
setInterval(updateHonestValues, 90000);
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -836,4 +836,53 @@ requestAnimationFrame(loop);
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
|
||||
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
||||
async function updateHonestValues(){
|
||||
try {
|
||||
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
||||
const d = await r.json();
|
||||
if (!d.ok) return;
|
||||
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
||||
const realSigma = d.sigma;
|
||||
// Find elements showing the myth values
|
||||
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
||||
// Walk text nodes
|
||||
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
||||
const toReplace = [];
|
||||
let node;
|
||||
while (node = walker.nextNode()) {
|
||||
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
||||
}
|
||||
toReplace.forEach(textNode => {
|
||||
const parent = textNode.parentNode;
|
||||
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
||||
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
||||
textNode.nodeValue = newText;
|
||||
parent.setAttribute('data-opus-honest-applied', '1');
|
||||
});
|
||||
// Add a small badge bottom-right showing honest live status
|
||||
if (!document.getElementById('opus-honest-badge')) {
|
||||
const b = document.createElement('div');
|
||||
b.id = 'opus-honest-badge';
|
||||
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
||||
b.title = 'Cliquer pour détails';
|
||||
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
||||
b.onclick = () => {
|
||||
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
||||
};
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
} catch(e){console.error('L99-honest fetch error:', e);}
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
||||
else updateHonestValues();
|
||||
setInterval(updateHonestValues, 90000);
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
</body></html>
|
||||
|
||||
@@ -326,4 +326,53 @@ setInterval(loadMetrics,30000);
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
|
||||
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
||||
async function updateHonestValues(){
|
||||
try {
|
||||
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
||||
const d = await r.json();
|
||||
if (!d.ok) return;
|
||||
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
||||
const realSigma = d.sigma;
|
||||
// Find elements showing the myth values
|
||||
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
||||
// Walk text nodes
|
||||
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
||||
const toReplace = [];
|
||||
let node;
|
||||
while (node = walker.nextNode()) {
|
||||
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
||||
}
|
||||
toReplace.forEach(textNode => {
|
||||
const parent = textNode.parentNode;
|
||||
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
||||
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
||||
textNode.nodeValue = newText;
|
||||
parent.setAttribute('data-opus-honest-applied', '1');
|
||||
});
|
||||
// Add a small badge bottom-right showing honest live status
|
||||
if (!document.getElementById('opus-honest-badge')) {
|
||||
const b = document.createElement('div');
|
||||
b.id = 'opus-honest-badge';
|
||||
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
||||
b.title = 'Cliquer pour détails';
|
||||
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
||||
b.onclick = () => {
|
||||
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
||||
};
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
} catch(e){console.error('L99-honest fetch error:', e);}
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
||||
else updateHonestValues();
|
||||
setInterval(updateHonestValues, 90000);
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
</body></html>
|
||||
|
||||
@@ -434,5 +434,54 @@ render();
|
||||
</script>
|
||||
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
||||
|
||||
|
||||
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
||||
<script>
|
||||
(function(){
|
||||
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
||||
async function updateHonestValues(){
|
||||
try {
|
||||
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
||||
const d = await r.json();
|
||||
if (!d.ok) return;
|
||||
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
||||
const realSigma = d.sigma;
|
||||
// Find elements showing the myth values
|
||||
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
||||
// Walk text nodes
|
||||
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
||||
const toReplace = [];
|
||||
let node;
|
||||
while (node = walker.nextNode()) {
|
||||
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
||||
}
|
||||
toReplace.forEach(textNode => {
|
||||
const parent = textNode.parentNode;
|
||||
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
||||
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
||||
textNode.nodeValue = newText;
|
||||
parent.setAttribute('data-opus-honest-applied', '1');
|
||||
});
|
||||
// Add a small badge bottom-right showing honest live status
|
||||
if (!document.getElementById('opus-honest-badge')) {
|
||||
const b = document.createElement('div');
|
||||
b.id = 'opus-honest-badge';
|
||||
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
||||
b.title = 'Cliquer pour détails';
|
||||
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
||||
b.onclick = () => {
|
||||
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
||||
};
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
} catch(e){console.error('L99-honest fetch error:', e);}
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
||||
else updateHonestValues();
|
||||
setInterval(updateHonestValues, 90000);
|
||||
})();
|
||||
</script>
|
||||
<!-- === OPUS HONEST END === -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -74,7 +74,7 @@ h2{padding:12px 40px 0;font-size:15px;color:#0ea5e9;text-transform:uppercase;let
|
||||
<div class="card"><h3>weval_skills</h3><p>14,368 vecteurs — competences et patterns WEVIA. Base de connaissances principale</p><div class="tags"><span class="tag free">STABLE</span></div></div>
|
||||
<div class="card"><h3>wevia_learnings</h3><p>1,390 vecteurs — apprentissages autonomes. +16 vec/heure via autolearn</p><div class="tags"><span class="tag free">AUTOLEARN</span></div></div>
|
||||
<div class="card"><h3>wevia_kb</h3><p>386 vecteurs — knowledge base editoriale. Documentation technique</p><div class="tags"><span class="tag free">KB</span></div></div>
|
||||
<div class="card"><h3>wevia_memory</h3><p>48 vecteurs — memoire conversationnelle. Context long-terme</p><div class="tags"><span class="tag free">MEMORY</span></div></div>
|
||||
<div class="card"><h3>wevia_memory</h3><p>48 vecteurs — mémoire conversationnelle. Context long-terme</p><div class="tags"><span class="tag free">MEMORY</span></div></div>
|
||||
</div>
|
||||
<div class="footer">WEVAL CONSULTING · AI Sovereign Hub · 14 providers · 4 Ollama · 16K+ vectors · 0 EUR</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/1.5px
Normal file
1
api/1.5px
Normal file
@@ -0,0 +1 @@
|
||||
v9.17 tailles reduites agents-archi desencombrement directive yacine - avant v9.16 sizes 52px standard 64px master encombrement - fix v9.17 reduced 52- standard 64- master - font 28- + 34- - border 2.5px- cyan allege - post-fix zoom lisible sans encombrement visuel tetes compactes premium
|
||||
0
api/157861
Normal file
0
api/157861
Normal file
1
api/2.5
Normal file
1
api/2.5
Normal file
@@ -0,0 +1 @@
|
||||
v9.16 taille tetes d93c fix directive yacine toujours probleme taille - cause racine style id d93c l170 agents-archi.html avait ecrase v9.12 sizes avec .p-av width 40 48 hardcoded !important - fix remplace 40- standard 48- master + font-size 22- + 26- master + border 1.5 rgba blanc - cyan rgba 34,211,238 - post-fix zoom tetes readable premium cyan glow master 64 visible 30 pct plus grand que legacy
|
||||
1
api/279
Normal file
1
api/279
Normal file
@@ -0,0 +1 @@
|
||||
v9.19 plus aucune valeur statique tous kpis live - apres audit 126k disparu 0 remaining + 146694 disparu 0 remaining + 147kb garde car poids fichier pas kpi + 7 providers legacy - partout + 168 pages - partout - 5 fichiers ethica-hub growth-engine pitch vsm-15depts wevia-meetings wevia-meeting-rooms wevia-training tous updates - 10+ gold backups pre-v19 systematic - doctrine 4 honnete pas simulation fallback chaque valeur verifiee live - nr 153 l99 371 7sigma 150 dpmo 0 maintenu 59eme cycle
|
||||
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
|
||||
BIN
api/__pycache__/seed-empty-collections.cpython-312.pyc
Normal file
BIN
api/__pycache__/seed-empty-collections.cpython-312.pyc
Normal file
Binary file not shown.
BIN
api/__pycache__/v68-playwright-e2e-wtp.cpython-312.pyc
Normal file
BIN
api/__pycache__/v68-playwright-e2e-wtp.cpython-312.pyc
Normal file
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]));
|
||||
File diff suppressed because it is too large
Load Diff
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,10 +1,10 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-19T21:30:02+02:00",
|
||||
"disk_pct": 79,
|
||||
"disk_free_gb": 31,
|
||||
"ts": "2026-04-20T04:30:01+02:00",
|
||||
"disk_pct": 80,
|
||||
"disk_free_gb": 29,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 20,
|
||||
"runway_days": 19,
|
||||
"alert": "WARN_runway_under_30d",
|
||||
"action_auto_if_under_7d": "trigger_hetzner_volume_extension_api",
|
||||
"hetzner_volume_size_gb_recommended": 500,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-19T21:45:02+02:00",
|
||||
"ts": "2026-04-20T04:45:03+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "File not found.",
|
||||
"escalation_rules": {
|
||||
|
||||
14
api/agent-ethica-countdown.json
Normal file
14
api/agent-ethica-countdown.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"agent": "V61_Ethica_Countdown",
|
||||
"ts": "2026-04-19T22:12:36+02:00",
|
||||
"client": "Ethica Group",
|
||||
"contact": "Kaouther Najar",
|
||||
"contract": "renewal Q1 2026",
|
||||
"amount_keur": 280,
|
||||
"deadline_iso": "2026-03-31",
|
||||
"days_remaining": 0,
|
||||
"urgency": "CRITICAL",
|
||||
"draft_ready_V45": true,
|
||||
"next_step_owner": "Yacine click send on draft + schedule meeting Kaouther",
|
||||
"cron": "daily 09:00"
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"routes": 445,
|
||||
"skills": 835,
|
||||
"wiki": 1630,
|
||||
"pages": 256,
|
||||
"apis": 229,
|
||||
"wiki": 1686,
|
||||
"pages": 275,
|
||||
"apis": 234,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
{
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-19 16:00"
|
||||
"timestamp": "2026-04-19 22:00"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-19 12:00",
|
||||
"timestamp": "2026-04-20 00:00",
|
||||
"analysis": {
|
||||
"existing_skills": 835,
|
||||
"missing": 15,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-19T21: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": 141,
|
||||
"dg_views_last_1k_log": 22,
|
||||
"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",
|
||||
|
||||
10
api/agent-github-pat-watcher.json
Normal file
10
api/agent-github-pat-watcher.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"agent": "V61_GitHub_PAT_Watcher",
|
||||
"ts": "2026-04-19T22:12:37+02:00",
|
||||
"pat_configured": false,
|
||||
"last_push_health": "OK",
|
||||
"remote_probe": "fatal: unable to get credential storage ",
|
||||
"urgency": "LOW",
|
||||
"next_step_owner": "none - token live",
|
||||
"cron": "daily 10:00"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-19T21:50:03+02:00",
|
||||
"ts": "2026-04-20T04:40:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
13
api/agent-linkedin-sourcing.json
Normal file
13
api/agent-linkedin-sourcing.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"agent": "V61_LinkedIn_Sourcing",
|
||||
"ts": "2026-04-19T22:12:37+02:00",
|
||||
"icp_count": 39,
|
||||
"icp_source": "V46 39 ICP Pharma/Banque/Retail/Public Maghreb+MENA",
|
||||
"api_keys_configured": {
|
||||
"hunter_io": false,
|
||||
"apollo": false
|
||||
},
|
||||
"action_required": "Yacine: add HUNTER_IO_KEY + APOLLO_KEY to secrets.env then sourcing auto-runs",
|
||||
"cron": "if keys present: daily 11:00 sourcing 5 emails/day max",
|
||||
"status": "AWAITING_API_KEYS"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-19T21:00:01+02:00",
|
||||
"ts": "2026-04-20T04:00:03+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
54
api/agent-nudge-owner.json
Normal file
54
api/agent-nudge-owner.json
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-20T00:00:02+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
"count": 8,
|
||||
"drafts": ["Olga Vistex addendum", "Ray Huawei billing OCP", "Kaouther Ethica Q1 renewal", "Marjane first contact", "OCP discovery", "CNSS prospect", "BCP prospect", "Maroc Telecom LinkedIn"],
|
||||
"urgency": "HIGH",
|
||||
"action": "Yacine envoie via Gmail ymahboub@weval-consulting.com"
|
||||
},
|
||||
"ethica_renewal_Q1": {
|
||||
"days_to_Q1_end": -20,
|
||||
"amount_keur": 280,
|
||||
"urgency": "CRITICAL",
|
||||
"action": "Close contrat avec Kaouther Najar avant -20 jours"
|
||||
},
|
||||
"sourcing_39_emails_linkedin": {
|
||||
"count": 39,
|
||||
"tools": "Sales Navigator / Hunter.io / Apollo",
|
||||
"icp": "V46 Pharma/Banque/Retail/Public Maghreb+MENA",
|
||||
"urgency": "MEDIUM"
|
||||
},
|
||||
"vistex_sylvain_addendum": {
|
||||
"status": "DISPUTE_ONGOING",
|
||||
"urgency": "HIGH",
|
||||
"action": "resolve lead protection clauses"
|
||||
},
|
||||
"huawei_billing_dispute": {
|
||||
"status": "DISPUTE_ONGOING",
|
||||
"urgency": "MEDIUM"
|
||||
},
|
||||
"rgpd_ropa_dpia": {
|
||||
"articles": ["30 RoPA", "33 breach 72h", "35 DPIA"],
|
||||
"urgency": "MEDIUM",
|
||||
"action": "formalize Q2 2026"
|
||||
},
|
||||
"benchmarks_truthfulqa": {
|
||||
"platform": "Colab A100",
|
||||
"datasets": ["TruthfulQA", "HaluEval", "FActScore", "FEVER"],
|
||||
"urgency": "LOW",
|
||||
"eta": "Q2 2026"
|
||||
},
|
||||
"github_pat_renew": {
|
||||
"current_exp": "15-avr",
|
||||
"status": "RENEWED",
|
||||
"urgency": "HIGH"
|
||||
}
|
||||
},
|
||||
"total_actions_pending": 8,
|
||||
"alert_level": "business_owner_action_required",
|
||||
"automation_coverage_pct": 80,
|
||||
"manual_residual_pct": 20
|
||||
}
|
||||
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,10 +1,10 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-19T21:32:06+02:00",
|
||||
"ts": "2026-04-20T04:30:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 180,
|
||||
"mql_auto": 23,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 0,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
@@ -21,8 +21,8 @@
|
||||
"trend": "Ethica_renewal_Q1_critical"
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 7,
|
||||
"load_5min": "6.6",
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "4.57",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-19 20:00",
|
||||
"timestamp": "2026-04-20 04:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 19,
|
||||
"disk": "84%",
|
||||
"ram": "10Gi/30Gi",
|
||||
"load": "1.84",
|
||||
"uptime": "up 5 days, 8 hours, 8 minutes"
|
||||
"disk": "81%",
|
||||
"ram": "11Gi/30Gi",
|
||||
"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,13 +111,14 @@
|
||||
]
|
||||
},
|
||||
"apis": {
|
||||
"count": 249,
|
||||
"count": 261,
|
||||
"files": [
|
||||
"wevia-stream-sovereign.php",
|
||||
"wevia-pending-loader.php",
|
||||
"wevia-autowire-agent.php",
|
||||
"wevia-v67-erp-agents-registry.php",
|
||||
"wevia-auth-agent.php",
|
||||
"wevia-safe-ops.php",
|
||||
"wevia-api-router.php",
|
||||
"wevia-opus-depth.php",
|
||||
"wevia-orchestrator-scan.php",
|
||||
@@ -136,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",
|
||||
@@ -143,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",
|
||||
@@ -172,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",
|
||||
@@ -185,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",
|
||||
@@ -199,6 +204,7 @@
|
||||
"wevia-multi-provider.php",
|
||||
"wevia-skills.php",
|
||||
"wevia-token-callback.php",
|
||||
"wevia-ecosystem-health-144.php",
|
||||
"wevia-enterprise-fleet.php",
|
||||
"wevia-full-exec.php",
|
||||
"wevia-sse-v76-agents-ext.php",
|
||||
@@ -218,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",
|
||||
@@ -252,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",
|
||||
@@ -261,8 +269,10 @@
|
||||
"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",
|
||||
"wevia-dashboard.php",
|
||||
"wevia-v78-capability-dispatcher.php",
|
||||
"wevia-webchat-direct.php",
|
||||
@@ -271,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",
|
||||
@@ -324,6 +335,7 @@
|
||||
"wevia-oss-intents.php",
|
||||
"wevia-neurorag-api.php",
|
||||
"wevia-v62-acquired-api.php",
|
||||
"wevia-apple-scan.php",
|
||||
"wevia-live-metrics.php",
|
||||
"wevia-mcp-hub.php",
|
||||
"wevia-dark-bridge.php",
|
||||
@@ -419,33 +431,33 @@
|
||||
]
|
||||
},
|
||||
"qdrant": {
|
||||
"total": 17341,
|
||||
"total": 22101,
|
||||
"collections": {
|
||||
"weval_skills": 14477,
|
||||
"weval_skills": 19087,
|
||||
"wevia_graph": 3,
|
||||
"weval_intents_memory": 0,
|
||||
"weval_intents_memory": 50,
|
||||
"obsidian_vault": 46,
|
||||
"kb_bpmn_flows": 0,
|
||||
"kb_bpmn_flows": 7,
|
||||
"kb_ethica_pharma": 16,
|
||||
"kb_consulting_strategy": 0,
|
||||
"kb_consulting_strategy": 6,
|
||||
"wevia_learnings": 1736,
|
||||
"wevia_brain_knowledge": 294,
|
||||
"kb_vsm_best_practices": 0,
|
||||
"kb_bpmn_patterns": 0,
|
||||
"kb_dmaic_playbooks": 0,
|
||||
"kb_wevads_deliv": 0,
|
||||
"kb_vsm_best_practices": 7,
|
||||
"kb_bpmn_patterns": 7,
|
||||
"kb_dmaic_playbooks": 7,
|
||||
"kb_wevads_deliv": 6,
|
||||
"wevia_memory_768": 80,
|
||||
"kb_test_": 0,
|
||||
"wevia_kb_768": 255,
|
||||
"weval_agents_registry": 0,
|
||||
"weval_agents_registry": 50,
|
||||
"wevia_kb": 386,
|
||||
"wevia_memory": 48,
|
||||
"kb_lean6sigma": 0
|
||||
"kb_lean6sigma": 10
|
||||
}
|
||||
},
|
||||
"ollama": {
|
||||
"count": 6,
|
||||
"count": 7,
|
||||
"models": [
|
||||
"weval-brain-v4:latest",
|
||||
"llama3.2:latest",
|
||||
"nomic-embed-text:latest",
|
||||
"weval-brain-v3:latest",
|
||||
@@ -455,16 +467,16 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 260
|
||||
"count": 280
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 92
|
||||
"count": 91
|
||||
},
|
||||
"dataset": {
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 1630
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-19T16:00:04+00:00",
|
||||
"compute_ms": 2019,
|
||||
"timestamp": "2026-04-19T22:00:05+00:00",
|
||||
"compute_ms": 2168,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -14,38 +14,38 @@
|
||||
"oss_skills": 734,
|
||||
"oss_tests": 762,
|
||||
"docker": 19,
|
||||
"ollama_models": 5,
|
||||
"git_repos": 40,
|
||||
"ollama_models": 6,
|
||||
"git_repos": 38,
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 518,
|
||||
"latency_ms": 605,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 455,
|
||||
"latency_ms": 686,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
},
|
||||
"scores": {
|
||||
"combined": 75,
|
||||
"infra": 50,
|
||||
"infra": 53,
|
||||
"ecosystem": 100,
|
||||
"agents": 0,
|
||||
"skills": 100,
|
||||
"nonreg": 100,
|
||||
"oss": 100,
|
||||
"docker": 95,
|
||||
"providers": 56,
|
||||
"providers": 64,
|
||||
"hierarchy": 0,
|
||||
"instructions": 100
|
||||
},
|
||||
"leaderboard": [
|
||||
{
|
||||
"name": "WEVAL_Ecosystem",
|
||||
"score": 80,
|
||||
"score": 80.3,
|
||||
"skills": 839,
|
||||
"agents": 0
|
||||
},
|
||||
@@ -56,7 +56,7 @@
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_Manager",
|
||||
"score": 56,
|
||||
"score": 64,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
@@ -81,7 +81,7 @@
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_OpenClaw",
|
||||
"score": 61,
|
||||
"score": 70,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
|
||||
78
api/anonymize-pii.php
Normal file
78
api/anonymize-pii.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
// Opus v5.5.1 19avr: PII Anonymization - sqlite default fix
|
||||
header('Content-Type: application/json');
|
||||
$in = json_decode(file_get_contents('php://input'), true) ?: [];
|
||||
$text = $in['text'] ?? $_REQUEST['text'] ?? '';
|
||||
$direction = $in['direction'] ?? 'anonymize';
|
||||
|
||||
if (!$text) { echo json_encode(['ok'=>false, 'error'=>'no text provided']); exit; }
|
||||
|
||||
$vault_db = '/opt/wevia-brain/pii-vault/vault.sqlite';
|
||||
@mkdir(dirname($vault_db), 0755, true);
|
||||
|
||||
try {
|
||||
$db = new PDO('sqlite:' . $vault_db);
|
||||
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$db->exec('CREATE TABLE IF NOT EXISTS surrogate_map (
|
||||
original TEXT PRIMARY KEY,
|
||||
surrogate TEXT UNIQUE NOT NULL,
|
||||
category TEXT,
|
||||
created_at INTEGER
|
||||
)');
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['ok'=>false, 'error'=>'vault init: '.$e->getMessage()]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$patterns = [
|
||||
'email' => '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/',
|
||||
'phone' => '/(?:\+212|0)[0-9]{9,10}/',
|
||||
'ipv4' => '/\b(?:\d{1,3}\.){3}\d{1,3}\b/',
|
||||
'aws_key' => '/AKIA[0-9A-Z]{16}/',
|
||||
'jwt' => '/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/',
|
||||
'uuid' => '/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i'
|
||||
];
|
||||
|
||||
$result = $text;
|
||||
$mappings = [];
|
||||
$now = time();
|
||||
|
||||
if ($direction === 'anonymize') {
|
||||
foreach ($patterns as $cat => $regex) {
|
||||
preg_match_all($regex, $result, $matches);
|
||||
foreach (array_unique($matches[0] ?? []) as $orig) {
|
||||
$stmt = $db->prepare('SELECT surrogate FROM surrogate_map WHERE original=?');
|
||||
$stmt->execute([$orig]);
|
||||
$surr = $stmt->fetchColumn();
|
||||
if (!$surr) {
|
||||
$surr = strtoupper($cat) . '_' . substr(hash('sha256', $orig . 'wevia_salt'), 0, 8);
|
||||
$ins = $db->prepare('INSERT INTO surrogate_map (original, surrogate, category, created_at) VALUES (?, ?, ?, ?)');
|
||||
try { $ins->execute([$orig, $surr, $cat, $now]); } catch(Exception $e){}
|
||||
}
|
||||
$result = str_replace($orig, $surr, $result);
|
||||
$mappings[$orig] = ['surrogate' => $surr, 'category' => $cat];
|
||||
}
|
||||
}
|
||||
echo json_encode([
|
||||
'ok' => true, 'direction' => 'anonymize',
|
||||
'v' => 'V5.5.1-deeprepo-style-opus-19avr',
|
||||
'original_preview' => substr($text, 0, 200),
|
||||
'anonymized_text' => $result,
|
||||
'surrogates_count' => count($mappings),
|
||||
'categories_found' => array_values(array_unique(array_column($mappings, 'category'))),
|
||||
'vault_db' => $vault_db,
|
||||
'vault_total_mappings' => (int)$db->query('SELECT COUNT(*) FROM surrogate_map')->fetchColumn(),
|
||||
'inspired_by' => 'DeepRepo.ai LLM-Anonymization layer 1+2 (regex safety net + vault)',
|
||||
'ts' => date('c')
|
||||
], JSON_PRETTY_PRINT);
|
||||
} else {
|
||||
$rows = $db->query('SELECT original, surrogate FROM surrogate_map')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$replaced = 0;
|
||||
foreach ($rows as $r) {
|
||||
if (strpos($result, $r['surrogate']) !== false) {
|
||||
$result = str_replace($r['surrogate'], $r['original'], $result);
|
||||
$replaced++;
|
||||
}
|
||||
}
|
||||
echo json_encode(['ok'=>true,'direction'=>'restore','restored_text'=>$result,'replaced_count'=>$replaced,'ts'=>date('c')], JSON_PRETTY_PRINT);
|
||||
}
|
||||
@@ -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)'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,94 +1,45 @@
|
||||
{
|
||||
"generated_at": "2026-04-19T21:55:01.846281",
|
||||
"generated_at": "2026-04-20T04:45:01.421358",
|
||||
"stats": {
|
||||
"total": 497,
|
||||
"pending": 955,
|
||||
"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": 458,
|
||||
"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,11 @@
|
||||
{
|
||||
"ts": "2026-04-19T21:59:49.893143",
|
||||
"last_heartbeat": "2026-04-19T21:59:49.893154",
|
||||
"status": "ALIVE",
|
||||
"v58_refreshed_by_opus_wire": true,
|
||||
"tasks_today": 121,
|
||||
"tasks_week": 574
|
||||
"ts": "2026-04-20T04:45:01.384956",
|
||||
"last_heartbeat": "2026-04-20T04:45:01.384956",
|
||||
"last_heartbeat_ts_epoch": 1776653101,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
"v58_v59_refreshed_by_opus_wire": true,
|
||||
"note": "auto-refresh via cron every 30min ideal - need crontab entry"
|
||||
}
|
||||
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()
|
||||
@@ -1,7 +1,7 @@
|
||||
# WEVIA Master — System Documentation
|
||||
Generated: Sun Apr 19 12:00:02 PM CEST 2026
|
||||
Generated: Mon Apr 20 12:00:02 AM CEST 2026
|
||||
|
||||
## APIs (214)
|
||||
## APIs (234)
|
||||
wevia-action-engine.php
|
||||
wevia-actions.php
|
||||
wevia-admin-data.php
|
||||
@@ -14,6 +14,7 @@ wevia-agents.php
|
||||
wevia-anthropic.php
|
||||
wevia-api-bridge.php
|
||||
wevia-api-router.php
|
||||
wevia-apple-scan.php
|
||||
wevia-architecture-hooks.php
|
||||
wevia-arena-autowire.php
|
||||
wevia-arena-budget.php
|
||||
@@ -60,6 +61,7 @@ wevia-daily-standup.php
|
||||
wevia-dark-bridge.php
|
||||
wevia-dashboard.php
|
||||
wevia-db-stats.php
|
||||
wevia-decisions-api.php
|
||||
wevia-deep-research.php
|
||||
wevia-deepseek-proxy.php
|
||||
wevia-deepseek-web.php
|
||||
@@ -75,6 +77,7 @@ wevia-doctrine-injector.php
|
||||
wevia-dream.php
|
||||
wevia-dynamic-exec.php
|
||||
wevia-dynamic-resolver.php
|
||||
wevia-ecosystem-health-144.php
|
||||
wevia-ecosystem.php
|
||||
wevia-email-api.php
|
||||
wevia-enterprise-fleet.php
|
||||
@@ -92,6 +95,7 @@ wevia-health.php
|
||||
wevia-human-ai.php
|
||||
wevia-infra-intercept.php
|
||||
wevia-json-api.php
|
||||
wevia-kpi-feeders.php
|
||||
wevia-lean-toc.php
|
||||
wevia-live-context.php
|
||||
wevia-live-metrics.php
|
||||
@@ -113,6 +117,7 @@ wevia-multi-ai.php
|
||||
wevia-multi-provider.php
|
||||
wevia-neurorag-api.php
|
||||
wevia-new-models.php
|
||||
wevia-nl-autowire.php
|
||||
wevia-nl-normalizer-prehook.php
|
||||
wevia-observe-crm-intent.php
|
||||
wevia-office-senders-intent.php
|
||||
@@ -134,11 +139,15 @@ wevia-orchestrator-extra-agents-v72.php
|
||||
wevia-orchestrator.php
|
||||
wevia-orchestrator-scan.php
|
||||
wevia-orchestrator-v2.php
|
||||
wevia-orphans-mapper.php
|
||||
wevia-oss-bridge.php
|
||||
wevia-oss-intents.php
|
||||
wevia-oss-scan.php
|
||||
wevia-pages-registry.php
|
||||
wevia-partners-intent.php
|
||||
wevia-patch-file.php
|
||||
wevia-pdns-prompt-intent.php
|
||||
wevia-pending-loader.php
|
||||
wevia-pipeline.php
|
||||
wevia-post-exec.php
|
||||
wevia-products-kpi-v80.php
|
||||
@@ -155,6 +164,8 @@ wevia-redis-llm.php
|
||||
wevia-regression-scanner.php
|
||||
wevia-rnd.php
|
||||
wevia-run-tests.php
|
||||
wevia-safe-ops.php
|
||||
wevia-safe-write.php
|
||||
wevia-security-fortress.php
|
||||
wevia-self-edit.php
|
||||
wevia-send-kaouther-intent.php
|
||||
@@ -166,10 +177,12 @@ wevia-sovereign-heal-intent.php
|
||||
wevia-sovereign-proxy.php
|
||||
wevia-sse-orchestrator.php
|
||||
wevia-sse-orchestrator-public.php
|
||||
wevia-sse-v76-agents-ext.php
|
||||
wevia-stream-api.php
|
||||
wevia-stream-sovereign.php
|
||||
wevia-supervisor.php
|
||||
wevia-test-email-intent.php
|
||||
wevia-tips-catalog-v82.php
|
||||
wevia-token-callback.php
|
||||
wevia-tool-executor.php
|
||||
wevia-tool-extensions.php
|
||||
@@ -177,6 +190,8 @@ wevia-tools.php
|
||||
wevia-tools-router.php
|
||||
wevia-tool-test.php
|
||||
wevia-track-s95-prompt-intent.php
|
||||
wevia-truth-builder.php
|
||||
wevia-unified-api.php
|
||||
wevia-unified.php
|
||||
wevia-v60-tier1-bridges.php
|
||||
wevia-v61-intents-include.php
|
||||
@@ -189,6 +204,7 @@ wevia-v65-risk-erp-gaps.php
|
||||
wevia-v66-all-erps-painpoints.php
|
||||
wevia-v66-ia-building-api.php
|
||||
wevia-v67-dashboard-api.php
|
||||
wevia-v67-erp-agents-registry.php
|
||||
wevia-v67-roi-simulator.php
|
||||
wevia-v69-dg-command-center.php
|
||||
wevia-v70-enterprise-complete.php
|
||||
@@ -201,7 +217,11 @@ wevia-v73-intents-include.php
|
||||
wevia-v74-gap-agents-factory.php
|
||||
wevia-v74-intents-include.php
|
||||
wevia-v74-sixsigma-api.php
|
||||
wevia-v75-intents-include.php
|
||||
wevia-v76-multi-agent-intent.php
|
||||
wevia-v77-coherence.php
|
||||
wevia-v77-parallel-executor.php
|
||||
wevia-v78-capability-dispatcher.php
|
||||
wevia-v79-kpi-pipeline.php
|
||||
wevia-v81-ai-audit-100.php
|
||||
wevia-v82-tips-catalog.php
|
||||
@@ -217,9 +237,10 @@ wevia-wave114-intents.php
|
||||
wevia-wave114.php
|
||||
wevia-webchat-direct.php
|
||||
|
||||
## Scripts (42)
|
||||
## Scripts (43)
|
||||
wevia-antiregression.py
|
||||
wevia-autodoc.sh
|
||||
wevia-autointent-sync.sh
|
||||
wevia-auto-renew.py
|
||||
wevia-auto-wire.py
|
||||
wevia-blade-admin.sh
|
||||
@@ -332,11 +353,11 @@ wevia-webwide.py
|
||||
## Ollama Models
|
||||
|
||||
## Docker (19 containers)
|
||||
loki Up 2 days
|
||||
loki Up 3 days
|
||||
listmonk Up 3 days
|
||||
plausible-plausible-1 Up 43 hours
|
||||
plausible-plausible-db-1 Up 43 hours
|
||||
plausible-plausible-events-db-1 Up 43 hours
|
||||
plausible-plausible-1 Up 2 days
|
||||
plausible-plausible-db-1 Up 2 days
|
||||
plausible-plausible-events-db-1 Up 2 days
|
||||
n8n-docker-n8n-1 Up 3 days
|
||||
mattermost-docker-mm-db-1 Up 3 days
|
||||
mattermost-docker-mattermost-1 Up 3 days (healthy)
|
||||
|
||||
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