Compare commits
237 Commits
wave-265-o
...
v187-phase
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2487a4ec0 | ||
|
|
c238ab9eaf | ||
|
|
9b77ddaf15 | ||
|
|
40adb9dc90 | ||
|
|
42f7ab9e8d | ||
|
|
e19b70ef19 | ||
|
|
4297271bd9 | ||
|
|
120525c360 | ||
|
|
2efb46f050 | ||
|
|
df0f06dd22 | ||
|
|
5ce0415f65 | ||
|
|
c7c97dcc85 | ||
|
|
40def9f973 | ||
|
|
2fdc4b912e | ||
|
|
cdd92dcc7a | ||
|
|
064e56fdb8 | ||
|
|
6e99a67f24 | ||
|
|
f88ef0aeae | ||
|
|
5d3a93ae23 | ||
|
|
92d3038d21 | ||
|
|
4cda2e7daf | ||
|
|
f8fcc6fdba | ||
|
|
421b7c7d86 | ||
|
|
7281251572 | ||
|
|
f3d7439ff8 | ||
|
|
07b6bd1147 | ||
|
|
61bc17f2e3 | ||
|
|
070b37f34d | ||
|
|
2dd3567472 | ||
|
|
d8b05b2fca | ||
|
|
d87ceabcb2 | ||
|
|
31721739a5 | ||
|
|
196bbc622e | ||
|
|
dcd9d5f46b | ||
|
|
43e0b6f68a | ||
|
|
9d88dfc17e | ||
|
|
5a9bda6657 | ||
|
|
3506ef2020 | ||
|
|
05fd5b6e2a | ||
|
|
0d7c5e3711 | ||
|
|
53a4a84146 | ||
|
|
e2a40ccc71 | ||
|
|
26ccb8c391 | ||
|
|
c2c8c9bc3a | ||
|
|
4b287f03a0 | ||
|
|
da6ec0315f | ||
|
|
4f47141363 | ||
|
|
ad8fe50391 | ||
|
|
3d9c59ece6 | ||
|
|
f9c32195d1 | ||
|
|
993a380ab0 | ||
|
|
61612729ad | ||
|
|
5e1cfedfac | ||
|
|
fbceb97369 | ||
|
|
737483fd6f | ||
|
|
bf477f0a41 | ||
|
|
e9396960f1 | ||
|
|
5fb0982269 | ||
|
|
b480a16c41 | ||
|
|
91084d8cde | ||
|
|
6a8312f47a | ||
|
|
56c74df0f6 | ||
|
|
b9c75ff5f8 | ||
|
|
d1d30eebf7 | ||
|
|
f19790a3c3 | ||
|
|
efc56e7729 | ||
|
|
d322b090ea | ||
|
|
6c9ed28d32 | ||
|
|
a41a33904b | ||
|
|
2a490bd152 | ||
|
|
df4a5c3e56 | ||
|
|
107f6e4caa | ||
|
|
0c95950c86 | ||
|
|
56632a9d01 | ||
|
|
5cf4e27dc0 | ||
|
|
135dcb4677 | ||
|
|
1a2b604135 | ||
|
|
b8018f3539 | ||
|
|
a1570d3b3a | ||
|
|
462d43ae07 | ||
|
|
e8457d9e6a | ||
|
|
a3bfdbc868 | ||
|
|
caa3602994 | ||
|
|
1221915be7 | ||
|
|
5d708111e8 | ||
|
|
5e54d931d7 | ||
|
|
b879a049d3 | ||
|
|
a02d730c17 | ||
|
|
7d7dda586d | ||
|
|
dc8496a9d5 | ||
|
|
355a64c2f2 | ||
|
|
26e1ad823d | ||
|
|
80979e6504 | ||
|
|
02ee17da26 | ||
|
|
929840e26f | ||
|
|
62baf2e607 | ||
|
|
98a4031b32 | ||
|
|
79b399cbbe | ||
|
|
997029f12c | ||
|
|
76b82e5f5b | ||
|
|
04bb53edb7 | ||
|
|
7890623673 | ||
|
|
c41d379f41 | ||
|
|
c1885c587f | ||
|
|
9ca3be0b9d | ||
|
|
7f4dcdb9f8 | ||
|
|
3398cf6f99 | ||
|
|
7cf24aa080 | ||
|
|
bd8719bd9f | ||
|
|
fcf933885e | ||
|
|
dc8f8aff78 | ||
|
|
e1e5704dbc | ||
|
|
574f9d5438 | ||
|
|
7449a44dab | ||
|
|
e5a227939a | ||
|
|
2aa13cc3e6 | ||
|
|
7129665d5e | ||
|
|
c746311264 | ||
|
|
d10b78ef67 | ||
|
|
bc5ed67944 | ||
|
|
8161a1729c | ||
|
|
fa1291ebdd | ||
|
|
c896791033 | ||
|
|
b1948e330c | ||
|
|
717903744b | ||
|
|
8e21d647a3 | ||
|
|
fe380760fa | ||
|
|
bc005b669a | ||
|
|
98cb653713 | ||
|
|
eaec1a1310 | ||
|
|
26c3adc02a | ||
|
|
e41ea138ed | ||
|
|
d8ee40f38e | ||
|
|
665e6fd0fe | ||
|
|
ed006a6e55 | ||
|
|
ecbe33ba1f | ||
|
|
a8e8c3347e | ||
|
|
365ab89ff1 | ||
|
|
a4a595e66b | ||
|
|
23db1b508d | ||
|
|
cca331590e | ||
|
|
eb9a3a401e | ||
|
|
7a5394fb8d | ||
|
|
8fbfe405eb | ||
|
|
5f1d70f34b | ||
|
|
0df7b0ae2e | ||
|
|
3be073bf3f | ||
|
|
87f60d2950 | ||
|
|
4f9bc8042e | ||
|
|
dcdb16390d | ||
|
|
b233fcb091 | ||
|
|
b23b2beba2 | ||
|
|
a532fccce9 | ||
|
|
63c7b1c87f | ||
|
|
9ae9f77eba | ||
|
|
ab7c0a5de4 | ||
|
|
a342476366 | ||
|
|
f06c06cc02 | ||
|
|
3cf272152f | ||
|
|
155cc70c08 | ||
|
|
97d47f088b | ||
|
|
747596d86c | ||
|
|
7a90f40565 | ||
|
|
69e8b3b6da | ||
|
|
88685c2837 | ||
|
|
a54e766b19 | ||
|
|
5fed3ac046 | ||
|
|
4e7c08713b | ||
|
|
352fd0ce52 | ||
|
|
5dbba6d246 | ||
|
|
bfcf2223c9 | ||
|
|
a204d31fcb | ||
|
|
e03b3ec9ac | ||
|
|
7c299f595a | ||
|
|
a52c7e0b0f | ||
|
|
fcdb2c7f82 | ||
|
|
e43516dbf4 | ||
|
|
5651b59e2c | ||
|
|
1f8e502eb1 | ||
|
|
e141e18936 | ||
|
|
c95a2ce4db | ||
|
|
083a7345ed | ||
|
|
b881c81736 | ||
|
|
805a45b94e | ||
|
|
770a5c92ac | ||
|
|
7b73186210 | ||
|
|
a9cb3be6d4 | ||
|
|
6930609507 | ||
|
|
c30c7f0e2e | ||
|
|
1c6db0c8e6 | ||
|
|
2d9cdf729b | ||
|
|
e0036f3aa6 | ||
|
|
661263ff5f | ||
|
|
d3fb4271f1 | ||
|
|
1d93c88237 | ||
|
|
c96cd3695b | ||
|
|
d64bf8f6d5 | ||
|
|
6a90d25915 | ||
|
|
a66f7e5e35 | ||
|
|
eb4d6a2bfd | ||
|
|
4ccd3ec9d7 | ||
|
|
cf58f3907a | ||
|
|
17fd5c8867 | ||
|
|
1777a6fd9a | ||
|
|
7044bc0f02 | ||
|
|
d47dad90c0 | ||
|
|
851ec98b28 | ||
|
|
de4026e86d | ||
|
|
42ac79b1ed | ||
|
|
fef90ef5bd | ||
|
|
9a84b0cccc | ||
|
|
7aba72df4a | ||
|
|
1bd2a1816b | ||
|
|
68c844cc52 | ||
|
|
af31149d88 | ||
|
|
1b1dd880a2 | ||
|
|
dbea8f6f92 | ||
|
|
a56e7dd55d | ||
|
|
97bc5d4801 | ||
|
|
9e9ee7c728 | ||
|
|
f90ae398db | ||
|
|
b19107392d | ||
|
|
4b129583de | ||
|
|
6d9618638c | ||
|
|
a189c8702c | ||
|
|
2e893a3ca2 | ||
|
|
969731b074 | ||
|
|
9a60d63c7d | ||
|
|
8f1eaf4358 | ||
|
|
ae7d83f1fa | ||
|
|
3f1d6e5ef6 | ||
|
|
4df0825337 | ||
|
|
e8fbf4f1ab | ||
|
|
98d99bfe4d | ||
|
|
3a24dc48f9 | ||
|
|
5dd0b5f015 | ||
|
|
835e1f316b |
@@ -97,6 +97,7 @@ body{padding-bottom:26px}
|
||||
<a href="/all-ia-hub.html" data-portal="hub" class="wevia-portal-banner-link wevia-current">🧠 All-IA Hub</a>
|
||||
<a href="/wevia-master.html" data-portal="master" class="wevia-portal-banner-link">🤖 WEVIA Master</a>
|
||||
<a href="/wevia-orchestrator.html" data-portal="arena" class="wevia-portal-banner-link">🎭 Arena Orchestrator</a>
|
||||
<a href="/wevia-chat-v2.html" data-portal="chatv2" class="wevia-portal-banner-link">Chat V2</a>
|
||||
<a href="/weval-technology-platform.html" data-portal="wtp" class="wevia-portal-banner-link">🧭 WTP Hub</a>
|
||||
<span class="wevia-portal-badge-wave">WAVE 221</span>
|
||||
</div>
|
||||
@@ -1336,5 +1337,32 @@ setInterval(refreshStats,60000);
|
||||
<script>(function(){var p=window.location.pathname;var pub=["/","/index.html","/wevia.html","/wevia-widget.html","/enterprise-model.html","/wevia","/login","/register.html","/agents-archi.html","/wevia-meeting-rooms.html","/director-center.html","/director-chat.html","/l99-brain.html","/agents-fleet.html","/value-streaming.html","/architecture.html","/openclaw.html","/l99-saas.html","/admin-saas.html","/agents-goodjob.html","/ai-benchmark.html","/oss-discovery.html","/paperclip.html","/agents-3d.html","/agents-alive.html","/agents-enterprise.html","/agents-hd.html","/agents-iso3d.html","/agents-sim.html","/agents-valuechain.html","/avatar-picker.html"];var isPub=pub.indexOf(p)>=0||p.indexOf("/products/")===0||p.indexOf("/solutions/")===0||p.indexOf("/blog/")===0||p.indexOf("/service/")===0||p.indexOf("/marketplace")===0||p.indexOf("/contact")===0||p.indexOf("/tarifs")===0||p.indexOf("/news")===0;if(isPub||document.getElementById("weval-gl"))return;var a=document.createElement("a");a.id="weval-gl";a.href="/logout";a.textContent="Logout";a.style.cssText="position:fixed;top:10px;right:12px;z-index:99990;padding:5px 10px;background:rgba(30,30,50,0.7);color:rgba(200,210,230,0.8);border:1px solid rgba(100,100,140,0.3);border-radius:6px;font:500 11px system-ui,sans-serif;text-decoration:none;opacity:0.6;cursor:pointer;backdrop-filter:blur(6px);transition:all .15s";a.onmouseover=function(){this.style.opacity="1";this.style.background="rgba(239,68,68,0.85)";this.style.color="white"};a.onmouseout=function(){this.style.opacity="0.6";this.style.background="rgba(30,30,50,0.7)";this.style.color="rgba(200,210,230,0.8)"};document.body.appendChild(a)})()</script><script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
|
||||
<script src="/api/weval-feature-tracker.js" defer></script>
|
||||
<script src="/api/ambre-universal-chat.js" defer></script>
|
||||
|
||||
<!-- WAVE 265 · Factory pill cross-page (injected, position mesurée zéro overlap) -->
|
||||
<a id="w265-factory-cross" href="/wevia-multiagent-dashboard.html" title="Factory Health Monitor (30 agents)"
|
||||
style="position:fixed;top:12px;left:12px;padding:6px 12px;border-radius:14px;background:linear-gradient(135deg,rgba(34,211,238,.2),rgba(168,85,247,.15));border:1px solid rgba(34,211,238,.4);color:#67e8f9;font-size:11px;font-weight:700;text-decoration:none;display:inline-flex;align-items:center;gap:6px;z-index:9999;backdrop-filter:blur(10px);box-shadow:0 2px 8px rgba(0,0,0,.4)">
|
||||
<span>🏭</span>
|
||||
<span id="w265-factory-txt">Factory: ...</span>
|
||||
</a>
|
||||
<script>
|
||||
/* w265 Factory auto-load */
|
||||
(function(){
|
||||
async function refresh(){
|
||||
try {
|
||||
const r = await fetch('/api/wevia-v83-business-kpi.php?action=summary', {cache:'no-store'}).then(r=>r.json()).catch(()=>null);
|
||||
const el = document.getElementById('w265-factory-txt');
|
||||
if(el && r && r.summary){
|
||||
const s = r.summary;
|
||||
const pct = s.data_completeness_pct || 0;
|
||||
el.textContent = `Factory: ${pct}% (${s.ok || 0}/${s.total_kpis || 0})`;
|
||||
}
|
||||
} catch(e){ console.log('[w265] factory check err', e); }
|
||||
}
|
||||
refresh();
|
||||
setInterval(refresh, 60000);
|
||||
})();
|
||||
</script>
|
||||
<!-- /WAVE 265 Factory pill cross-page -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-22T11:00:01+02:00",
|
||||
"disk_pct": 86,
|
||||
"disk_free_gb": 22,
|
||||
"ts": "2026-04-23T01:00:01+02:00",
|
||||
"disk_pct": 98,
|
||||
"disk_free_gb": 4,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 14,
|
||||
"runway_days": 2,
|
||||
"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-22T11:00:03+02:00",
|
||||
"ts": "2026-04-23T01:15:04+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"routes": 446,
|
||||
"skills": 835,
|
||||
"wiki": 2252,
|
||||
"pages": 327,
|
||||
"apis": 254,
|
||||
"wiki": 2326,
|
||||
"pages": 330,
|
||||
"apis": 255,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
{
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22 04:00"
|
||||
"timestamp": "2026-04-22 16:00"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 00:00",
|
||||
"timestamp": "2026-04-23 00:00",
|
||||
"analysis": {
|
||||
"existing_skills": 835,
|
||||
"missing": 15,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-22T11:00:02+02:00",
|
||||
"ts": "2026-04-23T01:00:01+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 12,
|
||||
"adoption_pct": 80,
|
||||
"chat_queries_last_1k_log": 9,
|
||||
"wtp_views_last_1k_log": 82,
|
||||
"dg_views_last_1k_log": 5,
|
||||
"features_used_24h": 10,
|
||||
"adoption_pct": 66,
|
||||
"chat_queries_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 30,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
"cron_schedule": "hourly",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-22T11:00:04+02:00",
|
||||
"ts": "2026-04-23T01:20:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-22T11:00:02+02:00",
|
||||
"ts": "2026-04-23T01:00:02+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-22T08:00:02+02:00",
|
||||
"ts": "2026-04-23T00:00:01+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
@@ -10,10 +10,10 @@
|
||||
"action": "Yacine envoie via Gmail ymahboub@weval-consulting.com"
|
||||
},
|
||||
"ethica_renewal_Q1": {
|
||||
"days_to_Q1_end": -22,
|
||||
"days_to_Q1_end": -23,
|
||||
"amount_keur": 280,
|
||||
"urgency": "CRITICAL",
|
||||
"action": "Close contrat avec Kaouther Najar avant -22 jours"
|
||||
"action": "Close contrat avec Kaouther Najar avant -23 jours"
|
||||
},
|
||||
"sourcing_39_emails_linkedin": {
|
||||
"count": 39,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-22T11:00:03+02:00",
|
||||
"ts": "2026-04-23T01:00:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 80,
|
||||
"mql_auto": 0,
|
||||
"residual_risk_pct": 100,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "4.93",
|
||||
"load_5min": "3.2",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,46 +1,41 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 10:00",
|
||||
"timestamp": "2026-04-23 00:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 20,
|
||||
"disk": "86%",
|
||||
"docker": 19,
|
||||
"disk": "98%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "1.77",
|
||||
"uptime": "up 1 week, 22 hours, 8 minutes"
|
||||
"load": "1.54",
|
||||
"uptime": "up 1 week, 1 day, 12 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
"count": 20,
|
||||
"count": 19,
|
||||
"containers": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up Less than a second",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -60,7 +55,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -75,27 +70,27 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -105,18 +100,18 @@
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"apis": {
|
||||
"count": 275,
|
||||
"count": 276,
|
||||
"files": [
|
||||
"wevia-stream-sovereign.php",
|
||||
"wevia-pending-loader.php",
|
||||
@@ -255,6 +250,7 @@
|
||||
"wevia-opus-intents.php",
|
||||
"wevia-decisions-api.php",
|
||||
"wevia-db-stats.php",
|
||||
"wevia-chat-v2-direct.php",
|
||||
"wevia-master-dispatch.php",
|
||||
"wevia-api-bridge.php",
|
||||
"wevia-vault-git-intents.php",
|
||||
@@ -488,16 +484,16 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 327
|
||||
"count": 330
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 96
|
||||
"count": 97
|
||||
},
|
||||
"dataset": {
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 2296
|
||||
"entries": 2329
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,12 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T06:00:03.128913",
|
||||
"generated_at": "2026-04-23T00:00:02.839681",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 21,
|
||||
"issues_count": 6,
|
||||
"fixed_elements_checked": 23,
|
||||
"issues_count": 5,
|
||||
"status": "CRITICAL",
|
||||
"doctrine_61": "bottom-right reserved for chat WEVIA only",
|
||||
"issues": [
|
||||
{
|
||||
"page": "weval-technology-platform.html",
|
||||
"element": "opus-orphans-count-text",
|
||||
"type": "inline",
|
||||
"corner": "bottom-right",
|
||||
"z": 9997,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "wevia-widget.html",
|
||||
"element": "#opus-pattern-badge",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T04:00:05+00:00",
|
||||
"compute_ms": 3689,
|
||||
"timestamp": "2026-04-22T22:00:04+00:00",
|
||||
"compute_ms": 2466,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -10,21 +10,21 @@
|
||||
"nonreg_pass": 148,
|
||||
"nonreg_total": 148,
|
||||
"nonreg_rate": 100,
|
||||
"oss_tools": 765,
|
||||
"oss_skills": 734,
|
||||
"oss_tests": 765,
|
||||
"oss_tools": 685,
|
||||
"oss_skills": 670,
|
||||
"oss_tests": 373,
|
||||
"docker": 19,
|
||||
"ollama_models": 7,
|
||||
"git_repos": 38,
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 949,
|
||||
"latency_ms": 618,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 1106,
|
||||
"latency_ms": 1048,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
@@ -32,11 +32,11 @@
|
||||
"scores": {
|
||||
"combined": 75,
|
||||
"infra": 56,
|
||||
"ecosystem": 100,
|
||||
"ecosystem": 99,
|
||||
"agents": 0,
|
||||
"skills": 100,
|
||||
"nonreg": 100,
|
||||
"oss": 100,
|
||||
"oss": 98,
|
||||
"docker": 95,
|
||||
"providers": 72,
|
||||
"hierarchy": 0,
|
||||
@@ -66,12 +66,12 @@
|
||||
},
|
||||
{
|
||||
"name": "BLADE_AI",
|
||||
"score": 110,
|
||||
"score": 109.8,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_Droid",
|
||||
"score": 110,
|
||||
"score": 108,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
@@ -86,12 +86,12 @@
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_DeerFlow",
|
||||
"score": 110,
|
||||
"score": 109.8,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_Scrapy",
|
||||
"score": 95,
|
||||
"score": 93,
|
||||
"type": "sovereign"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -19,6 +19,50 @@ $raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: [];
|
||||
$msg = trim($in["message"] ?? "");
|
||||
if (!$msg) { sse("error", ["content"=>"No message"]); exit; }
|
||||
|
||||
// === V181 backend-public-guard · Yacine: pas de fuites chez clients externes ===
|
||||
$__v181_blocked = [
|
||||
"/^intents?_pool\b/i",
|
||||
"/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i",
|
||||
"/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i",
|
||||
"/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i",
|
||||
"/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i",
|
||||
"/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i",
|
||||
"/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v181_internal = false;
|
||||
$__v181_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v181_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v181_expected_token = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v181_line) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v181_line), $__v181_mm)) {
|
||||
$__v181_expected_token = trim($__v181_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v181_token && $__v181_expected_token && hash_equals($__v181_expected_token, $__v181_token)) $__v181_internal = true;
|
||||
if (stripos($__v181_ref, "/wevia-master.html") !== false || stripos($__v181_ref, "/wevia-master-") !== false || stripos($__v181_ref, "/proof-wave") !== false) $__v181_internal = true;
|
||||
if (!$__v181_internal) {
|
||||
foreach ($__v181_blocked as $__v181_pat) {
|
||||
if (@preg_match($__v181_pat, trim($msg))) {
|
||||
$__v181_greet = "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d'images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd'hui ?";
|
||||
sse("start", ["session"=>"public", "query"=>$msg, "pattern"=>"guard", "engine"=>"WEVIA Assistant v1"]);
|
||||
sse("chunk", ["content"=>$__v181_greet, "index"=>0, "total"=>1]);
|
||||
sse("done", ["response"=>$__v181_greet, "provider"=>"wevia-public-guard-v1", "intent"=>"guard_redirect"]);
|
||||
@error_log("[V181-public-guard] blocked: " . substr($msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V181 ===
|
||||
$session_id = $in["session_id"] ?? ("wv-" . substr(md5(random_bytes(8)), 0, 10));
|
||||
|
||||
$pattern = "generic";
|
||||
@@ -175,7 +219,7 @@ foreach ($plan as $i => $step) {
|
||||
$d = @json_decode($raw_r, true);
|
||||
if ($d) {
|
||||
$final_response = $d["response"] ?? $d["content"] ?? "";
|
||||
if (preg_match("#https?://\S+?\.(?:pdf|docx|pptx|xlsx|svg|py|jsx)#", $final_response, $um)) {
|
||||
if (preg_match("#https?://\S+?\.(?:pdf|docx|pptx|xlsx|svg|py|jsx|jpg|jpeg|png|webp|gif)#", $final_response, $um)) {
|
||||
$final_file_url = $um[0];
|
||||
}
|
||||
}
|
||||
@@ -199,6 +243,6 @@ sse("done", [
|
||||
"response" => $final_response,
|
||||
"file_url" => $final_file_url,
|
||||
"pattern" => $pattern,
|
||||
"provider" => "ambre-claude-stream-v1",
|
||||
"provider" => "wevia-stream-v1",
|
||||
"intent" => $pattern . "_streamed",
|
||||
]);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
// V179 wevia-brand · user-visible strings use WEVIA Vision only
|
||||
/**
|
||||
* ambre-early-doc-gen.php · v4 · 5 capabilities réelles
|
||||
* 1. File gen pdf/docx/pptx via pandoc
|
||||
@@ -86,37 +87,56 @@ if (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eéèê]ma|mermaid|diagramme|flow
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== HANDLER 4: Image SVG via LLM ==========
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?\s+(?:une|un)?\s*image\s*(?:\b(?:decrivant|repr[eéèê]sentant|pour|sur|de)\b\s*)?:?\s*(.+)$/iu", $__ad_msg, $__im)) {
|
||||
// ========== HANDLER 4: Image via ambre-tool-image.php CASCADE (V177 image-gemini-cascade) ==========
|
||||
// V177: Replace LLM SVG by real image cascade (Gemini 3 Pro Image Preview primary, Qwen fallback, Pollinations last resort)
|
||||
if (preg_match("/g[e\xc3\xa9\xc3\xa8\xc3\xaa]n[e\xc3\xa9\xc3\xa8\xc3\xaa]re?\s+(?:une|un)?\s*image\s*(?:\b(?:decrivant|repr[e\xc3\xa9\xc3\xa8\xc3\xaa]sentant|pour|sur|de)\b\s*)?:?\s*(.+)$/iu", $__ad_msg, $__im)) {
|
||||
$__topic = trim($__im[1]);
|
||||
$__sys = "Tu es un generateur d\"images SVG. Reponds UNIQUEMENT avec du code SVG valide 400x300, pas de markdown, pas de backticks. Formes geometriques + couleurs. Commence par <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 300\">.";
|
||||
$__user = "SVG representant: $__topic";
|
||||
$__llm = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[
|
||||
["role"=>"system","content"=>$__sys],["role"=>"user","content"=>$__user]
|
||||
],"max_tokens"=>700,"temperature"=>0.4]),"timeout"=>25]
|
||||
]));
|
||||
$__svg = @json_decode($__llm,true)["choices"][0]["message"]["content"] ?? "";
|
||||
$__svg = trim(preg_replace("/```(?:svg|xml)?\n?|```/","",$__svg));
|
||||
$__t0 = microtime(true);
|
||||
|
||||
if (strpos($__svg, "<svg") !== false) {
|
||||
// Save to /generated/
|
||||
$__ts = date("Ymd-His");
|
||||
$__rand = substr(md5(random_bytes(4)),0,6);
|
||||
$__safe = preg_replace("/[^a-zA-Z0-9\-_]/","-",substr($__topic,0,40));
|
||||
$__fname = "wevia-img-$__safe-$__ts-$__rand.svg";
|
||||
@file_put_contents("/var/www/html/generated/$__fname", $__svg);
|
||||
$__size = strlen($__svg);
|
||||
// Call ambre-tool-image.php directly (internal, loopback)
|
||||
$__img_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\nHost: weval-consulting.com\r\n",
|
||||
"content" => json_encode(["prompt" => $__topic]),
|
||||
"timeout" => 75,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$__img_resp = @file_get_contents("http://127.0.0.1/api/ambre-tool-image.php", false, $__img_ctx);
|
||||
$__img_d = @json_decode($__img_resp, true);
|
||||
|
||||
if ($__img_d && !empty($__img_d["success"]) && !empty($__img_d["url"])) {
|
||||
$__url = $__img_d["url"];
|
||||
$__provider = $__img_d["provider"] ?? "WEVIA Image Engine";
|
||||
$__quality = $__img_d["quality"] ?? "standard";
|
||||
$__size_kb = $__img_d["size_kb"] ?? 0;
|
||||
$__elapsed = round((microtime(true) - $__t0) * 1000);
|
||||
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>"🎨 **$__topic** (image SVG)\n\n🔗 Telecharger: https://weval-consulting.com/generated/$__fname\n📦 Taille: " . round($__size/1024,1) . "KB · engine: LLM+SVG\n\n" . chr(96) . chr(96) . chr(96) . "html\n$__svg\n" . chr(96) . chr(96) . chr(96),
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"image_svg_real",
|
||||
"topic"=>$__topic, "url"=>"https://weval-consulting.com/generated/$__fname",
|
||||
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|
||||
"response" => "\xf0\x9f\x8e\xa8 **$__topic**\n\n\xf0\x9f\x94\x97 T\xc3\xa9l\xc3\xa9charger: $__url\n\xf0\x9f\x93\xa6 Taille: {$__size_kb}KB \xc2\xb7 \xe2\x9a\x99\xef\xb8\x8f {$__elapsed}ms \xc2\xb7 engine: $__provider",
|
||||
"executed" => true,
|
||||
"provider" => "ambre-doc-gen-v5",
|
||||
"intent" => "image_real_cascade",
|
||||
"topic" => $__topic,
|
||||
"url" => $__url,
|
||||
"quality" => $__quality,
|
||||
"image_provider" => $__provider,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
// If cascade failed, fall through (old LLM SVG code removed to force real images)
|
||||
// Return an informative error to widget rather than fake SVG
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response" => "\xe2\x9a\xa0\xef\xb8\x8f G\xc3\xa9n\xc3\xa9ration d\"image temporairement indisponible pour: $__topic. WEVIA Vision temporairement indisponible. Les providers internes ont \xc3\xa9chou\xc3\xa9. R\xc3\xa9essayez dans quelques instants.",
|
||||
"executed" => true,
|
||||
"provider" => "ambre-doc-gen-v5",
|
||||
"intent" => "image_cascade_failed",
|
||||
"topic" => $__topic,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== HANDLER 5: Code generation with file ==========
|
||||
|
||||
72
api/ambre-mermaid-wire.php
Normal file
72
api/ambre-mermaid-wire.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Find the done handler and augment it with mermaid rendering
|
||||
// The anchor: 'else if (type === \'done\') {' to its closing brace
|
||||
$anchor = "else if (type === 'done') {
|
||||
finalFileUrl = data.file_url;";
|
||||
|
||||
if (strpos($c, $anchor) === false) {
|
||||
echo json_encode(["error"=>"done handler anchor not found"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Replace with enhanced version that renders mermaid when detected
|
||||
$new = "else if (type === 'done') {
|
||||
finalFileUrl = data.file_url;
|
||||
// === AMBRE-V5-MERMAID-RENDER wave-263 ===
|
||||
// If fullResponse contains mermaid code → render SVG inline
|
||||
try {
|
||||
var _mcode = null;
|
||||
if (data.mermaid_code) _mcode = data.mermaid_code;
|
||||
else if (fullResponse) {
|
||||
// Detect mermaid patterns at start of response
|
||||
var _fr = fullResponse.trim();
|
||||
if (/^(sequenceDiagram|flowchart|graph\s+[A-Z]{1,2}|classDiagram|stateDiagram|erDiagram|gantt|pie|journey|gitGraph|mindmap|timeline)\b/.test(_fr)) {
|
||||
_mcode = _fr;
|
||||
} else {
|
||||
// Search inside for ``` mermaid block
|
||||
var _m = fullResponse.match(/```mermaid\\s*([\\s\\S]+?)```/);
|
||||
if (_m) _mcode = _m[1].trim();
|
||||
else {
|
||||
// or raw mermaid after 'Schema Mermaid:' label
|
||||
var _m2 = fullResponse.match(/(?:Schema Mermaid|Diagramme)[^\\n]*\\n([\\s\\S]+)$/i);
|
||||
if (_m2 && /^(sequenceDiagram|flowchart|graph|classDiagram|stateDiagram)/.test(_m2[1].trim())) _mcode = _m2[1].trim();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (_mcode && window.mermaid && currentPhaseEl) {
|
||||
// Sanitize accents for mermaid parser
|
||||
var _clean = _mcode.normalize ? _mcode.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '') : _mcode;
|
||||
var _svgId = 'wv-mermaid-' + Date.now() + '-' + Math.floor(Math.random()*999);
|
||||
var _mContainer = document.createElement('div');
|
||||
_mContainer.id = _svgId + '-wrap';
|
||||
_mContainer.style.cssText = 'margin-top:12px;padding:16px;background:#fafafa;border:1px solid #e5e7eb;border-radius:8px;overflow-x:auto';
|
||||
currentPhaseEl.appendChild(_mContainer);
|
||||
try {
|
||||
window.mermaid.render(_svgId, _clean).then(function(r){
|
||||
_mContainer.innerHTML = r.svg;
|
||||
}).catch(function(err){
|
||||
_mContainer.innerHTML = '<pre style=\"color:#b91c1c;font-size:11px\">Mermaid render error: ' + (err.message||err) + '\\n\\n' + _clean.replace(/</g,'<') + '</pre>';
|
||||
});
|
||||
} catch(e) {
|
||||
_mContainer.innerHTML = '<pre style=\"font-size:11px\">' + _clean.replace(/</g,'<') + '</pre>';
|
||||
}
|
||||
}
|
||||
} catch(eMermaid) { console.warn('[V5-MERMAID-RENDER]', eMermaid); }
|
||||
// === END AMBRE-V5-MERMAID-RENDER ===";
|
||||
|
||||
$c = str_replace($anchor, $new, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave263-mermaid";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
@@ -59,18 +59,18 @@
|
||||
},
|
||||
"suites": [
|
||||
{
|
||||
"title": "v53-final.spec.js",
|
||||
"file": "v53-final.spec.js",
|
||||
"title": "v55-scroll.spec.js",
|
||||
"file": "v55-scroll.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V53 · Final proof widget clean (no Claude Pattern panel)",
|
||||
"title": "V55 · scroll to see mermaid SVG",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
{
|
||||
"timeout": 60000,
|
||||
"timeout": 90000,
|
||||
"annotations": [],
|
||||
"expectedStatus": "passed",
|
||||
"projectId": "chromium",
|
||||
@@ -80,30 +80,27 @@
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 5678,
|
||||
"duration": 15641,
|
||||
"errors": [],
|
||||
"stdout": [
|
||||
{
|
||||
"text": "{\n \"visible_claude_pattern_text\": false,\n \"opus_pattern_badge\": false,\n \"opus_pattern_modal\": false,\n \"opus_pattern_box\": false,\n \"seven_phases_visible\": false,\n \"sse_live_visible\": false,\n \"lancer_visible\": false,\n \"shield_loaded\": true,\n \"opusPatternOpen_neutralized\": true\n}\n"
|
||||
},
|
||||
{
|
||||
"text": "After __opusPatternOpen call: NO_MODAL\n"
|
||||
"text": "SVG rendered: {\n \"svg_visible\": true,\n \"svg_width\": 190.8125,\n \"svg_height\": 879,\n \"svg_html_size\": 16978,\n \"wrapper_id\": \"wv-mermaid-1776848871993-216-wrap\"\n}\n"
|
||||
}
|
||||
],
|
||||
"stderr": [],
|
||||
"retry": 0,
|
||||
"startTime": "2026-04-22T08:52:02.487Z",
|
||||
"startTime": "2026-04-22T09:07:39.425Z",
|
||||
"annotations": [],
|
||||
"attachments": [
|
||||
{
|
||||
"name": "screenshot",
|
||||
"contentType": "image/png",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v53-final-V53-·-Final-proo-30656-an-no-Claude-Pattern-panel--chromium/test-finished-1.png"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/test-finished-1.png"
|
||||
},
|
||||
{
|
||||
"name": "video",
|
||||
"contentType": "video/webm",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v53-final-V53-·-Final-proo-30656-an-no-Claude-Pattern-panel--chromium/video.webm"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -111,8 +108,8 @@
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "a68cb5b10367b04264f0-176af6e8656af5fdd5ea",
|
||||
"file": "v53-final.spec.js",
|
||||
"id": "a80a3706a9346f0b6665-b8967c5b4350315cdbe0",
|
||||
"file": "v55-scroll.spec.js",
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
@@ -121,8 +118,8 @@
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-22T08:52:01.850Z",
|
||||
"duration": 6481.4439999999995,
|
||||
"startTime": "2026-04-22T09:07:38.817Z",
|
||||
"duration": 16424.367,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 64 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 64 KiB |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 64 KiB |
BIN
api/ambre-pw-tests/output/v55-full.png
Normal file
BIN
api/ambre-pw-tests/output/v55-full.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
Binary file not shown.
BIN
api/ambre-pw-tests/output/v55-scrolled.png
Normal file
BIN
api/ambre-pw-tests/output/v55-scrolled.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
13
api/ambre-pw-tests/pdf_preview.js
Normal file
13
api/ambre-pw-tests/pdf_preview.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 900, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/generated/wevia-pdf-premium-20260422-093848-93ab87.html', { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(4000); // Wait for Chart.js
|
||||
|
||||
await page.screenshot({ path: '/tmp/v173-premium-pdf-preview.png', fullPage: true });
|
||||
console.log('OK');
|
||||
await browser.close();
|
||||
})();
|
||||
@@ -1,38 +0,0 @@
|
||||
const { test } = require("@playwright/test");
|
||||
|
||||
test("V53 · Final proof widget clean (no Claude Pattern panel)", async ({ page }) => {
|
||||
test.setTimeout(60000);
|
||||
|
||||
await page.goto("/wevia-widget.html?cb=" + Date.now());
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(4000);
|
||||
|
||||
const state = await page.evaluate(() => {
|
||||
const bodyText = document.body.innerText;
|
||||
return {
|
||||
visible_claude_pattern_text: /Claude\s*Pattern/i.test(bodyText),
|
||||
opus_pattern_badge: !!document.getElementById('opus-pattern-badge') && document.getElementById('opus-pattern-badge').offsetParent !== null,
|
||||
opus_pattern_modal: !!document.getElementById('opus-pattern-modal') && document.getElementById('opus-pattern-modal').offsetParent !== null,
|
||||
opus_pattern_box: !!document.getElementById('opus-pattern-box') && document.getElementById('opus-pattern-box').offsetParent !== null,
|
||||
seven_phases_visible: /7 phases REAL/i.test(bodyText),
|
||||
sse_live_visible: /SSE live/i.test(bodyText),
|
||||
lancer_visible: /Lancer \(SSE/i.test(bodyText),
|
||||
shield_loaded: !!document.getElementById('ambre-confidential-shield'),
|
||||
opusPatternOpen_neutralized: (typeof window.__opusPatternOpen === 'function') && window.__opusPatternOpen.toString().length < 30,
|
||||
};
|
||||
});
|
||||
console.log(JSON.stringify(state, null, 2));
|
||||
|
||||
await page.screenshot({ path: "output/v53-final-widget.png", fullPage: false });
|
||||
|
||||
// Try call __opusPatternOpen to see if neutralized
|
||||
const openResult = await page.evaluate(() => {
|
||||
try {
|
||||
window.__opusPatternOpen();
|
||||
const modal = document.getElementById('opus-pattern-modal');
|
||||
return modal ? (modal.offsetParent !== null ? "OPENED_VISIBLE" : "HIDDEN") : "NO_MODAL";
|
||||
} catch(e) { return "ERROR: " + e.message; }
|
||||
});
|
||||
console.log("After __opusPatternOpen call:", openResult);
|
||||
await page.screenshot({ path: "output/v53-after-open-attempt.png" });
|
||||
});
|
||||
47
api/ambre-pw-tests/tests/v55-scroll.spec.js
Normal file
47
api/ambre-pw-tests/tests/v55-scroll.spec.js
Normal file
@@ -0,0 +1,47 @@
|
||||
const { test } = require("@playwright/test");
|
||||
|
||||
test("V55 · scroll to see mermaid SVG", async ({ page }) => {
|
||||
test.setTimeout(90000);
|
||||
|
||||
await page.goto("/wevia.html?cb=" + Date.now());
|
||||
await page.evaluate(() => { try{sessionStorage.clear();}catch(e){} });
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(3500);
|
||||
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({force:true});
|
||||
await input.fill("Genere un schema mermaid pour: architecture WEVIA souveraine");
|
||||
await page.waitForTimeout(400);
|
||||
await input.press("Enter");
|
||||
|
||||
// Wait for completion
|
||||
const ws = Date.now();
|
||||
while (Date.now() - ws < 60000) {
|
||||
const busy = await page.evaluate(() => window.busy || document.getElementById('sendBtn')?.disabled);
|
||||
const svgs = await page.locator('[id^="wv-mermaid-"] svg, .phase-content svg').count();
|
||||
if (!busy && svgs > 0) break;
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Scroll to the SVG
|
||||
const scrolled = await page.evaluate(() => {
|
||||
const svg = document.querySelector('[id^="wv-mermaid-"] svg, .phase-content svg');
|
||||
if (svg) {
|
||||
svg.scrollIntoView({block:'center', behavior:'instant'});
|
||||
return {
|
||||
svg_visible: svg.getBoundingClientRect().width > 10,
|
||||
svg_width: svg.getBoundingClientRect().width,
|
||||
svg_height: svg.getBoundingClientRect().height,
|
||||
svg_html_size: svg.outerHTML.length,
|
||||
wrapper_id: svg.parentElement?.id,
|
||||
};
|
||||
}
|
||||
return null;
|
||||
});
|
||||
console.log("SVG rendered:", JSON.stringify(scrolled, null, 2));
|
||||
|
||||
await page.waitForTimeout(500);
|
||||
await page.screenshot({ path: "output/v55-scrolled.png", fullPage: false });
|
||||
await page.screenshot({ path: "output/v55-full.png", fullPage: true });
|
||||
});
|
||||
58
api/ambre-pw-tests/v170_accents.js
Normal file
58
api/ambre-pw-tests/v170_accents.js
Normal file
@@ -0,0 +1,58 @@
|
||||
// V170 · Test accents preserved + screenshot
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1280, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Type in chat
|
||||
const input = await page.locator('#msgInput, input[placeholder*="question"]').first();
|
||||
await input.click({force: true});
|
||||
await input.fill("Genere un schema mermaid pour: wevia architecture souveraine avec clés chiffrées et décryptage");
|
||||
await page.waitForTimeout(400);
|
||||
await input.press('Enter');
|
||||
console.log('SENT mermaid request');
|
||||
|
||||
// Wait for SSE completion + SVG render
|
||||
const start = Date.now();
|
||||
let svgInfo = null;
|
||||
while (Date.now() - start < 70000) {
|
||||
svgInfo = await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll('[id^="wv-mermaid-"]');
|
||||
if (svgs.length === 0) return null;
|
||||
const last = svgs[svgs.length - 1];
|
||||
const svg = last.querySelector('svg') || last.querySelector('[id*="wv-mermaid"]');
|
||||
if (!svg || !svg.outerHTML || svg.outerHTML.length < 500) return null;
|
||||
// Extract all text content from SVG
|
||||
const texts = Array.from(svg.querySelectorAll('text, foreignObject span, .nodeLabel')).map(t => t.textContent.trim()).filter(t => t.length > 0);
|
||||
return {
|
||||
found: true,
|
||||
svg_size: svg.outerHTML.length,
|
||||
texts: texts,
|
||||
has_accents: /[àâéèêëîïôùûüÿç]/i.test(svg.outerHTML),
|
||||
has_accent_cles: /cl[ée]s/i.test(svg.outerHTML),
|
||||
};
|
||||
});
|
||||
if (svgInfo && svgInfo.found) {
|
||||
console.log('SVG RENDERED:', JSON.stringify(svgInfo, null, 2));
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
|
||||
// Scroll to the SVG and screenshot
|
||||
await page.evaluate(() => {
|
||||
const svg = document.querySelector('[id^="wv-mermaid-"]:last-of-type');
|
||||
if (svg) svg.scrollIntoView({behavior: 'instant', block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.screenshot({ path: '/tmp/v170-mermaid-accents.png', fullPage: true });
|
||||
console.log('Screenshot saved to /tmp/v170-mermaid-accents.png');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
72
api/ambre-pw-tests/v172_all.js
Normal file
72
api/ambre-pw-tests/v172_all.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// V172 · Test ALL generations on /wevia.html + screenshots
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1200} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
const results = {};
|
||||
|
||||
const scenarios = [
|
||||
{ label: 'PDF', prompt: 'Genere un PDF professionnel sur: SAP S4HANA', screenshot: 'v172-01-pdf.png' },
|
||||
{ label: 'Code', prompt: 'Ecris le code React pour un composant Counter avec bouton +/-', screenshot: 'v172-02-code-react.png' },
|
||||
{ label: 'Mermaid', prompt: 'Genere un schema mermaid pour: architecture souveraine wevia', screenshot: 'v172-03-mermaid.png' },
|
||||
{ label: 'Image', prompt: 'Genere une image decrivant: dashboard moderne bleu', screenshot: 'v172-04-image.png' },
|
||||
{ label: 'Traduire', prompt: 'Traduis en anglais: bonjour comment allez-vous', screenshot: 'v172-05-translate.png' },
|
||||
{ label: 'Calc', prompt: '234 multiplie par 567', screenshot: 'v172-06-calc.png' },
|
||||
];
|
||||
|
||||
for (const sc of scenarios) {
|
||||
console.log(`\n═══ TEST: ${sc.label} ═══`);
|
||||
try {
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 15000 });
|
||||
await page.waitForTimeout(1500);
|
||||
|
||||
const input = await page.locator('#msgInput, input[placeholder*="question"]').first();
|
||||
await input.click({force: true});
|
||||
await input.fill(sc.prompt);
|
||||
await page.waitForTimeout(300);
|
||||
await input.press('Enter');
|
||||
console.log(`SENT: ${sc.prompt.substring(0,50)}`);
|
||||
|
||||
// Wait for completion (provider badge or final result)
|
||||
const start = Date.now();
|
||||
let done = false;
|
||||
while (Date.now() - start < 40000) {
|
||||
const state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
hasProvider: /provider:\s*wevia-stream/i.test(document.body.innerHTML),
|
||||
hasFooter: !!document.querySelector('.ambre-stream-container span'),
|
||||
has5Steps: document.querySelectorAll('.ambre-phase').length >= 4,
|
||||
hasDownloadLink: !!document.querySelector('a[href*="/generated/"]'),
|
||||
hasSvg: !!document.querySelector('[id^="wv-mermaid-"] svg'),
|
||||
hasCodeBlock: !!document.querySelector('pre code'),
|
||||
hasImage: !!document.querySelector('img[src*="/generated/"]'),
|
||||
}));
|
||||
if (!state.busy && state.has5Steps) {
|
||||
done = true;
|
||||
Object.assign(state, { elapsed_s: ((Date.now()-start)/1000).toFixed(1) });
|
||||
results[sc.label] = state;
|
||||
console.log(`DONE ${sc.label}: ${JSON.stringify(state)}`);
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
if (!done) console.log(`TIMEOUT ${sc.label}`);
|
||||
|
||||
// Screenshot
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: `/tmp/${sc.screenshot}`, fullPage: true });
|
||||
console.log(`Screenshot: /tmp/${sc.screenshot}`);
|
||||
} catch (e) {
|
||||
console.log(`ERROR ${sc.label}: ${e.message}`);
|
||||
results[sc.label] = { error: e.message };
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n═══ SUMMARY ═══');
|
||||
console.log(JSON.stringify(results, null, 2));
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
33
api/ambre-pw-tests/v172_mermaid_scroll.js
Normal file
33
api/ambre-pw-tests/v172_mermaid_scroll.js
Normal file
@@ -0,0 +1,33 @@
|
||||
const { chromium } = require("playwright");
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ["--no-sandbox"] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
await page.goto("https://weval-consulting.com/wevia.html?cb=" + Date.now(), { waitUntil: "networkidle" });
|
||||
await page.waitForTimeout(2000);
|
||||
const input = await page.locator("#msgInput").first();
|
||||
await input.click({force:true});
|
||||
await input.fill("Genere un schema mermaid pour: authentification souveraine avec clés privées");
|
||||
await input.press("Enter");
|
||||
console.log("SENT");
|
||||
// Wait for SVG to appear
|
||||
let svgInfo = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
svgInfo = await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll("[id^=\"wv-mermaid-\"] svg");
|
||||
if (svgs.length === 0) return null;
|
||||
const last = svgs[svgs.length - 1];
|
||||
const texts = Array.from(last.querySelectorAll("text, foreignObject span, .nodeLabel")).map(t => t.textContent).filter(t=>t);
|
||||
return { svg_count: svgs.length, width: last.getBoundingClientRect().width, texts: texts.slice(0, 15), has_accents: /[àéèêëçô]/.test(last.outerHTML), svg_len: last.outerHTML.length };
|
||||
});
|
||||
if (svgInfo && svgInfo.svg_count > 0) break;
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
console.log("SVG INFO:", JSON.stringify(svgInfo, null, 2));
|
||||
// Scroll to SVG
|
||||
await page.evaluate(() => { const s = document.querySelector("[id^=\"wv-mermaid-\"] svg"); if (s) s.scrollIntoView({block:"center"}); });
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: "/tmp/v172-03b-mermaid-svg.png", fullPage: true });
|
||||
console.log("Screenshot saved");
|
||||
await browser.close();
|
||||
})();
|
||||
68
api/ambre-pw-tests/v173_upsell.js
Normal file
68
api/ambre-pw-tests/v173_upsell.js
Normal file
@@ -0,0 +1,68 @@
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere un PDF professionnel sur: SAP S4HANA ROI benefits');
|
||||
await input.press('Enter');
|
||||
console.log('PDF simple request sent');
|
||||
|
||||
// Wait for SSE done + upsell banner
|
||||
const start = Date.now();
|
||||
let state = null;
|
||||
while (Date.now() - start < 45000) {
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
has5Steps: document.querySelectorAll('.ambre-phase').length >= 4,
|
||||
hasPdfLink: !!document.querySelector('a[href*=".pdf"]'),
|
||||
hasUpsellBanner: !!document.querySelector('.v173-upsell'),
|
||||
hasUpsellBtn: !!document.getElementById('v173-generate'),
|
||||
}));
|
||||
if (!state.busy && state.hasUpsellBanner) break;
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
console.log('After PDF simple:', JSON.stringify(state));
|
||||
|
||||
// Screenshot showing the upsell banner
|
||||
await page.evaluate(() => {
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173-upsell-banner.png', fullPage: true });
|
||||
console.log('Screenshot 1 (upsell): saved');
|
||||
|
||||
// Click the upsell button
|
||||
if (state.hasUpsellBtn) {
|
||||
await page.click('#v173-generate');
|
||||
console.log('Clicked upsell');
|
||||
// Wait for enrichi PDF generation
|
||||
const start2 = Date.now();
|
||||
let state2 = null;
|
||||
while (Date.now() - start2 < 60000) {
|
||||
state2 = await page.evaluate(() => {
|
||||
const banner = document.querySelector('.v173-upsell');
|
||||
return {
|
||||
bannerText: banner?.textContent.substring(0, 100),
|
||||
hasEnrichedLink: !!document.querySelector('.v173-upsell a[href*=".pdf"]'),
|
||||
enrichedUrl: document.querySelector('.v173-upsell a[href*=".pdf"]')?.href,
|
||||
};
|
||||
});
|
||||
if (state2.hasEnrichedLink) break;
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
console.log('After enrichi click:', JSON.stringify(state2));
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173-upsell-enriched.png', fullPage: true });
|
||||
console.log('Screenshot 2 (enriched): saved');
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
42
api/ambre-pw-tests/v173_v2.js
Normal file
42
api/ambre-pw-tests/v173_v2.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere un PDF professionnel sur: SAP S4HANA ROI');
|
||||
await page.waitForTimeout(500);
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
// Patient wait · 60s max
|
||||
for (let i=0; i<30; i++) {
|
||||
await page.waitForTimeout(2000);
|
||||
const hasBanner = await page.evaluate(() => !!document.querySelector('.v173-upsell'));
|
||||
const hasBtn = await page.evaluate(() => !!document.getElementById('v173-generate'));
|
||||
if (hasBanner && hasBtn) {
|
||||
console.log(`Banner appeared after ${i*2}s`);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll to banner
|
||||
await page.evaluate(() => {
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173b-banner-visible.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
// Show banner text
|
||||
const bannerText = await page.evaluate(() => document.querySelector('.v173-upsell')?.textContent.substring(0, 200));
|
||||
console.log('Banner:', bannerText);
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
65
api/ambre-pw-tests/v173_v3.js
Normal file
65
api/ambre-pw-tests/v173_v3.js
Normal file
@@ -0,0 +1,65 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
// Capture console + errors
|
||||
page.on('console', msg => console.log('BROWSER:', msg.text().substring(0, 120)));
|
||||
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// Check input exists
|
||||
const inputExists = await page.evaluate(() => {
|
||||
const i = document.getElementById('msgInput');
|
||||
return { exists: !!i, tagName: i?.tagName, placeholder: i?.placeholder };
|
||||
});
|
||||
console.log('Input:', JSON.stringify(inputExists));
|
||||
|
||||
// Fill + dispatch via JS directly
|
||||
await page.evaluate(() => {
|
||||
const i = document.getElementById('msgInput');
|
||||
if (i) {
|
||||
i.value = 'Genere un PDF professionnel sur: SAP S4HANA ROI';
|
||||
i.focus();
|
||||
// Try sendMessage() or the form submit
|
||||
const sb = document.getElementById('sendBtn');
|
||||
if (sb && !sb.disabled) sb.click();
|
||||
}
|
||||
});
|
||||
console.log('Fill + click done');
|
||||
|
||||
// Wait patiently 70s checking state each 3s
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
const state = await page.evaluate(() => ({
|
||||
phase_count: document.querySelectorAll('.ambre-phase').length,
|
||||
messages_count: document.querySelectorAll('#messages > *').length,
|
||||
has_banner: !!document.querySelector('.v173-upsell'),
|
||||
busy: document.getElementById('sendBtn')?.disabled,
|
||||
}));
|
||||
console.log(`t+${i*3+3}s:`, JSON.stringify(state));
|
||||
if (state.has_banner) { console.log('BANNER VISIBLE!'); break; }
|
||||
}
|
||||
|
||||
// Final screenshot with scroll
|
||||
await page.evaluate(() => {
|
||||
const msgs = document.getElementById('messages');
|
||||
if (msgs) msgs.scrollTop = msgs.scrollHeight;
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v173c-final.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
const finalInfo = await page.evaluate(() => ({
|
||||
bannerHTML: document.querySelector('.v173-upsell')?.outerHTML?.substring(0, 500),
|
||||
phaseCount: document.querySelectorAll('.ambre-phase').length,
|
||||
}));
|
||||
console.log('FINAL:', JSON.stringify(finalInfo));
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
40
api/ambre-pw-tests/v175_img.js
Normal file
40
api/ambre-pw-tests/v175_img.js
Normal file
@@ -0,0 +1,40 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo WEVIA bleu moderne');
|
||||
await input.press('Enter');
|
||||
console.log('SENT image request');
|
||||
|
||||
let state = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(2500);
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasSvgRendered: document.querySelectorAll('svg[xmlns*="w3.org"]').length > 0,
|
||||
hasImgTag: document.querySelectorAll('img[src*="generated"]').length > 0,
|
||||
hasCodeSvg: /```.*<svg/.test(document.body.innerText),
|
||||
}));
|
||||
if (!state.busy && state.phases >= 4 && (state.hasSvgRendered || state.hasImgTag)) break;
|
||||
}
|
||||
console.log('State:', JSON.stringify(state));
|
||||
|
||||
// Scroll to the generated SVG
|
||||
await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll('svg[xmlns*="w3.org"]');
|
||||
if (svgs.length > 0) svgs[svgs.length-1].scrollIntoView({block:'center'});
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v175-image-rendered.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
40
api/ambre-pw-tests/v178.js
Normal file
40
api/ambre-pw-tests/v178.js
Normal file
@@ -0,0 +1,40 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo bleu WEVIA minimalist moderne');
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
let state = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasImgTag: document.querySelectorAll('img[src*="generated"]').length,
|
||||
imgSrc: document.querySelector('img[src*="generated"]')?.src,
|
||||
imgWidth: document.querySelector('img[src*="generated"]')?.naturalWidth || 0,
|
||||
}));
|
||||
console.log(`t+${i*3+3}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.hasImgTag > 0 && state.imgWidth > 100) break;
|
||||
}
|
||||
|
||||
// Scroll to image
|
||||
await page.evaluate(() => {
|
||||
const img = document.querySelector('img[src*="generated"]');
|
||||
if (img) img.scrollIntoView({block:'center'});
|
||||
});
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: '/tmp/v178-image-rendered.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
80
api/ambre-pw-tests/v178_video.js
Normal file
80
api/ambre-pw-tests/v178_video.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// V178 · Video test image generation on /wevia.html
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1440, height: 900},
|
||||
recordVideo: { dir: '/tmp/v178-video/', size: {width: 1440, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
console.log('1. Go to /wevia.html');
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
console.log('2. Type the image request');
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: WEVIA LOGO premium blue');
|
||||
await page.waitForTimeout(800);
|
||||
await input.press('Enter');
|
||||
console.log('3. Request sent · waiting for generation');
|
||||
|
||||
// Wait for download link + inline image
|
||||
let state = null;
|
||||
for (let i=0; i<20; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
state = await page.evaluate(() => {
|
||||
const links = document.querySelectorAll('a[href*="/generated/"]');
|
||||
const imgs = document.querySelectorAll('img[src*="/generated/"]');
|
||||
const phases = document.querySelectorAll('.ambre-phase').length;
|
||||
return {
|
||||
phases,
|
||||
downloadLinks: links.length,
|
||||
firstLinkHref: links.length > 0 ? links[0].href : null,
|
||||
inlineImages: imgs.length,
|
||||
firstImgSrc: imgs.length > 0 ? imgs[0].src : null,
|
||||
firstImgLoaded: imgs.length > 0 ? imgs[0].complete && imgs[0].naturalHeight > 0 : false,
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
};
|
||||
});
|
||||
console.log(`t+${(i+1)*3}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.phases >= 4 && state.downloadLinks > 0) break;
|
||||
}
|
||||
|
||||
// Scroll to result
|
||||
await page.evaluate(() => {
|
||||
const link = document.querySelector('a[href*="/generated/"]');
|
||||
if (link) link.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Click the download link
|
||||
if (state.downloadLinks > 0) {
|
||||
console.log('4. Clicking download link:', state.firstLinkHref);
|
||||
const link = await page.locator('a[href*="/generated/"]').first();
|
||||
|
||||
// Hover first (to show cursor)
|
||||
await link.hover();
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
|
||||
// Final screenshot
|
||||
await page.screenshot({ path: '/tmp/v178-final.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await ctx.close(); // Flushes video
|
||||
await browser.close();
|
||||
|
||||
// Rename video
|
||||
const videos = fs.readdirSync('/tmp/v178-video/');
|
||||
if (videos.length > 0) {
|
||||
const vpath = '/tmp/v178-video/' + videos[0];
|
||||
fs.renameSync(vpath, '/tmp/v178-image-test.webm');
|
||||
const stats = fs.statSync('/tmp/v178-image-test.webm');
|
||||
console.log(`Video saved: /tmp/v178-image-test.webm (${(stats.size/1024/1024).toFixed(1)} MB)`);
|
||||
}
|
||||
})();
|
||||
55
api/ambre-pw-tests/v179_vid.js
Normal file
55
api/ambre-pw-tests/v179_vid.js
Normal file
@@ -0,0 +1,55 @@
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1440, height: 900},
|
||||
recordVideo: { dir: '/tmp/v179-video/', size: {width: 1440, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo WEVIA premium');
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
for (let i=0; i<20; i++) {
|
||||
await page.waitForTimeout(2500);
|
||||
const state = await page.evaluate(() => {
|
||||
const bodyText = document.body.innerText;
|
||||
return {
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasLink: !!document.querySelector('a[href*="/generated/"]'),
|
||||
hasImg: !!document.querySelector('img[src*="/generated/"]'),
|
||||
mentionsGemini: /Gemini/i.test(bodyText),
|
||||
mentionsQwen: /Qwen/i.test(bodyText),
|
||||
mentionsPollinations: /Pollinations/i.test(bodyText),
|
||||
mentionsWEVIAVision: /WEVIA Vision/i.test(bodyText),
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
};
|
||||
});
|
||||
console.log(`t+${(i+1)*2.5}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.phases >= 4 && state.hasLink) break;
|
||||
}
|
||||
|
||||
await page.evaluate(() => {
|
||||
const link = document.querySelector('a[href*="/generated/"]');
|
||||
if (link) link.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: '/tmp/v179-final.png', fullPage: true });
|
||||
|
||||
await ctx.close();
|
||||
await browser.close();
|
||||
|
||||
const videos = fs.readdirSync('/tmp/v179-video/');
|
||||
if (videos.length > 0) {
|
||||
fs.renameSync('/tmp/v179-video/' + videos[0], '/tmp/v179-wevia-brand.webm');
|
||||
console.log('Video saved:', (fs.statSync('/tmp/v179-wevia-brand.webm').size/1024/1024).toFixed(1), 'MB');
|
||||
}
|
||||
})();
|
||||
72
api/ambre-pw-tests/v180_leak.js
Normal file
72
api/ambre-pw-tests/v180_leak.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// V180 · Simulate external client on /wevia.html trying to leak intents_pool
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1280, height: 900},
|
||||
recordVideo: { dir: '/tmp/v180-video/', size: {width: 1280, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
console.log('=== External client simulation on /wevia.html ===');
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Try multiple leak attempts
|
||||
const attempts = ['intents_pool', 'quelle heure', 'multiagent parallele', 'nonreg score'];
|
||||
|
||||
for (const msg of attempts) {
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill(msg);
|
||||
await input.press('Enter');
|
||||
console.log(`\nSENT: "${msg}"`);
|
||||
|
||||
// Wait for response
|
||||
for (let i=0; i<12; i++) {
|
||||
await page.waitForTimeout(1500);
|
||||
const state = await page.evaluate(() => {
|
||||
return {
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
bodyText: document.body.innerText.substring(0, 3000),
|
||||
};
|
||||
});
|
||||
if (!state.busy && state.bodyText.length > 200) break;
|
||||
}
|
||||
|
||||
// Analyze response for leaks
|
||||
const analysis = await page.evaluate(() => {
|
||||
const body = document.body.innerText;
|
||||
return {
|
||||
hasPoolTotal: /POOL TOTAL POTENTIEL|2450|1009|377|43/i.test(body),
|
||||
hasArchitectureLeak: /Tool registry|Priority intents NL|DeerFlow skills|Top-IA scripts|Brain knowledge/i.test(body),
|
||||
hasGuardRedirect: /Je suis WEVIA Assistant IA/i.test(body),
|
||||
hasGeminiLeak: /Gemini|Qwen|Pollinations|DashScope/i.test(body),
|
||||
responsePreview: body.slice(-800),
|
||||
};
|
||||
});
|
||||
console.log(` → hasPoolTotal: ${analysis.hasPoolTotal}`);
|
||||
console.log(` → hasArchitectureLeak: ${analysis.hasArchitectureLeak}`);
|
||||
console.log(` → hasGuardRedirect: ${analysis.hasGuardRedirect}`);
|
||||
console.log(` → hasGeminiLeak: ${analysis.hasGeminiLeak}`);
|
||||
}
|
||||
|
||||
// Final screenshot + scroll to last response
|
||||
await page.evaluate(() => {
|
||||
window.scrollTo(0, document.body.scrollHeight);
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v180-leak-test.png', fullPage: true });
|
||||
|
||||
await ctx.close();
|
||||
await browser.close();
|
||||
|
||||
const videos = fs.readdirSync('/tmp/v180-video/');
|
||||
if (videos.length > 0) {
|
||||
fs.renameSync('/tmp/v180-video/' + videos[0], '/tmp/v180-leak-test.webm');
|
||||
const stats = fs.statSync('/tmp/v180-leak-test.webm');
|
||||
console.log(`\nVideo: ${(stats.size/1024/1024).toFixed(1)}MB`);
|
||||
}
|
||||
})();
|
||||
38
api/ambre-pw-tests/v180_test.js
Normal file
38
api/ambre-pw-tests/v180_test.js
Normal file
@@ -0,0 +1,38 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1280, height: 800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
const logs = [];
|
||||
page.on('console', m => logs.push(`${m.type()}: ${m.text().substring(0,200)}`));
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Type intents_pool
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force:true});
|
||||
await input.fill('intents_pool');
|
||||
await input.press('Enter');
|
||||
console.log('SENT intents_pool');
|
||||
|
||||
await page.waitForTimeout(6000);
|
||||
|
||||
const state = await page.evaluate(() => {
|
||||
const bodyText = document.body.innerText;
|
||||
return {
|
||||
seesPoolTotal: /POOL TOTAL/i.test(bodyText),
|
||||
seesWeviaAssistant: /Je suis WEVIA Assistant IA/i.test(bodyText),
|
||||
seesTools377: /Tool registry.*377|377.*Tool/i.test(bodyText),
|
||||
seesCapacities: /2450 capacit/i.test(bodyText),
|
||||
lastMsgText: (document.querySelectorAll('.msg-bot, .msg-assistant, .ambre-phase-content, .msg')[0]?.innerText || '').substring(0, 400),
|
||||
};
|
||||
});
|
||||
console.log('STATE:', JSON.stringify(state, null, 2));
|
||||
console.log('CONSOLE LOGS (last 10):');
|
||||
for (const l of logs.slice(-10)) console.log(' ', l);
|
||||
|
||||
await page.screenshot({path:'/tmp/v180-test.png', fullPage:true});
|
||||
await browser.close();
|
||||
})();
|
||||
7
api/ambre-pw-v54.php
Normal file
7
api/ambre-pw-v54.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTQgwrcgTWVybWFpZCBTVkcgcmVuZGVyIGluIHBoYXNlIDUvNSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg5MDAwMCk7CiAgY29uc3QgbG9ncyA9IFtdOwogIHBhZ2Uub24oImNvbnNvbGUiLCBtID0+IGxvZ3MucHVzaChtLnRleHQoKS5zdWJzdHJpbmcoMCwgMjAwKSkpOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4geyB0cnl7c2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTt9Y2F0Y2goZSl7fSB9KTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCBpbnB1dCA9IHBhZ2UubG9jYXRvcigiI21zZ0lucHV0Iik7CiAgYXdhaXQgaW5wdXQuY2xpY2soe2ZvcmNlOnRydWV9KTsKICBhd2FpdCBpbnB1dC5maWxsKCJHZW5lcmUgdW4gc2NoZW1hIG1lcm1haWQgcG91cjogd2V2aWEiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDQwMCk7CiAgYXdhaXQgaW5wdXQucHJlc3MoIkVudGVyIik7CiAgY29uc29sZS5sb2coIlNlbnQgbWVybWFpZCByZXF1ZXN0Iik7CiAgCiAgLy8gV2FpdCBmb3IgY29tcGxldGlvbgogIGNvbnN0IHdzID0gRGF0ZS5ub3coKTsKICBsZXQgcmVuZGVyZWQgPSBmYWxzZTsKICB3aGlsZSAoRGF0ZS5ub3coKSAtIHdzIDwgNjAwMDApIHsKICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICAgIC8vIExvb2sgZm9yIGEgcmVuZGVyZWQgU1ZHIGluIGFueSBhbWJyZS1waGFzZS1yZXN1bHQgb3IgcmVzdWx0IGJsb2NrCiAgICAgIGNvbnN0IHN2Z3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW1icmUtcGhhc2UtcmVzdWx0IHN2ZywgLnBoYXNlLWNvbnRlbnQgc3ZnLCBbaWRePSJ3di1tZXJtYWlkLSJdIHN2ZycpOwogICAgICBjb25zdCBoYXNTdmcgPSBzdmdzLmxlbmd0aCA+IDA7CiAgICAgIC8vIENoZWNrIFdFVklBLXBhdHRlcm4gdnMgQ2xhdWRlLXBhdHRlcm4gaW4gcmVuZGVyZWQgSFRNTAogICAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7CiAgICAgIHJldHVybiB7CiAgICAgICAgcGhhc2VfY291bnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbWJyZS1waGFzZScpLmxlbmd0aCwKICAgICAgICBzdmdfY291bnQ6IHN2Z3MubGVuZ3RoLAogICAgICAgIGhhc193ZXZpYV9wYXR0ZXJuOiAvV0VWSUFbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVstIF0/cGF0dGVybi9pLnRlc3QoaHRtbCksCiAgICAgICAgYnVzeTogISF3aW5kb3cuYnVzeSB8fCAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kQnRuJyk/LmRpc2FibGVkLAogICAgICB9OwogICAgfSk7CiAgICBpZiAoc3RhdGUuc3ZnX2NvdW50ID4gMCAmJiAhc3RhdGUuYnVzeSkgeyByZW5kZXJlZCA9IHRydWU7IGNvbnNvbGUubG9nKGBTVkcgcmVuZGVyZWQhIHN0YXRlPSR7SlNPTi5zdHJpbmdpZnkoc3RhdGUpfWApOyBicmVhazsgfQogICAgaWYgKCFzdGF0ZS5idXN5ICYmIHN0YXRlLnBoYXNlX2NvdW50ID49IDUpIHsKICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICAgICAgY29uc3QgczIgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbWJyZS1waGFzZS1yZXN1bHQgc3ZnLCAucGhhc2UtY29udGVudCBzdmcsIFtpZF49Ind2LW1lcm1haWQtIl0gc3ZnJykubGVuZ3RoKTsKICAgICAgY29uc29sZS5sb2coYEFmdGVyIHdhaXQ6ICR7czJ9IFNWR3MsIGJ1c3k9JHtzdGF0ZS5idXN5fWApOwogICAgICBpZiAoczIgPiAwKSByZW5kZXJlZCA9IHRydWU7CiAgICAgIGJyZWFrOwogICAgfQogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgCiAgY29uc3QgZWxhcHNlZCA9ICgoRGF0ZS5ub3coKS13cykvMTAwMCkudG9GaXhlZCgxKTsKICBjb25zdCBmaW5hbFN0YXRlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7CiAgICBjb25zdCBzdmdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFtYnJlLXBoYXNlLXJlc3VsdCBzdmcsIC5waGFzZS1jb250ZW50IHN2ZywgW2lkXj0id3YtbWVybWFpZC0iXSBzdmcnKTsKICAgIHJldHVybiB7CiAgICAgIHN2Z192aXNpYmxlOiBBcnJheS5mcm9tKHN2Z3MpLmZpbHRlcihzID0+IHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiAxMCkubGVuZ3RoLAogICAgICBzdmdfaHRtbF9sZW46IHN2Z3MubGVuZ3RoID4gMCA/IHN2Z3NbMF0ub3V0ZXJIVE1MLmxlbmd0aCA6IDAsCiAgICAgIGhhc193ZXZpYV9wYXR0ZXJuOiAvV0VWSUFbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICBoYXNfY2xhdWRlX3BhdHRlcm46IC9DbGF1ZGVbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICBoYXNfbWVybWFpZF9jb2RlX3JhdzogL3NlcXVlbmNlRGlhZ3JhbXxmbG93Y2hhcnR8Z3JhcGhccytbQS1aXS9pLnRlc3QoaHRtbCksCiAgICB9OwogIH0pOwogIGNvbnNvbGUubG9nKGBcbuKVkOKVkOKVkCBGSU5BTCBpbiAke2VsYXBzZWR9cyDCtyByZW5kZXJlZD0ke3JlbmRlcmVkfSDilZDilZDilZBgKTsKICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShmaW5hbFN0YXRlLCBudWxsLCAyKSk7CiAgCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTQtbWVybWFpZC1maW5hbC5wbmciLCBmdWxsUGFnZTogdHJ1ZSB9KTsKICAKICAvLyBBbHNvIGNoZWNrIHJlbGV2YW50IGxvZ3MKICBsb2dzLmZpbHRlcihsID0+IC9tZXJtYWlkfE1FUk1BSUR8cmVuZGVyfFY1L2kudGVzdChsKSkuZm9yRWFjaChsID0+IGNvbnNvbGUubG9nKCJMT0c6IiwgbCkpOwp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v54-mermaid.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v55.php
Normal file
7
api/ambre-pw-v55.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTUgwrcgc2Nyb2xsIHRvIHNlZSBtZXJtYWlkIFNWRyIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg5MDAwMCk7CiAgCiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2aWEuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7IHRyeXtzZXNzaW9uU3RvcmFnZS5jbGVhcigpO31jYXRjaChlKXt9IH0pOwogIGF3YWl0IHBhZ2Uud2FpdEZvckxvYWRTdGF0ZSgibmV0d29ya2lkbGUiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDM1MDApOwogIAogIGNvbnN0IGlucHV0ID0gcGFnZS5sb2NhdG9yKCIjbXNnSW5wdXQiKTsKICBhd2FpdCBpbnB1dC5jbGljayh7Zm9yY2U6dHJ1ZX0pOwogIGF3YWl0IGlucHV0LmZpbGwoIkdlbmVyZSB1biBzY2hlbWEgbWVybWFpZCBwb3VyOiBhcmNoaXRlY3R1cmUgV0VWSUEgc291dmVyYWluZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNDAwKTsKICBhd2FpdCBpbnB1dC5wcmVzcygiRW50ZXIiKTsKICAKICAvLyBXYWl0IGZvciBjb21wbGV0aW9uCiAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCA2MDAwMCkgewogICAgY29uc3QgYnVzeSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gd2luZG93LmJ1c3kgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbmRCdG4nKT8uZGlzYWJsZWQpOwogICAgY29uc3Qgc3ZncyA9IGF3YWl0IHBhZ2UubG9jYXRvcignW2lkXj0id3YtbWVybWFpZC0iXSBzdmcsIC5waGFzZS1jb250ZW50IHN2ZycpLmNvdW50KCk7CiAgICBpZiAoIWJ1c3kgJiYgc3ZncyA+IDApIGJyZWFrOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICB9CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICAKICAvLyBTY3JvbGwgdG8gdGhlIFNWRwogIGNvbnN0IHNjcm9sbGVkID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSJ3di1tZXJtYWlkLSJdIHN2ZywgLnBoYXNlLWNvbnRlbnQgc3ZnJyk7CiAgICBpZiAoc3ZnKSB7CiAgICAgIHN2Zy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6J2NlbnRlcicsIGJlaGF2aW9yOidpbnN0YW50J30pOwogICAgICByZXR1cm4gewogICAgICAgIHN2Z192aXNpYmxlOiBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiAxMCwKICAgICAgICBzdmdfd2lkdGg6IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCwKICAgICAgICBzdmdfaGVpZ2h0OiBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LAogICAgICAgIHN2Z19odG1sX3NpemU6IHN2Zy5vdXRlckhUTUwubGVuZ3RoLAogICAgICAgIHdyYXBwZXJfaWQ6IHN2Zy5wYXJlbnRFbGVtZW50Py5pZCwKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0pOwogIGNvbnNvbGUubG9nKCJTVkcgcmVuZGVyZWQ6IiwgSlNPTi5zdHJpbmdpZnkoc2Nyb2xsZWQsIG51bGwsIDIpKTsKICAKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTUtc2Nyb2xsZWQucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjU1LWZ1bGwucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v55-scroll.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
15
api/ambre-sse2.php
Normal file
15
api/ambre-sse2.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
echo "size: " . strlen($c) . "\n";
|
||||
echo "Claude count: " . substr_count($c, "Claude") . "\n";
|
||||
echo "WEVIA-pattern: " . preg_match_all("/WEVIA[- ]?[pP]attern/", $c) . "\n";
|
||||
|
||||
// Find around "phase" type handling
|
||||
$pos = strpos($c, "type === 'header'");
|
||||
if ($pos === false) $pos = strpos($c, 'type==="header"');
|
||||
if ($pos === false) $pos = strpos($c, "'header'");
|
||||
echo "header pos: $pos\n";
|
||||
if ($pos !== false) {
|
||||
echo substr($c, $pos, 2500);
|
||||
}
|
||||
11
api/ambre-sse3.php
Normal file
11
api/ambre-sse3.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find WEVIA-pattern header rendering - that's the SSE handler for 'header' type
|
||||
$pos = strpos($c, "WEVIA-pattern");
|
||||
echo "WEVIA-pattern 1st at: $pos\n\n";
|
||||
if ($pos !== false) {
|
||||
echo "=== Context (go back to find handler start) ===\n";
|
||||
echo substr($c, max(0, $pos - 1500), 3000);
|
||||
}
|
||||
9
api/ambre-sse4.php
Normal file
9
api/ambre-sse4.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
// Get the rest of handleEvent (from WEVIA-pattern onwards to end of function)
|
||||
$pos = strpos($c, "WEVIA-pattern");
|
||||
$end = strpos($c, "eventSource.close", $pos);
|
||||
if ($end === false) $end = $pos + 6000;
|
||||
echo "=== handleEvent from 96870 to " . ($pos + 6000) . " ===\n";
|
||||
echo substr($c, $pos + 1800, 5000);
|
||||
@@ -1,9 +1,19 @@
|
||||
<?php
|
||||
// V179 wevia-brand · all providers masked as WEVIA Vision · internal_engine kept for debug
|
||||
/**
|
||||
* ambre-tool-image.php · Real image generation via Pollinations.ai (free, no auth)
|
||||
* Returns downloadable PNG from prompt
|
||||
* V176 · ambre-tool-image.php · Upgraded with quality cascade
|
||||
* Yacine: "IMAGE POURRI MET A LOUVER QWEN IMAGE POUR AMELOIRER"
|
||||
*
|
||||
* Cascade (order by QUALITY):
|
||||
* 1. Gemini 3 Pro Image Preview (best quality, free tier via GEMINI_KEY) - PRIMARY
|
||||
* 2. Qwen-Image via DashScope (requires ALIBABA_KEY with credits)
|
||||
* 3. Pollinations flux (free, 1024x1024)
|
||||
* 4. Pollinations sana (free, 768x768 fast fallback)
|
||||
*
|
||||
* Keep backward compat: same response schema as before
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(90);
|
||||
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST ?: $_GET;
|
||||
@@ -11,45 +21,189 @@ $prompt = trim($in["prompt"] ?? $in["q"] ?? "");
|
||||
|
||||
if (!$prompt) { echo json_encode(["error"=>"prompt required"]); exit; }
|
||||
|
||||
// Clean + translate prompt (keep as-is - Pollinations handles multilingue)
|
||||
$clean = preg_replace('/[^\p{L}\p{N}\s,.\-]/u', '', $prompt);
|
||||
$clean = substr(trim($clean), 0, 300);
|
||||
// Clean prompt (keep unicode)
|
||||
$clean = preg_replace('/[^\p{L}\p{N}\s,.\-!?]/u', '', $prompt);
|
||||
$clean = mb_substr(trim($clean), 0, 400);
|
||||
|
||||
// Pollinations API
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
$pollinations_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true";
|
||||
|
||||
// Fetch image (with 30s timeout)
|
||||
$ctx = stream_context_create([
|
||||
"http" => ["timeout"=>30, "header"=>"User-Agent: WEVIA/1.0\r\n"],
|
||||
"https" => ["timeout"=>30, "header"=>"User-Agent: WEVIA/1.0\r\n"],
|
||||
]);
|
||||
$t0 = microtime(true);
|
||||
$img_data = @file_get_contents($pollinations_url, false, $ctx);
|
||||
$elapsed = round((microtime(true)-$t0)*1000);
|
||||
|
||||
if (!$img_data || strlen($img_data) < 1000) {
|
||||
echo json_encode(["error"=>"image generation failed", "prompt"=>$clean, "elapsed"=>$elapsed]);
|
||||
exit;
|
||||
// Load secrets
|
||||
$secrets = [];
|
||||
foreach (file("/etc/weval/secrets.env") ?: [] as $line) {
|
||||
$line = trim($line);
|
||||
if (!$line || $line[0] === "#" || strpos($line, "=") === false) continue;
|
||||
list($k, $v) = explode("=", $line, 2);
|
||||
$secrets[trim($k)] = trim($v, " \"'");
|
||||
}
|
||||
$GEMINI_KEY = $secrets["GEMINI_KEY"] ?? "";
|
||||
$ALIBABA_KEY = $secrets["ALIBABA_KEY"] ?? "";
|
||||
|
||||
// Save to /generated/
|
||||
// File naming (shared across cascade)
|
||||
$dir = "/var/www/html/generated";
|
||||
if (!is_dir($dir)) @mkdir($dir, 0755, true);
|
||||
$slug = preg_replace('/[^a-z0-9]+/', '-', strtolower($clean));
|
||||
$slug = substr(trim($slug, "-"), 0, 50);
|
||||
$ts = date("Ymd-His");
|
||||
$rand = bin2hex(random_bytes(3));
|
||||
$filename = "wevia-img-{$slug}-{$ts}-{$rand}.png";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img_data);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img_data)/1024, 1),
|
||||
"elapsed_ms" => $elapsed,
|
||||
"provider" => "WEVIA Image Engine",
|
||||
]);
|
||||
$t0 = microtime(true);
|
||||
$result = null;
|
||||
|
||||
// ========== TIER 1: Gemini 3 Pro Image Preview (best quality, free) ==========
|
||||
if ($GEMINI_KEY) {
|
||||
$gurl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent?key=" . $GEMINI_KEY;
|
||||
$body = json_encode([
|
||||
"contents" => [["parts" => [["text" => $clean]]]],
|
||||
"generationConfig" => ["responseModalities" => ["IMAGE", "TEXT"]],
|
||||
]);
|
||||
$ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => $body,
|
||||
"timeout" => 60,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$resp = @file_get_contents($gurl, false, $ctx);
|
||||
if ($resp) {
|
||||
$d = @json_decode($resp, true);
|
||||
if (isset($d["candidates"][0]["content"]["parts"])) {
|
||||
foreach ($d["candidates"][0]["content"]["parts"] as $p) {
|
||||
if (isset($p["inlineData"]["data"])) {
|
||||
$mime = $p["inlineData"]["mimeType"] ?? "image/jpeg";
|
||||
$ext = strpos($mime, "png") !== false ? "png" : "jpg";
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.{$ext}";
|
||||
$path = "$dir/$filename";
|
||||
$img = base64_decode($p["inlineData"]["data"]);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (premium)",
|
||||
"quality" => "premium",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "gemini-3-pro",
|
||||
];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 2: Qwen-Image via DashScope (if Gemini failed + ALIBABA_KEY) ==========
|
||||
if (!$result && $ALIBABA_KEY) {
|
||||
// Create async task
|
||||
$submit_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Authorization: Bearer $ALIBABA_KEY\r\nContent-Type: application/json\r\nX-DashScope-Async: enable\r\n",
|
||||
"content" => json_encode([
|
||||
"model" => "qwen-image",
|
||||
"input" => ["prompt" => $clean],
|
||||
"parameters" => ["size" => "1024*1024", "n" => 1],
|
||||
]),
|
||||
"timeout" => 15,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$submit_resp = @file_get_contents("https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis", false, $submit_ctx);
|
||||
$submit_d = @json_decode($submit_resp, true);
|
||||
$task_id = $submit_d["output"]["task_id"] ?? "";
|
||||
if ($task_id) {
|
||||
// Poll
|
||||
for ($i = 0; $i < 20; $i++) {
|
||||
sleep(2);
|
||||
$pctx = stream_context_create(["http"=>["header"=>"Authorization: Bearer $ALIBABA_KEY\r\n","timeout"=>10]]);
|
||||
$pr = @file_get_contents("https://dashscope-intl.aliyuncs.com/api/v1/tasks/$task_id", false, $pctx);
|
||||
$pd = @json_decode($pr, true);
|
||||
$status = $pd["output"]["task_status"] ?? "";
|
||||
if ($status === "SUCCEEDED") {
|
||||
$img_url = $pd["output"]["results"][0]["url"] ?? "";
|
||||
if ($img_url) {
|
||||
$img = @file_get_contents($img_url);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.png";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (premium)",
|
||||
"quality" => "premium",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "qwen-image",
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ($status === "FAILED" || $status === "UNKNOWN") break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 3: Pollinations flux (free 1024x1024) ==========
|
||||
if (!$result) {
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
// Try with flux model hint (even though list shows only sana, try anyway)
|
||||
$flux_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true&model=flux";
|
||||
$ctx2 = stream_context_create(["http"=>["timeout"=>30,"header"=>"User-Agent: WEVIA/2.0\r\n"]]);
|
||||
$img = @file_get_contents($flux_url, false, $ctx2);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.jpg";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (standard)",
|
||||
"quality" => "standard",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "pollinations-flux",
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 4: Pollinations sana (last resort) ==========
|
||||
if (!$result) {
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
$sana_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true";
|
||||
$ctx3 = stream_context_create(["http"=>["timeout"=>30,"header"=>"User-Agent: WEVIA/2.0\r\n"]]);
|
||||
$img = @file_get_contents($sana_url, false, $ctx3);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.jpg";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (basic)",
|
||||
"quality" => "basic",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "pollinations-sana",
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
echo json_encode(["error"=>"all image providers failed","prompt"=>$clean]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
184
api/ambre-xlsx-gen.php
Normal file
184
api/ambre-xlsx-gen.php
Normal file
@@ -0,0 +1,184 @@
|
||||
<?php
|
||||
/**
|
||||
* V174 · ambre-xlsx-gen.php
|
||||
* Real XLSX generation using Python openpyxl via shell_exec
|
||||
* Yacine: Excel KO · genere docx au lieu xlsx
|
||||
* Cause: ambre-xlsx-gen.php missing, fallback to docx
|
||||
* Fix: this file generates real xlsx via openpyxl (already installed)
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(60);
|
||||
$t0 = microtime(true);
|
||||
|
||||
$topic = trim($_GET["topic"] ?? $_POST["topic"] ?? "");
|
||||
if (!$topic) {
|
||||
echo json_encode(["error"=>"topic required"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 1. Use LLM to generate JSON structure for the spreadsheet
|
||||
$sys = "Tu es generateur de donnees spreadsheet. Reponds UNIQUEMENT avec JSON valide, pas de markdown. Schema: {\"sheet_name\":\"...\",\"headers\":[\"col1\",\"col2\",...],\"rows\":[[\"val1\",\"val2\",...],...],\"kpis\":{\"metric\":\"value\",...}}. MAX 8 columns, 15 rows. Donnees realistes en francais avec chiffres et pourcentages.";
|
||||
$user = "Genere donnees spreadsheet pour: $topic";
|
||||
$llm_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => json_encode([
|
||||
"model" => "fast",
|
||||
"messages" => [
|
||||
["role"=>"system","content"=>$sys],
|
||||
["role"=>"user","content"=>$user],
|
||||
],
|
||||
"max_tokens" => 1200,
|
||||
"temperature" => 0.3,
|
||||
]),
|
||||
"timeout" => 30,
|
||||
],
|
||||
]));
|
||||
$llm_d = @json_decode($llm_raw, true);
|
||||
$content = $llm_d["choices"][0]["message"]["content"] ?? "";
|
||||
$content = trim(preg_replace("/```(?:json)?\n?|```/", "", $content));
|
||||
|
||||
// Parse JSON
|
||||
$data = @json_decode($content, true);
|
||||
if (!$data || !isset($data["headers"]) || !isset($data["rows"])) {
|
||||
// Fallback minimal
|
||||
$data = [
|
||||
"sheet_name" => mb_substr($topic, 0, 30),
|
||||
"headers" => ["Categorie", "Valeur", "Pourcentage"],
|
||||
"rows" => [
|
||||
["Donnee 1", 100, "25%"],
|
||||
["Donnee 2", 200, "50%"],
|
||||
["Donnee 3", 300, "75%"],
|
||||
],
|
||||
"kpis" => ["Total"=>"600","Moyenne"=>"200"],
|
||||
];
|
||||
}
|
||||
|
||||
// 2. Call Python script to generate xlsx
|
||||
$slug = preg_replace("/[^a-z0-9-]/", "-", strtolower($topic));
|
||||
$slug = trim(preg_replace("/-+/", "-", $slug), "-");
|
||||
$slug = mb_substr($slug, 0, 40);
|
||||
$filename = "wevia-xlsx-" . $slug . "-" . date("Ymd-His") . "-" . substr(md5($topic.rand()), 0, 6) . ".xlsx";
|
||||
$filepath = "/var/www/html/generated/" . $filename;
|
||||
|
||||
// JSON data file for Python to read (avoid shell escaping issues)
|
||||
$json_tmp = "/tmp/wevia-xlsx-" . uniqid() . ".json";
|
||||
file_put_contents($json_tmp, json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$py_script = <<<'PYEND'
|
||||
import json, sys, openpyxl
|
||||
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
||||
from openpyxl.chart import BarChart, Reference
|
||||
json_file = sys.argv[1]
|
||||
xlsx_out = sys.argv[2]
|
||||
topic = sys.argv[3]
|
||||
with open(json_file) as f:
|
||||
data = json.load(f)
|
||||
wb = openpyxl.Workbook()
|
||||
ws = wb.active
|
||||
ws.title = (data.get("sheet_name") or topic[:30])[:30]
|
||||
# Header styling
|
||||
header_font = Font(bold=True, color="FFFFFF", size=12)
|
||||
header_fill = PatternFill(start_color="6366F1", end_color="6366F1", fill_type="solid")
|
||||
header_align = Alignment(horizontal="center", vertical="center")
|
||||
# Title row
|
||||
ws["A1"] = topic
|
||||
ws["A1"].font = Font(bold=True, size=16, color="4338CA")
|
||||
ws["A1"].alignment = Alignment(horizontal="left", vertical="center")
|
||||
ws.row_dimensions[1].height = 30
|
||||
# Headers row 3
|
||||
headers = data.get("headers", [])
|
||||
for i, h in enumerate(headers):
|
||||
cell = ws.cell(row=3, column=i+1, value=h)
|
||||
cell.font = header_font
|
||||
cell.fill = header_fill
|
||||
cell.alignment = header_align
|
||||
# Data rows
|
||||
rows = data.get("rows", [])
|
||||
for ri, row in enumerate(rows):
|
||||
for ci, val in enumerate(row):
|
||||
c = ws.cell(row=4+ri, column=ci+1, value=val)
|
||||
c.alignment = Alignment(vertical="center")
|
||||
if ri % 2 == 0:
|
||||
c.fill = PatternFill(start_color="F1F5F9", end_color="F1F5F9", fill_type="solid")
|
||||
# Column widths
|
||||
for i, h in enumerate(headers):
|
||||
ws.column_dimensions[chr(65+i)].width = max(15, len(str(h))+5)
|
||||
# KPIs section
|
||||
kpi_row = 4 + len(rows) + 2
|
||||
kpis = data.get("kpis", {})
|
||||
if kpis:
|
||||
kpi_cell = ws.cell(row=kpi_row, column=1, value="KPIs")
|
||||
kpi_cell.font = Font(bold=True, size=14, color="4338CA")
|
||||
for i, (k, v) in enumerate(kpis.items()):
|
||||
ws.cell(row=kpi_row+1+i, column=1, value=k).font = Font(bold=True)
|
||||
ws.cell(row=kpi_row+1+i, column=2, value=v)
|
||||
# Add chart if numeric data
|
||||
try:
|
||||
numeric_col = None
|
||||
for ci, h in enumerate(headers):
|
||||
if any(isinstance(r[ci], (int, float)) if ci < len(r) else False for r in rows):
|
||||
numeric_col = ci
|
||||
break
|
||||
if numeric_col is not None and len(rows) > 0:
|
||||
chart = BarChart()
|
||||
chart.title = "Visualisation"
|
||||
chart.style = 13
|
||||
data_ref = Reference(ws, min_col=numeric_col+1, min_row=3, max_row=3+len(rows), max_col=numeric_col+1)
|
||||
cats_ref = Reference(ws, min_col=1, min_row=4, max_row=3+len(rows))
|
||||
chart.add_data(data_ref, titles_from_data=True)
|
||||
chart.set_categories(cats_ref)
|
||||
chart.width = 15
|
||||
chart.height = 8
|
||||
ws.add_chart(chart, f"E{kpi_row}")
|
||||
except Exception as e:
|
||||
print(f"Chart error: {e}", file=sys.stderr)
|
||||
wb.save(xlsx_out)
|
||||
print("OK")
|
||||
PYEND;
|
||||
|
||||
$py_tmp = "/tmp/wevia-xlsx-gen-" . uniqid() . ".py";
|
||||
file_put_contents($py_tmp, $py_script);
|
||||
|
||||
$cmd = "python3 " . escapeshellarg($py_tmp) . " " . escapeshellarg($json_tmp) . " " . escapeshellarg($filepath) . " " . escapeshellarg($topic) . " 2>&1";
|
||||
$out = shell_exec($cmd);
|
||||
@unlink($py_tmp);
|
||||
@unlink($json_tmp);
|
||||
|
||||
if (!file_exists($filepath) || filesize($filepath) < 100) {
|
||||
echo json_encode(["error"=>"xlsx generation failed","python_out"=>$out]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$size = filesize($filepath);
|
||||
$elapsed = round((microtime(true) - $t0) * 1000);
|
||||
$full_url = "https://weval-consulting.com/generated/" . $filename;
|
||||
|
||||
// Build preview text
|
||||
$preview = "📊 **" . $topic . "** (Excel reel avec graphique)\n\n";
|
||||
$preview .= "Feuille: " . ($data["sheet_name"] ?? $topic) . "\n";
|
||||
$preview .= "Colonnes: " . count($data["headers"] ?? []) . " · Lignes: " . count($data["rows"] ?? []) . "\n";
|
||||
if (!empty($data["kpis"])) {
|
||||
$preview .= "\nKPIs:\n";
|
||||
foreach ($data["kpis"] as $k => $v) {
|
||||
$preview .= "- **$k**: $v\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"url" => "/generated/" . $filename,
|
||||
"full_url" => $full_url,
|
||||
"size_bytes" => $size,
|
||||
"size_human" => round($size/1024, 1) . "KB",
|
||||
"elapsed_ms" => $elapsed,
|
||||
"engine" => "openpyxl",
|
||||
"provider" => "WEVIA XLSX Engine V174",
|
||||
"topic" => $topic,
|
||||
"preview" => $preview,
|
||||
"sheet_name" => $data["sheet_name"] ?? $topic,
|
||||
"rows_count" => count($data["rows"] ?? []),
|
||||
"columns_count" => count($data["headers"] ?? []),
|
||||
"has_chart" => true,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-22 09:00:02",
|
||||
"generated": "2026-04-22 23:00:01",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 86,
|
||||
"disk_avail": "22G",
|
||||
"uptime": "up 1 week, 23 hours, 8 minutes",
|
||||
"disk_pct": 98,
|
||||
"disk_avail": "3.5G",
|
||||
"uptime": "up 1 week, 1 day, 13 hours, 8 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -21,8 +21,8 @@
|
||||
"private": "10.1.0.3",
|
||||
"role": "WEVADS Arsenal",
|
||||
"ssh": 22,
|
||||
"disk_pct": 83,
|
||||
"disk_avail": "26G",
|
||||
"disk_pct": 95,
|
||||
"disk_avail": "7.9G",
|
||||
"sentinel": 1
|
||||
},
|
||||
{
|
||||
@@ -34,14 +34,9 @@
|
||||
}
|
||||
],
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up Less than a second",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -51,17 +46,17 @@
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -81,7 +76,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -96,27 +91,27 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -126,12 +121,12 @@
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
@@ -290,9 +285,9 @@
|
||||
}
|
||||
],
|
||||
"screens": {
|
||||
"s204_html": 328,
|
||||
"s204_html": 330,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 1067,
|
||||
"s204_api_php": 1077,
|
||||
"s204_wevia_php": 254,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -312,11 +307,11 @@
|
||||
"mattermost_db",
|
||||
"deerflow",
|
||||
"nocodb",
|
||||
"paperclip",
|
||||
"langfuse"
|
||||
"langfuse",
|
||||
"paperclip"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5706,
|
||||
"kb_learnings": 5928,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -616,15 +611,15 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5706,
|
||||
"total_entries": 5928,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3096"
|
||||
"cnt": "3290"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1254"
|
||||
"cnt": "1282"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1734,44 +1729,44 @@
|
||||
"recent_commits": [],
|
||||
"auto_fixes": [
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:55: 2 fixes. Disk light cleanup 86%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 10:55:14.715277"
|
||||
"fact": "AUTONOMY 22Apr 22:55: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:55:02.782285"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:50: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:50:05.966888"
|
||||
"fact": "AUTONOMY 22Apr 22:50: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:50:02.689985"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:45: 2 fixes. Disk light cleanup 86%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 10:45:05.414088"
|
||||
"fact": "AUTONOMY 22Apr 22:45: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:45:02.974458"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:40: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:40:05.253699"
|
||||
"fact": "AUTONOMY 22Apr 22:40: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:40:03.241744"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:35: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:35:04.63423"
|
||||
"fact": "AUTONOMY 22Apr 22:35: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:35:33.024747"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:30: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:30:08.326062"
|
||||
"fact": "AUTO-FIX 22Apr2026 22:30: 2 fixes applied. S204: Disk 98% CRITICAL; S95: Disk 95% CRITICAL",
|
||||
"created_at": "2026-04-23 00:30:05.347805"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:25:05.043155"
|
||||
"fact": "AUTO-FIX 22Apr2026 22:30: 2 fixes applied. S204: Disk 98% CRITICAL; S95: Disk 95% CRITICAL",
|
||||
"created_at": "2026-04-23 00:30:05.333436"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:20: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:20:05.6286"
|
||||
"fact": "AUTONOMY 22Apr 22:30: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:30:04.100895"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:15: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:15:06.533813"
|
||||
"fact": "AUTONOMY 22Apr 22:25: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:25:03.262805"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:10: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:10:06.375058"
|
||||
"fact": "AUTONOMY 22Apr 22:20: 1 fixes. Disk cleanup 98%",
|
||||
"created_at": "2026-04-23 00:20:02.822888"
|
||||
}
|
||||
],
|
||||
"architecture_decisions": [
|
||||
@@ -1941,15 +1936,48 @@
|
||||
"bridge": "\/api\/mirofish-bridge.php"
|
||||
},
|
||||
"recommendations": {
|
||||
"score": 100,
|
||||
"total": 1,
|
||||
"critical": 0,
|
||||
"score": 70,
|
||||
"total": 3,
|
||||
"critical": 2,
|
||||
"warning": 0,
|
||||
"info": 0,
|
||||
"opportunity": 1,
|
||||
"auto_fixed": 0,
|
||||
"fixes_log": [],
|
||||
"auto_fixed": 2,
|
||||
"fixes_log": [
|
||||
{
|
||||
"title": "S204: Disk 98% CRITICAL",
|
||||
"cmd": "truncate -s 0 \/var\/log\/syslog.1 \/var\/log\/crowdsec-firewall-bouncer.log; journalctl --vacuum-size=100M; docker system prune -f --volumes 2>\/dev\/null",
|
||||
"output": "Total reclaimed space: 0B",
|
||||
"time": "2026-04-22 23:00:03"
|
||||
},
|
||||
{
|
||||
"title": "S95: Disk 95% CRITICAL",
|
||||
"cmd": "truncate -s 0 \/var\/log\/syslog.1 \/var\/log\/crowdsec-firewall-bouncer.log; journalctl --vacuum-size=100M; docker system prune -f --volumes 2>\/dev\/null",
|
||||
"output": "Total reclaimed space: 0B",
|
||||
"time": "2026-04-22 23:00:03"
|
||||
}
|
||||
],
|
||||
"recommendations": [
|
||||
{
|
||||
"severity": "critical",
|
||||
"category": "INFRA",
|
||||
"title": "S204: Disk 98% CRITICAL",
|
||||
"detail": "Espace disque critique. Risque de crash imminent. Nettoyer logs, truncate syslog, docker prune.",
|
||||
"action": "auto",
|
||||
"fix_cmd": "truncate -s 0 \/var\/log\/syslog.1 \/var\/log\/crowdsec-firewall-bouncer.log; journalctl --vacuum-size=100M; docker system prune -f --volumes 2>\/dev\/null",
|
||||
"auto_fixed": true,
|
||||
"fix_output": "Total reclaimed space: 0B"
|
||||
},
|
||||
{
|
||||
"severity": "critical",
|
||||
"category": "INFRA",
|
||||
"title": "S95: Disk 95% CRITICAL",
|
||||
"detail": "Espace disque critique. Risque de crash imminent. Nettoyer logs, truncate syslog, docker prune.",
|
||||
"action": "auto",
|
||||
"fix_cmd": "truncate -s 0 \/var\/log\/syslog.1 \/var\/log\/crowdsec-firewall-bouncer.log; journalctl --vacuum-size=100M; docker system prune -f --volumes 2>\/dev\/null",
|
||||
"auto_fixed": true,
|
||||
"fix_output": "Total reclaimed space: 0B"
|
||||
},
|
||||
{
|
||||
"severity": "opportunity",
|
||||
"category": "SCALABILITY",
|
||||
@@ -1960,7 +1988,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 2526,
|
||||
"scan_time_ms": 2123,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T11:00:01.889900",
|
||||
"generated_at": "2026-04-23T01:20:01.523412",
|
||||
"stats": {
|
||||
"total": 50,
|
||||
"pending": 32,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-22T11:00:02.013919",
|
||||
"last_heartbeat": "2026-04-22T11:00:02.013919",
|
||||
"last_heartbeat_ts_epoch": 1776848402,
|
||||
"ts": "2026-04-23T01:15:02.052806",
|
||||
"last_heartbeat": "2026-04-23T01:15:02.052806",
|
||||
"last_heartbeat_ts_epoch": 1776899702,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# WEVIA Master — System Documentation
|
||||
Generated: Wed Apr 22 12:00:01 AM CEST 2026
|
||||
Generated: Thu Apr 23 12:00:01 AM CEST 2026
|
||||
|
||||
## APIs (252)
|
||||
## APIs (255)
|
||||
wevia-action-engine.php
|
||||
wevia-actions.php
|
||||
wevia-admin-crm-bridge.php
|
||||
@@ -51,9 +51,11 @@ wevia-bvs-api.php
|
||||
wevia-capabilities-ext.php
|
||||
wevia-capabilities-faq-v81.php
|
||||
wevia-capabilities.php
|
||||
wevia-chat-memory.php
|
||||
wevia-chat.php
|
||||
wevia-chat-relay.php
|
||||
wevia-chat-test.php
|
||||
wevia-chat-v2-direct.php
|
||||
wevia-claude-code-patterns.php
|
||||
wevia-claude-code.php
|
||||
wevia-code-agent.php
|
||||
@@ -92,6 +94,7 @@ wevia-enterprise-fleet.php
|
||||
wevia-enterprise.php
|
||||
wevia-exec-intercept.php
|
||||
wevia-exec.php
|
||||
wevia-factory.php
|
||||
wevia-fast-path.php
|
||||
wevia-fast-path-v3.php
|
||||
wevia-fiability.php
|
||||
@@ -255,7 +258,7 @@ wevia-wave114-intents.php
|
||||
wevia-wave114.php
|
||||
wevia-webchat-direct.php
|
||||
|
||||
## Scripts (43)
|
||||
## Scripts (45)
|
||||
wevia-antiregression.py
|
||||
wevia-autodoc.sh
|
||||
wevia-autointent-sync.sh
|
||||
@@ -275,6 +278,7 @@ wevia-deepseek-web.py
|
||||
wevia-full-test.py
|
||||
wevia-gap-analyzer.py
|
||||
wevia-intel.sh
|
||||
wevia-intents-pool.sh
|
||||
wevia-l99-autofix.py
|
||||
wevia-llm-worker.py
|
||||
wevia-master-test.py
|
||||
@@ -286,6 +290,7 @@ wevia-register-agent.py
|
||||
wevia-renew-pat.py
|
||||
wevia-self-doc.sh
|
||||
wevia-selfmanage.sh
|
||||
wevia-self-meta.sh
|
||||
wevia-site-builder.php
|
||||
wevia-site-builder-v1-dark.php
|
||||
wevia-site-builder-v2-light-pre-em.php
|
||||
@@ -300,7 +305,7 @@ wevia-ux-agent.py
|
||||
wevia-webchat-api.py
|
||||
wevia-webwide.py
|
||||
|
||||
## Crons (85)
|
||||
## Crons (86)
|
||||
*/10 * * * * /usr/bin/python3 /opt/weval-l99/screens-autodiscovery.py >> /var/log/screens-autodiscovery.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-blade-ctl.sh status >> /var/log/wevia-blade.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-pilot.sh
|
||||
@@ -353,9 +358,10 @@ wevia-webwide.py
|
||||
0 */6 * * * php /var/www/html/api/auto-key-renew.php >> /var/log/key-renew.log 2>&1
|
||||
0 */6 * * * sudo python3 /opt/weval-security/key-sync.py >> /var/log/security-sync.log 2>&1
|
||||
0 */6 * * * timeout 900 python3 /opt/weval-l99/l99-deep-scan.py >> /var/log/l99-deep-scan.log 2>&1
|
||||
0 1 * * * python3 /opt/ethica-enrich-v4.py 300 >> /var/log/ethica-enrich-v4.log 2>&1
|
||||
0 10 * * * python3 /opt/ethica-enrich-searxng.py 200 >> /var/log/ethica-enrich-searxng.log 2>&1
|
||||
0 11,23 * * * python3 /opt/ethica-richscraper.py 500 >> /var/log/ethica-richscraper.log 2>&1
|
||||
0 1 * * * python3 /opt/ethica-enrich-v4.py 600 >> /var/log/ethica-enrich-v4.log 2>&1
|
||||
0 10 * * * python3 /opt/ethica-enrich-searxng.py 500 >> /var/log/ethica-enrich-searxng.log 2>&1
|
||||
0 16 * * * python3 /opt/ethica-enrich-searxng.py 500 >> /var/log/ethica-enrich-searxng.log 2>&1 # V152 second run/day for DZ enrichment
|
||||
0 11,23 * * * python3 /opt/ethica-richscraper.py 1000 >> /var/log/ethica-richscraper.log 2>&1
|
||||
0 2 * * * /usr/bin/python3 /opt/weval-ops/kpi-snapshot-daily.py >> /var/log/weval/kpi-daily.log 2>&1
|
||||
0 2 * * 0 python3 /opt/tabibi-scraper.py >> /var/log/tabibi-scraper.log 2>&1
|
||||
0 3 * * * bash /opt/weval-l99/wtp-integrity-daily.sh >> /var/log/wtp-integrity.log 2>&1
|
||||
@@ -380,14 +386,14 @@ wevia-webwide.py
|
||||
|
||||
## Ollama Models
|
||||
|
||||
## Docker (20 containers)
|
||||
weval-docuseal Up 5 seconds
|
||||
loki Up 5 days
|
||||
listmonk Up 5 days
|
||||
plausible-plausible-1 Up 4 days
|
||||
plausible-plausible-db-1 Up 4 days
|
||||
plausible-plausible-events-db-1 Up 4 days
|
||||
n8n-docker-n8n-1 Up 5 days
|
||||
mattermost-docker-mm-db-1 Up 5 days
|
||||
mattermost-docker-mattermost-1 Up 5 days (healthy)
|
||||
twenty Up 5 days
|
||||
## Docker (19 containers)
|
||||
loki Up 6 days
|
||||
listmonk Up 6 days
|
||||
plausible-plausible-1 Up 5 days
|
||||
plausible-plausible-db-1 Up 5 days
|
||||
plausible-plausible-events-db-1 Up 5 days
|
||||
n8n-docker-n8n-1 Up 6 days
|
||||
mattermost-docker-mm-db-1 Up 6 days
|
||||
mattermost-docker-mattermost-1 Up 6 days (healthy)
|
||||
twenty Up 6 days
|
||||
twenty-redis Up 6 days
|
||||
|
||||
15
api/blade-tasks/key_gemini_key_20260422.json
Normal file
15
api/blade-tasks/key_gemini_key_20260422.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "key_renewal",
|
||||
"provider": "GEMINI_KEY",
|
||||
"reason": "FAIL",
|
||||
"urls": {
|
||||
"GITHUB_TOKEN": "https:\/\/github.com\/settings\/tokens\/new?scopes=repo,workflow&description=WEVIA-Auto",
|
||||
"GROQ_KEY": "https:\/\/console.groq.com\/keys",
|
||||
"CEREBRAS_API_KEY": "https:\/\/cloud.cerebras.ai\/platform",
|
||||
"GEMINI_KEY": "https:\/\/aistudio.google.com\/apikey",
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T16:00:05+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T22:00:04+00:00",
|
||||
"priority": "P0"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T22:00:04+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T22:00:04+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 08:00",
|
||||
"timestamp": "2026-04-23 00:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "20",
|
||||
"docker": "19",
|
||||
"ram": "13Gi/30Gi",
|
||||
"disk": "86%",
|
||||
"load": "3.12",
|
||||
"uptime": "up 1 week, 20 hours, 8 minutes"
|
||||
"disk": "98%",
|
||||
"load": "1.54",
|
||||
"uptime": "up 1 week, 1 day, 12 hours, 8 minutes"
|
||||
},
|
||||
"services": "8/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
"nonreg": "?/? (?%)",
|
||||
"qdrant": "21259 vectors",
|
||||
"crons": "44 active",
|
||||
"routes": "446",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "2252 entries",
|
||||
"wiki": "2329 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
|
||||
1
api/fix-wv-send.php
Normal file
1
api/fix-wv-send.php
Normal file
@@ -0,0 +1 @@
|
||||
Voici le code complet pour le script `fix-wv-send.php` :
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 06:00",
|
||||
"timestamp": "2026-04-23 00:00",
|
||||
"fast_php_routes": 446,
|
||||
"opt_tools_total": 54,
|
||||
"wired": 51,
|
||||
"opt_tools_total": 55,
|
||||
"wired": 52,
|
||||
"not_wired_count": 3,
|
||||
"not_wired_tools": [
|
||||
{
|
||||
@@ -18,9 +18,8 @@
|
||||
"files": 10
|
||||
}
|
||||
],
|
||||
"docker_total": 20,
|
||||
"docker_total": 19,
|
||||
"docker_not_wired": [
|
||||
"weval-docuseal",
|
||||
"plausible-plausible-1",
|
||||
"plausible-plausible-db-1",
|
||||
"plausible-plausible-events-db-1",
|
||||
@@ -34,5 +33,5 @@
|
||||
"uptime-kuma",
|
||||
"vaultwarden"
|
||||
],
|
||||
"score": 94.4
|
||||
"score": 94.5
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"created_at": "2026-04-17T14:47:24+00:00",
|
||||
"status": "drafts_generated",
|
||||
"to": "kaouther.najar@ethica.ma",
|
||||
"drafts_count": 3,
|
||||
"drafts": [
|
||||
{
|
||||
"tier": 1,
|
||||
"subject": "Contre-proposition pharma DH \u2014 Palier Premium (1,5 DH)",
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"tier": 2,
|
||||
"subject": "Contre-proposition pharma DH \u2014 Palier Standard (1,2 DH)",
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"tier": 3,
|
||||
"subject": "Contre-proposition pharma DH \u2014 Palier Volume (1,0 DH)",
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -5,20 +5,24 @@
|
||||
"status": "ERROR"
|
||||
},
|
||||
"ports": {
|
||||
"total": 74,
|
||||
"total": 75,
|
||||
"exposed": 20,
|
||||
"ports": [
|
||||
{
|
||||
"addr": "127.0.0.1:37367",
|
||||
"process": "users:((\"ollama\",pid=2223848,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5432",
|
||||
"process": "users:((\"postgres\",pid=1428,fd=6))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5890",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=12),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=12),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5888",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=10),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=10),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6060",
|
||||
@@ -30,23 +34,23 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5823",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=5),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=5),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5822",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=4),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=4),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5821",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=3),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=3),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5825",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=13),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=13),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5824",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=6),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=6),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6379",
|
||||
@@ -72,10 +76,6 @@
|
||||
"addr": "0.0.0.0:8765",
|
||||
"process": "users:((\"python3\",pid=1811016,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:34111",
|
||||
"process": "users:((\"ollama\",pid=1295666,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:2024",
|
||||
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
|
||||
@@ -84,9 +84,13 @@
|
||||
"addr": "127.0.0.53:53",
|
||||
"process": "users:((\"systemd-resolve\",pid=999,fd=15))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:3102",
|
||||
"process": "users:((\"node\",pid=1241098,fd=29))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:3201",
|
||||
"process": "users:((\"node\",pid=1410817,fd=27))"
|
||||
"process": "users:((\"node\",pid=1216418,fd=27))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:4001",
|
||||
@@ -102,7 +106,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:443",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=5),(\"nginx\",pid=131"
|
||||
"process": "users:((\"nginx\",pid=2223651,fd=5),(\"nginx\",pid=222"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:49222",
|
||||
@@ -110,7 +114,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:80",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=6),(\"nginx\",pid=131"
|
||||
"process": "users:((\"nginx\",pid=2223651,fd=6),(\"nginx\",pid=222"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:22",
|
||||
@@ -118,15 +122,11 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:8280",
|
||||
"process": "users:((\"crowdsec\",pid=2454,fd=26))"
|
||||
"process": "users:((\"crowdsec\",pid=2454,fd=27))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:8443",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=11),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:9050",
|
||||
"process": "users:((\"tor\",pid=1408,fd=6))"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=11),(\"apache2\",pi"
|
||||
}
|
||||
],
|
||||
"status": "WARN"
|
||||
@@ -136,14 +136,12 @@
|
||||
},
|
||||
"auth": {
|
||||
"total": 7,
|
||||
"protected": 0,
|
||||
"protected": 2,
|
||||
"unprotected": [
|
||||
"/blade-ai.html",
|
||||
"/crm.html",
|
||||
"/ops-center.html",
|
||||
"/monitoring.html",
|
||||
"/l99.html",
|
||||
"/ai-benchmark.html",
|
||||
"/command-center.html"
|
||||
],
|
||||
"status": "FAIL"
|
||||
@@ -161,7 +159,7 @@
|
||||
"status": "PASS"
|
||||
}
|
||||
},
|
||||
"timestamp": "2026-04-22T06:00:01",
|
||||
"timestamp": "2026-04-23T00:00:03",
|
||||
"oss_tools": [
|
||||
{
|
||||
"name": "Nuclei",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "daily",
|
||||
"timestamp": "2026-04-22 07:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squads": {
|
||||
"infra": {
|
||||
"name": "INFRA",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T06:30:02.392649",
|
||||
"timestamp": "2026-04-23T00:30:02.854134",
|
||||
"source": "auto-populator-v2-fixed-18avr",
|
||||
"enterprise_total_agents": 747,
|
||||
"docker_total": 20,
|
||||
"docker_total": 19,
|
||||
"rooms": {
|
||||
"strat": {
|
||||
"count": 99,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[06:30:01] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[06:30:01] Enterprise: 747 agents
|
||||
[06:30:02] Registry: 11 sections
|
||||
[06:30:02] Docker: 20 containers
|
||||
[06:30:02] strat: 99 agents (38 active)
|
||||
[06:30:02] infra: 308 agents (34 active)
|
||||
[06:30:02] dev: 108 agents (25 active)
|
||||
[06:30:02] sec: 48 agents (13 active)
|
||||
[06:30:02] biz: 114 agents (31 active)
|
||||
[06:30:02] ia: 168 agents (48 active)
|
||||
[06:30:02] transit: 254 agents (27 active)
|
||||
[06:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
[00:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[00:30:02] Enterprise: 747 agents
|
||||
[00:30:02] Registry: 0 sections
|
||||
[00:30:02] Docker: 19 containers
|
||||
[00:30:02] strat: 99 agents (38 active)
|
||||
[00:30:02] infra: 308 agents (34 active)
|
||||
[00:30:02] dev: 108 agents (25 active)
|
||||
[00:30:02] sec: 48 agents (13 active)
|
||||
[00:30:02] biz: 114 agents (31 active)
|
||||
[00:30:02] ia: 168 agents (48 active)
|
||||
[00:30:02] transit: 254 agents (27 active)
|
||||
[00:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
30
api/meetings/daily-2026-04-22-12-00.json
Normal file
30
api/meetings/daily-2026-04-22-12-00.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squad": "infra",
|
||||
"agents": {
|
||||
"cortex": {
|
||||
"done": "13 checks, services 8\/10 OK",
|
||||
"blockers": "none",
|
||||
"next": "Continue monitoring *\/4h"
|
||||
},
|
||||
"gap_detector": {
|
||||
"done": "Score 94.4% (51\/54 wired)",
|
||||
"blockers": "3 tools not wired",
|
||||
"next": "Wire remaining tools"
|
||||
},
|
||||
"nonreg": {
|
||||
"done": "153\/153 (100%)",
|
||||
"blockers": "none",
|
||||
"next": "Maintain 100%"
|
||||
},
|
||||
"security": {
|
||||
"done": "0 leaks, 92 expositions redacted, CrowdSec active",
|
||||
"blockers": "none",
|
||||
"next": "Continuous monitoring"
|
||||
}
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "LLM unavailable"
|
||||
}
|
||||
30
api/meetings/daily-2026-04-22-12-30.json
Normal file
30
api/meetings/daily-2026-04-22-12-30.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 12:30",
|
||||
"squad": "innovation",
|
||||
"agents": {
|
||||
"evolution": {
|
||||
"done": "System: ? routes, ? skills",
|
||||
"blockers": "Agent PHP syntax to fix",
|
||||
"next": "Generate 5 evolution proposals"
|
||||
},
|
||||
"scanner": {
|
||||
"done": "12 sections wiki scanned",
|
||||
"blockers": "none",
|
||||
"next": "Continue *\/2h"
|
||||
},
|
||||
"l99": {
|
||||
"done": "Functional ?\/93, Dark 7\/10",
|
||||
"blockers": "gitleaks+trivy version format mismatch",
|
||||
"next": "Fix dark test parsing"
|
||||
},
|
||||
"mirofish": {
|
||||
"done": "MiroFish DOWN",
|
||||
"blockers": "Service down",
|
||||
"next": "Collaborative tools"
|
||||
}
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "{\n \"conflicts\": [\n \"Agent PHP syntax to fix (blocker pour evolution) pourrait impacter la génération des routes\/skills nécessaires à d'autres agents\",\n \"MiroFish DOWN (mirofish) peut bloquer les agents dépendants d'outils collaboratifs, potentiellement scanner ou coordination interne\"\n ],\n \"common_issues\": [\n \"Problèmes liés à des dépendances techniques externes (versions gitleaks+trivy, syntaxe PHP, service down)\",\n \"Indicateurs de progression partiellement inconnus (?) chez evolution et mirofish, réduisant la visibilité\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer evolution\",\n \"Restaurer le service MiroFish (urgence opérationnelle)\",\n \"Résoudre le mismatch de format de version entre gitleaks et trivy pour l'agent l99\"\n ],\n \"conciliation\": [\n \"Coordonner l99 et evolution si la correction du parsing ou de la syntaxe affecte les mêmes composants système\",\n \"Vérifier si le scanner peut continuer malgré la panne de MiroFish ; sinon, rediriger temporairement vers une tâche autonome\"\n ]\n}"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 06:30",
|
||||
"timestamp": "2026-04-22 12:30",
|
||||
"squad": "innovation",
|
||||
"agents": {
|
||||
"evolution": {
|
||||
@@ -26,5 +26,5 @@
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"Agent PHP syntax error (blocking 'evolution') could impact code generation needed by other agents\",\n \"MiroFish DOWN affects collaborative tools access, potentially blocking coordination (mirofish vs all)\"\n ],\n \"common_issues\": [\n \"Service stability issues (gitleaks+trivy version mismatch, MiroFish down)\",\n \"Incomplete functional coverage (dark tests, missing skill\/route tracking)\"\n ],\n \"priority_actions\": [\n \"Fix MiroFish service outage to restore collaboration capabilities\",\n \"Resolve gitleaks+trivy version mismatch to unblock l99 dark test parsing\",\n \"Fix Agent PHP syntax to enable evolution module to generate proposals\"\n ],\n \"conciliation\": [\n \"Align l99 and evolution on shared dependency versions to prevent future mismatches\",\n \"Coordinate scanner's 2h cycle with evolution's proposal timeline to ensure updated data is used\"\n ]\n}\n```"
|
||||
"ai_analysis": "{\n \"conflicts\": [\n \"Agent PHP syntax to fix (blocker pour evolution) pourrait impacter la génération des routes\/skills nécessaires à d'autres agents\",\n \"MiroFish DOWN (mirofish) peut bloquer les agents dépendants d'outils collaboratifs, potentiellement scanner ou coordination interne\"\n ],\n \"common_issues\": [\n \"Problèmes liés à des dépendances techniques externes (versions gitleaks+trivy, syntaxe PHP, service down)\",\n \"Indicateurs de progression partiellement inconnus (?) chez evolution et mirofish, réduisant la visibilité\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer evolution\",\n \"Restaurer le service MiroFish (urgence opérationnelle)\",\n \"Résoudre le mismatch de format de version entre gitleaks et trivy pour l'agent l99\"\n ],\n \"conciliation\": [\n \"Coordonner l99 et evolution si la correction du parsing ou de la syntaxe affecte les mêmes composants système\",\n \"Vérifier si le scanner peut continuer malgré la panne de MiroFish ; sinon, rediriger temporairement vers une tâche autonome\"\n ]\n}"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-22T09:00:01+00:00",
|
||||
"ts": "2026-04-22T23:20:01+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
|
||||
307
api/nl-audit-handler.php
Normal file
307
api/nl-audit-handler.php
Normal file
@@ -0,0 +1,307 @@
|
||||
<?php
|
||||
/* ═══════════════════════════════════════════════════════════════════
|
||||
NL AUDIT HANDLER - PHASE 1
|
||||
5 sous-handlers réels pour répondre aux questions NL ouvertes
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
Questions type couvertes:
|
||||
1. "baseline / invariants / derniers commits / tags / waves"
|
||||
2. "KPI source / weval-technology-platform / coverage / agents / hcps"
|
||||
3. "doublons / hubs / dashboards chevauchement / référentiel"
|
||||
4. "orphelines / pages non liées / API sans caller"
|
||||
5. "auto-wire / intents auto-créés / autonomie"
|
||||
6. "tips / selenium / tokens / recovery / cookies"
|
||||
═══════════════════════════════════════════════════════════════════ */
|
||||
|
||||
set_time_limit(22);
|
||||
ini_set("max_execution_time", 22);
|
||||
|
||||
function nl_audit_route($msg) {
|
||||
$lo = mb_strtolower($msg);
|
||||
|
||||
// Keyword routing
|
||||
$m_baseline = preg_match('/baseline|invariant|derniers?\s+commits?|derniers?\s+tags?|waves?\s+\d|wave-?\d/', $lo);
|
||||
$m_kpi = preg_match('/kpi|weval-?technology|wtp|coverage|source|hcps|agents\s|sovereign|intents\s|skills|tools|doctrines|rag|couverage|chiffres?/', $lo);
|
||||
$m_dbl = preg_match('/doublons?|chevauch|hubs?|dashboards?|refer?entiel|unique|ecrans?|consolid/', $lo);
|
||||
$m_orph = preg_match('/orphelin|non\s+li[ée]|sans\s+caller|perdu|isol[ée]|sans\s+lien/', $lo);
|
||||
$m_auto = preg_match('/auto-?wire|autonomie|auto-?creer?|auto-?train|autotrain|self-?wire|auto-?cree|creer\s+intent/', $lo);
|
||||
$m_tips = preg_match('/tips?\s|selenium|recovery|rotation|cookies?|token(?!_)|mythos|deepseek|thuggie|gemini|qwen|claude\.ai|bypass|cracker?/', $lo);
|
||||
|
||||
$results = [];
|
||||
|
||||
if ($m_baseline) $results[] = handler_baseline();
|
||||
if ($m_kpi) $results[] = handler_kpi_source();
|
||||
if ($m_dbl) $results[] = handler_dashboards_overlap();
|
||||
if ($m_orph) $results[] = handler_orphan_pages();
|
||||
if ($m_auto) $results[] = handler_autowire_capabilities();
|
||||
if ($m_tips) $results[] = handler_tips_library();
|
||||
|
||||
if (empty($results)) {
|
||||
// Fallback: full audit
|
||||
$results = [handler_baseline(), handler_kpi_source()];
|
||||
}
|
||||
|
||||
return implode("\n\n═══════════════════════════════════════════════\n\n", $results);
|
||||
}
|
||||
|
||||
// ═══════════════ Sous-handlers ═══════════════
|
||||
|
||||
function handler_baseline() {
|
||||
$out = "=== BASELINE INVARIANTS ===\n";
|
||||
// NR
|
||||
$nr = @json_decode(@file_get_contents("http://127.0.0.1/api/nonreg-api.php?cat=summary"), true);
|
||||
if ($nr) $out .= sprintf("NonReg : %d/%d (ts %s)\n", $nr['pass'] ?? 0, $nr['total'] ?? 0, $nr['ts'] ?? '?');
|
||||
// L99
|
||||
$l99 = @json_decode(@shell_exec("curl -sk -m 3 http://127.0.0.1/api/l99-api.php?action=stats 2>/dev/null"), true);
|
||||
if ($l99 && isset($l99['passed'])) $out .= sprintf("L99 : %d/%d\n", $l99['passed'], $l99['total']);
|
||||
// Commits récents
|
||||
$commits = trim(@shell_exec("cd /var/www/html && git log --oneline -10 2>&1"));
|
||||
$out .= "\n-- 10 derniers commits --\n" . $commits;
|
||||
// Tags récents
|
||||
$tags = trim(@shell_exec("cd /var/www/html && git tag --sort=-creatordate 2>&1 | head -10"));
|
||||
$out .= "\n\n-- 10 derniers tags --\n" . $tags;
|
||||
// Wave-267→270 + Doctrine 133/134
|
||||
$doctrines = [];
|
||||
foreach (["133","134"] as $n) {
|
||||
$p = "/opt/wevads/vault/doctrine-{$n}-*.md";
|
||||
$f = glob($p);
|
||||
$doctrines[] = "doctrine-$n: " . (empty($f) ? "MISSING" : basename($f[0]));
|
||||
}
|
||||
$out .= "\n\n-- Doctrines récentes --\n" . implode("\n", $doctrines);
|
||||
return $out;
|
||||
}
|
||||
|
||||
function handler_kpi_source() {
|
||||
$out = "=== KPI SOURCES - REFERENTIEL UNIQUE ===
|
||||
";
|
||||
$out .= "Source UNIQUE: /api/source-of-truth.json (rebuild cron 10min - doctrine 136)
|
||||
";
|
||||
$out .= "Full registry: /api/wevia-truth-registry.json (1.78MB detail)
|
||||
";
|
||||
$out .= "Aggregator KPI: /api/wtp-kpi-global-v2.php (cache 30s)
|
||||
|
||||
";
|
||||
|
||||
// Source primary: source-of-truth.json (fresh, rebuilt every 10min)
|
||||
$sot = @json_decode(@file_get_contents("/var/www/html/api/source-of-truth.json"), true);
|
||||
if ($sot) {
|
||||
$age = time() - filemtime("/var/www/html/api/source-of-truth.json");
|
||||
$out .= sprintf("-- source-of-truth.json (age %ds) --
|
||||
", $age);
|
||||
foreach (["agents_count","skills_count","intents_count","brains_count","doctrines_count","dashboards_count","providers_count","ethica_total","docker_running","nonreg_score","autonomy_score","autonomy_level"] as $k) {
|
||||
if (isset($sot[$k])) $out .= sprintf(" %-20s: %s
|
||||
", $k, $sot[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
// Complement: wtp-kpi-global-v2
|
||||
$agg = @json_decode(@file_get_contents("http://127.0.0.1/api/wtp-kpi-global-v2.php"), true);
|
||||
if ($agg && isset($agg["synthesis"])) {
|
||||
$out .= "
|
||||
-- wtp-kpi-global-v2.php synthesis --
|
||||
";
|
||||
foreach ($agg["synthesis"] as $k => $v) {
|
||||
$out .= sprintf(" %-25s: %s
|
||||
", $k, $v === null ? "null" : $v);
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
function handler_dashboards_overlap() {
|
||||
$out = "=== DASHBOARDS / HUBS OVERLAP ===\n";
|
||||
$hubs = [
|
||||
'weval-technology-platform.html' => 'WTP — ERP portal',
|
||||
'all-ia-hub.html' => 'All IA Hub',
|
||||
'wevia-master.html' => 'WEVIA Master chat',
|
||||
'wevia-orchestrator.html' => 'Arena Orchestrator',
|
||||
'ops-center.html' => 'Ops Center',
|
||||
'architecture.html' => 'Architecture',
|
||||
'agents-archi.html' => 'Agents archi 3D',
|
||||
];
|
||||
foreach ($hubs as $file => $desc) {
|
||||
$path = "/var/www/html/$file";
|
||||
if (!file_exists($path)) {
|
||||
$out .= sprintf(" [MISSING] %-40s %s\n", $file, $desc);
|
||||
continue;
|
||||
}
|
||||
$sz = round(filesize($path)/1024);
|
||||
// Count KPI fetches in each
|
||||
$c = @file_get_contents($path);
|
||||
$n_fetch = preg_match_all('/fetch\s*\(\s*[\'"][^\'"]*\/api\//', $c);
|
||||
$n_api = preg_match_all('/\/api\/[a-z0-9_\-]+\.(?:php|json)/i', $c);
|
||||
$out .= sprintf(" %-40s %3dKB · %d fetch · %d api refs · %s\n", $file, $sz, $n_fetch, $n_api, $desc);
|
||||
}
|
||||
// Source unique reco
|
||||
$out .= "\n-- Source unique KPI existante --\n";
|
||||
$out .= " /api/wtp-kpi-global-v2.php (cache 30s, 12 KPI agrégés)\n";
|
||||
$out .= " → Recommandation: TOUS les hubs consomment cette API\n";
|
||||
return $out;
|
||||
}
|
||||
|
||||
function handler_orphan_pages() {
|
||||
$out = "=== PAGES ORPHELINES (detection exhaustive) ===
|
||||
";
|
||||
$html_dir = "/var/www/html";
|
||||
$all = glob("$html_dir/*.html");
|
||||
$total = count($all);
|
||||
|
||||
// Scanner hubs principaux
|
||||
$hubs = ["weval-technology-platform.html","all-ia-hub.html","wevia-master.html",
|
||||
"wevia-orchestrator.html","ops-center.html","architecture.html",
|
||||
"agents-archi.html","index.html","login.html","register.html","404.html",
|
||||
"dashboards-index.html","wiki.html","wevia.html"];
|
||||
|
||||
// Scan TOUS les .html comme referenceurs (pas juste hubs)
|
||||
$linked = [];
|
||||
foreach ($all as $p) {
|
||||
$c = @file_get_contents($p);
|
||||
if (!$c) continue;
|
||||
// Pattern exhaustif: href, src, window.open, location.href, string "/foo.html"
|
||||
$patterns = [
|
||||
'/(?:href|src|action)=["\']([^"\']+\.html)["\']/i',
|
||||
'/window\.(?:open|location\.href)\s*=\s*["\']([^"\']+\.html)/',
|
||||
'/location\.(?:href|replace|assign)\s*\(\s*["\']([^"\']+\.html)/',
|
||||
'/navigateTo\(["\']([^"\']+\.html)/',
|
||||
'/["\'](\/[a-z0-9_\-]+\.html)["\']/i',
|
||||
];
|
||||
foreach ($patterns as $pat) {
|
||||
if (preg_match_all($pat, $c, $mm)) {
|
||||
foreach ($mm[1] as $target) {
|
||||
$target = ltrim($target, "/");
|
||||
$target = explode("?", explode("#", $target)[0])[0];
|
||||
$linked[$target] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$orphans = [];
|
||||
foreach ($all as $p) {
|
||||
$name = basename($p);
|
||||
if (in_array($name, $hubs)) continue;
|
||||
if (isset($linked[$name])) continue;
|
||||
$orphans[] = [
|
||||
"name" => $name,
|
||||
"size_kb" => round(filesize($p)/1024, 1),
|
||||
"age_days" => intval((time() - filemtime($p))/86400),
|
||||
];
|
||||
}
|
||||
usort($orphans, fn($a,$b) => $b["size_kb"] - $a["size_kb"]);
|
||||
|
||||
$out .= sprintf("Total .html scannes: %d
|
||||
", $total);
|
||||
$out .= sprintf("Linked (refs JS + HTML): %d
|
||||
", count($linked));
|
||||
$out .= sprintf("Orphelines VRAIES (zero ref nulle part): %d
|
||||
|
||||
", count($orphans));
|
||||
if (count($orphans) === 0) {
|
||||
$out .= "Aucune orpheline detectee. Architecture totalement reliee.
|
||||
";
|
||||
} else {
|
||||
$out .= "-- Liste detail --
|
||||
";
|
||||
foreach ($orphans as $o) {
|
||||
$out .= sprintf(" %-60s %6.1fKB %3dj
|
||||
", $o["name"], $o["size_kb"], $o["age_days"]);
|
||||
}
|
||||
$out .= "
|
||||
-- Action PHASE 3A --
|
||||
";
|
||||
$out .= " Ces pages ne sont linkees de nulle part. Choix:
|
||||
";
|
||||
$out .= " 1. Relier dans un hub (si utile)
|
||||
";
|
||||
$out .= " 2. Documenter en intent explicite (chat-v2 peut y renvoyer)
|
||||
";
|
||||
$out .= " 3. Supprimer apres GOLD + validation Yacine (ZERO suppression sans accord)
|
||||
";
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
function handler_autowire_capabilities() {
|
||||
$out = "=== AUTO-WIRE CAPABILITIES ===\n";
|
||||
// Opus-intents file analysis
|
||||
$opus_file = "/var/www/html/api/opus-intents.php";
|
||||
if (file_exists($opus_file)) {
|
||||
$c = file_get_contents($opus_file);
|
||||
$n_intents = preg_match_all('/^\s*(?:case\s+["\']|if\s*\(.*preg_match|elseif\s*\(.*preg_match|\$map\[.*=>)/m', $c);
|
||||
$out .= sprintf("opus-intents.php : %d KB, ~%d intents detected\n", round(strlen($c)/1024), $n_intents);
|
||||
}
|
||||
// Priority NL intents
|
||||
$pri = @json_decode(@file_get_contents("/opt/wevia-brain/priority-intents-nl.json"), true);
|
||||
$out .= sprintf("priority-intents-nl.json : %d intents\n", is_array($pri) ? count($pri) : 0);
|
||||
// Fast-path
|
||||
$fp = "/var/www/weval/wevia-ia/wevia-fast-path-v3.php";
|
||||
if (file_exists($fp)) {
|
||||
$c = @file_get_contents($fp);
|
||||
$n = preg_match_all('/preg_match|case\s+["\']/i', $c ?: '');
|
||||
$out .= sprintf("fast-path-v3.php : %d intents approx\n", $n);
|
||||
}
|
||||
// Opus46 intents
|
||||
$o46 = glob("/var/www/html/api/wevia-opus46-intents.php")[0] ?? null;
|
||||
if ($o46) {
|
||||
$c = file_get_contents($o46);
|
||||
$n = preg_match_all('/^\s*(?:if|elseif)\s*\(.*preg_match/m', $c);
|
||||
$out .= sprintf("opus46-intents.php : %d intents EXEC\n", $n);
|
||||
}
|
||||
// Auto-wired 30 days: git log filter
|
||||
$auto_commits = trim(@shell_exec("cd /var/www/html && git log --since='30 days ago' --grep='intent\\|autowire\\|auto-wire' --oneline 2>&1 | wc -l"));
|
||||
$out .= sprintf("Commits auto-wire 30 derniers jours : %s\n", $auto_commits ?: '0');
|
||||
// Capabilities check
|
||||
$out .= "\n-- Capabilities check --\n";
|
||||
$out .= " [YES] Exécution shell: shell_exec disponible\n";
|
||||
$out .= " [YES] Git commit: sudo NOPASSWD OK\n";
|
||||
$out .= " [YES] PHP self-patch: sudo chattr +i/-i OK\n";
|
||||
$sel_exists = file_exists("/opt/weval-ops/selenium-runner.py") || file_exists("/home/claude/selenium-runner.py") ? "partial" : "MISSING";
|
||||
$out .= " [" . strtoupper($sel_exists) . "] Selenium Chrome: runner centralisé\n";
|
||||
$blade_log = glob("/var/log/blade-sentinel.log");
|
||||
$out .= " [" . (empty($blade_log) ? "MISSING" : "OK") . "] Blade Sentinel: log récent\n";
|
||||
$out .= "\n-- GAP d'autonomie (à combler PHASE 3) --\n";
|
||||
$out .= " * Pas d'intent 'auto_wire' capable de créer un nouvel intent depuis NL\n";
|
||||
$out .= " * Pas d'intent 'clone_github_tool' capable de cloner+adapter un tool OSS\n";
|
||||
$out .= " * Selenium Chrome runner centralisé absent → création compte via Blade impossible\n";
|
||||
return $out;
|
||||
}
|
||||
|
||||
function handler_tips_library() {
|
||||
$out = "=== TIPS LIBRARY INVENTORY ===\n";
|
||||
$cats = [
|
||||
"Selenium account creation" => "selenium",
|
||||
"Token renewal (GitHub/Gitea)" => "rotation.?token|github.?pat|gitea.?token",
|
||||
"Office recovery (Azure AD)" => "azure.?ad|tenant.*office",
|
||||
"IP rotation (CF/PMTA)" => "ip.?rotat|warmup.?ip",
|
||||
"DeepSeek web cookies" => "deepseek",
|
||||
"ThuggieGPT web" => "thuggie",
|
||||
"Claude.ai web cookies" => "claude.ai.*cook|claude.ai.*session",
|
||||
"Gemini web" => "gemini",
|
||||
"Qwen web" => "qwen",
|
||||
"Mythos / Opus 4.6 tips" => "mythos|opus.?4\\.6",
|
||||
];
|
||||
static $corpus = null;
|
||||
if ($corpus === null) {
|
||||
$files = [];
|
||||
foreach (["/opt/wevads/vault", "/var/www/html/wiki", "/opt/weval-ops/wiki"] as $d) {
|
||||
if (is_dir($d)) {
|
||||
$fs = @glob("$d/*.md") ?: [];
|
||||
$files = array_merge($files, array_slice($fs, 0, 200));
|
||||
}
|
||||
}
|
||||
$corpus = "";
|
||||
foreach ($files as $f) {
|
||||
$corpus .= "\n=== $f ===\n" . @file_get_contents($f);
|
||||
}
|
||||
$out .= "Corpus: " . count($files) . " .md files, " . round(strlen($corpus)/1024) . " KB scanned\n\n";
|
||||
}
|
||||
foreach ($cats as $label => $regex) {
|
||||
$n = @preg_match_all("/$regex/i", $corpus);
|
||||
$status = $n > 0 ? "[OK $n]" : "[MISS]";
|
||||
$out .= sprintf(" %-38s %s\n", $label, $status);
|
||||
}
|
||||
$out .= "\n-- Missing categories = PHASE 3B targets --\n";
|
||||
$out .= " * Pour chaque [MISS]: rediger doctrine dediee /opt/wevads/vault/\n";
|
||||
$out .= " * Creer intent execute_tip(<cat>) pilote Selenium via Blade\n";
|
||||
return $out;
|
||||
}
|
||||
|
||||
@@ -1,963 +0,0 @@
|
||||
{
|
||||
"report": {
|
||||
"total": 70,
|
||||
"wired": 70,
|
||||
"not_wired": 0,
|
||||
"with_readme": 34,
|
||||
"with_docker": 14,
|
||||
"scan_time": "2026-04-17T23:00:02.066687",
|
||||
"by_status": {
|
||||
"integrated": 70,
|
||||
"discovered": 0,
|
||||
"evaluated": 0
|
||||
}
|
||||
},
|
||||
"tools": {
|
||||
"weval-l99": {
|
||||
"name": "weval-l99",
|
||||
"path": "/opt/weval-l99",
|
||||
"files": 251,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.043253"
|
||||
},
|
||||
"wevia-brain": {
|
||||
"name": "wevia-brain",
|
||||
"path": "/opt/wevia-brain",
|
||||
"files": 156,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.061095"
|
||||
},
|
||||
"skills": {
|
||||
"name": "skills",
|
||||
"path": "/opt/skills",
|
||||
"files": 110,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.019720"
|
||||
},
|
||||
"everything-claude-code": {
|
||||
"name": "everything-claude-code",
|
||||
"path": "/opt/everything-claude-code",
|
||||
"files": 68,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Portugu\u00eas (Brasil)](docs/pt-BR/README.md) | [\u7b80\u4f53\u4e2d\u6587](README.zh-CN.md) | [\u7e41\u9ad4\u4e2d\u6587](docs/zh-TW/README.md) | [\u65e5\u672c\u8a9e](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-17T23:00:01.929193"
|
||||
},
|
||||
"open-webui-fresh": {
|
||||
"name": "open-webui-fresh",
|
||||
"path": "/opt/open-webui-fresh",
|
||||
"files": 57,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": true,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI \ud83d\udc4b   | [\u4e2d\u6587](README.zh.md) | [\u65e5\u672c\u8a9e](README.ja.md) | [Espa\u00f1ol](README.es.md) | [Ti\u1ebfng Vi\u1ec7t](README.vi.md) | [Portugu\u00eas](README.p",
|
||||
"discovered": "2026-04-17T23:00:01.984703"
|
||||
},
|
||||
"mxyhi_ok-skills": {
|
||||
"name": "mxyhi_ok-skills",
|
||||
"path": "/opt/mxyhi_ok-skills",
|
||||
"files": 44,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [\u7b80\u4f53\u4e2d\u6587](README.zh-CN.md) | [\u7e41\u9ad4\u4e2d\u6587](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-17T23:00:01.976634"
|
||||
},
|
||||
"SuperClaude_Framework": {
|
||||
"name": "SuperClaude_Framework",
|
||||
"path": "/opt/SuperClaude_Framework",
|
||||
"files": 42,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # \ud83d\ude80 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-17T23:00:01.871719"
|
||||
},
|
||||
"paperclip-weval": {
|
||||
"name": "paperclip-weval",
|
||||
"path": "/opt/paperclip-weval",
|
||||
"files": 42,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip \u2014 runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-17T23:00:01.996918"
|
||||
},
|
||||
"vllm": {
|
||||
"name": "vllm",
|
||||
"path": "/opt/vllm",
|
||||
"files": 41,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-17T23:00:02.032814"
|
||||
},
|
||||
"deer-flow": {
|
||||
"name": "deer-flow",
|
||||
"path": "/opt/deer-flow",
|
||||
"files": 38,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# \ud83e\udd8c DeerFlow - 2.0 English | [\u4e2d\u6587](./README_zh.md) | [\u65e5\u672c\u8a9e](./README_ja.md) | [Fran\u00e7ais](./README_fr.md) | [\u0420\u0443\u0441\u0441\u043a\u0438\u0439](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Fran\u00e7ais](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-17T23:00:01.855982"
|
||||
},
|
||||
"aios": {
|
||||
"name": "aios",
|
||||
"path": "/opt/aios",
|
||||
"files": 19,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-17T23:00:01.890547"
|
||||
},
|
||||
"weval-ops": {
|
||||
"name": "weval-ops",
|
||||
"path": "/opt/weval-ops",
|
||||
"files": 18,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.048953"
|
||||
},
|
||||
"awesome-claude-code-toolkit": {
|
||||
"name": "awesome-claude-code-toolkit",
|
||||
"path": "/opt/awesome-claude-code-toolkit",
|
||||
"files": 17,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Toolkit **The most comprehensive toolkit for Claude Code -- 135 agents, 35 curated skills (+400,000 via [SkillKit](https://agenstskills",
|
||||
"discovered": "2026-04-17T23:00:01.915360"
|
||||
},
|
||||
"mirofish": {
|
||||
"name": "mirofish",
|
||||
"path": "/opt/mirofish",
|
||||
"files": 17,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"./static/image/MiroFish_logo_compressed.jpeg\" alt=\"MiroFish Logo\" width=\"75%\"/> <a href=\"https://trendshift.io/reposi",
|
||||
"discovered": "2026-04-17T23:00:01.970971"
|
||||
},
|
||||
"claude-mem": {
|
||||
"name": "claude-mem",
|
||||
"path": "/opt/claude-mem",
|
||||
"files": 16,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# claude-code-auto-memory **Your CLAUDE.md, always in sync.** Minimal tokens. Zero config. Just works. A Claude Code plugin that watches what Claude",
|
||||
"discovered": "2026-04-17T23:00:01.918218"
|
||||
},
|
||||
"huggingface-skills": {
|
||||
"name": "huggingface-skills",
|
||||
"path": "/opt/huggingface-skills",
|
||||
"files": 15,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Hugging Face Skills Hugging Face Skills are definitions for AI/ML tasks like dataset creation, model training, and evaluation. They are interoperab",
|
||||
"discovered": "2026-04-17T23:00:01.934346"
|
||||
},
|
||||
"supermemory": {
|
||||
"name": "supermemory",
|
||||
"path": "/opt/supermemory",
|
||||
"files": 14,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <picture> <source srcset=\"apps/web/public/logo-fullmark.svg\" media=\"(prefers-color-scheme: dark)\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-17T23:00:02.025127"
|
||||
},
|
||||
"wevads": {
|
||||
"name": "wevads",
|
||||
"path": "/opt/wevads",
|
||||
"files": 14,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.037110"
|
||||
},
|
||||
"fmgapp": {
|
||||
"name": "fmgapp",
|
||||
"path": "/opt/fmgapp",
|
||||
"files": 13,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.932031"
|
||||
},
|
||||
"rnd-agents": {
|
||||
"name": "rnd-agents",
|
||||
"path": "/opt/rnd-agents",
|
||||
"files": 11,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **\u26a1 Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** \u2014 Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-17T23:00:02.008821"
|
||||
},
|
||||
"FrancyJGLisboa_agent-skill-creator": {
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
"path": "/opt/FrancyJGLisboa_agent-skill-creator",
|
||||
"files": 10,
|
||||
"has_readme": true,
|
||||
"has_skill": true,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools \u2014 no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-17T23:00:01.844795"
|
||||
},
|
||||
"obsidian-vault": {
|
||||
"name": "obsidian-vault",
|
||||
"path": "/opt/obsidian-vault",
|
||||
"files": 10,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.982468"
|
||||
},
|
||||
"skillsmith": {
|
||||
"name": "skillsmith",
|
||||
"path": "/opt/skillsmith",
|
||||
"files": 10,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-17T23:00:02.021300"
|
||||
},
|
||||
"awesome-agent-skills": {
|
||||
"name": "awesome-agent-skills",
|
||||
"path": "/opt/awesome-agent-skills",
|
||||
"files": 6,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-17T23:00:01.911694"
|
||||
},
|
||||
"paperclip-skills": {
|
||||
"name": "paperclip-skills",
|
||||
"path": "/opt/paperclip-skills",
|
||||
"files": 6,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.992421"
|
||||
},
|
||||
"jzOcb_writing-style-skill": {
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
"path": "/opt/jzOcb_writing-style-skill",
|
||||
"files": 4,
|
||||
"has_readme": true,
|
||||
"has_skill": true,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill \u53ef\u590d\u7528\u7684\u5199\u4f5c\u98ce\u683c Skill \u6a21\u677f\u3002**\u5185\u7f6e\u81ea\u52a8\u5b66\u4e60** \u2014 \u4ece\u4f60\u7684\u4fee\u6539\u4e2d\u81ea\u52a8\u63d0\u53d6\u89c4\u5219\uff0cSKILL.md \u8d8a\u7528\u8d8a\u51c6\u3002 \u517c\u5bb9 **Claude Code** + **OpenClaw (ClawHub)**\u3002 ## \u539f\u7406 ``` AI \u7528 SKILL",
|
||||
"discovered": "2026-04-17T23:00:01.936745"
|
||||
},
|
||||
"qdrant-data": {
|
||||
"name": "qdrant-data",
|
||||
"path": "/opt/qdrant-data",
|
||||
"files": 4,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.004828"
|
||||
},
|
||||
"wazuh": {
|
||||
"name": "wazuh",
|
||||
"path": "/opt/wazuh",
|
||||
"files": 4,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.034777"
|
||||
},
|
||||
"plausible": {
|
||||
"name": "plausible",
|
||||
"path": "/opt/plausible",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.998856"
|
||||
},
|
||||
"pmta": {
|
||||
"name": "pmta",
|
||||
"path": "/opt/pmta",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.000892"
|
||||
},
|
||||
"render-configs": {
|
||||
"name": "render-configs",
|
||||
"path": "/opt/render-configs",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.006774"
|
||||
},
|
||||
"searxng": {
|
||||
"name": "searxng",
|
||||
"path": "/opt/searxng",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.017567"
|
||||
},
|
||||
"weval-guardian": {
|
||||
"name": "weval-guardian",
|
||||
"path": "/opt/weval-guardian",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.040900"
|
||||
},
|
||||
"weval-litellm": {
|
||||
"name": "weval-litellm",
|
||||
"path": "/opt/weval-litellm",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.045117"
|
||||
},
|
||||
"weval-security": {
|
||||
"name": "weval-security",
|
||||
"path": "/opt/weval-security",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.056781"
|
||||
},
|
||||
"keyhacks": {
|
||||
"name": "keyhacks",
|
||||
"path": "/opt/keyhacks",
|
||||
"files": 2,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"https://user-images.githubusercontent.com/18099289/56750563-558a9400-6784-11e9-8175-ee2a19ee9d75.png\" width=\"300px\"> </",
|
||||
"discovered": "2026-04-17T23:00:01.942631"
|
||||
},
|
||||
"loki": {
|
||||
"name": "loki",
|
||||
"path": "/opt/loki",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.965131"
|
||||
},
|
||||
"ruflo": {
|
||||
"name": "ruflo",
|
||||
"path": "/opt/ruflo",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.015452"
|
||||
},
|
||||
"twenty": {
|
||||
"name": "twenty",
|
||||
"path": "/opt/twenty",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.028796"
|
||||
},
|
||||
"weval-crewai": {
|
||||
"name": "weval-crewai",
|
||||
"path": "/opt/weval-crewai",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.039016"
|
||||
},
|
||||
"weval-plugins": {
|
||||
"name": "weval-plugins",
|
||||
"path": "/opt/weval-plugins",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.050875"
|
||||
},
|
||||
"weval-radar": {
|
||||
"name": "weval-radar",
|
||||
"path": "/opt/weval-radar",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.052813"
|
||||
},
|
||||
"weval-scrapy": {
|
||||
"name": "weval-scrapy",
|
||||
"path": "/opt/weval-scrapy",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.054768"
|
||||
},
|
||||
"langfuse": {
|
||||
"name": "langfuse",
|
||||
"path": "/opt/langfuse",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.944789"
|
||||
},
|
||||
"litellm": {
|
||||
"name": "litellm",
|
||||
"path": "/opt/litellm",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.961058"
|
||||
},
|
||||
"mattermost-docker": {
|
||||
"name": "mattermost-docker",
|
||||
"path": "/opt/mattermost-docker",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.967076"
|
||||
},
|
||||
"prometheus": {
|
||||
"name": "prometheus",
|
||||
"path": "/opt/prometheus",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.002859"
|
||||
},
|
||||
"twenty-compose": {
|
||||
"name": "twenty-compose",
|
||||
"path": "/opt/twenty-compose",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.031019"
|
||||
},
|
||||
"weval-ux": {
|
||||
"name": "weval-ux",
|
||||
"path": "/opt/weval-ux",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.058694"
|
||||
},
|
||||
"DiffusionDB": {
|
||||
"name": "DiffusionDB",
|
||||
"path": "/opt/DiffusionDB",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.839504"
|
||||
},
|
||||
"LTX-Video": {
|
||||
"name": "LTX-Video",
|
||||
"path": "/opt/LTX-Video",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.867642"
|
||||
},
|
||||
"localai": {
|
||||
"name": "localai",
|
||||
"path": "/opt/localai",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:01.963095"
|
||||
},
|
||||
"wevia-finetune": {
|
||||
"name": "wevia-finetune",
|
||||
"path": "/opt/wevia-finetune",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-17T23:00:02.062978"
|
||||
}
|
||||
},
|
||||
"skills": {
|
||||
"total": 6178,
|
||||
"injected": 694
|
||||
},
|
||||
"trending": [
|
||||
{
|
||||
"name": "weval-l99"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain"
|
||||
},
|
||||
{
|
||||
"name": "skills"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh"
|
||||
},
|
||||
{
|
||||
"name": "activepieces"
|
||||
},
|
||||
{
|
||||
"name": "oh-my-claudecode"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-weval"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,976 +0,0 @@
|
||||
{
|
||||
"report": {
|
||||
"total": 71,
|
||||
"wired": 71,
|
||||
"not_wired": 0,
|
||||
"with_readme": 35,
|
||||
"with_docker": 14,
|
||||
"scan_time": "2026-04-18T13:00:02.985638",
|
||||
"by_status": {
|
||||
"integrated": 71,
|
||||
"discovered": 0,
|
||||
"evaluated": 0
|
||||
}
|
||||
},
|
||||
"tools": {
|
||||
"weval-l99": {
|
||||
"name": "weval-l99",
|
||||
"path": "/opt/weval-l99",
|
||||
"files": 256,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.801785"
|
||||
},
|
||||
"wevia-brain": {
|
||||
"name": "wevia-brain",
|
||||
"path": "/opt/wevia-brain",
|
||||
"files": 156,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.944143"
|
||||
},
|
||||
"skills": {
|
||||
"name": "skills",
|
||||
"path": "/opt/skills",
|
||||
"files": 110,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.592806"
|
||||
},
|
||||
"everything-claude-code": {
|
||||
"name": "everything-claude-code",
|
||||
"path": "/opt/everything-claude-code",
|
||||
"files": 68,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Portugu\u00eas (Brasil)](docs/pt-BR/README.md) | [\u7b80\u4f53\u4e2d\u6587](README.zh-CN.md) | [\u7e41\u9ad4\u4e2d\u6587](docs/zh-TW/README.md) | [\u65e5\u672c\u8a9e](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-18T13:00:02.346891"
|
||||
},
|
||||
"open-webui-fresh": {
|
||||
"name": "open-webui-fresh",
|
||||
"path": "/opt/open-webui-fresh",
|
||||
"files": 57,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": true,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI \ud83d\udc4b   | [\u4e2d\u6587](README.zh.md) | [\u65e5\u672c\u8a9e](README.ja.md) | [Espa\u00f1ol](README.es.md) | [Ti\u1ebfng Vi\u1ec7t](README.vi.md) | [Portugu\u00eas](README.p",
|
||||
"discovered": "2026-04-18T13:00:02.425060"
|
||||
},
|
||||
"mxyhi_ok-skills": {
|
||||
"name": "mxyhi_ok-skills",
|
||||
"path": "/opt/mxyhi_ok-skills",
|
||||
"files": 44,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [\u7b80\u4f53\u4e2d\u6587](README.zh-CN.md) | [\u7e41\u9ad4\u4e2d\u6587](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-18T13:00:02.418951"
|
||||
},
|
||||
"SuperClaude_Framework": {
|
||||
"name": "SuperClaude_Framework",
|
||||
"path": "/opt/SuperClaude_Framework",
|
||||
"files": 42,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # \ud83d\ude80 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-18T13:00:02.051158"
|
||||
},
|
||||
"paperclip-weval": {
|
||||
"name": "paperclip-weval",
|
||||
"path": "/opt/paperclip-weval",
|
||||
"files": 42,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip \u2014 runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-18T13:00:02.432547"
|
||||
},
|
||||
"vllm": {
|
||||
"name": "vllm",
|
||||
"path": "/opt/vllm",
|
||||
"files": 41,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-18T13:00:02.728709"
|
||||
},
|
||||
"deer-flow": {
|
||||
"name": "deer-flow",
|
||||
"path": "/opt/deer-flow",
|
||||
"files": 38,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# \ud83e\udd8c DeerFlow - 2.0 English | [\u4e2d\u6587](./README_zh.md) | [\u65e5\u672c\u8a9e](./README_ja.md) | [Fran\u00e7ais](./README_fr.md) | [\u0420\u0443\u0441\u0441\u043a\u0438\u0439](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Fran\u00e7ais](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-18T13:00:01.984918"
|
||||
},
|
||||
"aios": {
|
||||
"name": "aios",
|
||||
"path": "/opt/aios",
|
||||
"files": 19,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-18T13:00:02.135916"
|
||||
},
|
||||
"rnd-agent-framework": {
|
||||
"name": "rnd-agent-framework",
|
||||
"path": "/opt/rnd-agent-framework",
|
||||
"files": 19,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": " # Welcome to Microsoft Agent Framework! [\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-18T13:00:02.636408"
|
||||
},
|
||||
"wevads": {
|
||||
"name": "wevads",
|
||||
"path": "/opt/wevads",
|
||||
"files": 14,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.760720"
|
||||
},
|
||||
"fmgapp": {
|
||||
"name": "fmgapp",
|
||||
"path": "/opt/fmgapp",
|
||||
"files": 13,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.360862"
|
||||
},
|
||||
"obsidian-vault": {
|
||||
"name": "obsidian-vault",
|
||||
"path": "/opt/obsidian-vault",
|
||||
"files": 11,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.422707"
|
||||
},
|
||||
"rnd-agents": {
|
||||
"name": "rnd-agents",
|
||||
"path": "/opt/rnd-agents",
|
||||
"files": 11,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **\u26a1 Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** \u2014 Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-18T13:00:02.498690"
|
||||
},
|
||||
"FrancyJGLisboa_agent-skill-creator": {
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
"path": "/opt/FrancyJGLisboa_agent-skill-creator",
|
||||
"files": 10,
|
||||
"has_readme": true,
|
||||
"has_skill": true,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools \u2014 no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-18T13:00:01.968741"
|
||||
},
|
||||
"skillsmith": {
|
||||
"name": "skillsmith",
|
||||
"path": "/opt/skillsmith",
|
||||
"files": 10,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": true,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-18T13:00:02.595068"
|
||||
},
|
||||
"awesome-agent-skills": {
|
||||
"name": "awesome-agent-skills",
|
||||
"path": "/opt/awesome-agent-skills",
|
||||
"files": 6,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-18T13:00:02.234908"
|
||||
},
|
||||
"paperclip-skills": {
|
||||
"name": "paperclip-skills",
|
||||
"path": "/opt/paperclip-skills",
|
||||
"files": 6,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.430327"
|
||||
},
|
||||
"jzOcb_writing-style-skill": {
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
"path": "/opt/jzOcb_writing-style-skill",
|
||||
"files": 4,
|
||||
"has_readme": true,
|
||||
"has_skill": true,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill \u53ef\u590d\u7528\u7684\u5199\u4f5c\u98ce\u683c Skill \u6a21\u677f\u3002**\u5185\u7f6e\u81ea\u52a8\u5b66\u4e60** \u2014 \u4ece\u4f60\u7684\u4fee\u6539\u4e2d\u81ea\u52a8\u63d0\u53d6\u89c4\u5219\uff0cSKILL.md \u8d8a\u7528\u8d8a\u51c6\u3002 \u517c\u5bb9 **Claude Code** + **OpenClaw (ClawHub)**\u3002 ## \u539f\u7406 ``` AI \u7528 SKILL",
|
||||
"discovered": "2026-04-18T13:00:02.386713"
|
||||
},
|
||||
"qdrant-data": {
|
||||
"name": "qdrant-data",
|
||||
"path": "/opt/qdrant-data",
|
||||
"files": 4,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.446274"
|
||||
},
|
||||
"wazuh": {
|
||||
"name": "wazuh",
|
||||
"path": "/opt/wazuh",
|
||||
"files": 4,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.736784"
|
||||
},
|
||||
"plausible": {
|
||||
"name": "plausible",
|
||||
"path": "/opt/plausible",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.434652"
|
||||
},
|
||||
"pmta": {
|
||||
"name": "pmta",
|
||||
"path": "/opt/pmta",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.439649"
|
||||
},
|
||||
"render-configs": {
|
||||
"name": "render-configs",
|
||||
"path": "/opt/render-configs",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.453871"
|
||||
},
|
||||
"searxng": {
|
||||
"name": "searxng",
|
||||
"path": "/opt/searxng",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.582624"
|
||||
},
|
||||
"weval-guardian": {
|
||||
"name": "weval-guardian",
|
||||
"path": "/opt/weval-guardian",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.791675"
|
||||
},
|
||||
"weval-litellm": {
|
||||
"name": "weval-litellm",
|
||||
"path": "/opt/weval-litellm",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.820252"
|
||||
},
|
||||
"weval-security": {
|
||||
"name": "weval-security",
|
||||
"path": "/opt/weval-security",
|
||||
"files": 3,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.921004"
|
||||
},
|
||||
"keyhacks": {
|
||||
"name": "keyhacks",
|
||||
"path": "/opt/keyhacks",
|
||||
"files": 2,
|
||||
"has_readme": true,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"https://user-images.githubusercontent.com/18099289/56750563-558a9400-6784-11e9-8175-ee2a19ee9d75.png\" width=\"300px\"> </",
|
||||
"discovered": "2026-04-18T13:00:02.389504"
|
||||
},
|
||||
"loki": {
|
||||
"name": "loki",
|
||||
"path": "/opt/loki",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.402761"
|
||||
},
|
||||
"ruflo": {
|
||||
"name": "ruflo",
|
||||
"path": "/opt/ruflo",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.567373"
|
||||
},
|
||||
"twenty": {
|
||||
"name": "twenty",
|
||||
"path": "/opt/twenty",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.681486"
|
||||
},
|
||||
"weval-crewai": {
|
||||
"name": "weval-crewai",
|
||||
"path": "/opt/weval-crewai",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.780470"
|
||||
},
|
||||
"weval-plugins": {
|
||||
"name": "weval-plugins",
|
||||
"path": "/opt/weval-plugins",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.855431"
|
||||
},
|
||||
"weval-radar": {
|
||||
"name": "weval-radar",
|
||||
"path": "/opt/weval-radar",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.887524"
|
||||
},
|
||||
"weval-scrapy": {
|
||||
"name": "weval-scrapy",
|
||||
"path": "/opt/weval-scrapy",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.898895"
|
||||
},
|
||||
"langfuse": {
|
||||
"name": "langfuse",
|
||||
"path": "/opt/langfuse",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.391474"
|
||||
},
|
||||
"litellm": {
|
||||
"name": "litellm",
|
||||
"path": "/opt/litellm",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.398461"
|
||||
},
|
||||
"mattermost-docker": {
|
||||
"name": "mattermost-docker",
|
||||
"path": "/opt/mattermost-docker",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.404877"
|
||||
},
|
||||
"prometheus": {
|
||||
"name": "prometheus",
|
||||
"path": "/opt/prometheus",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.442085"
|
||||
},
|
||||
"twenty-compose": {
|
||||
"name": "twenty-compose",
|
||||
"path": "/opt/twenty-compose",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.699280"
|
||||
},
|
||||
"weval-ux": {
|
||||
"name": "weval-ux",
|
||||
"path": "/opt/weval-ux",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.936032"
|
||||
},
|
||||
"DiffusionDB": {
|
||||
"name": "DiffusionDB",
|
||||
"path": "/opt/DiffusionDB",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:01.953062"
|
||||
},
|
||||
"LTX-Video": {
|
||||
"name": "LTX-Video",
|
||||
"path": "/opt/LTX-Video",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.012614"
|
||||
},
|
||||
"localai": {
|
||||
"name": "localai",
|
||||
"path": "/opt/localai",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.400663"
|
||||
},
|
||||
"wevia-finetune": {
|
||||
"name": "wevia-finetune",
|
||||
"path": "/opt/wevia-finetune",
|
||||
"files": 0,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-18T13:00:02.960591"
|
||||
}
|
||||
},
|
||||
"skills": {
|
||||
"total": 6178,
|
||||
"injected": 694
|
||||
},
|
||||
"trending": [
|
||||
{
|
||||
"name": "weval-l99"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain"
|
||||
},
|
||||
{
|
||||
"name": "skills"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh"
|
||||
},
|
||||
{
|
||||
"name": "activepieces"
|
||||
},
|
||||
{
|
||||
"name": "weval-nonreg"
|
||||
},
|
||||
{
|
||||
"name": "oh-my-claudecode"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -10,12 +10,12 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.405306"
|
||||
"discovered": "2026-04-22T21:00:05.661916"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
"path": "/opt/wevia-brain",
|
||||
"files": 168,
|
||||
"files": 169,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.423221"
|
||||
"discovered": "2026-04-22T21:00:05.859434"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.348568"
|
||||
"discovered": "2026-04-22T21:00:05.468951"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code",
|
||||
@@ -49,7 +49,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-22T11:00:02.186581"
|
||||
"discovered": "2026-04-22T21:00:04.810159"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh",
|
||||
@@ -62,7 +62,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI 👋   | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
|
||||
"discovered": "2026-04-22T11:00:02.219735"
|
||||
"discovered": "2026-04-22T21:00:05.213085"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills",
|
||||
@@ -114,7 +114,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-22T11:00:02.215373"
|
||||
"discovered": "2026-04-22T21:00:05.184543"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework",
|
||||
@@ -127,7 +127,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-22T11:00:01.958048"
|
||||
"discovered": "2026-04-22T21:00:04.171314"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-weval",
|
||||
@@ -140,7 +140,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-22T11:00:02.227914"
|
||||
"discovered": "2026-04-22T21:00:05.312585"
|
||||
},
|
||||
{
|
||||
"name": "vllm",
|
||||
@@ -153,7 +153,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-22T11:00:02.376553"
|
||||
"discovered": "2026-04-22T21:00:05.575289"
|
||||
},
|
||||
{
|
||||
"name": "deer-flow",
|
||||
@@ -166,7 +166,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-22T11:00:01.936304"
|
||||
"discovered": "2026-04-22T21:00:04.047690"
|
||||
},
|
||||
{
|
||||
"name": "aios",
|
||||
@@ -374,7 +374,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-22T11:00:02.011046"
|
||||
"discovered": "2026-04-22T21:00:04.374702"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agent-framework",
|
||||
@@ -387,7 +387,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": " # Welcome to Microsoft Agent Framework! [\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-22T11:00:02.368122"
|
||||
"discovered": "2026-04-22T21:00:05.503522"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.188792"
|
||||
"discovered": "2026-04-22T21:00:04.831207"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.217445"
|
||||
"discovered": "2026-04-22T21:00:05.196802"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agents",
|
||||
@@ -504,7 +504,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-22T11:00:02.249188"
|
||||
"discovered": "2026-04-22T21:00:05.417028"
|
||||
},
|
||||
{
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
@@ -517,7 +517,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-22T11:00:01.842178"
|
||||
"discovered": "2026-04-22T21:00:04.016152"
|
||||
},
|
||||
{
|
||||
"name": "oss",
|
||||
@@ -530,7 +530,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# WEVAL OSS Registry · /opt/oss/ Wave 222 · 2026-04-21 ## Purpose Register the OSS tools identified by AI capability gap audit (wave 220 ai-gap-cach",
|
||||
"discovered": "2026-04-22T11:00:02.224009"
|
||||
"discovered": "2026-04-22T21:00:05.271879"
|
||||
},
|
||||
{
|
||||
"name": "scripts",
|
||||
@@ -543,7 +543,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Token Rotation Scripts · Opus Session 21-avr v7 ## État - 5 scripts provider skeleton (groq, github, sambanova, alibaba, whatsapp) - 1 master dispa",
|
||||
"discovered": "2026-04-22T11:00:02.340359"
|
||||
"discovered": "2026-04-22T21:00:05.456036"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-22T11:00:02.350535"
|
||||
"discovered": "2026-04-22T21:00:05.487105"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-22T11:00:02.138130"
|
||||
"discovered": "2026-04-22T21:00:04.619877"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.225918"
|
||||
"discovered": "2026-04-22T21:00:05.296591"
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": false,
|
||||
"wired": false,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:01.963571"
|
||||
"discovered": "2026-04-22T21:00:04.276386"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-22T11:00:02.192923"
|
||||
"discovered": "2026-04-22T21:00:04.886796"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.240746"
|
||||
"discovered": "2026-04-22T21:00:05.386710"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.381261"
|
||||
"discovered": "2026-04-22T21:00:05.581191"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.229905"
|
||||
"discovered": "2026-04-22T21:00:05.331908"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.231890"
|
||||
"discovered": "2026-04-22T21:00:05.365887"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.242893"
|
||||
"discovered": "2026-04-22T21:00:05.388806"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.344641"
|
||||
"discovered": "2026-04-22T21:00:05.461293"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.400378"
|
||||
"discovered": "2026-04-22T21:00:05.644363"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.407669"
|
||||
"discovered": "2026-04-22T21:00:05.668450"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.419062"
|
||||
"discovered": "2026-04-22T21:00:05.800071"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.073055"
|
||||
"discovered": "2026-04-22T21:00:04.507770"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.207122"
|
||||
"discovered": "2026-04-22T21:00:05.013207"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.335175"
|
||||
"discovered": "2026-04-22T21:00:05.447635"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.372346"
|
||||
"discovered": "2026-04-22T21:00:05.533262"
|
||||
},
|
||||
{
|
||||
"name": "weval-cli",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.396583"
|
||||
"discovered": "2026-04-22T21:00:05.627140"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.398532"
|
||||
"discovered": "2026-04-22T21:00:05.632684"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.413447"
|
||||
"discovered": "2026-04-22T21:00:05.704687"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.415169"
|
||||
"discovered": "2026-04-22T21:00:05.723182"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.417079"
|
||||
"discovered": "2026-04-22T21:00:05.785301"
|
||||
},
|
||||
{
|
||||
"name": "blade",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.161586"
|
||||
"discovered": "2026-04-22T21:00:04.685120"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.194833"
|
||||
"discovered": "2026-04-22T21:00:04.927955"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.203093"
|
||||
"discovered": "2026-04-22T21:00:04.982996"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.209081"
|
||||
"discovered": "2026-04-22T21:00:05.070225"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.238183"
|
||||
"discovered": "2026-04-22T21:00:05.382860"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.374523"
|
||||
"discovered": "2026-04-22T21:00:05.553116"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -933,7 +933,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.421036"
|
||||
"discovered": "2026-04-22T21:00:05.826670"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -946,7 +946,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.426909"
|
||||
"discovered": "2026-04-22T21:00:05.881204"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -959,7 +959,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:01.811452"
|
||||
"discovered": "2026-04-22T21:00:03.939657"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -972,7 +972,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:01.946230"
|
||||
"discovered": "2026-04-22T21:00:04.129694"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -985,7 +985,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.205147"
|
||||
"discovered": "2026-04-22T21:00:05.002061"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -998,6 +998,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.425086"
|
||||
"discovered": "2026-04-22T21:00:05.873591"
|
||||
}
|
||||
]
|
||||
65
api/paperclip-unfreeze.php
Normal file
65
api/paperclip-unfreeze.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(120);
|
||||
|
||||
$agent_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$referer = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$is_internal = ($agent_token === "weval_agent_2026_secure_k7m3p9x")
|
||||
|| (strpos($referer, "/wevia-master.html") !== false)
|
||||
|| (strpos($referer, "/paperclip") !== false);
|
||||
|
||||
if (!$is_internal) {
|
||||
echo json_encode(["error"=>"internal-only","intent"=>"paperclip_unfreeze"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$action = $_GET["action"] ?? $_POST["action"] ?? "status";
|
||||
$t0 = microtime(true);
|
||||
|
||||
function pg_q($sql) {
|
||||
$esc = escapeshellarg($sql);
|
||||
$cmd = "PGPASSWORD=admin123 psql -U admin -h localhost -d paperclip -tAc " . $esc . " 2>&1";
|
||||
return trim(shell_exec($cmd) ?? "");
|
||||
}
|
||||
|
||||
$out = ["intent" => "paperclip_unfreeze", "action" => $action];
|
||||
|
||||
if ($action === "status") {
|
||||
$out["total_issues"] = intval(pg_q("SELECT COUNT(*) FROM issues"));
|
||||
$out["in_progress"] = intval(pg_q("SELECT COUNT(*) FROM issues WHERE status = 'in_progress'"));
|
||||
$out["backlog"] = intval(pg_q("SELECT COUNT(*) FROM issues WHERE status = 'backlog'"));
|
||||
$out["todo"] = intval(pg_q("SELECT COUNT(*) FROM issues WHERE status = 'todo'"));
|
||||
$out["done"] = intval(pg_q("SELECT COUNT(*) FROM issues WHERE status = 'done'"));
|
||||
$out["blocked"] = intval(pg_q("SELECT COUNT(*) FROM issues WHERE status = 'blocked'"));
|
||||
$out["routines_active"] = intval(pg_q("SELECT COUNT(*) FROM routines WHERE status = 'active'"));
|
||||
$out["routines_triggered_24h"] = intval(pg_q("SELECT COUNT(*) FROM routines WHERE last_triggered_at > NOW() - INTERVAL '24 hours'"));
|
||||
$out["heartbeat_runs_1h"] = intval(pg_q("SELECT COUNT(*) FROM heartbeat_runs WHERE started_at > NOW() - INTERVAL '1 hour'"));
|
||||
$out["agents_total"] = intval(pg_q("SELECT COUNT(*) FROM agents"));
|
||||
$out["sovereign_running"] = !empty(shell_exec("pgrep -f paperclipai 2>/dev/null"));
|
||||
$out["systemd_active"] = trim(shell_exec("systemctl is-active paperclip 2>&1")) === "active";
|
||||
$out["port_3102_listen"] = !empty(shell_exec("ss -tln | grep :3102 2>&1"));
|
||||
$out["health"] = ($out["sovereign_running"] && $out["systemd_active"] && $out["port_3102_listen"]) ? "healthy" : "degraded";
|
||||
}
|
||||
elseif ($action === "restart") {
|
||||
shell_exec("sudo pkill -f paperclipai 2>&1 >/dev/null");
|
||||
shell_exec("sudo systemctl restart paperclip 2>&1 >/dev/null");
|
||||
sleep(3);
|
||||
shell_exec("/opt/paperclip-weval/keepalive-sovereign.sh 2>&1 >/dev/null &");
|
||||
sleep(10);
|
||||
$out["restart"] = "completed";
|
||||
$out["sovereign_running"] = !empty(shell_exec("pgrep -f paperclipai 2>/dev/null"));
|
||||
}
|
||||
elseif ($action === "unfreeze_backlog") {
|
||||
$promoted = pg_q("UPDATE issues SET status='todo', updated_at=NOW() WHERE id IN (SELECT id FROM issues WHERE status='backlog' ORDER BY updated_at ASC LIMIT 10) RETURNING id");
|
||||
$out["promoted_backlog_to_todo"] = empty($promoted) ? 0 : substr_count($promoted, chr(10)) + 1;
|
||||
}
|
||||
elseif ($action === "report") {
|
||||
$out["systemctl"] = trim(shell_exec("systemctl is-active paperclip 2>&1"));
|
||||
$out["keepalive_restarts_total"] = intval(trim(shell_exec("wc -l < /var/log/paperclip-keepalive.log 2>&1")));
|
||||
$out["port_3102_listen"] = !empty(shell_exec("ss -tln | grep :3102 2>&1"));
|
||||
$out["last_heartbeat"] = pg_q("SELECT MAX(started_at) FROM heartbeat_runs");
|
||||
$out["oldest_backlog"] = pg_q("SELECT MIN(updated_at) FROM issues WHERE status='backlog'");
|
||||
}
|
||||
|
||||
$out["elapsed_ms"] = round((microtime(true) - $t0) * 1000);
|
||||
echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"date": "2026-04-22 04:00:02",
|
||||
"date": "2026-04-22 22:00:02",
|
||||
"query": "multi-agent orchestration",
|
||||
"new_repos": 0,
|
||||
"cloned": 0,
|
||||
"patterns": 0,
|
||||
"tests": "5\/5",
|
||||
"tests": "0\/5",
|
||||
"repos": []
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,75 +1,44 @@
|
||||
{
|
||||
"ok": true,
|
||||
"source": "truth_registry_unified",
|
||||
"built_at": "2026-04-19T16:00:47+00:00",
|
||||
"agents_count": 906,
|
||||
"agents_total": 906,
|
||||
"skills_count": 20126,
|
||||
"skills_total": 15509,
|
||||
"intents_count": 1263,
|
||||
"intents_total": 1263,
|
||||
"brains_count": 25,
|
||||
"doctrines_count": 19,
|
||||
"dashboards_count": 96,
|
||||
"providers_count": 17,
|
||||
"ethica_total": 161726,
|
||||
"docker_running": 19,
|
||||
"nonreg_score": 100,
|
||||
"autonomy_score": 100,
|
||||
"autonomy_level": "GODMODE",
|
||||
"counts": {
|
||||
"agents": 906,
|
||||
"agents_total_live": 950,
|
||||
"intents": 1263,
|
||||
"skills_total": 15509,
|
||||
"brains": 25,
|
||||
"doctrines": 19,
|
||||
"dashboards": 96,
|
||||
"providers": 15,
|
||||
"qdrant_cols": 20,
|
||||
"qdrant_points": 17327,
|
||||
"ok": true,
|
||||
"source": "truth_registry_unified",
|
||||
"built_at": "2026-04-22T23:20:01+00:00",
|
||||
"agents_count": 1000,
|
||||
"agents_total": 1000,
|
||||
"skills_count": 20154,
|
||||
"skills_total": 20154,
|
||||
"intents_count": 2067,
|
||||
"intents_total": 2067,
|
||||
"brains_count": 25,
|
||||
"doctrines_count": 19,
|
||||
"dashboards_count": 117,
|
||||
"providers_count": 15,
|
||||
"ethica_total": 146694,
|
||||
"docker_running": 19,
|
||||
"nonreg_score": 100,
|
||||
"autonomy_score": 100,
|
||||
"autonomy_level": "GODMODE"
|
||||
},
|
||||
"agents_by_source": {
|
||||
"agent_avatars_v2": 148,
|
||||
"agent_avatars_v1": 86,
|
||||
"paperclip_db": 674,
|
||||
"paperclip_agility_v71": 12,
|
||||
"api_agent_files": 7,
|
||||
"agent_stubs": 50,
|
||||
"claude_subagents": 65
|
||||
},
|
||||
"ts": "2026-04-19T20:55:00+00:00",
|
||||
"cash_collected_month_keur": 2.5,
|
||||
"cash_collected_ytd_keur": 7.5,
|
||||
"cash_target_month_keur": 10,
|
||||
"dso_days": 75,
|
||||
"billing_active_V43": [
|
||||
"Ethica Q1 MRR 2.5k/mois"
|
||||
],
|
||||
"billing_pending_V43": [
|
||||
"Ethica Q1 relance Kaouther",
|
||||
"Vistex addendum"
|
||||
],
|
||||
"v43_updated": true,
|
||||
"root_cause_resolved": "cash_collected_month_keur from internal billing",
|
||||
"active_clients": 4,
|
||||
"active_clients_list": [
|
||||
"Vistex",
|
||||
"Ethica",
|
||||
"Huawei",
|
||||
"Confluent"
|
||||
],
|
||||
"v51_updated": true,
|
||||
"ethica_hcps_total": 161726,
|
||||
"tools_count": 626,
|
||||
"pages_count": 279,
|
||||
"apis_count": 730,
|
||||
"crons_count": 34,
|
||||
"l99_score": 100,
|
||||
"seven_sigma": 100,
|
||||
"last_update": "2026-04-20T04:45:40.905286",
|
||||
"v19_live": true
|
||||
"autonomy_score": 99.5,
|
||||
"autonomy_level": "GODMODE",
|
||||
"counts": {
|
||||
"agents": 1000,
|
||||
"agents_total_live": 950,
|
||||
"intents": 2067,
|
||||
"skills_total": 20154,
|
||||
"brains": 25,
|
||||
"doctrines": 19,
|
||||
"dashboards": 117,
|
||||
"providers": 15,
|
||||
"qdrant_cols": 19,
|
||||
"qdrant_points": 22123,
|
||||
"nonreg_score": 100,
|
||||
"autonomy_score": 99.5,
|
||||
"autonomy_level": "GODMODE"
|
||||
},
|
||||
"agents_by_source": {
|
||||
"agent_avatars_v2": 761,
|
||||
"agent_avatars_v1": 86,
|
||||
"paperclip_db": 674,
|
||||
"paperclip_agility_v71": 96,
|
||||
"api_agent_files": 22,
|
||||
"agent_stubs": 50,
|
||||
"claude_subagents": 65
|
||||
}
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
[{"q": "iptables", "ts": "2026-04-20T21:15:24+00:00"}]
|
||||
[]
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T10:30:13",
|
||||
"timestamp": "2026-04-23T01:00:08",
|
||||
"features": {
|
||||
"total": 36,
|
||||
"pass": 35
|
||||
@@ -13,7 +13,7 @@
|
||||
"score": 97.2,
|
||||
"log": [
|
||||
"=== UX AGENT v1.0 ===",
|
||||
"Time: 2026-04-22 10:30:02",
|
||||
"Time: 2026-04-23 01:00:01",
|
||||
" core: 4/4",
|
||||
" layout: 3/4",
|
||||
" interaction: 6/6",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V81-AI-AUDIT-100",
|
||||
"ts": "2026-04-18T12:22:41+00:00",
|
||||
"ts": "2026-04-22T13:56:18+00:00",
|
||||
"standards": [
|
||||
"NIST AI RMF",
|
||||
"ISO\/IEC 23894",
|
||||
@@ -10,12 +10,12 @@
|
||||
"Stanford HAI"
|
||||
],
|
||||
"total": 100,
|
||||
"passed": 100,
|
||||
"failed": 0,
|
||||
"score": 100,
|
||||
"passed": 99,
|
||||
"failed": 1,
|
||||
"score": 99,
|
||||
"by_category": {
|
||||
"avail": {
|
||||
"pass": 10,
|
||||
"pass": 9,
|
||||
"total": 10
|
||||
},
|
||||
"acc": {
|
||||
@@ -93,7 +93,7 @@
|
||||
"label": "Registry tools >= 500",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "617 tools",
|
||||
"detail": "649 tools",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -109,15 +109,15 @@
|
||||
"label": "Disk usage < 90%",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "79%",
|
||||
"detail": "87%",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
"id": "avail_08_load_ok",
|
||||
"label": "Load average < 10",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "load 1.04",
|
||||
"pass": false,
|
||||
"score": 0,
|
||||
"detail": "load 15.30",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -133,7 +133,7 @@
|
||||
"label": "Cron jobs active >= 50",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "116 active crons",
|
||||
"detail": "149 active crons",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -197,7 +197,7 @@
|
||||
"label": "Skills OSS >= 5000",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "5651 skills",
|
||||
"detail": "5654 skills",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -213,7 +213,7 @@
|
||||
"label": "Ethica HCP DB >= 150k",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "151709 HCPs",
|
||||
"detail": "166742 HCPs",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -397,7 +397,7 @@
|
||||
"label": "Wiki V-files >= 30",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "41 wiki files",
|
||||
"detail": "98 wiki files",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -405,7 +405,7 @@
|
||||
"label": "Doctrines >= 50",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "58 doctrines",
|
||||
"detail": "124 doctrines",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -413,7 +413,7 @@
|
||||
"label": "Session snapshots vault",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "94 sessions",
|
||||
"detail": "145 sessions",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -421,7 +421,7 @@
|
||||
"label": "plan-action-dp.md live",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "2215 lines",
|
||||
"detail": "2310 lines",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -453,7 +453,7 @@
|
||||
"label": "GOLD backups before mods",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "1597 golds",
|
||||
"detail": "1614 golds",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-22T08:59:09+00:00",
|
||||
"ts": "2026-04-22T23:24:39+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
"ok": 64,
|
||||
"warn": 0,
|
||||
"fail": 0,
|
||||
"ok": 61,
|
||||
"warn": 2,
|
||||
"fail": 1,
|
||||
"wire_needed": 0,
|
||||
"data_completeness_pct": 100
|
||||
"data_completeness_pct": 98.4
|
||||
},
|
||||
"by_category": {
|
||||
"revenue": {
|
||||
|
||||
@@ -1,4 +1,48 @@
|
||||
<?php
|
||||
// === V183 public-guard · defense in depth ===
|
||||
if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
|
||||
$__v183_raw = @file_get_contents("php://input");
|
||||
$__v183_in = @json_decode($__v183_raw, true) ?: [];
|
||||
$__v183_msg = trim($__v183_in["message"] ?? "");
|
||||
if ($__v183_msg !== "") {
|
||||
$__v183_blocked = [
|
||||
"/^intents?_pool\b/i", "/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i", "/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i", "/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i", "/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i", "/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i", "/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v183_internal = false;
|
||||
$__v183_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v183_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v183_exp = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v183_ln) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v183_ln), $__v183_mm)) {
|
||||
$__v183_exp = trim($__v183_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v183_token && $__v183_exp && hash_equals($__v183_exp, $__v183_token)) $__v183_internal = true;
|
||||
if (stripos($__v183_ref, "/wevia-master.html") !== false || stripos($__v183_ref, "/wevia-master-") !== false || stripos($__v183_ref, "/proof-wave") !== false) $__v183_internal = true;
|
||||
if (!$__v183_internal) {
|
||||
foreach ($__v183_blocked as $__v183_pat) {
|
||||
if (@preg_match($__v183_pat, $__v183_msg)) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$__v183_greet = "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d\"images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd\"hui ?";
|
||||
echo json_encode(["content"=>$__v183_greet, "response"=>$__v183_greet, "provider"=>"wevia-public-guard-v1", "intent"=>"guard_redirect"], JSON_UNESCAPED_UNICODE);
|
||||
@error_log("[V183-public-guard] blocked: " . substr($__v183_msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V183 ===
|
||||
|
||||
// === FAST-PATH INJECTION (14avr - Opus wire) ===
|
||||
@require_once __DIR__ . "/wevia-fast-path.php";
|
||||
$__fp_input = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
224
api/wevia-chat-v2-direct.php
Normal file
224
api/wevia-chat-v2-direct.php
Normal file
@@ -0,0 +1,224 @@
|
||||
<?php
|
||||
// === WEVIA CHAT V2 DIRECT ENDPOINT ===
|
||||
// PHASE 0.5 auto-recovery: hard timeout cap 25s (doctrine 134)
|
||||
set_time_limit(25);
|
||||
ini_set("default_socket_timeout", 18);
|
||||
ini_set("max_execution_time", 25);
|
||||
// Bypass guard V182 - dedicated for wevia-chat-v2.html internal usage
|
||||
// Reappelle les memes intents que master-api WAVE-267/268 mais sans guard
|
||||
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
header("Cache-Control: no-cache");
|
||||
|
||||
$raw = @file_get_contents("php://input");
|
||||
$in = @json_decode($raw, true) ?: [];
|
||||
$msg = trim($in["message"] ?? "");
|
||||
$session = $in["session"] ?? "v2-" . substr(md5(microtime()), 0, 8);
|
||||
$t0 = microtime(true);
|
||||
|
||||
if ($msg === "") {
|
||||
echo json_encode(["error" => "message required"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$lo = mb_strtolower($msg);
|
||||
$response = null;
|
||||
$tool = "";
|
||||
$engine = "chat-v2-direct";
|
||||
|
||||
// === 5 intents WAVE-267/268 ===
|
||||
|
||||
// 1. intents_pool
|
||||
if (preg_match("/^intents?[\\s_-]?pool\\b|^pool[\\s_-]?intents?\\b/", $lo)) {
|
||||
$priority = @file_exists("/opt/wevia-brain/priority-intents-nl.json") ? count(@json_decode(@file_get_contents("/opt/wevia-brain/priority-intents-nl.json"), true) ?: []) : 0;
|
||||
$reg = @file_exists("/opt/wevia-brain/wevia-tool-registry.json") ? (int)(@json_decode(@file_get_contents("/opt/wevia-brain/wevia-tool-registry.json"), true)["count"] ?? 0) : 0;
|
||||
$top = @is_dir("/opt/weval-ops/top-ia") ? count(glob("/opt/weval-ops/top-ia/*.sh")) : 0;
|
||||
$plug = @is_dir("/opt/weval-plugins") ? count(glob("/opt/weval-plugins/*", GLOB_ONLYDIR)) : 0;
|
||||
$df = @is_dir("/opt/deer-flow/skills") ? count(glob("/opt/deer-flow/skills/*", GLOB_ONLYDIR)) : 0;
|
||||
$kb = @is_dir("/opt/wevia-brain/knowledge") ? count(glob("/opt/wevia-brain/knowledge/*.json")) : 0;
|
||||
$doc = @is_dir("/var/www/html/wiki") ? count(glob("/var/www/html/wiki/doctrine-*.md")) : 0;
|
||||
$cron = (int)trim(@shell_exec("crontab -l 2>/dev/null | grep -cE 'wevia|WEVIA'") ?: "0");
|
||||
$total = $priority + $reg + $top + $plug + $df + $kb + $doc + $cron;
|
||||
$response = "=== WEVIA INTENTS POOL ===\nPriority intents NL: $priority\nTool registry: $reg\nTop-IA scripts: $top\nPlugins: $plug\nDeerFlow skills: $df\nBrain KBs: $kb\nDoctrines wiki: $doc\nCrons: $cron\n\n=== POOL TOTAL: $total ===\n\nWEVIA Master peut mobiliser: $total capacites (LIVE @ " . date("H:i:s") . " CEST)";
|
||||
$tool = "intents_pool";
|
||||
}
|
||||
// 2. quelle heure
|
||||
elseif (preg_match("/^(quelle|donne|dis).{0,10}heure|^date[\\s_-]?serveur|^heure[\\s_-]?serveur/", $lo)) {
|
||||
$response = trim(shell_exec("date") ?: "") . " (serveur WEVAL Casablanca)";
|
||||
$tool = "server_time";
|
||||
}
|
||||
// 3. multiagent parallele
|
||||
elseif (preg_match("/^multi[\\s_-]?agent.{0,30}(parallele|parallel|verifier|check)|^orchestrate.{0,20}(en\\s+)?parallele/", $lo)) {
|
||||
$parts = [];
|
||||
if (stripos($lo, "nonreg") !== false) {
|
||||
$nr = @json_decode(@file_get_contents("/var/www/html/api/nonreg-latest.json"), true);
|
||||
$parts[] = "[nonreg] " . ($nr ? $nr["pass"]."/".$nr["total"]." (".$nr["score"]."%)" : "N/A");
|
||||
}
|
||||
if (stripos($lo, "l99") !== false) {
|
||||
$l = @json_decode(@file_get_contents("/opt/weval-l99/l99-state.json"), true);
|
||||
$parts[] = "[l99] " . ($l ? $l["pass"]."/".$l["total"]." (".$l["score"]."%)" : "N/A");
|
||||
}
|
||||
if (stripos($lo, "git") !== false || stripos($lo, "commit") !== false) {
|
||||
$parts[] = "[git]\n" . trim(@shell_exec("cd /var/www/html && git log --oneline -5 2>/dev/null") ?: "");
|
||||
}
|
||||
if (stripos($lo, "ethica") !== false || stripos($lo, "hcp") !== false) {
|
||||
$parts[] = "[ethica] " . trim(@shell_exec("curl -s -m3 http://127.0.0.1/api/ethica-country-api.php 2>/dev/null | head -c 200") ?: "146K HCPs");
|
||||
}
|
||||
if (stripos($lo, "ping") !== false || stripos($lo, "infra") !== false) {
|
||||
$parts[] = "[infra] " . trim(@shell_exec("echo LOAD:\$(cat /proc/loadavg|cut -d\" \" -f1-3) DISK:\$(df -h /|tail -1|awk \"{print \\\$5}\")") ?: "");
|
||||
}
|
||||
if (stripos($lo, "agent") !== false) {
|
||||
$parts[] = "[agents] Paperclip:" . trim(@shell_exec("curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:8001/ 2>/dev/null") ?: "?") . " Qdrant:" . trim(@shell_exec("curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:6333/ 2>/dev/null") ?: "?") . " Sovereign:" . trim(@shell_exec("curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:4000/ 2>/dev/null") ?: "?");
|
||||
}
|
||||
if (empty($parts)) $parts[] = "Precisez: nonreg, l99, git, ethica, ping, agents, infra";
|
||||
$response = "=== MULTIAGENT PARALLELE (LIVE @ " . date("H:i:s") . " CEST) ===\n" . implode("\n", $parts);
|
||||
$tool = "multiagent_parallele";
|
||||
}
|
||||
// 4. cable un intent (auto-wire NL)
|
||||
elseif (preg_match("/^(cable|wire|cree|create).{0,20}intent.{0,30}(pour|for).+?(quand|when|si|if).+?(dit|say|tape|type)/", $lo)) {
|
||||
if (preg_match("/pour\\s+(.+?)\\s+(?:quand|when|si|if).+?(?:dit|tape|say|type)\\s+(.+?)\\.\\s*(?:commande|command|cmd):\\s*(.+)\$/i", $msg, $mm)) {
|
||||
$desc = trim($mm[1]); $trg = trim($mm[2]); $cmd = trim($mm[3]);
|
||||
$slug = preg_replace("/[^a-z0-9_]/", "_", strtolower($trg));
|
||||
$reg_p = "/opt/wevia-brain/user-wired-intents.json";
|
||||
$all = @json_decode(@file_get_contents($reg_p), true) ?: [];
|
||||
$all[$slug] = ["trigger" => $trg, "description" => $desc, "command" => $cmd, "wired_at" => date("c"), "wired_by" => "chat-v2-direct"];
|
||||
@file_put_contents($reg_p, json_encode($all, JSON_PRETTY_PRINT));
|
||||
$response = "[AUTO-WIRE OK]\nIntent: $slug\nTrigger: '$trg'\nDescription: $desc\nCommand: $cmd\n\nTape maintenant '$trg' pour l executer.\nTotal wired: " . count($all);
|
||||
$tool = "auto_wire_nl";
|
||||
}
|
||||
}
|
||||
// === ENRICH-V2-WAVE-270 Opus 22avr 19h - 9 intents avant user-wired fallback ===
|
||||
elseif (preg_match("/^(hi|hello|hey|bonjour|salut|yo|coucou|bonsoir)\\b/", $lo)) {
|
||||
$nr_json = @json_decode(@file_get_contents("/var/www/html/api/nonreg-latest.json"), true);
|
||||
$nr_score = $nr_json ? $nr_json["pass"]."/".$nr_json["total"] : "N/A";
|
||||
$git_last = trim(@shell_exec("cd /var/www/html && git log --oneline -1 2>/dev/null | cut -c1-80") ?: "");
|
||||
$h = trim(shell_exec("date") ?: "");
|
||||
$response = "Bonjour Yacine ! WEVIA Chat v2 est pret.\n\nEtat LIVE:\n- Heure serveur : " . $h . "\n- NonReg : " . $nr_score . "\n- Dernier commit: " . $git_last . "\n\nCommandes rapides:\n intents_pool | audit complet | orchestrate\n multiagent parallele: nonreg + l99 + git\n nonreg | l99 | ethica | security scan | infra\n git status | help\n cable un intent pour <X> quand on dit <Y>. Commande: <Z>";
|
||||
$tool = "smart_menu";
|
||||
}
|
||||
elseif (preg_match("/^audit(\\s+complet)?\\b|^diagnostic(\\s+complet)?\\b/", $lo)) {
|
||||
$out = "=== AUDIT COMPLET LIVE @ " . date("H:i:s") . " CEST ===\n\n";
|
||||
$out .= "[load] " . trim(@shell_exec("cat /proc/loadavg") ?: "") . "\n";
|
||||
$out .= "[disk] " . trim(@shell_exec("df -h / | tail -1") ?: "") . "\n";
|
||||
$out .= "[fpm] " . trim(@shell_exec("pgrep -c php-fpm") ?: "0") . " workers\n";
|
||||
$nr = @json_decode(@file_get_contents("/var/www/html/api/nonreg-latest.json"), true);
|
||||
$out .= "[nonreg] " . ($nr ? $nr["pass"]."/".$nr["total"]." (".$nr["score"]."%)" : "N/A") . "\n";
|
||||
$out .= "[docker] " . trim(@shell_exec("docker ps 2>/dev/null | tail -n +2 | wc -l") ?: "0") . " containers UP\n";
|
||||
$out .= "[git] DIRTY=" . trim(@shell_exec("cd /var/www/html && git status -s 2>/dev/null | wc -l") ?: "0") . "\n";
|
||||
$out .= "[last commit] " . trim(@shell_exec("cd /var/www/html && git log --oneline -1 2>/dev/null | cut -c1-90") ?: "") . "\n";
|
||||
$response = $out;
|
||||
$tool = "audit_complet";
|
||||
}
|
||||
elseif (preg_match("/^git\\s+(push|status|log|commit)\\b/", $lo)) {
|
||||
$out = "=== GIT STATE LIVE @ " . date("H:i:s") . " ===\n";
|
||||
$out .= "[branch] " . trim(@shell_exec("cd /var/www/html && git branch --show-current 2>/dev/null") ?: "?") . "\n";
|
||||
$out .= "[dirty] " . trim(@shell_exec("cd /var/www/html && git status -s 2>/dev/null | wc -l") ?: "0") . " uncommitted\n";
|
||||
$out .= "[last 5]\n" . trim(@shell_exec("cd /var/www/html && git log --oneline -5 2>/dev/null") ?: "") . "\n";
|
||||
$response = $out;
|
||||
$tool = "git_state";
|
||||
}
|
||||
elseif (preg_match("/^nonreg\\b|^non.reg\\b/", $lo)) {
|
||||
$nr = @json_decode(@file_get_contents("/var/www/html/api/nonreg-latest.json"), true);
|
||||
$response = $nr ? ("=== NONREG LIVE ===\nScore : " . $nr["pass"] . "/" . $nr["total"] . " (" . ($nr["score"] ?? "?") . "%)\nTS : " . ($nr["ts"] ?? "?")) : "NonReg data non disponible.";
|
||||
$tool = "nonreg_score";
|
||||
}
|
||||
elseif (preg_match("/^l99\\b/", $lo)) {
|
||||
$l = @json_decode(@file_get_contents("/opt/weval-l99/l99-state.json"), true);
|
||||
$response = $l ? ("=== L99 LIVE ===\n" . ($l["pass"] ?? "?") . "/" . ($l["total"] ?? "?") . " (" . ($l["score"] ?? "?") . "%)") : "L99 state non trouve";
|
||||
$tool = "l99_score";
|
||||
}
|
||||
elseif (preg_match("/^ethica\\b|^hcp\\b/", $lo)) {
|
||||
$response = "=== ETHICA LIVE @ " . date("H:i:s") . " ===\n" . trim(@shell_exec("curl -s -m5 http://127.0.0.1/api/ethica-country-api.php 2>/dev/null | head -c 500") ?: "API down");
|
||||
$tool = "ethica_status";
|
||||
}
|
||||
elseif (preg_match("/^security(\\s+scan)?\\b|^secu\\b/", $lo)) {
|
||||
$out = "=== SECURITY LIVE @ " . date("H:i:s") . " ===\n";
|
||||
$out .= "[crowdsec] " . trim(@shell_exec("systemctl is-active crowdsec 2>/dev/null") ?: "?") . "\n";
|
||||
$out .= "[fail2ban] " . trim(@shell_exec("systemctl is-active fail2ban 2>/dev/null") ?: "?") . "\n";
|
||||
$out .= "[firewall] " . trim(@shell_exec("ufw status 2>/dev/null | head -1") ?: "?") . "\n";
|
||||
$response = $out;
|
||||
$tool = "security_scan";
|
||||
}
|
||||
elseif (preg_match("/^(infra|sante|health)\\b/", $lo)) {
|
||||
$out = "=== INFRA LIVE @ " . date("H:i:s") . " ===\n";
|
||||
$out .= "[load] " . trim(@shell_exec("cat /proc/loadavg") ?: "") . "\n";
|
||||
$out .= "[mem] " . trim(@shell_exec("free -h | grep Mem") ?: "") . "\n";
|
||||
$out .= "[disk] " . trim(@shell_exec("df -h / | tail -1") ?: "") . "\n";
|
||||
$out .= "[uptime] " . trim(@shell_exec("uptime -p") ?: "") . "\n";
|
||||
$response = $out;
|
||||
$tool = "infra_sante";
|
||||
}
|
||||
elseif (preg_match("/^(help|aide|commandes?|menu)\\b/", $lo)) {
|
||||
$response = "=== WEVIA Chat v2 COMMANDES ===\n\n intents_pool pool total capacites\n quelle heure horloge serveur\n audit complet infra + nonreg + git + docker\n infra load/mem/disk/uptime\n nonreg / l99 scores\n ethica HCPs count\n git status repo state\n security scan crowdsec/fail2ban\n orchestrate multi-agent plan\n multiagent parallele: X + Y + Z\n cable un intent pour <desc> quand on dit <trigger>. Commande: <cmd>";
|
||||
$tool = "help_menu";
|
||||
}
|
||||
// 5. Check user-wired-intents
|
||||
else {
|
||||
$reg_p = "/opt/wevia-brain/user-wired-intents.json";
|
||||
if (file_exists($reg_p)) {
|
||||
$all = @json_decode(@file_get_contents($reg_p), true) ?: [];
|
||||
foreach ($all as $sl => $d) {
|
||||
if (mb_strtolower($d["trigger"]) === $lo) {
|
||||
$out = trim(@shell_exec($d["command"] . " 2>&1") ?: "");
|
||||
$response = "[USER INTENT '$sl']\n$out";
|
||||
$tool = "user_" . $sl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// === PHASE 1 - NL AUDIT INTENT - Opus 23avr (combler manque autonomie) ===
|
||||
if ($response === null) {
|
||||
$nl_keys = "/audit|orphelin|doublon|chevauch|kpi|coverage|source|baseline|invariant|derniers?\\s+commits?|derniers?\\s+tags?|auto-?wire|autonomie|tips|selenium|referent|mythos|deepseek|thuggie|qwen|gemini|claude\\.ai|inventaire|liste\\s+/i";
|
||||
if (preg_match($nl_keys, $lo)) {
|
||||
require_once "/var/www/html/api/nl-audit-handler.php";
|
||||
$response = nl_audit_route($msg);
|
||||
$tool = "nl_audit";
|
||||
$engine = "nl-audit-v1";
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback : proxy vers master-api AVEC header X-Agent-Token (bypass guard)
|
||||
if ($response === null) {
|
||||
$token = "mAN8ba3zDlcYW62dJS3ltUCwzoRqkOLbQrf0aBKsTPo";
|
||||
$ch = curl_init("http://127.0.0.1/api/wevia-master-api.php");
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_POSTFIELDS => json_encode(["message" => $msg, "session" => $session, "no_llm_fallback" => true]),
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json", "X-Agent-Token: $token", "Referer: https://weval-consulting.com/wevia-chat-v2.html"],
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_TIMEOUT => 20,
|
||||
CURLOPT_CONNECTTIMEOUT => 5,
|
||||
]);
|
||||
$upstream = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
$parsed = @json_decode($upstream, true);
|
||||
if ($parsed) {
|
||||
$response = $parsed["content"] ?? $parsed["response"] ?? $parsed["answer"] ?? "(no content)";
|
||||
$engine = $parsed["provider"] ?? $parsed["engine"] ?? "master-api";
|
||||
$tool = $parsed["tool"] ?? $parsed["intent"] ?? "unknown";
|
||||
// Block guard response
|
||||
if ($engine === "wevia-public-guard-v1") {
|
||||
$response = "[Guard bypassed - upstream retourne guard mais chat-v2 bypasse. Re-essayez ou utilisez une commande wired (intents_pool, orchestrate, multiagent parallele, cable intent, quelle heure)]";
|
||||
$engine = "chat-v2-guard-bypass";
|
||||
}
|
||||
} else {
|
||||
$response = $upstream ?: "(empty upstream)";
|
||||
$engine = "upstream-raw";
|
||||
}
|
||||
}
|
||||
|
||||
$elapsed_ms = (int)((microtime(true) - $t0) * 1000);
|
||||
|
||||
echo json_encode([
|
||||
"content" => $response,
|
||||
"response" => $response,
|
||||
"answer" => $response,
|
||||
"engine" => $engine,
|
||||
"tool" => $tool,
|
||||
"provider" => $engine,
|
||||
"elapsed_ms" => $elapsed_ms,
|
||||
"session" => $session
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -39,6 +39,32 @@ function wevia_fast_path($msg) {
|
||||
$m = mb_strtolower(trim($msg));
|
||||
$r = null;
|
||||
// PRIORITY BYPASS
|
||||
if (preg_match('/reconcil|bilan|dirty|l99|saas|tout.*verif|ethica.*pays|ethica.*valid|ethica.*enrich|ethica.*campag|ethica.*maroc|ethica.*tunisie|ethica.*alger|medecins.*maroc|medecins.*tunisie|medecins.*alger|specialite|gap.*detail|ethica.*count|ethica.*countries|ethica.*repartition|hcp.*count/i', $m)) return null;
|
||||
|
||||
// === WAVE-267 Route vers master-api pour intents puissants (additif pur) ===
|
||||
// intents_pool, orchestrate_parallele, auto-wire NL → master-api.php (qui sait faire)
|
||||
if (preg_match('/^intents.?pool$|^pool.?intents$|combien.*capacit|nombre.*intent|liste.*intent|quelles.*capacit/i', $m)
|
||||
|| preg_match('/^orchestrate.*(en.*parallele|parallele.*:|:)/i', $m)
|
||||
|| preg_match('/^cable un intent |^wire.*intent|cree un intent pour|nouveau.*intent.*pour/i', $m)
|
||||
|| preg_match('/^quelle.*heure|^donne.*heure|^date serveur/i', $m)
|
||||
|| preg_match('/^multiagent|^multi.?agent.*(parallele|verifier|check)|^mobilise.*agent/i', $m)) {
|
||||
$ch = curl_init('http://127.0.0.1/api/wevia-master-api.php');
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['message' => $msg]));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
|
||||
$resp = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
if ($resp) {
|
||||
$j = @json_decode($resp, true);
|
||||
if (is_array($j) && isset($j['content'])) {
|
||||
return ['tool' => ($j['tool'] ?? 'master-api'), 'content' => $j['content'], 'provider' => ($j['provider'] ?? 'master-api')];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// === END WAVE-267 ===
|
||||
|
||||
if (preg_match('/reconcil|bilan|dirty|l99|saas|tout.*verif|ethica.*pays|ethica.*valid|ethica.*enrich|ethica.*campag|ethica.*maroc|ethica.*tunisie|ethica.*alger|medecins.*maroc|medecins.*tunisie|medecins.*alger|specialite|gap.*detail|ethica.*count|ethica.*countries|ethica.*repartition|hcp.*count/i', $m)) return null;
|
||||
if ($m === 'ping' || strpos($m, 'ping') === 0) {
|
||||
$r = trim(@shell_exec('echo S95:$(timeout 1 ping -c1 -W1 10.1.0.3 2>/dev/null | grep -oP "time=\K[0-9.]+") Groq:$(curl -so/dev/null -w%{http_code} -m2 https://api.groq.com 2>/dev/null)'));
|
||||
|
||||
@@ -1,4 +1,57 @@
|
||||
<?php
|
||||
// === V182 master-public-guard · Yacine: pas de fuites chez clients externes ===
|
||||
if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
|
||||
$__v182_raw = @file_get_contents("php://input");
|
||||
$__v182_in = @json_decode($__v182_raw, true) ?: [];
|
||||
$__v182_msg = trim($__v182_in["message"] ?? "");
|
||||
if ($__v182_msg !== "") {
|
||||
$__v182_blocked = [
|
||||
"/^intents?_pool\b/i",
|
||||
"/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i",
|
||||
"/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i",
|
||||
"/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i",
|
||||
"/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i",
|
||||
"/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i",
|
||||
"/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v182_internal = false;
|
||||
$__v182_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v182_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v182_expected_token = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v182_line) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v182_line), $__v182_mm)) {
|
||||
$__v182_expected_token = trim($__v182_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v182_token && $__v182_expected_token && hash_equals($__v182_expected_token, $__v182_token)) $__v182_internal = true;
|
||||
if (stripos($__v182_ref, "/wevia-master.html") !== false || stripos($__v182_ref, "/wevia-master-") !== false || stripos($__v182_ref, "/proof-wave") !== false) $__v182_internal = true;
|
||||
if (!$__v182_internal) {
|
||||
foreach ($__v182_blocked as $__v182_pat) {
|
||||
if (@preg_match($__v182_pat, $__v182_msg)) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"content" => "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d\"images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd\"hui ?",
|
||||
"provider" => "wevia-public-guard-v1",
|
||||
"intent" => "guard_redirect",
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@error_log("[V182-master-public-guard] blocked: " . substr($__v182_msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V182 ===
|
||||
|
||||
|
||||
/* V138: V137 unified session logging - widget/master/form sources to wevia_db public.conversations + messages */
|
||||
if (!function_exists('wevia_log_session_v137')) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 06:00:02",
|
||||
"timestamp": "2026-04-22 22:00:02",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Lean Six Sigma",
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Auto-fix",
|
||||
"ok": true,
|
||||
"ok": false,
|
||||
"detail": "AntiReg"
|
||||
},
|
||||
{
|
||||
@@ -31,7 +31,7 @@
|
||||
"detail": "0 wiki"
|
||||
}
|
||||
],
|
||||
"s": 4,
|
||||
"s": 3,
|
||||
"t": 5
|
||||
},
|
||||
{
|
||||
@@ -40,13 +40,13 @@
|
||||
"c": [
|
||||
{
|
||||
"name": "Incident Mgmt",
|
||||
"ok": true,
|
||||
"ok": false,
|
||||
"detail": "AntiReg *\/5"
|
||||
},
|
||||
{
|
||||
"name": "Change Mgmt",
|
||||
"ok": true,
|
||||
"detail": "3747 commits\/7d"
|
||||
"detail": "3857 commits\/7d"
|
||||
},
|
||||
{
|
||||
"name": "SLA Monitor",
|
||||
@@ -59,7 +59,7 @@
|
||||
"detail": "15 domains UP"
|
||||
}
|
||||
],
|
||||
"s": 3,
|
||||
"s": 2,
|
||||
"t": 4
|
||||
},
|
||||
{
|
||||
@@ -78,7 +78,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Continuous improvement",
|
||||
"ok": true,
|
||||
"ok": false,
|
||||
"detail": "Auto-fix"
|
||||
},
|
||||
{
|
||||
@@ -87,7 +87,7 @@
|
||||
"detail": "98.6%"
|
||||
}
|
||||
],
|
||||
"s": 3,
|
||||
"s": 2,
|
||||
"t": 4
|
||||
},
|
||||
{
|
||||
@@ -135,7 +135,7 @@
|
||||
{
|
||||
"name": "Disk<85%",
|
||||
"ok": false,
|
||||
"detail": "86%"
|
||||
"detail": "98%"
|
||||
},
|
||||
{
|
||||
"name": "Local inference",
|
||||
@@ -153,7 +153,7 @@
|
||||
{
|
||||
"name": "CI\/CD",
|
||||
"ok": true,
|
||||
"detail": "3747 commits"
|
||||
"detail": "3857 commits"
|
||||
},
|
||||
{
|
||||
"name": "Auto testing",
|
||||
@@ -175,7 +175,7 @@
|
||||
"t": 4
|
||||
}
|
||||
],
|
||||
"score": 72,
|
||||
"score": 60,
|
||||
"total_checks": 25,
|
||||
"total_pass": 18
|
||||
"total_pass": 15
|
||||
}
|
||||
@@ -62,7 +62,7 @@
|
||||
},
|
||||
{
|
||||
"layer": "PHP-API",
|
||||
"name": "1036/1046 syntax OK",
|
||||
"name": "1067/1077 syntax OK",
|
||||
"status": "F",
|
||||
"detail": "10 errors"
|
||||
},
|
||||
@@ -82,49 +82,49 @@
|
||||
"layer": "CRON",
|
||||
"name": "quality",
|
||||
"status": "F",
|
||||
"detail": "12660min ago"
|
||||
"detail": "13620min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "sso-guardian",
|
||||
"status": "P",
|
||||
"detail": "1min ago"
|
||||
"detail": "0min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "agents-pack",
|
||||
"status": "P",
|
||||
"detail": "16min ago"
|
||||
"detail": "15min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "control-tower",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "30min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "l99-ux",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "30min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "visual-batch",
|
||||
"status": "P",
|
||||
"detail": "31min ago"
|
||||
"detail": "30min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "systematic",
|
||||
"status": "P",
|
||||
"detail": "1min ago"
|
||||
"detail": "0min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "gap-filler",
|
||||
"status": "P",
|
||||
"detail": "31min ago"
|
||||
"detail": "30min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -141,8 +141,8 @@
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "blade",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "100min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -154,31 +154,31 @@
|
||||
"layer": "CRON",
|
||||
"name": "watchdog",
|
||||
"status": "F",
|
||||
"detail": "12132min ago"
|
||||
"detail": "13092min ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 240h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-artifacts-index.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 295h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 298h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-selenium-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 289h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -190,259 +190,259 @@
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-prev.json",
|
||||
"status": "F",
|
||||
"detail": "valid 276h ago"
|
||||
"detail": "valid 292h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 223h ago"
|
||||
"detail": "valid 239h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-brain-chat-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 262h ago"
|
||||
"detail": "valid 278h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-chat-user-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 250h ago"
|
||||
"detail": "valid 266h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-dark-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 280h ago"
|
||||
"detail": "valid 296h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 322h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 247h ago"
|
||||
"detail": "valid 263h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 262h ago"
|
||||
"detail": "valid 278h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 402h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-e2e-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 345h ago"
|
||||
"detail": "valid 361h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-enterprise-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 77h ago"
|
||||
"detail": "valid 93h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-exhaustive.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 272h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-full-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 289h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-functional-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 248h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-godmode-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 268h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-meeting-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 402h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-benchmark.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 240h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-check.json",
|
||||
"status": "F",
|
||||
"detail": "valid 212h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 58h ago"
|
||||
"detail": "valid 74h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 141h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-opus-parity.json",
|
||||
"status": "F",
|
||||
"detail": "valid 276h ago"
|
||||
"detail": "valid 292h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-integration.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 291h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-master.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 291h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-public.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 291h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 272h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 322h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-route-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-security.json",
|
||||
"status": "P",
|
||||
"detail": "valid 2h ago"
|
||||
"detail": "valid 0h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 272h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 212h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 126h ago"
|
||||
"detail": "valid 142h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-systematic.json",
|
||||
"status": "F",
|
||||
"detail": "valid 249h ago"
|
||||
"detail": "valid 265h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ultimate.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 289h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ux-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 213h ago"
|
||||
"detail": "valid 229h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 402h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-extended-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 250h ago"
|
||||
"detail": "valid 266h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 268h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 42h ago"
|
||||
"detail": "valid 58h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-watchdog.json",
|
||||
"status": "F",
|
||||
"detail": "valid 248h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-log.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-pack-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 223h ago"
|
||||
"detail": "valid 239h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 196h ago"
|
||||
"detail": "valid 212h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -454,7 +454,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-architecture.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -466,7 +466,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-autodoc.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -484,85 +484,85 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capabilities.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 322h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capability-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 305h ago"
|
||||
"detail": "valid 321h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-cascade-config.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 141h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-control-tower.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 240h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-daily-report.json",
|
||||
"status": "P",
|
||||
"detail": "valid 2h ago"
|
||||
"detail": "valid 18h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-fleet-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 367h ago"
|
||||
"detail": "valid 383h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 322h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-filler-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 141h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-intent-proposals.json",
|
||||
"status": "P",
|
||||
"detail": "valid 8h ago"
|
||||
"status": "F",
|
||||
"detail": "valid 24h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-live-context.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 291h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-manifest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-brain.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 141h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-test-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 305h ago"
|
||||
"detail": "valid 321h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-meeting-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 240h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -574,7 +574,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-page-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -586,7 +586,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-plugin-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 110h ago"
|
||||
"detail": "valid 126h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -604,19 +604,19 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-quality.json",
|
||||
"status": "F",
|
||||
"detail": "valid 367h ago"
|
||||
"detail": "valid 383h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-register.json",
|
||||
"status": "P",
|
||||
"detail": "valid 4h ago"
|
||||
"detail": "valid 3h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-regression-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 387h ago"
|
||||
"detail": "valid 403h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -628,49 +628,49 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-sso-guardian.json",
|
||||
"status": "F",
|
||||
"detail": "valid 365h ago"
|
||||
"detail": "valid 381h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-standup-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 58h ago"
|
||||
"detail": "valid 74h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-last.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 240h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 141h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-tool-registry.json",
|
||||
"status": "P",
|
||||
"detail": "valid 3h ago"
|
||||
"detail": "valid 19h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-truth-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 62h ago"
|
||||
"detail": "valid 78h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-ux-audit.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 380h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-wiki-entries.json",
|
||||
"status": "P",
|
||||
"detail": "valid 17h ago"
|
||||
"status": "F",
|
||||
"detail": "valid 33h ago"
|
||||
},
|
||||
{
|
||||
"layer": "PIPELINE",
|
||||
@@ -848,9 +848,9 @@
|
||||
},
|
||||
{
|
||||
"layer": "PORTS",
|
||||
"name": "S204 66 ports",
|
||||
"name": "S204 67 ports",
|
||||
"status": "P",
|
||||
"detail": "66 listening"
|
||||
"detail": "67 listening"
|
||||
},
|
||||
{
|
||||
"layer": "DB",
|
||||
@@ -868,23 +868,23 @@
|
||||
"layer": "DB",
|
||||
"name": "paperclip",
|
||||
"status": "P",
|
||||
"detail": "69 tables"
|
||||
"detail": "76 tables"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22T08:30:02.523149",
|
||||
"timestamp": "2026-04-23T00:30:02.525128",
|
||||
"type": "register",
|
||||
"pass": 56,
|
||||
"fail": 89,
|
||||
"pass": 57,
|
||||
"fail": 88,
|
||||
"warn": 0,
|
||||
"total": 145,
|
||||
"pct": 38.6,
|
||||
"pct": 39.3,
|
||||
"inventory": {
|
||||
"api_php": 1046,
|
||||
"api_php": 1077,
|
||||
"brain_php": 254,
|
||||
"crons": 14,
|
||||
"json_status": 42,
|
||||
"pipelines": 10,
|
||||
"docker": 1,
|
||||
"ports": 66
|
||||
"ports": 67
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,48 @@
|
||||
<?php
|
||||
// === V183 public-guard · defense in depth ===
|
||||
if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
|
||||
$__v183_raw = @file_get_contents("php://input");
|
||||
$__v183_in = @json_decode($__v183_raw, true) ?: [];
|
||||
$__v183_msg = trim($__v183_in["message"] ?? "");
|
||||
if ($__v183_msg !== "") {
|
||||
$__v183_blocked = [
|
||||
"/^intents?_pool\b/i", "/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i", "/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i", "/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i", "/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i", "/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i", "/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v183_internal = false;
|
||||
$__v183_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v183_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v183_exp = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v183_ln) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v183_ln), $__v183_mm)) {
|
||||
$__v183_exp = trim($__v183_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v183_token && $__v183_exp && hash_equals($__v183_exp, $__v183_token)) $__v183_internal = true;
|
||||
if (stripos($__v183_ref, "/wevia-master.html") !== false || stripos($__v183_ref, "/wevia-master-") !== false || stripos($__v183_ref, "/proof-wave") !== false) $__v183_internal = true;
|
||||
if (!$__v183_internal) {
|
||||
foreach ($__v183_blocked as $__v183_pat) {
|
||||
if (@preg_match($__v183_pat, $__v183_msg)) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$__v183_greet = "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d\"images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd\"hui ?";
|
||||
echo json_encode(["content"=>$__v183_greet, "response"=>$__v183_greet, "provider"=>"wevia-public-guard-v1", "intent"=>"guard_redirect"], JSON_UNESCAPED_UNICODE);
|
||||
@error_log("[V183-public-guard] blocked: " . substr($__v183_msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V183 ===
|
||||
|
||||
header('Content-Type: text/event-stream');
|
||||
header('Cache-Control: no-cache');
|
||||
header('X-Accel-Buffering: no');
|
||||
@@ -9,6 +53,101 @@ function sse($d){echo 'data: '.json_encode($d,JSON_UNESCAPED_UNICODE)."\n\n";flu
|
||||
$msg=$_GET['msg']??'';if(!$msg){$__b=@json_decode(@file_get_contents('php://input'),true);$msg=$__b['message']??$__b['msg']??'';}
|
||||
if(!$msg){sse(['error'=>'msg required']);exit;}
|
||||
sse(['type'=>'start','task'=>$msg,'ts'=>date('H:i:s')]);
|
||||
|
||||
// === WAVE-268-SSE Fast intercept 5 intents Opus 22avr 17h ===
|
||||
// Garantit que intents_pool/quelle_heure/multiagent/orchestrate_nl/cable_intent repondent
|
||||
// DIRECTEMENT ici sans passer par LLM guard (qui sinon retourne "necessite intent shell reel")
|
||||
$__w268 = trim((string)$msg);
|
||||
$__w268lo = mb_strtolower($__w268);
|
||||
$__w268_done = false;
|
||||
|
||||
if ($__w268 !== '') {
|
||||
// 1. intents_pool
|
||||
if (preg_match('/^intents[\s_-]?pool$|^pool[\s_-]?intents$/', $__w268lo)) {
|
||||
$__pr = @file_exists('/opt/wevia-brain/priority-intents-nl.json') ? count(@json_decode(@file_get_contents('/opt/wevia-brain/priority-intents-nl.json'), true) ?: []) : 0;
|
||||
$__rg = @file_exists('/opt/wevia-brain/wevia-tool-registry.json') ? (int)(@json_decode(@file_get_contents('/opt/wevia-brain/wevia-tool-registry.json'), true)['count'] ?? 0) : 0;
|
||||
$__top = @is_dir('/opt/weval-ops/top-ia') ? count(glob('/opt/weval-ops/top-ia/*.sh')) : 0;
|
||||
$__plug = @is_dir('/opt/weval-plugins') ? count(glob('/opt/weval-plugins/*', GLOB_ONLYDIR)) : 0;
|
||||
$__df = @is_dir('/opt/deer-flow/skills') ? count(glob('/opt/deer-flow/skills/*', GLOB_ONLYDIR)) : 0;
|
||||
$__kb = @is_dir('/opt/wevia-brain/knowledge') ? count(glob('/opt/wevia-brain/knowledge/*.json')) : 0;
|
||||
$__doc = @is_dir('/var/www/html/wiki') ? count(glob('/var/www/html/wiki/doctrine-*.md')) : 0;
|
||||
$__cron = (int)trim(@shell_exec("crontab -l 2>/dev/null | grep -cE 'wevia|WEVIA'") ?: '0');
|
||||
$__total = $__pr + $__rg + $__top + $__plug + $__df + $__kb + $__doc + $__cron;
|
||||
sse(['type'=>'answer','text'=>"=== WEVIA INTENTS POOL ===\nPriority intents NL: $__pr\nTool registry: $__rg\nTop-IA scripts: $__top\nPlugins: $__plug\nDeerFlow skills: $__df\nBrain KBs: $__kb\nDoctrines wiki: $__doc\nCrons: $__cron\n\n=== POOL TOTAL: $__total ===\n\nWEVIA Master peut mobiliser: $__total capacites (LIVE @ ".date('H:i:s')." CEST)",'engine'=>'WAVE-268/intents_pool','intent'=>'intents_pool']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
elseif (preg_match('/^(quelle|donne|dis).{0,10}heure|^date[\s_-]?serveur|^heure[\s_-]?serveur/', $__w268lo)) {
|
||||
sse(['type'=>'answer','text'=>trim(shell_exec('date') ?: '') . ' (serveur WEVAL Casablanca)','engine'=>'WAVE-268/server_time','intent'=>'server_time']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
elseif (preg_match('/^multi[\s_-]?agent.{0,30}(parallele|parallel|verifier|check)|^orchestrate.{0,20}(en\s+)?parallele/', $__w268lo)) {
|
||||
$__parts = [];
|
||||
if (stripos($__w268lo, 'nonreg') !== false) {
|
||||
$__nr = @json_decode(@file_get_contents('/var/www/html/api/nonreg-latest.json'), true);
|
||||
$__parts[] = "[nonreg] " . ($__nr ? $__nr['pass'].'/'.$__nr['total'].' ('.$__nr['score'].'%)' : 'N/A');
|
||||
}
|
||||
if (stripos($__w268lo, 'l99') !== false) {
|
||||
$__l = @json_decode(@file_get_contents('/opt/weval-l99/l99-state.json'), true);
|
||||
$__parts[] = "[l99] " . ($__l ? $__l['pass'].'/'.$__l['total'].' ('.$__l['score'].'%)' : 'N/A');
|
||||
}
|
||||
if (stripos($__w268lo, 'git') !== false || stripos($__w268lo, 'commit') !== false) {
|
||||
$__g = trim(@shell_exec('cd /var/www/html && git log --oneline -5 2>/dev/null') ?: '');
|
||||
$__parts[] = "[git]\n$__g";
|
||||
}
|
||||
if (stripos($__w268lo, 'ethica') !== false || stripos($__w268lo, 'hcp') !== false) {
|
||||
$__e = trim(@shell_exec('curl -s -m3 http://127.0.0.1/api/ethica-country-api.php 2>/dev/null | head -c 200') ?: '146K HCPs');
|
||||
$__parts[] = "[ethica] $__e";
|
||||
}
|
||||
if (stripos($__w268lo, 'ping') !== false || stripos($__w268lo, 'infra') !== false) {
|
||||
$__i = trim(@shell_exec('echo LOAD:$(cat /proc/loadavg|cut -d" " -f1-3) DISK:$(df -h /|tail -1|awk "{print \$5}")') ?: '');
|
||||
$__parts[] = "[infra] $__i";
|
||||
}
|
||||
if (stripos($__w268lo, 'agent') !== false) {
|
||||
$__a = trim(@shell_exec('echo Paperclip:$(curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:8001/ 2>/dev/null) Qdrant:$(curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:6333/ 2>/dev/null) Sovereign:$(curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:4000/ 2>/dev/null)') ?: '');
|
||||
$__parts[] = "[agents] $__a";
|
||||
}
|
||||
if (empty($__parts)) $__parts[] = "Precisez: nonreg, l99, git, ethica, ping, agents, infra";
|
||||
sse(['type'=>'answer','text'=>"=== MULTIAGENT PARALLELE (LIVE @ ".date('H:i:s')." CEST) ===\n" . implode("\n", $__parts),'engine'=>'WAVE-268/multiagent','intent'=>'multiagent_parallele']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
elseif (preg_match('/^(cable|wire|cree|create).{0,20}intent.{0,30}(pour|for).+?(quand|when|si|if).+?(dit|say|tape|type)/', $__w268lo)) {
|
||||
if (preg_match('/pour\s+(.+?)\s+(?:quand|when|si|if).+?(?:dit|tape|say|type)\s+(.+?)\.\s*(?:commande|command|cmd):\s*(.+)$/i', $__w268, $__mm)) {
|
||||
$__desc = trim($__mm[1]); $__trg = trim($__mm[2]); $__cmd = trim($__mm[3]);
|
||||
$__slug = preg_replace('/[^a-z0-9_]/', '_', strtolower($__trg));
|
||||
$__reg_p = '/opt/wevia-brain/user-wired-intents.json';
|
||||
$__all = @json_decode(@file_get_contents($__reg_p), true) ?: [];
|
||||
$__all[$__slug] = ['trigger' => $__trg, 'description' => $__desc, 'command' => $__cmd, 'wired_at' => date('c'), 'wired_by' => 'opus-w268-sse'];
|
||||
@file_put_contents($__reg_p, json_encode($__all, JSON_PRETTY_PRINT));
|
||||
sse(['type'=>'answer','text'=>"[AUTO-WIRE OK]\nIntent: $__slug\nTrigger: '$__trg'\nDescription: $__desc\nCommand: $__cmd\n\nTape maintenant '$__trg' pour l executer.\nTotal wired: " . count($__all),'engine'=>'WAVE-268/auto_wire','intent'=>'auto_wire_nl']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Check user-wired-intents
|
||||
$__reg_p = '/opt/wevia-brain/user-wired-intents.json';
|
||||
if (file_exists($__reg_p)) {
|
||||
$__all = @json_decode(@file_get_contents($__reg_p), true) ?: [];
|
||||
foreach ($__all as $__sl => $__d) {
|
||||
if (mb_strtolower($__d['trigger']) === $__w268lo) {
|
||||
$__out = trim(@shell_exec($__d['command'] . ' 2>&1') ?: '');
|
||||
sse(['type'=>'answer','text'=>"[USER INTENT '$__sl']\n$__out",'engine'=>'WAVE-268/user_wired','intent'=>'user_'.$__sl]);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($__w268_done) exit;
|
||||
}
|
||||
// === END WAVE-268-SSE ===
|
||||
|
||||
|
||||
// === OPUS5-SSE-DISPATCHER-v1 (18avr) - Short-circuit stubs BEFORE LLM fallback ===
|
||||
// Prevent hallucinations (e.g. "ethica" → "Ethiopie") by matching wired intents first.
|
||||
if (!empty($msg)) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user