Compare commits
169 Commits
wave-259-u
...
v175-opus-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
814ba61691 | ||
|
|
af33c56591 | ||
|
|
f465bedbd3 | ||
|
|
4eb9e842b1 | ||
|
|
a47fefad6c | ||
|
|
4fcb3c563f | ||
|
|
3b34c3eb5d | ||
|
|
c9dabf21a9 | ||
|
|
241a0cf38c | ||
|
|
0cfda21d31 | ||
|
|
1b051e200c | ||
|
|
0f83d5e73e | ||
|
|
10f8769c87 | ||
|
|
1de6db6366 | ||
|
|
caaca91df5 | ||
|
|
a2b789c71b | ||
|
|
534f10cc2b | ||
|
|
bbb69cddeb | ||
|
|
0abc88de15 | ||
|
|
0e711c0577 | ||
|
|
8d325645c0 | ||
|
|
5b41d193b5 | ||
|
|
12d3ee310f | ||
|
|
f60da1d3d9 | ||
|
|
6c067d60ca | ||
|
|
9676b7087a | ||
|
|
d40dce94a7 | ||
|
|
051513a202 | ||
|
|
e56219f73c | ||
|
|
c5bdc08150 | ||
|
|
46406d757e | ||
|
|
bf20f939a9 | ||
|
|
b203dfdd2e | ||
|
|
b86a26fec5 | ||
|
|
fd9677e060 | ||
|
|
20aae00bee | ||
|
|
6c75c4ebd3 | ||
|
|
d549c92e3c | ||
|
|
1cb4020632 | ||
|
|
35cafc3460 | ||
|
|
2d7f928207 | ||
|
|
881bee9fc9 | ||
|
|
3e74787ecb | ||
|
|
dcddae2cfd | ||
|
|
2074cda08a | ||
|
|
94f27781a8 | ||
|
|
3871563762 | ||
|
|
17b92cd315 | ||
|
|
6d86ac51dc | ||
|
|
9f2aae1f6b | ||
|
|
b8acf3e04e | ||
|
|
7cec95c2f3 | ||
|
|
f464cce955 | ||
|
|
067a45d815 | ||
|
|
3ee5b827b9 | ||
|
|
1e6d17e419 | ||
|
|
04e8bdde91 | ||
|
|
d683b57b2e | ||
|
|
7216ecea64 | ||
|
|
f39e904d6e | ||
|
|
426c86cbcf | ||
|
|
dc5751c0cd | ||
|
|
0a2b212b0b | ||
|
|
ce0206c4e3 | ||
|
|
ca12430835 | ||
|
|
700a0e062a | ||
|
|
a28c372c48 | ||
|
|
730054f910 | ||
|
|
d2d7f3316f | ||
|
|
36a7b206d8 | ||
|
|
0b4e2d9532 | ||
|
|
4ca30a13cd | ||
|
|
7d774f1173 | ||
|
|
4eba799515 | ||
|
|
b7b8a49e82 | ||
|
|
ebb9aa206e | ||
|
|
8103d921d7 | ||
|
|
0471c9b2b1 | ||
|
|
10a6a49fd5 | ||
|
|
7adc35c12f | ||
|
|
dd35a5ecf6 | ||
|
|
022dfe65c5 | ||
|
|
6a6fb48508 | ||
|
|
0cff0e534b | ||
|
|
21d0f0b8a4 | ||
|
|
b377bda982 | ||
|
|
ca4255ac63 | ||
|
|
00ca47aef2 | ||
|
|
208bee2b87 | ||
|
|
649a49f382 | ||
|
|
accbcb3ee5 | ||
|
|
0b55a56039 | ||
|
|
160b2a57bd | ||
|
|
e79005a535 | ||
|
|
a51fab2eed |
@@ -1336,5 +1336,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,9 +1,9 @@
|
||||
{
|
||||
"agent": "V41_Activation_Campaign",
|
||||
"ts": "2026-04-21T10:00:01+02:00",
|
||||
"unique_ips_24h_estimate": 17,
|
||||
"chat_queries_24h": 16,
|
||||
"dau_real_estimate": 5,
|
||||
"ts": "2026-04-22T10:00:01+02:00",
|
||||
"unique_ips_24h_estimate": 79,
|
||||
"chat_queries_24h": 1,
|
||||
"dau_real_estimate": 26,
|
||||
"target_trials_week": 5,
|
||||
"activation_targets": ["Kaouther_Najar_Ethica","Olga_Vistex","Ray_Huawei","5_prospects_pharma_banque"],
|
||||
"emails_to_send_this_week": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_CSM_Daily",
|
||||
"ts": "2026-04-21T09:00:02+02:00",
|
||||
"ts": "2026-04-22T09:00:02+02:00",
|
||||
"customers_active": ["Vistex","Ethica","Huawei","Confluent"],
|
||||
"customers_count": 4,
|
||||
"ethica_last_activity": "none",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-22T05:00:02+02:00",
|
||||
"disk_pct": 85,
|
||||
"disk_free_gb": 22,
|
||||
"ts": "2026-04-22T15:30:02+02:00",
|
||||
"disk_pct": 87,
|
||||
"disk_free_gb": 20,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 14,
|
||||
"runway_days": 13,
|
||||
"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-22T05:00:03+02:00",
|
||||
"ts": "2026-04-22T15:45:02+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V61_Ethica_Countdown",
|
||||
"ts": "2026-04-21T09:00:01+02:00",
|
||||
"ts": "2026-04-22T09:00:01+02:00",
|
||||
"client": "Ethica Group",
|
||||
"contact": "Kaouther Najar",
|
||||
"contract": "renewal Q1 2026",
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"routes": 446,
|
||||
"skills": 835,
|
||||
"wiki": 2066,
|
||||
"pages": 318,
|
||||
"apis": 252,
|
||||
"wiki": 2296,
|
||||
"pages": 328,
|
||||
"apis": 254,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
{
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-21 22:00"
|
||||
"timestamp": "2026-04-22 10:00"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 00:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"analysis": {
|
||||
"existing_skills": 835,
|
||||
"missing": 15,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-22T05:00:02+02:00",
|
||||
"ts": "2026-04-22T15:00:02+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 12,
|
||||
"adoption_pct": 80,
|
||||
"chat_queries_last_1k_log": 2,
|
||||
"wtp_views_last_1k_log": 98,
|
||||
"dg_views_last_1k_log": 4,
|
||||
"features_used_24h": 11,
|
||||
"adoption_pct": 73,
|
||||
"chat_queries_last_1k_log": 3,
|
||||
"wtp_views_last_1k_log": 9,
|
||||
"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": "V61_GitHub_PAT_Watcher",
|
||||
"ts": "2026-04-21T10:00:03+02:00",
|
||||
"ts": "2026-04-22T10:00:03+02:00",
|
||||
"pat_configured": false,
|
||||
"last_push_health": "OK",
|
||||
"remote_probe": "fatal: unable to get credential storage ",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-22T05:10:03+02:00",
|
||||
"ts": "2026-04-22T15:50:03+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V61_LinkedIn_Sourcing",
|
||||
"ts": "2026-04-21T11:00:02+02:00",
|
||||
"ts": "2026-04-22T11:00:01+02:00",
|
||||
"icp_count": 39,
|
||||
"icp_source": "V46 39 ICP Pharma/Banque/Retail/Public Maghreb+MENA",
|
||||
"api_keys_configured": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-22T05:00:03+02:00",
|
||||
"ts": "2026-04-22T15:00:03+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-22T00:00:02+02:00",
|
||||
"ts": "2026-04-22T08:00:02+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-22T05:00:04+02:00",
|
||||
"ts": "2026-04-22T15:30:04+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 80,
|
||||
"mql_auto": 19,
|
||||
"residual_risk_pct": 81,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "10.82",
|
||||
"load_5min": "18.32",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 04:00",
|
||||
"timestamp": "2026-04-22 14:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 19,
|
||||
"disk": "85%",
|
||||
"docker": 20,
|
||||
"disk": "87%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "13.04",
|
||||
"uptime": "up 1 week, 16 hours, 8 minutes"
|
||||
"load": "2.46",
|
||||
"uptime": "up 1 week, 1 day, 2 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -20,12 +20,12 @@
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -45,27 +45,27 @@
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 5 days (healthy)",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -116,7 +116,7 @@
|
||||
]
|
||||
},
|
||||
"apis": {
|
||||
"count": 273,
|
||||
"count": 275,
|
||||
"files": [
|
||||
"wevia-stream-sovereign.php",
|
||||
"wevia-pending-loader.php",
|
||||
@@ -180,6 +180,7 @@
|
||||
"wevia-agent-chef.php",
|
||||
"wevia-agentic.php",
|
||||
"wevia-arena-engine.php",
|
||||
"wevia-factory.php",
|
||||
"wevia-brain.php",
|
||||
"wevia-capabilities-ext.php",
|
||||
"wevia-sovereign-heal-intent.php",
|
||||
@@ -223,6 +224,7 @@
|
||||
"wevia-vault-llm.php",
|
||||
"wevia-tool-test.php",
|
||||
"wevia-v74-intents-include.php",
|
||||
"wevia-chat-memory.php",
|
||||
"wevia-self-diagnostic-intent.php",
|
||||
"wevia-control-kpis.php",
|
||||
"wevia-test-email-intent.php",
|
||||
@@ -450,7 +452,7 @@
|
||||
]
|
||||
},
|
||||
"qdrant": {
|
||||
"total": 22105,
|
||||
"total": 22123,
|
||||
"collections": {
|
||||
"weval_skills": 19089,
|
||||
"wevia_graph": 3,
|
||||
@@ -465,7 +467,7 @@
|
||||
"kb_bpmn_patterns": 7,
|
||||
"kb_dmaic_playbooks": 7,
|
||||
"kb_wevads_deliv": 6,
|
||||
"wevia_memory_768": 82,
|
||||
"wevia_memory_768": 100,
|
||||
"wevia_kb_768": 255,
|
||||
"weval_agents_registry": 50,
|
||||
"wevia_kb": 386,
|
||||
@@ -486,16 +488,16 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 324
|
||||
"count": 328
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 95
|
||||
"count": 96
|
||||
},
|
||||
"dataset": {
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 2123
|
||||
"entries": 2324
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T00:00:03.159161",
|
||||
"generated_at": "2026-04-22T12:00:04.136998",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 19,
|
||||
"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",
|
||||
"page": "wevia-widget.html",
|
||||
"element": "#opus-pattern-badge",
|
||||
"type": "css_rule",
|
||||
"corner": "bottom-right",
|
||||
"z": 9997,
|
||||
"z": 99990,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-21T22:00:06+00:00",
|
||||
"compute_ms": 4023,
|
||||
"timestamp": "2026-04-22T10:00:07+00:00",
|
||||
"compute_ms": 5100,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -19,12 +19,12 @@
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 968,
|
||||
"latency_ms": 1583,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 1001,
|
||||
"latency_ms": 907,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -199,6 +199,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",
|
||||
]);
|
||||
|
||||
116
api/ambre-confidential-shield.js
Normal file
116
api/ambre-confidential-shield.js
Normal file
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* ambre-confidential-shield.js · wave-261
|
||||
* GARDE CONFIDENTIELLE : supprime tout badge/dock interne sur pages PUBLIQUES
|
||||
*
|
||||
* Usage: loadé en TÊTE sur /, /wevia.html, /wevia, /index.html
|
||||
*
|
||||
* ELEMENTS À MASQUER sur pages publiques :
|
||||
* - #opus-pattern-badge · Claude Pattern badge
|
||||
* - #opus-pattern-style · CSS associé
|
||||
* - #opus-udrill · drill menu fixed
|
||||
* - #opus-udrill-in · contenu drill
|
||||
* - #opus-dashboard-entry · dashboard hover
|
||||
* - #opus-dashboard-link · Dashboards link fixed
|
||||
* - #wtp-udock, #v130-xnav, #opus-xlinks · docks internes
|
||||
* - Tout élément avec text "WTP" + "Admin" + "Droid" dans un même conteneur fixed
|
||||
* - Tout lien vers /weval-technology-platform.html, /wevia-master.html, /all-ia-hub.html, etc. en position fixed
|
||||
*/
|
||||
(function(){
|
||||
'use strict';
|
||||
|
||||
// Public paths where shield is ACTIVE (block internal UI elements)
|
||||
var PUBLIC_PATHS = ['/', '/index.html', '/wevia-widget.html', '/wevia.html', '/wevia', '/consent.html', '/register.html', '/login'];
|
||||
var path = (location.pathname || '/').toLowerCase();
|
||||
var isPublic = PUBLIC_PATHS.indexOf(path) !== -1;
|
||||
if (!isPublic) return; // do nothing on private/auth pages
|
||||
|
||||
// IDs to HIDE on public pages (confidential internal UI)
|
||||
var CONFIDENTIAL_IDS = [
|
||||
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
|
||||
'opus-pattern-modal', 'opus-pattern-box', 'opus-pattern-close', 'opus-pattern-input',
|
||||
'opus-pattern-bot', 'opus-pattern-output', 'opus-pattern-content',
|
||||
'opus-pattern-launch', 'opus-pattern-send',
|
||||
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
|
||||
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
|
||||
'opus-claude-pattern', 'opus-dashboards',
|
||||
'archi-meta-badge', 'v130-floating-dock',
|
||||
];
|
||||
|
||||
// Inject CSS that hides these IDs IMMEDIATELY (before any JS injects them)
|
||||
var css = document.createElement('style');
|
||||
css.id = 'ambre-confidential-shield';
|
||||
css.textContent = CONFIDENTIAL_IDS.map(function(id){return '#' + id;}).join(',') + '{display:none!important;visibility:hidden!important;pointer-events:none!important}';
|
||||
// Also hide any fixed element containing "Droid" + "Admin" text (the dock in Image 1)
|
||||
(document.head || document.documentElement).appendChild(css);
|
||||
|
||||
// MutationObserver to remove dynamically-injected leaks
|
||||
function scrubLeaks() {
|
||||
// Remove by id
|
||||
CONFIDENTIAL_IDS.forEach(function(id){
|
||||
var el = document.getElementById(id);
|
||||
if (el) el.remove();
|
||||
});
|
||||
|
||||
// Remove fixed elements with sensitive badges (WTP + IA Hub + Master + Droid + Admin)
|
||||
var fixedElements = document.querySelectorAll('div[style*="position: fixed"], div[style*="position:fixed"]');
|
||||
fixedElements.forEach(function(el){
|
||||
var txt = (el.innerText || '').toLowerCase();
|
||||
var matches = ['wtp', 'ia hub', 'master', 'orch', 'wevcode', 'arena', 'droid', 'admin', 'wevia engine']
|
||||
.filter(function(kw){ return txt.indexOf(kw) !== -1; }).length;
|
||||
if (matches >= 4) { // if 4+ internal keywords present → remove
|
||||
el.remove();
|
||||
}
|
||||
});
|
||||
|
||||
// Remove <a href="..."> fixed shortcuts to internal pages
|
||||
var privatePages = ['weval-technology-platform', 'wevia-master', 'all-ia-hub', 'wevia-orchestrator', 'wevcode', 'droid.html', 'admin-saas'];
|
||||
document.querySelectorAll('a[href]').forEach(function(a){
|
||||
var href = (a.getAttribute('href') || '').toLowerCase();
|
||||
var style = window.getComputedStyle(a);
|
||||
if (style.position === 'fixed' || (a.parentElement && window.getComputedStyle(a.parentElement).position === 'fixed')) {
|
||||
for (var i = 0; i < privatePages.length; i++) {
|
||||
if (href.indexOf(privatePages[i]) !== -1) {
|
||||
a.remove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Run at DOM ready and on mutations
|
||||
if (document.readyState !== 'loading') scrubLeaks();
|
||||
else document.addEventListener('DOMContentLoaded', scrubLeaks);
|
||||
|
||||
// MutationObserver for post-load injections
|
||||
var mo = new MutationObserver(function(mutations){
|
||||
for (var i = 0; i < mutations.length; i++) {
|
||||
var m = mutations[i];
|
||||
if (m.addedNodes && m.addedNodes.length > 0) {
|
||||
scrubLeaks();
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Start observing once body available
|
||||
function startObserver(){
|
||||
if (document.body) mo.observe(document.body, { childList: true, subtree: true });
|
||||
else setTimeout(startObserver, 100);
|
||||
}
|
||||
startObserver();
|
||||
|
||||
// Periodic sweep (catch late injections)
|
||||
setInterval(scrubLeaks, 2000);
|
||||
|
||||
// Also stop at 60s to save CPU
|
||||
setTimeout(function(){ try { mo.disconnect(); } catch(e){} }, 60000);
|
||||
|
||||
// Neutralize global opusPatternOpen function (prevents programmatic opening)
|
||||
try {
|
||||
Object.defineProperty(window, '__opusPatternOpen', { value: function(){}, writable: false, configurable: false });
|
||||
Object.defineProperty(window, '__opusPatternClose', { value: function(){}, writable: false, configurable: false });
|
||||
} catch(e) {}
|
||||
|
||||
console.log('[ambre-confidential-shield] active on public page: ' + path);
|
||||
})();
|
||||
5
api/ambre-ctx.php
Normal file
5
api/ambre-ctx.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
echo "=== around 94630 (phase result) ===\n";
|
||||
echo substr($c, 94500, 1500);
|
||||
43
api/ambre-dock-fix.php
Normal file
43
api/ambre-dock-fix.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wtp-unified-dock.js";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Add wevia-widget.html + all chatbot public pages to PUBLIC_PATHS
|
||||
$old = "var _AMBRE_PUBLIC_PATHS = ['/wevia.html', '/wevia', '/', '/index.html', '/consent.html', '/mirofish.html'];";
|
||||
$new = "var _AMBRE_PUBLIC_PATHS = ['/wevia.html', '/wevia', '/', '/index.html', '/consent.html', '/mirofish.html', '/wevia-widget.html', '/wevia-widget', '/register.html', '/register', '/login', '/login.html'];";
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"PUBLIC_PATHS pattern not found"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Also add iframe detection → if we are in an iframe on a public parent → skip dock
|
||||
$ext1 = " // === END AMBRE-V1-PUBLIC-GUARD ===";
|
||||
$ext2 = " // === END AMBRE-V1-PUBLIC-GUARD ===
|
||||
|
||||
// === AMBRE-V2-IFRAME-GUARD 2026-04-22 · skip dock if embedded in iframe (public widget context) ===
|
||||
try {
|
||||
if (window.self !== window.top) {
|
||||
// Running inside iframe - public widget context - DO NOT render dock
|
||||
return;
|
||||
}
|
||||
} catch(e) {
|
||||
// Cross-origin access error means we ARE in iframe - skip
|
||||
return;
|
||||
}
|
||||
// === END AMBRE-V2-IFRAME-GUARD ===";
|
||||
|
||||
$c = str_replace($old, $new, $c);
|
||||
$c = str_replace($ext1, $ext2, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wtp-unified-dock.GOLD-" . date("Ymd-His") . "-wave262-widget-guard";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
14
api/ambre-dock-read.php
Normal file
14
api/ambre-dock-read.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$f = "/var/www/html/wtp-unified-dock.js";
|
||||
if (file_exists($f)) {
|
||||
echo "=== wtp-unified-dock.js (first 2000 chars) ===\n";
|
||||
echo substr(@file_get_contents($f), 0, 2500);
|
||||
echo "\n\n=== Size: " . filesize($f) . "B ===\n";
|
||||
// Find what paths show the dock
|
||||
$c = @file_get_contents($f);
|
||||
if (preg_match_all("/(pub|pathname|location|private|internal|allow|deny)[^\n]{0,200}/i", $c, $m)) {
|
||||
echo "\n=== path/pathname occurrences ===\n";
|
||||
foreach (array_slice($m[0], 0, 10) as $o) echo " $o\n";
|
||||
}
|
||||
}
|
||||
8
api/ambre-doctrine-113.php
Normal file
8
api/ambre-doctrine-113.php
Normal file
File diff suppressed because one or more lines are too long
21
api/ambre-export-v48.php
Normal file
21
api/ambre-export-v48.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dst = "/var/www/html/generated";
|
||||
$out = ["copied"=>[]];
|
||||
foreach (glob("$src/v48-*.png") as $s) {
|
||||
$bn = "wevia-v48-showcase-" . basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
$video_dir = glob("$src/v48-*chromium");
|
||||
if ($video_dir) {
|
||||
$vids = glob($video_dir[0] . "/video.webm");
|
||||
if ($vids) {
|
||||
$dv = "$dst/wevia-v48-showcase-" . date("Ymd-His") . ".webm";
|
||||
@copy($vids[0], $dv);
|
||||
@chmod($dv, 0644);
|
||||
$out["video"] = ["url"=>"/generated/".basename($dv), "size_mb"=>round(filesize($dv)/1024/1024, 2)];
|
||||
}
|
||||
}
|
||||
echo json_encode($out, JSON_UNESCAPED_SLASHES);
|
||||
11
api/ambre-export-v50.php
Normal file
11
api/ambre-export-v50.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dst = "/var/www/html/generated";
|
||||
$out = ["copied"=>[]];
|
||||
foreach (glob("$src/v50-*.png") as $s) {
|
||||
$bn = "wevia-v50-shield-" . basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
echo json_encode($out, JSON_UNESCAPED_SLASHES);
|
||||
27
api/ambre-ext-probe.php
Normal file
27
api/ambre-ext-probe.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Ollama models available
|
||||
$ol = @file_get_contents("http://127.0.0.1:11434/api/tags", false, stream_context_create(["http"=>["timeout"=>3]]));
|
||||
$od = @json_decode($ol, true);
|
||||
$out["ollama_models"] = is_array($od) ? array_map(function($m){return $m["name"];}, $od["models"] ?? []) : [];
|
||||
|
||||
// Paperclip health/API
|
||||
$pc = @file_get_contents("http://127.0.0.1:3201/", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out["paperclip_first"] = substr($pc ?? "", 0, 200);
|
||||
|
||||
// DeerFlow api probe
|
||||
$df = @file_get_contents("http://127.0.0.1:3002/api/health", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out["deerflow_health"] = substr($df ?? "", 0, 150);
|
||||
|
||||
// Cascade providers health (all 13)
|
||||
$ch = @file_get_contents("http://127.0.0.1:4000/health", false, stream_context_create(["http"=>["timeout"=>3]]));
|
||||
$cd = @json_decode($ch, true);
|
||||
$out["cascade_providers"] = is_array($cd) ? ($cd["providers"] ?? $cd) : $ch;
|
||||
|
||||
// L99 (S95 arsenal) probe
|
||||
$l99 = @file_get_contents("http://127.0.0.1:5890/api/l99-health.php", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out["l99_health"] = substr($l99 ?? "", 0, 150);
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
29
api/ambre-find-mermaid.php
Normal file
29
api/ambre-find-mermaid.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Look for the Result/Resultat etape 5 rendering in V5-CLAUDE-PATTERN (now V5-WEVIA-PATTERN)
|
||||
// Find where the result appears
|
||||
$pos = strpos($c, "Resultat");
|
||||
while ($pos !== false) {
|
||||
$ctx = substr($c, max(0, $pos - 100), 600);
|
||||
if (strpos($ctx, "schema") !== false || strpos($ctx, "Mermaid") !== false || strpos($ctx, "mermaid") !== false) {
|
||||
echo "=== Context at $pos ===\n";
|
||||
echo $ctx;
|
||||
echo "\n\n---\n";
|
||||
}
|
||||
$pos = strpos($c, "Resultat", $pos + 1);
|
||||
}
|
||||
|
||||
// Find how the final SVG is supposed to render
|
||||
echo "\n\n=== Search mermaid.render in wevia.html ===\n";
|
||||
if (preg_match_all('/mermaid\.render\([^)]+\)/', $c, $m)) {
|
||||
foreach (array_slice($m[0], 0, 5) as $match) echo " $match\n";
|
||||
}
|
||||
|
||||
// Find the Schema rendering fct
|
||||
echo "\n=== Search Schema Mermaid rendering code ===\n";
|
||||
$pos = strpos($c, "Schema Mermaid:");
|
||||
if ($pos !== false) {
|
||||
echo substr($c, max(0, $pos - 200), 800);
|
||||
}
|
||||
21
api/ambre-find-panel.php
Normal file
21
api/ambre-find-panel.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia-widget.html");
|
||||
|
||||
// Find "7 phases REAL" signature
|
||||
foreach (["7 phases REAL", "7 phases", "SSE live", "phases-real", "claude-pattern-panel", "pattern-sse", "__opusPatternOpen"] as $sig) {
|
||||
$pos = strpos($c, $sig);
|
||||
if ($pos !== false) {
|
||||
echo "=== Found '$sig' at $pos ===\n";
|
||||
echo substr($c, max(0, $pos - 300), 600);
|
||||
echo "\n\n---\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find backend=wevia-widget context
|
||||
$pos2 = strpos($c, "backend");
|
||||
if ($pos2 !== false) {
|
||||
echo "\n=== backend ctx ===\n";
|
||||
echo substr($c, max(0, $pos2 - 200), 500);
|
||||
}
|
||||
28
api/ambre-find-result.php
Normal file
28
api/ambre-find-result.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find how the result payload is handled in SSE (type === "result")
|
||||
$pos = strpos($c, "type === 'result'");
|
||||
while ($pos !== false && $pos < 250000) {
|
||||
echo "=== Position $pos ===\n";
|
||||
echo substr($c, $pos, 800);
|
||||
echo "\n\n---\n";
|
||||
$pos = strpos($c, "type === 'result'", $pos + 10);
|
||||
if ($pos > strpos($c, "type === 'result'") + 100) break;
|
||||
}
|
||||
// Also check the 'schema' output handling
|
||||
$pos2 = strpos($c, "Schema Mermaid");
|
||||
echo "\n\n=== Schema Mermaid: $pos2 ===\n";
|
||||
if ($pos2 !== false) echo substr($c, max(0, $pos2 - 500), 1200);
|
||||
|
||||
// Check if the result step handles mermaid_code field
|
||||
echo "\n\n=== Look for mermaid_code field handler ===\n";
|
||||
if (preg_match_all('/mermaid_code[^,;]{0,300}/', $c, $m)) {
|
||||
foreach (array_slice($m[0], 0, 5) as $match) echo " " . substr($match, 0, 200) . "\n";
|
||||
}
|
||||
|
||||
// Also Resultat phase 5/5 rendering
|
||||
$pos3 = strpos($c, "Resultat");
|
||||
echo "\n\n=== Resultat: $pos3 ===\n";
|
||||
if ($pos3 !== false) echo substr($c, max(0, $pos3 - 100), 900);
|
||||
28
api/ambre-find-result2.php
Normal file
28
api/ambre-find-result2.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find "Resultat" encoded
|
||||
echo "=== Stage 5/5 result patterns ===\n";
|
||||
foreach (["'result'", "\"result\"", "R\u00e9sultat", "Schema Mermaid", "phase.*result", "etape.*5"] as $pat) {
|
||||
if (preg_match_all("/$pat/", $c, $m, PREG_OFFSET_CAPTURE)) {
|
||||
echo " '$pat' matches at: ";
|
||||
foreach (array_slice($m[0], 0, 3) as $hit) echo $hit[1] . " ";
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Find the SSE result handler code
|
||||
$pos = strpos($c, "type === 'result'");
|
||||
if ($pos === false) $pos = strpos($c, "type=='result'");
|
||||
if ($pos === false) $pos = strpos($c, "=== \"result\"");
|
||||
echo "\n=== result type at: $pos ===\n";
|
||||
if ($pos !== false) {
|
||||
echo substr($c, $pos, 1200);
|
||||
}
|
||||
|
||||
// Also search the output_data or schema_url handling
|
||||
echo "\n\n=== schema_url / output_data ===\n";
|
||||
if (preg_match_all('/schema_url|output_data|schema_content/', $c, $m)) {
|
||||
foreach ($m[0] as $match) echo " $match\n";
|
||||
}
|
||||
29
api/ambre-leak-find.php
Normal file
29
api/ambre-leak-find.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$w = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find the Claude Pattern panel HTML source
|
||||
$pos = strpos($w, "Claude Pattern");
|
||||
if ($pos !== false) {
|
||||
echo "=== wevia.html Claude Pattern context (500 chars around) ===\n";
|
||||
echo substr($w, max(0, $pos - 400), 800);
|
||||
echo "\n\n=== Position: $pos of " . strlen($w) . " ===\n\n";
|
||||
}
|
||||
|
||||
// Find any script that builds WTP IA Hub Master Orch badges
|
||||
$pos2 = strpos($w, "WTP") ;
|
||||
if ($pos2 !== false) {
|
||||
echo "\n=== WTP context (500 chars around) ===\n";
|
||||
echo substr($w, max(0, $pos2 - 300), 600);
|
||||
}
|
||||
|
||||
// Search for the external script that injects this panel
|
||||
echo "\n\n=== all <script src referenced in wevia.html ===\n";
|
||||
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $w, $m);
|
||||
foreach (array_unique($m[1] ?? []) as $s) echo " $s\n";
|
||||
|
||||
// Root index
|
||||
echo "\n=== index.html root - check for same panel sources ===\n";
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $root, $m2);
|
||||
foreach (array_unique($m2[1] ?? []) as $s) echo " $s\n";
|
||||
46
api/ambre-leak-scan.php
Normal file
46
api/ambre-leak-scan.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Check / root index widget + /wevia public
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
$out["root"] = [
|
||||
"size" => strlen($root ?? ""),
|
||||
"has_claude_pattern" => preg_match_all("/Claude\s*Pattern/i", $root ?? ""),
|
||||
"has_wtp_admin_ia_hub_master_orch" => preg_match_all("/\b(WTP|IA Hub|Master|Orch|WevCode|Arena|Droid|Admin|WEVIA Engine)\b/", $root ?? ""),
|
||||
"has_chattbot_modules" => preg_match_all("/nx-badge|claude-pattern|chat-modules/i", $root ?? ""),
|
||||
];
|
||||
|
||||
// Check wevia.html (public /wevia)
|
||||
$wevia = @file_get_contents("/var/www/html/wevia.html");
|
||||
$out["wevia_public"] = [
|
||||
"size" => strlen($wevia ?? ""),
|
||||
"has_claude_pattern_text" => preg_match_all("/Claude\s*Pattern/i", $wevia ?? ""),
|
||||
"has_internal_shortcuts" => preg_match_all("/\b(WTP|IA Hub|Master|Orch|WevCode|Arena|Droid|Admin|WEVIA Engine)\b/", $wevia ?? ""),
|
||||
"has_dashboards_shortcut" => strpos($wevia ?? "", "Dashboards") !== false,
|
||||
];
|
||||
|
||||
// Find the HTML source rendering Claude Pattern + WTP/Hub/Master badges
|
||||
// Most likely a panel in bottom-right of pages
|
||||
$out["sources_with_claude_pattern"] = [];
|
||||
foreach (glob("/var/www/html/*.html") as $f) {
|
||||
$c = @file_get_contents($f);
|
||||
if (preg_match("/Claude\s*Pattern/i", $c) || (strpos($c, "WTP") !== false && strpos($c, "Droid") !== false && strpos($c, "Orch") !== false)) {
|
||||
$out["sources_with_claude_pattern"][] = [
|
||||
"file" => basename($f),
|
||||
"size" => filesize($f),
|
||||
"has_claude_p" => (bool)preg_match("/Claude\s*Pattern/i", $c),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Also check JS files
|
||||
$out["js_with_claude_pattern"] = [];
|
||||
foreach (array_merge(glob("/var/www/html/js/*.js") ?: [], glob("/var/www/html/api/*.js") ?: []) as $f) {
|
||||
$c = @file_get_contents($f);
|
||||
if (preg_match("/Claude\s*Pattern/i", $c)) {
|
||||
$out["js_with_claude_pattern"][] = ["file"=>str_replace("/var/www/html", "", $f), "size"=>filesize($f)];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
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),
|
||||
]);
|
||||
213
api/ambre-multiagent-v2-external.php
Normal file
213
api/ambre-multiagent-v2-external.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-multiagent-v2-external.php · wave-260
|
||||
* MAX parallelism mobilisant IA EXTERNES + internes
|
||||
* Agents peuvent être : cascade fast | cascade think | ollama local | tool natif
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
header("Cache-Control: no-store, no-cache");
|
||||
header("CDN-Cache-Control: no-store");
|
||||
set_time_limit(120);
|
||||
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST;
|
||||
$goal = trim($in["goal"] ?? $in["message"] ?? "");
|
||||
$max_agents = min(12, max(2, intval($in["max_agents"] ?? 6)));
|
||||
|
||||
if (!$goal) { echo json_encode(["error"=>"goal required"]); exit; }
|
||||
|
||||
$t0 = microtime(true);
|
||||
|
||||
// PLAN with richer agent diversity
|
||||
$plan_sys = "Tu es un planificateur multi-agent WEVAL. Pour l'objectif donné, génère UN JSON STRICT :\n" .
|
||||
"{\n" .
|
||||
' "objective": "<reformulation>",' . "\n" .
|
||||
' "agents": [' . "\n" .
|
||||
' {"role":"<nom>", "task":"<tâche autonome>", "tool":"<type>", "model_hint":"<fast|think|ollama|tool_spec>"},' . "\n" .
|
||||
" ...\n" .
|
||||
" ]\n" .
|
||||
"}\n" .
|
||||
"Tools disponibles:\n" .
|
||||
"- llm_fast (Cerebras/Groq rapide)\n" .
|
||||
"- llm_think (Cerebras think raisonnement profond)\n" .
|
||||
"- llm_ollama (local qwen3/llama3.2 souverain)\n" .
|
||||
"- pdf_premium (génère PDF 5 pages)\n" .
|
||||
"- mermaid (diagramme SVG)\n" .
|
||||
"- web_search (recherche web)\n" .
|
||||
"- kb_search (mémoire partagée)\n" .
|
||||
"- calc (calcul)\n" .
|
||||
"Max $max_agents agents · roles variés · tools diversifiés pour parallélisme optimal.";
|
||||
|
||||
$plan_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"=>$plan_sys],["role"=>"user","content"=>"Objectif: $goal"]],"max_tokens"=>1000,"temperature"=>0.4]),
|
||||
"timeout"=>25],
|
||||
]));
|
||||
$pd = @json_decode($plan_raw, true);
|
||||
$pt = $pd["choices"][0]["message"]["content"] ?? "";
|
||||
$pt = preg_replace('/^```(?:json)?\s*/m', '', $pt);
|
||||
$pt = preg_replace('/\s*```\s*$/m', '', trim($pt));
|
||||
$plan = @json_decode($pt, true);
|
||||
|
||||
if (!$plan || !isset($plan["agents"])) {
|
||||
echo json_encode(["error"=>"plan invalid", "raw"=>substr($pt, 0, 400)]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$plan_ms = round((microtime(true)-$t0)*1000);
|
||||
|
||||
// EXECUTE
|
||||
$agents = array_slice($plan["agents"], 0, $max_agents);
|
||||
$mh = curl_multi_init();
|
||||
$handles = [];
|
||||
|
||||
foreach ($agents as $i => $agent) {
|
||||
$tool = strtolower($agent["tool"] ?? "llm_fast");
|
||||
$task = $agent["task"] ?? "";
|
||||
$ch = curl_init();
|
||||
|
||||
if ($tool === "llm_ollama") {
|
||||
// Ollama LOCAL sovereign (qwen3:4b fastest)
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1:11434/api/generate",
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["model"=>"qwen3:4b","prompt"=>$task,"stream"=>false,"options"=>["num_predict"=>400]]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "llm_think") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions",
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["model"=>"think","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>500]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 45, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "pdf_premium") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-pdf-premium.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 50, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "mermaid") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-mermaid.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "web_search") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-web-search.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["query"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "kb_search") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-mermaid-learn.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["action"=>"search","query"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "calc") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-calc.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["expression"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} else {
|
||||
// default = llm_fast (Cerebras)
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>400]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
$tool = "llm_fast";
|
||||
}
|
||||
|
||||
curl_multi_add_handle($mh, $ch);
|
||||
$handles[$i] = ["ch"=>$ch, "agent"=>$agent, "tool_used"=>$tool, "t0"=>microtime(true)];
|
||||
}
|
||||
|
||||
$exec_t0 = microtime(true);
|
||||
$running = null;
|
||||
do { curl_multi_exec($mh, $running); curl_multi_select($mh, 0.5); } while ($running > 0);
|
||||
|
||||
$results = [];
|
||||
foreach ($handles as $i => $h) {
|
||||
$output = curl_multi_getcontent($h["ch"]);
|
||||
$http = curl_getinfo($h["ch"], CURLINFO_HTTP_CODE);
|
||||
$ems = round((microtime(true)-$h["t0"])*1000);
|
||||
curl_multi_remove_handle($mh, $h["ch"]);
|
||||
curl_close($h["ch"]);
|
||||
|
||||
$d = @json_decode($output, true);
|
||||
$summary = "";
|
||||
if ($d) {
|
||||
if (isset($d["mermaid_code"])) $summary = "📊 Mermaid " . strlen($d["mermaid_code"]) . "B · source=" . ($d["source"] ?? "?");
|
||||
elseif (isset($d["url"])) $summary = "📄 " . $d["url"] . " · " . ($d["size_kb"] ?? "?") . "KB";
|
||||
elseif (isset($d["choices"][0]["message"]["content"])) $summary = substr($d["choices"][0]["message"]["content"], 0, 350);
|
||||
elseif (isset($d["response"])) $summary = substr($d["response"], 0, 350);
|
||||
elseif (isset($d["answer"])) $summary = substr($d["answer"], 0, 350);
|
||||
elseif (isset($d["result"])) $summary = (string)$d["result"];
|
||||
else $summary = substr($output, 0, 200);
|
||||
} else $summary = substr($output ?: "empty", 0, 200);
|
||||
|
||||
$results[] = [
|
||||
"agent" => $h["agent"]["role"] ?? "agent_$i",
|
||||
"task" => $h["agent"]["task"] ?? "",
|
||||
"tool" => $h["tool_used"],
|
||||
"http" => $http,
|
||||
"elapsed_ms" => $ems,
|
||||
"summary" => $summary,
|
||||
];
|
||||
}
|
||||
curl_multi_close($mh);
|
||||
$exec_ms = round((microtime(true)-$exec_t0)*1000);
|
||||
|
||||
// RECONCILE via Groq (souverain non-Cerebras pour diversité)
|
||||
$synth_input = "Objectif: $goal\n\nRésultats " . count($results) . " agents :\n";
|
||||
foreach ($results as $r) {
|
||||
$synth_input .= "• " . $r["agent"] . " (tool=" . $r["tool"] . ", " . $r["elapsed_ms"] . "ms): " . substr($r["summary"], 0, 250) . "\n";
|
||||
}
|
||||
$synth_input .= "\nProduis une synthèse finale en français, structurée, actionnable. Max 300 mots.";
|
||||
|
||||
$synth_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"=>"user","content"=>$synth_input]],"max_tokens"=>600]),
|
||||
"timeout"=>20],
|
||||
]));
|
||||
$sd = @json_decode($synth_raw, true);
|
||||
$reconciled = $sd["choices"][0]["message"]["content"] ?? "synthèse échouée";
|
||||
|
||||
// Register in learning pool
|
||||
$shared_kb_file = "/opt/wevads/internal-memory/_shared-learning.json";
|
||||
$shared_kb = @json_decode(@file_get_contents($shared_kb_file), true) ?: [];
|
||||
$shared_kb[] = [
|
||||
"ts" => time(), "source" => "multiagent-v2",
|
||||
"topic" => $plan["objective"] ?? $goal,
|
||||
"synthesis_preview" => substr($reconciled, 0, 300),
|
||||
"agents" => count($results),
|
||||
];
|
||||
if (count($shared_kb) > 500) $shared_kb = array_slice($shared_kb, -500);
|
||||
@file_put_contents($shared_kb_file, json_encode($shared_kb, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"goal" => $goal,
|
||||
"plan" => $plan,
|
||||
"plan_ms" => $plan_ms,
|
||||
"results" => $results,
|
||||
"exec_ms" => $exec_ms,
|
||||
"parallel_speedup" => round(array_sum(array_column($results, "elapsed_ms")) / max($exec_ms, 1), 2),
|
||||
"reconciled" => trim($reconciled),
|
||||
"total_ms" => round((microtime(true)-$t0)*1000),
|
||||
"agents_count" => count($results),
|
||||
"tools_diversity" => count(array_unique(array_column($results, "tool"))),
|
||||
"provider" => "WEVIA Multi-Agent V2 · external IA dispatch · wave-260",
|
||||
"shared_kb_size" => count($shared_kb),
|
||||
], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
|
||||
@@ -59,18 +59,18 @@
|
||||
},
|
||||
"suites": [
|
||||
{
|
||||
"title": "v47-widget.spec.js",
|
||||
"file": "v47-widget.spec.js",
|
||||
"title": "v55-scroll.spec.js",
|
||||
"file": "v55-scroll.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V47 · Universal chat widget on all-ia-hub",
|
||||
"title": "V55 · scroll to see mermaid SVG",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
{
|
||||
"timeout": 60000,
|
||||
"timeout": 90000,
|
||||
"annotations": [],
|
||||
"expectedStatus": "passed",
|
||||
"projectId": "chromium",
|
||||
@@ -80,36 +80,27 @@
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 35410,
|
||||
"duration": 15641,
|
||||
"errors": [],
|
||||
"stdout": [
|
||||
{
|
||||
"text": "Widget button count: 1\n"
|
||||
},
|
||||
{
|
||||
"text": "Response: Bonjour ! Je suis désolé, mais je ne peux pas accéder à votre `chat_id` directement. Ce genre d'information dépend de la plateforme ou du système dans lequel nous interagissons (comme une API, une application, ou un service interne).\n\nSi vous utilisez un service WEVAL Consulting connecté à un système de gestion des conversations, je peux vous aider à le retrouver ou à le générer — pour cela, pourr\n"
|
||||
},
|
||||
{
|
||||
"text": "Turns: 2\n"
|
||||
},
|
||||
{
|
||||
"text": "Multi-agent mode triggered: true in 24.1s\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-22T03:12:24.466Z",
|
||||
"startTime": "2026-04-22T09:07:39.425Z",
|
||||
"annotations": [],
|
||||
"attachments": [
|
||||
{
|
||||
"name": "screenshot",
|
||||
"contentType": "image/png",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v47-widget-V47-·-Universal-chat-widget-on-all-ia-hub-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/v47-widget-V47-·-Universal-chat-widget-on-all-ia-hub-chromium/video.webm"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -117,8 +108,8 @@
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "59fd77abc000aff557d3-1aa334e6a3d56f78c672",
|
||||
"file": "v47-widget.spec.js",
|
||||
"id": "a80a3706a9346f0b6665-b8967c5b4350315cdbe0",
|
||||
"file": "v55-scroll.spec.js",
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
@@ -127,8 +118,8 @@
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-22T03:12:23.770Z",
|
||||
"duration": 36288.549999999996,
|
||||
"startTime": "2026-04-22T09:07:38.817Z",
|
||||
"duration": 16424.367,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 242 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,65 +0,0 @@
|
||||
const { test } = require("@playwright/test");
|
||||
|
||||
test("V47 · Universal chat widget on all-ia-hub", async ({ page }) => {
|
||||
test.setTimeout(60000);
|
||||
|
||||
await page.goto("/all-ia-hub.html?cb=" + Date.now());
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// Check button present
|
||||
const btn = await page.locator(".amw-btn").count();
|
||||
console.log(`Widget button count: ${btn}`);
|
||||
|
||||
if (btn > 0) {
|
||||
await page.screenshot({ path: "output/v47-00-initial.png" });
|
||||
|
||||
// Click to open panel
|
||||
await page.locator(".amw-btn").click();
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: "output/v47-01-opened.png" });
|
||||
|
||||
// Send a message
|
||||
await page.locator("#amwInput").fill("Bonjour, quel est mon chat_id ?");
|
||||
await page.waitForTimeout(300);
|
||||
await page.locator("#amwSend").click();
|
||||
|
||||
// Wait for response
|
||||
const ws = Date.now();
|
||||
while (Date.now() - ws < 30000) {
|
||||
const msgs = await page.locator(".amw-msg.a").count();
|
||||
if (msgs > 1) break; // We need at least greeting + response
|
||||
await page.waitForTimeout(1000);
|
||||
}
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: "output/v47-02-chat.png", fullPage: false });
|
||||
|
||||
// Get last message text
|
||||
const txt = await page.locator(".amw-msg.a").last().innerText();
|
||||
console.log(`Response: ${txt.substring(0, 400)}`);
|
||||
|
||||
// Check turns counter
|
||||
const turns = await page.locator("#amwTurns").innerText();
|
||||
console.log(`Turns: ${turns}`);
|
||||
|
||||
// Test multi-agent
|
||||
await page.locator("#amwInput").fill("fais une analyse complete du marche IA 2026");
|
||||
await page.waitForTimeout(300);
|
||||
await page.locator("#amwSend").click();
|
||||
|
||||
const ws2 = Date.now();
|
||||
let found = false;
|
||||
while (Date.now() - ws2 < 90000) {
|
||||
const ma = await page.locator(".amw-msg.a.ma").count();
|
||||
if (ma > 0) { found = true; break; }
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
console.log(`Multi-agent mode triggered: ${found} in ${((Date.now()-ws2)/1000).toFixed(1)}s`);
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: "output/v47-03-multiagent.png", fullPage: false });
|
||||
|
||||
} else {
|
||||
console.log("❌ Widget button not found");
|
||||
await page.screenshot({ path: "output/v47-nowidget.png", fullPage: true });
|
||||
}
|
||||
});
|
||||
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();
|
||||
})();
|
||||
7
api/ambre-pw-v48-deploy.php
Normal file
7
api/ambre-pw-v48-deploy.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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDggwrcgU0hPV0NBU0Ugwrcgd2lkZ2V0IG9uIGFsbC1pYS1odWIgKyA2IGFnZW50cyBtdWx0aSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCgxODAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL2FsbC1pYS1odWIuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgY29uc3QgYnRuID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LWJ0biIpLmNvdW50KCk7CiAgaWYgKGJ0biA9PT0gMCkgeyBjb25zb2xlLmxvZygibm8gd2lkZ2V0Iik7IHJldHVybjsgfQogIAogIGF3YWl0IHBhZ2UubG9jYXRvcigiLmFtdy1idG4iKS5jbGljaygpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDgtMDEtb3Blbi5wbmciIH0pOwogIAogIC8vIFNlbmQgbXVsdGktYWdlbnQgcmVxdWVzdCAtIGV4cGxvaXRzIFYyIGRpdmVyc2l0eQogIGF3YWl0IHBhZ2UubG9jYXRvcigiI2Ftd0lucHV0IikuZmlsbCgiZmFpcyBtb2kgdW5lIGFuYWx5c2UgY29tcGxldGUgZHUgbWFyY2jDqSBJQSBzb3V2ZXJhaW5lIDIwMjYgYXZlYyBhZ2VudHMgZXh0ZXJuZXMgZGl2ZXJzaWZpZXMiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDMwMCk7CiAgYXdhaXQgcGFnZS5sb2NhdG9yKCIjYW13U2VuZCIpLmNsaWNrKCk7CiAgY29uc29sZS5sb2coIlNlbnQgbXVsdGktYWdlbnQgcmVxdWVzdCIpOwogIAogIC8vIFdhaXQgZm9yIG11bHRpLWFnZW50IGJhZGdlCiAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCAxMjAwMDApIHsKICAgIGNvbnN0IG1hID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LW1zZy5hLm1hIikuY291bnQoKTsKICAgIGlmIChtYSA+IDApIGJyZWFrOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgY29uc3QgZWwgPSAoKERhdGUubm93KCktd3MpLzEwMDApLnRvRml4ZWQoMSk7CiAgY29uc29sZS5sb2coYE11bHRpLWFnZW50IGluICR7ZWx9c2ApOwogIAogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDgtMDItbXVsdGkucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIAogIC8vIFNjcm9sbCB0byBzZWUgYWxsIHN5bnRoCiAgY29uc3QgcGFuZWwgPSBwYWdlLmxvY2F0b3IoIi5hbXctYm9keSIpOwogIGF3YWl0IHBhbmVsLmV2YWx1YXRlKGVsID0+IGVsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodCk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg1MDApOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQ4LTAzLXN5bnRoLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBHZXQgbGFzdCBtc2cgbWV0YQogIGNvbnN0IG1ldGEgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGxhc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYW13LW1zZy5hLm1hIik7CiAgICBpZiAobGFzdC5sZW5ndGggPT09IDApIHJldHVybiB7dHVybnM6IDB9OwogICAgY29uc3QgbCA9IGxhc3RbbGFzdC5sZW5ndGgtMV07CiAgICByZXR1cm4gewogICAgICB0ZXh0OiBsLmlubmVyVGV4dC5zdWJzdHJpbmcoMCwgNDAwKSwKICAgICAgbWV0YTogbC5xdWVyeVNlbGVjdG9yKCIubWV0YSIpPy5pbm5lclRleHQgfHwgIiIsCiAgICAgIHR1cm5zOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW13VHVybnMiKT8uaW5uZXJUZXh0IHx8ICI/IiwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coYFxuTWV0YTogJHttZXRhLm1ldGF9YCk7CiAgY29uc29sZS5sb2coYFR1cm5zIHRvdGFsOiAke21ldGEudHVybnN9YCk7CiAgY29uc29sZS5sb2coYFRleHQ6ICR7bWV0YS50ZXh0fWApOwp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v48-showcase.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v49-deploy.php
Normal file
7
api/ambre-pw-v49-deploy.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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDkgwrcgU2NhbiBwdWJsaWMgbGVha3Mgb24gLyBhbmQgL3dldmlhLmh0bWwiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIFNjYW4gLwogIGF3YWl0IHBhZ2UuZ290bygiLz9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgY29uc3Qgcm9vdExlYWtzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZCo9Im9wdXMiXSwgW2lkKj0icGF0dGVybiJdLCBbaWQqPSJkb2NrIl0sIFtpZCo9InhsaW5rcyJdLCBbaWQqPSJ4bmF2Il0nKSk7CiAgICByZXR1cm4gaWRzLm1hcChlbCA9PiAoewogICAgICBpZDogZWwuaWQsCiAgICAgIHRhZzogZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICB0ZXh0OiAoZWwuaW5uZXJUZXh0IHx8ICIiKS5zdWJzdHJpbmcoMCwgMjAwKSwKICAgICAgcG9zaXRpb246IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wb3NpdGlvbiwKICAgICAgdmlzaWJsZTogZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsLAogICAgfSkpOwogIH0pOwogIGNvbnNvbGUubG9nKCJST09UIC8gbGVha3M6IiwgSlNPTi5zdHJpbmdpZnkocm9vdExlYWtzLCBudWxsLCAyKSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDktMDEtcm9vdC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgCiAgLy8gU2NhbiAvd2V2aWEuaHRtbAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2Uud2FpdEZvckxvYWRTdGF0ZSgibmV0d29ya2lkbGUiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDMwMDApOwogIAogIGNvbnN0IHdldmlhTGVha3MgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGlkcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkKj0ib3B1cyJdLCBbaWQqPSJwYXR0ZXJuIl0sIFtpZCo9ImRvY2siXSwgW2lkKj0ieGxpbmtzIl0sIFtpZCo9InhuYXYiXSwgW2lkKj0idWRvY2siXScpKTsKICAgIGNvbnN0IG91dCA9IGlkcy5tYXAoZWwgPT4gKHsKICAgICAgaWQ6IGVsLmlkLAogICAgICB0YWc6IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwKICAgICAgdGV4dDogKGVsLmlubmVyVGV4dCB8fCAiIikuc3Vic3RyaW5nKDAsIDIwMCksCiAgICAgIHZpc2libGU6IGVsLm9mZnNldFBhcmVudCAhPT0gbnVsbCwKICAgIH0pKTsKICAgIC8vIEFsc28gbG9vayBmb3IgIkNsYXVkZSBQYXR0ZXJuIiB0ZXh0IGFueXdoZXJlIHZpc2libGUKICAgIGNvbnN0IGJvZHlUZXh0ID0gZG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CiAgICBjb25zdCBoYXNfY2xhdWRlX3AgPSAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYm9keVRleHQpOwogICAgY29uc3QgaGFzX2FkbWluX2JhZGdlID0gL1xiQWRtaW5cYi9pLnRlc3QoYm9keVRleHQpICYmIC9cYkRyb2lkXGIvaS50ZXN0KGJvZHlUZXh0KTsKICAgIHJldHVybiB7IGVsZW1lbnRzOiBvdXQsIGhhc19jbGF1ZGVfcGF0dGVybl92aXNpYmxlOiBoYXNfY2xhdWRlX3AsIGhhc19hZG1pbl9kcm9pZDogaGFzX2FkbWluX2JhZGdlIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlxuV0VWSUEgcHVibGljIGxlYWtzOiIsIEpTT04uc3RyaW5naWZ5KHdldmlhTGVha3MsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0OS0wMi13ZXZpYS5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v49-leaks.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v50-deploy.php
Normal file
7
api/ambre-pw-v50-deploy.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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTAgwrcgUFJPT0Ygc2hpZWxkIHJlbW92ZXMgbGVha3Mgb24gcHVibGljIHBhZ2VzIiwgYXN5bmMgKHsgcGFnZSB9KSA9PiB7CiAgdGVzdC5zZXRUaW1lb3V0KDYwMDAwKTsKICBjb25zdCBsb2dzID0gW107CiAgcGFnZS5vbigiY29uc29sZSIsIG0gPT4gbG9ncy5wdXNoKG0udGV4dCgpLnN1YnN0cmluZygwLCAxNTApKSk7CiAgCiAgLy8gVGVzdCAvCiAgYXdhaXQgcGFnZS5nb3RvKCIvP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCByb290U3RhdGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGJvZHlUZXh0ID0gZG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CiAgICByZXR1cm4gewogICAgICBzaXplOiBkb2N1bWVudC5ib2R5LmlubmVySFRNTC5sZW5ndGgsCiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgaGFzX3d0cF9kb2NrX3Zpc2libGU6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkKj0iZG9jayJdLCBbaWQqPSJ4bGlua3MiXSwgW2lkKj0ieG5hdiJdJykpLnNvbWUoZWwgPT4gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsICYmIC93dHB8ZHJvaWR8YWRtaW4vaS50ZXN0KGVsLmlubmVyVGV4dCkpLAogICAgICBoYXNfZGFzaGJvYXJkc19maXhlZDogQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjb3B1cy1kYXNoYm9hcmQtbGluaywgW2lkKj0iZGFzaGJvYXJkLWVudHJ5Il0nKSkuc29tZShlbCA9PiBlbC5vZmZzZXRQYXJlbnQgIT09IG51bGwpLAogICAgICBzaGllbGRfbG9hZGVkOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWJyZS1jb25maWRlbnRpYWwtc2hpZWxkJyksCiAgICAgIHZpc2libGVfZml4ZWRfaW50ZXJuYWw6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmKj0id2V2YWwtdGVjaG5vbG9neS1wbGF0Zm9ybSJdLCBhW2hyZWYqPSJ3ZXZpYS1tYXN0ZXIiXSwgYVtocmVmKj0iYWxsLWlhLWh1YiJdJykpCiAgICAgICAgICAuZmlsdGVyKGEgPT4gewogICAgICAgICAgICB2YXIgcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpOwogICAgICAgICAgICByZXR1cm4gcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyAmJiBhLm9mZnNldFBhcmVudCAhPT0gbnVsbDsKICAgICAgICAgIH0pLmxlbmd0aCwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlJPT1QgLyBzdGF0ZToiLCBKU09OLnN0cmluZ2lmeShyb290U3RhdGUsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MC0wMS1yb290LnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBUZXN0IC93ZXZpYS5odG1sCiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2aWEuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzUwMCk7CiAgCiAgY29uc3Qgd2V2aWFTdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybl90ZXh0OiAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYm9keVRleHQpLAogICAgICBvcHVzX3BhdHRlcm5fYmFkZ2VfdmlzaWJsZTogKGZ1bmN0aW9uKCl7IHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tYmFkZ2UnKTsgcmV0dXJuIGVsID8gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsIDogZmFsc2U7IH0pKCksCiAgICAgIG9wdXNfcGF0dGVybl9zdHlsZV9wcmVzZW50OiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tc3R5bGUnKSwKICAgICAgc2hpZWxkX2xvYWRlZDogISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW1icmUtY29uZmlkZW50aWFsLXNoaWVsZCcpLAogICAgfTsKICB9KTsKICBjb25zb2xlLmxvZygiXG5XRVZJQSAvd2V2aWEuaHRtbCBzdGF0ZToiLCBKU09OLnN0cmluZ2lmeSh3ZXZpYVN0YXRlLCBudWxsLCAyKSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTAtMDItd2V2aWEucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIAogIC8vIFNoaWVsZCBjb25zb2xlIGxvZ3MKICBjb25zdCBzaGllbGRMb2dzID0gbG9ncy5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCdzaGllbGQnKSk7CiAgY29uc29sZS5sb2coIlxuU2hpZWxkIGxvZ3M6Iiwgc2hpZWxkTG9ncyk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v50-shield.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v51-deploy.php
Normal file
7
api/ambre-pw-v51-deploy.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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTEgwrcgUFJPT0YgZG9jayByZW1vdmVkIGZyb20gd2lkZ2V0ICsgaWZyYW1lIGNvbnRleHQiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIERpcmVjdCBsb2FkIHdpZGdldAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLXdpZGdldC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCBzdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgb3B1c19wYXR0ZXJuX2JhZGdlX3Zpc2libGU6IChmdW5jdGlvbigpeyB2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJhZGdlJyk7IHJldHVybiBlP2Uub2Zmc2V0UGFyZW50IT09bnVsbDpmYWxzZTsgfSkoKSwKICAgICAgd3RwX3Vkb2NrX3Zpc2libGU6IChmdW5jdGlvbigpeyB2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3RwLXVkb2NrJyk7IHJldHVybiBlP2Uub2Zmc2V0UGFyZW50IT09bnVsbDpmYWxzZTsgfSkoKSwKICAgICAgd3RwX3NpZGViYXJfdmlzaWJsZTogKGZ1bmN0aW9uKCl7IHZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3dHAtc2lkZWJhcicpOyByZXR1cm4gZT9lLm9mZnNldFBhcmVudCE9PW51bGw6ZmFsc2U7IH0pKCksCiAgICAgIGFueV9iYWRnZV93aXRoX2ludGVybmFsOiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZio9IndldmFsLXRlY2hub2xvZ3ktcGxhdGZvcm0iXSwgYVtocmVmKj0id2V2aWEtbWFzdGVyIl0sIGFbaHJlZio9ImFsbC1pYS1odWIiXScpKS5maWx0ZXIoYT0+YS5vZmZzZXRQYXJlbnQhPT1udWxsKS5sZW5ndGgsCiAgICAgIHNoaWVsZF9sb2FkZWQ6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FtYnJlLWNvbmZpZGVudGlhbC1zaGllbGQnKSwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIldJREdFVCBkaXJlY3Q6IiwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMS13aWRnZXQtZGlyZWN0LnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBOb3cgdGVzdCBlbWJlZGRlZCBpbiBpZnJhbWUgKHNpbXVsYXRpbmcgcm9vdCAvIGNvbnRleHQpCiAgYXdhaXQgcGFnZS5nb3RvKCIvP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDAwKTsKICAKICAvLyBGaW5kIGFueSBpZnJhbWUgd2l0aCB3ZXZpYS13aWRnZXQKICBjb25zdCBpZnJhbWVzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSkubWFwKGYgPT4gKHsKICAgICAgc3JjOiBmLnNyYywKICAgICAgdmlzaWJsZTogZi5vZmZzZXRQYXJlbnQgIT09IG51bGwsCiAgICAgIHNpemU6IGYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICB9KSk7CiAgfSk7CiAgY29uc29sZS5sb2coIlxuSWZyYW1lcyBvbiAvOiIsIEpTT04uc3RyaW5naWZ5KGlmcmFtZXMpKTsKICAKICAvLyBDaGVjayBpZiB3aWRnZXQgaWZyYW1lIGV4aXN0cyBhbmQgaW5zcGVjdCBpbnNpZGUKICBpZiAoaWZyYW1lcy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCB3aWRnZXRGcmFtZSA9IHBhZ2UuZnJhbWVMb2NhdG9yKCdpZnJhbWVbc3JjKj0id2V2aWEtd2lkZ2V0Il0nKS5maXJzdCgpOwogICAgdHJ5IHsKICAgICAgY29uc3QgZnJhbWVTdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgICAgIGNvbnN0IGlmcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTsKICAgICAgICBmb3IgKGNvbnN0IGlmciBvZiBpZnJzKSB7CiAgICAgICAgICBpZiAoaWZyLnNyYyAmJiBpZnIuc3JjLmluY2x1ZGVzKCd3ZXZpYS13aWRnZXQnKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGlmci5jb250ZW50RG9jdW1lbnQ7CiAgICAgICAgICAgICAgaWYgKCFkb2MpIGNvbnRpbnVlOwogICAgICAgICAgICAgIGNvbnN0IGJ0ID0gZG9jLmJvZHkgPyBkb2MuYm9keS5pbm5lclRleHQgOiAiIjsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc3JjOiBpZnIuc3JjLAogICAgICAgICAgICAgICAgaGFzX2NsYXVkZV9wYXR0ZXJuOiAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYnQpLAogICAgICAgICAgICAgICAgaGFzX3d0cDogL1xiV1RQXGIvaS50ZXN0KGJ0KSwKICAgICAgICAgICAgICAgIGhhc19hZG1pbl9kcm9pZDogL1xiQWRtaW5cYi9pLnRlc3QoYnQpICYmIC9cYkRyb2lkXGIvaS50ZXN0KGJ0KSwKICAgICAgICAgICAgICAgIHRleHRfc2l6ZTogYnQubGVuZ3RoLAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gY2F0Y2goZSl7IHJldHVybiB7ZXJyb3I6ICJjcm9zcy1vcmlnaW4iLCBtc2c6IGUubWVzc2FnZX07IH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICJubyB3aWRnZXQgaWZyYW1lIjsKICAgICAgfSk7CiAgICAgIGNvbnNvbGUubG9nKCJXaWRnZXQgaWZyYW1lIHN0YXRlOiIsIEpTT04uc3RyaW5naWZ5KGZyYW1lU3RhdGUpKTsKICAgIH0gY2F0Y2goZSkgeyBjb25zb2xlLmxvZygiZnJhbWUgaW5zcGVjdCBlcnI6IiwgZS5tZXNzYWdlKTsgfQogIH0KICAKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMi1yb290LXdpdGgtaWZyYW1lLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBGb3JjZSBjbGljayB3aWRnZXQgYnV0dG9uIHRvIG9wZW4gcGFuZWwKICBjb25zdCBidG4gPSBhd2FpdCBwYWdlLmxvY2F0b3IoJ2J1dHRvbjpoYXMtdGV4dCgiT3V2cmlyIiksIGJ1dHRvbjpoYXMtdGV4dCgiQ2hhdCIpLCBbY2xhc3MqPSJjaGF0Il1bY2xhc3MqPSJidG4iXSwgW2NsYXNzKj0id2lkZ2V0Il1bY2xhc3MqPSJidG4iXScpLmZpcnN0KCk7CiAgaWYgKGF3YWl0IGJ0bi5jb3VudCgpID4gMCkgewogICAgdHJ5IHsKICAgICAgYXdhaXQgYnRuLmNsaWNrKHtmb3JjZTogdHJ1ZSwgdGltZW91dDogMzAwMH0pOwogICAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDIwMDApOwogICAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMy1wYW5lbC1vcGVuLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAgIH0gY2F0Y2goZSkgeyBjb25zb2xlLmxvZygiYnRuIGNsaWNrIGVycjoiLCBlLm1lc3NhZ2UpOyB9CiAgfQp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v51-widget.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v52-deploy.php
Normal file
7
api/ambre-pw-v52-deploy.php
Normal file
File diff suppressed because one or more lines are too long
7
api/ambre-pw-v53-deploy.php
Normal file
7
api/ambre-pw-v53-deploy.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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTMgwrcgRmluYWwgcHJvb2Ygd2lkZ2V0IGNsZWFuIChubyBDbGF1ZGUgUGF0dGVybiBwYW5lbCkiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLXdpZGdldC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDAwKTsKICAKICBjb25zdCBzdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIHZpc2libGVfY2xhdWRlX3BhdHRlcm5fdGV4dDogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgb3B1c19wYXR0ZXJuX2JhZGdlOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tYmFkZ2UnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJhZGdlJykub2Zmc2V0UGFyZW50ICE9PSBudWxsLAogICAgICBvcHVzX3BhdHRlcm5fbW9kYWw6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1tb2RhbCcpICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tbW9kYWwnKS5vZmZzZXRQYXJlbnQgIT09IG51bGwsCiAgICAgIG9wdXNfcGF0dGVybl9ib3g6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1ib3gnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJveCcpLm9mZnNldFBhcmVudCAhPT0gbnVsbCwKICAgICAgc2V2ZW5fcGhhc2VzX3Zpc2libGU6IC83IHBoYXNlcyBSRUFML2kudGVzdChib2R5VGV4dCksCiAgICAgIHNzZV9saXZlX3Zpc2libGU6IC9TU0UgbGl2ZS9pLnRlc3QoYm9keVRleHQpLAogICAgICBsYW5jZXJfdmlzaWJsZTogL0xhbmNlciBcKFNTRS9pLnRlc3QoYm9keVRleHQpLAogICAgICBzaGllbGRfbG9hZGVkOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWJyZS1jb25maWRlbnRpYWwtc2hpZWxkJyksCiAgICAgIG9wdXNQYXR0ZXJuT3Blbl9uZXV0cmFsaXplZDogKHR5cGVvZiB3aW5kb3cuX19vcHVzUGF0dGVybk9wZW4gPT09ICdmdW5jdGlvbicpICYmIHdpbmRvdy5fX29wdXNQYXR0ZXJuT3Blbi50b1N0cmluZygpLmxlbmd0aCA8IDMwLAogICAgfTsKICB9KTsKICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMikpOwogIAogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjUzLWZpbmFsLXdpZGdldC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgCiAgLy8gVHJ5IGNhbGwgX19vcHVzUGF0dGVybk9wZW4gdG8gc2VlIGlmIG5ldXRyYWxpemVkCiAgY29uc3Qgb3BlblJlc3VsdCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgdHJ5IHsKICAgICAgd2luZG93Ll9fb3B1c1BhdHRlcm5PcGVuKCk7CiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1tb2RhbCcpOwogICAgICByZXR1cm4gbW9kYWwgPyAobW9kYWwub2Zmc2V0UGFyZW50ICE9PSBudWxsID8gIk9QRU5FRF9WSVNJQkxFIiA6ICJISURERU4iKSA6ICJOT19NT0RBTCI7CiAgICB9IGNhdGNoKGUpIHsgcmV0dXJuICJFUlJPUjogIiArIGUubWVzc2FnZTsgfQogIH0pOwogIGNvbnNvbGUubG9nKCJBZnRlciBfX29wdXNQYXR0ZXJuT3BlbiBjYWxsOiIsIG9wZW5SZXN1bHQpOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjUzLWFmdGVyLW9wZW4tYXR0ZW1wdC5wbmciIH0pOwp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v53-final.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
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]);
|
||||
55
api/ambre-rename-claude.php
Normal file
55
api/ambre-rename-claude.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
$changes = [];
|
||||
|
||||
// Fix 1: rename "WEVIA Claude-pattern" in header
|
||||
$c_new = preg_replace("/<strong>WEVIA Claude[- ]?pattern<\/strong>/i", "<strong>WEVIA-pattern</strong>", $c);
|
||||
$c_new = preg_replace("/WEVIA Claude[- ]?pattern/", "WEVIA-pattern", $c_new);
|
||||
if ($c_new !== $c) {
|
||||
$changes[] = "renamed_WEVIA_Claude_pattern";
|
||||
$c = $c_new;
|
||||
}
|
||||
|
||||
// Fix 2: Remove any "Claude" mentions in phase labels
|
||||
$c_new = str_replace("Claude Pattern", "WEVIA-Pattern", $c);
|
||||
$c_new = str_replace("claude-pattern", "wevia-pattern", $c_new);
|
||||
$c_new = str_replace("Claude-pattern", "WEVIA-pattern", $c_new);
|
||||
if ($c_new !== $c) {
|
||||
$changes[] = "renamed_claude_pattern_generic";
|
||||
$c = $c_new;
|
||||
}
|
||||
|
||||
// Fix 3: Remove mentions of "Claude" alone that are confidential
|
||||
// But KEEP internal vars like _claude_xxx since they're code
|
||||
// Target ONLY user-facing strings (between quotes or HTML text)
|
||||
$user_facing_replacements = [
|
||||
"'Claude'" => "'WEVIA'",
|
||||
"\"Claude\"" => "\"WEVIA\"",
|
||||
">Claude<" => ">WEVIA<",
|
||||
"'Claude pattern'" => "'WEVIA pattern'",
|
||||
"\"Claude pattern\"" => "\"WEVIA pattern\"",
|
||||
];
|
||||
foreach ($user_facing_replacements as $k => $v) {
|
||||
if (strpos($c, $k) !== false) {
|
||||
$c = str_replace($k, $v, $c);
|
||||
$changes[] = "replaced_" . md5($k);
|
||||
}
|
||||
}
|
||||
|
||||
// Verify no more "Claude-pattern" in UI
|
||||
$out_count = substr_count($c, "Claude-pattern") + substr_count($c, "Claude pattern") + substr_count($c, "Claude Pattern");
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave263-rename";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
"changes" => $changes,
|
||||
"remaining_claude_pattern_count" => $out_count,
|
||||
]);
|
||||
43
api/ambre-scan-claude.php
Normal file
43
api/ambre-scan-claude.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Files that render "Claude" or "Claude-pattern" badge VISIBLE on public wevia.html
|
||||
$w = @file_get_contents("/var/www/html/wevia.html");
|
||||
$out["wevia_html"] = [
|
||||
"size" => strlen($w),
|
||||
"claude_text_count" => substr_count($w, "Claude"),
|
||||
"claude_pattern_count" => preg_match_all("/Claude[\s\-]?pattern/i", $w),
|
||||
"WEVIA_Claude_pattern" => substr_count($w, "WEVIA Claude-pattern"),
|
||||
"Claude_pattern_span" => preg_match_all("/<span[^>]*>Claude[\s\-]?[Pp]attern/i", $w),
|
||||
];
|
||||
|
||||
// Find the exact rendering in wevia.html
|
||||
$pos = strpos($w, "Claude-pattern");
|
||||
if ($pos === false) $pos = strpos($w, "Claude pattern");
|
||||
if ($pos === false) $pos = strpos($w, "WEVIA Claude");
|
||||
if ($pos !== false) $out["wevia_context"] = substr($w, max(0, $pos - 200), 500);
|
||||
|
||||
// Mermaid generator - check output
|
||||
$mp = @file_get_contents("/var/www/html/api/ambre-tool-mermaid.php");
|
||||
$out["mermaid_tool"] = [
|
||||
"size" => strlen($mp ?? ""),
|
||||
"exists" => file_exists("/var/www/html/api/ambre-tool-mermaid.php"),
|
||||
];
|
||||
|
||||
// Find V5-claude-pattern source
|
||||
$out["claude_pattern_sources"] = trim(@shell_exec("grep -lE 'claude[- ]?pattern|Claude[- ]?[Pp]attern' /var/www/html/wevia.html /var/www/html/*.html /var/www/html/api/*.php 2>/dev/null | head -10"));
|
||||
|
||||
// Check V5-CLAUDE-PATTERN block in wevia.html
|
||||
if (preg_match("/\/\/ === AMBRE-V5-CLAUDE-PATTERN.{0,10000}\/\/ === END AMBRE-V5-CLAUDE-PATTERN/s", $w, $m)) {
|
||||
$out["v5_block_size"] = strlen($m[0]);
|
||||
// Extract the rendered badges
|
||||
if (preg_match_all('/["\']WEVIA[^"\']*Claude[^"\']*pattern[^"\']*["\']/', $m[0], $badges)) {
|
||||
$out["v5_badges"] = $badges[0];
|
||||
}
|
||||
if (preg_match_all('/["\']WEVIA[- ]?pattern["\']/i', $m[0], $badges2)) {
|
||||
$out["v5_badges_alt"] = $badges2[0];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
68
api/ambre-scan-w260.php
Normal file
68
api/ambre-scan-w260.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
chdir("/var/www/html");
|
||||
$out["recent_tags"] = array_filter(array_map("trim", explode("\n", @shell_exec("git tag -l 'wave-*' --sort=-creatordate 2>&1 | head -10"))));
|
||||
$out["recent_commits"] = array_filter(array_map("trim", explode("\n", @shell_exec("git log --since='30 minutes ago' --oneline 2>&1 | head -12"))));
|
||||
|
||||
// External AIs/agents available on this server (L99, Director, Blade, Arena, AlliaHub, Paperclip, DeerFlow)
|
||||
$ext_agents = [
|
||||
"L99" => "http://127.0.0.1:5890", // S95 arsenal
|
||||
"Paperclip" => "http://127.0.0.1:3201",
|
||||
"DeerFlow" => "http://127.0.0.1:3002",
|
||||
"MiroFish" => "http://127.0.0.1:3050",
|
||||
"TwentyCRM" => "http://127.0.0.1:3000",
|
||||
"n8n" => "http://127.0.0.1:5678",
|
||||
"Ollama" => "http://127.0.0.1:11434",
|
||||
"Qdrant" => "http://127.0.0.1:6333",
|
||||
"Cascade" => "http://127.0.0.1:4000",
|
||||
"Mattermost" => "http://127.0.0.1:8065",
|
||||
];
|
||||
$out["external_agents"] = [];
|
||||
foreach ($ext_agents as $n => $url) {
|
||||
$t0 = microtime(true);
|
||||
$r = @file_get_contents($url, false, stream_context_create(["http"=>["timeout"=>2,"ignore_errors"=>true]]));
|
||||
$out["external_agents"][$n] = [
|
||||
"url" => $url,
|
||||
"up" => (bool)$r,
|
||||
"ms" => round((microtime(true)-$t0)*1000),
|
||||
];
|
||||
}
|
||||
|
||||
// Check CF Transform Rules possibility (needs CF token working)
|
||||
$cf_token = null;
|
||||
if (file_exists("/etc/weval/secrets.env")) {
|
||||
$sc = @file_get_contents("/etc/weval/secrets.env");
|
||||
if (preg_match("/CF_API_TOKEN=([^\n\"]+)/", $sc, $m)) $cf_token = trim($m[1]);
|
||||
}
|
||||
$out["cf_token_len"] = $cf_token ? strlen($cf_token) : 0;
|
||||
|
||||
// Test CF token
|
||||
if ($cf_token) {
|
||||
$ctx = stream_context_create(["http"=>["method"=>"GET","header"=>"Authorization: Bearer $cf_token\r\n","timeout"=>5,"ignore_errors"=>true]]);
|
||||
$verify = @file_get_contents("https://api.cloudflare.com/client/v4/user/tokens/verify", false, $ctx);
|
||||
$v = @json_decode($verify, true);
|
||||
$out["cf_token_status"] = $v["success"] ?? false;
|
||||
$out["cf_token_msg"] = substr($verify ?? "none", 0, 200);
|
||||
}
|
||||
|
||||
// Registered chatbots needing memory wire
|
||||
$out["pages_with_widget"] = [];
|
||||
foreach (["wevia.html", "wevia-master.html", "all-ia-hub.html", "wevia-orchestrator.html", "director-chat.html", "l99-brain.html", "director-center.html", "paperclip.html", "agents-enterprise.html", "wevia-multiagent-dashboard.html"] as $p) {
|
||||
$f = "/var/www/html/$p";
|
||||
if (file_exists($f)) {
|
||||
$c = @file_get_contents($f);
|
||||
$out["pages_with_widget"][$p] = [
|
||||
"size" => strlen($c),
|
||||
"has_universal_widget" => strpos($c, "ambre-universal-chat.js") !== false,
|
||||
"has_chat_api" => strpos($c, "chat-api") !== false || strpos($c, "session-chat") !== false,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Internal memory state now
|
||||
$out["internal_memory_files"] = array_map("basename", glob("/opt/wevads/internal-memory/*.jsonl") ?: []);
|
||||
$out["internal_memory_count"] = count($out["internal_memory_files"]);
|
||||
|
||||
$out["load"] = trim(@shell_exec("uptime"));
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
51
api/ambre-shield-v2.php
Normal file
51
api/ambre-shield-v2.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/api/ambre-confidential-shield.js";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Replace the CONFIDENTIAL_IDS list with expanded version
|
||||
$old = "var CONFIDENTIAL_IDS = [
|
||||
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
|
||||
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
|
||||
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
|
||||
'opus-claude-pattern', 'opus-dashboards',
|
||||
];";
|
||||
|
||||
$new = "var CONFIDENTIAL_IDS = [
|
||||
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
|
||||
'opus-pattern-modal', 'opus-pattern-box', 'opus-pattern-close', 'opus-pattern-input',
|
||||
'opus-pattern-bot', 'opus-pattern-output', 'opus-pattern-content',
|
||||
'opus-pattern-launch', 'opus-pattern-send',
|
||||
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
|
||||
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
|
||||
'opus-claude-pattern', 'opus-dashboards',
|
||||
'archi-meta-badge', 'v130-floating-dock',
|
||||
];";
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"CONFIDENTIAL_IDS not found in shield"]);
|
||||
exit;
|
||||
}
|
||||
$c = str_replace($old, $new, $c);
|
||||
|
||||
// Also neutralize the window.__opusPatternOpen function (prevent opening)
|
||||
$old2 = "console.log('[ambre-confidential-shield] active on public page: ' + path);";
|
||||
$new2 = "// Neutralize global opusPatternOpen function (prevents programmatic opening)
|
||||
try {
|
||||
Object.defineProperty(window, '__opusPatternOpen', { value: function(){}, writable: false, configurable: false });
|
||||
Object.defineProperty(window, '__opusPatternClose', { value: function(){}, writable: false, configurable: false });
|
||||
} catch(e) {}
|
||||
|
||||
console.log('[ambre-confidential-shield] active on public page: ' + path);";
|
||||
|
||||
$c = str_replace($old2, $new2, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/shield.GOLD-" . date("Ymd-His") . "-wave262-v2";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
]);
|
||||
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);
|
||||
21
api/ambre-trace-leak.php
Normal file
21
api/ambre-trace-leak.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// grep for opus-pattern-badge in /var/www/html
|
||||
$out["opus_pattern_sources"] = trim(@shell_exec("grep -lrE 'opus-pattern-badge|opus-pattern-style' /var/www/html --include='*.js' --include='*.html' --include='*.php' 2>/dev/null | head -10"));
|
||||
$out["opus_udrill_sources"] = trim(@shell_exec("grep -lrE 'opus-udrill|opus-dashboard-entry' /var/www/html --include='*.js' --include='*.html' --include='*.php' 2>/dev/null | head -10"));
|
||||
$out["wtp_dock_sources"] = trim(@shell_exec("grep -lrE 'WTP Global|ERP Global|Admin.*Droid|Orch.*WevCode' /var/www/html --include='*.js' --include='*.html' 2>/dev/null | head -10"));
|
||||
|
||||
// Read the opus-pattern injector
|
||||
$f = @shell_exec("grep -lrE 'opus-pattern-badge' /var/www/html --include='*.js' --include='*.php' 2>/dev/null | head -1");
|
||||
$f = trim($f);
|
||||
if ($f && file_exists($f)) {
|
||||
$c = @file_get_contents($f);
|
||||
$out["pattern_injector_file"] = $f;
|
||||
$out["pattern_injector_has_guard"] = strpos($c, "PUBLIC-GUARD") !== false || strpos($c, "public_paths") !== false || strpos($c, "AMBRE-V1") !== false;
|
||||
// Extract first 300 chars
|
||||
$out["pattern_injector_head"] = substr($c, 0, 400);
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
17
api/ambre-widget-read.php
Normal file
17
api/ambre-widget-read.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia-widget.html");
|
||||
// Find Claude Pattern context
|
||||
$pos = strpos($c, "Claude Pattern");
|
||||
if ($pos !== false) {
|
||||
echo "=== Claude Pattern ctx ===\n";
|
||||
echo substr($c, max(0, $pos - 300), 600);
|
||||
}
|
||||
echo "\n\n=== WTP ctx ===\n";
|
||||
$pos2 = strpos($c, "WTP");
|
||||
if ($pos2 !== false) echo substr($c, max(0, $pos2 - 300), 700);
|
||||
|
||||
echo "\n\n=== All script srcs and inline signatures ===\n";
|
||||
preg_match_all('/<script[^>]*(?:src=["\']([^"\']+)["\']|>([^<]{0,100}))/', $c, $m);
|
||||
foreach ($m[1] as $s) if ($s) echo "SRC: $s\n";
|
||||
foreach ($m[2] as $s) if (trim($s)) echo "INLINE: " . substr(trim($s), 0, 100) . "\n";
|
||||
53
api/ambre-widget-trace.php
Normal file
53
api/ambre-widget-trace.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
|
||||
// Find all widgets + iframes + the chatbot/claude-pattern widget
|
||||
$out = [];
|
||||
|
||||
// Search for specific widget signatures in index.html
|
||||
$sigs = [
|
||||
"claude-pattern",
|
||||
"Claude Pattern",
|
||||
"WTP",
|
||||
"IA Hub",
|
||||
"Master",
|
||||
"Droid",
|
||||
"Arena",
|
||||
"WEVIA Engine",
|
||||
"WevCode",
|
||||
"widget.js",
|
||||
"chat-widget",
|
||||
"Ouvrir en plein ecran",
|
||||
"weval-chat-fix",
|
||||
"wevia-widget",
|
||||
"chat-fix",
|
||||
];
|
||||
foreach ($sigs as $s) {
|
||||
$out["match_$s"] = substr_count($root, $s);
|
||||
}
|
||||
$out["root_size"] = strlen($root);
|
||||
|
||||
// All <script src>
|
||||
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $root, $m);
|
||||
$out["scripts"] = array_unique($m[1] ?? []);
|
||||
|
||||
// Check weval-chat-fix.js content
|
||||
$cf = @file_get_contents("/var/www/html/weval-chat-fix.js");
|
||||
if ($cf) {
|
||||
$out["chat_fix_size"] = strlen($cf);
|
||||
$out["chat_fix_has_wtp"] = substr_count($cf, "WTP");
|
||||
$out["chat_fix_has_claude_pattern"] = substr_count($cf, "Claude Pattern");
|
||||
$out["chat_fix_has_Master"] = substr_count($cf, "Master") + substr_count($cf, "IA Hub");
|
||||
$out["chat_fix_head_200"] = substr($cf, 0, 400);
|
||||
}
|
||||
|
||||
// Also check wevia-widget
|
||||
$ww = @file_get_contents("/var/www/html/wevia-widget.html");
|
||||
if ($ww) {
|
||||
$out["wevia_widget_size"] = strlen($ww);
|
||||
$out["wevia_widget_has_dock"] = substr_count($ww, "WTP") + substr_count($ww, "Master") + substr_count($ww, "Droid");
|
||||
$out["wevia_widget_has_claude_pattern"] = substr_count($ww, "Claude Pattern");
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|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 03:00:02",
|
||||
"generated": "2026-04-22 13:30:02",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 85,
|
||||
"disk_avail": "22G",
|
||||
"uptime": "up 1 week, 17 hours, 8 minutes",
|
||||
"disk_pct": 87,
|
||||
"disk_avail": "20G",
|
||||
"uptime": "up 1 week, 1 day, 3 hours, 38 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -21,7 +21,7 @@
|
||||
"private": "10.1.0.3",
|
||||
"role": "WEVADS Arsenal",
|
||||
"ssh": 22,
|
||||
"disk_pct": 82,
|
||||
"disk_pct": 83,
|
||||
"disk_avail": "26G",
|
||||
"sentinel": 1
|
||||
},
|
||||
@@ -36,17 +36,17 @@
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up Less than a second",
|
||||
"status": "Up 1 second",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -66,7 +66,7 @@
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -81,7 +81,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -136,6 +136,16 @@
|
||||
}
|
||||
],
|
||||
"domains": [
|
||||
{
|
||||
"file": "ai.weval-consulting.com",
|
||||
"server_names": [
|
||||
"ai.weval-consulting.com"
|
||||
],
|
||||
"ssl": true,
|
||||
"php-session": false,
|
||||
"php-session_paths": false,
|
||||
"auth_complete": false
|
||||
},
|
||||
{
|
||||
"file": "analytics.weval-consulting.com",
|
||||
"server_names": [
|
||||
@@ -280,9 +290,9 @@
|
||||
}
|
||||
],
|
||||
"screens": {
|
||||
"s204_html": 324,
|
||||
"s204_html": 328,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 1025,
|
||||
"s204_api_php": 1074,
|
||||
"s204_wevia_php": 254,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -306,7 +316,7 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5622,
|
||||
"kb_learnings": 5770,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -418,7 +428,7 @@
|
||||
},
|
||||
{
|
||||
"name": "wevia_memory_768",
|
||||
"vectors": 98
|
||||
"vectors": 100
|
||||
},
|
||||
{
|
||||
"name": "wevia_kb_768",
|
||||
@@ -606,15 +616,15 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5622,
|
||||
"total_entries": 5770,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3024"
|
||||
"cnt": "3150"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1242"
|
||||
"cnt": "1264"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1714,54 +1724,54 @@
|
||||
"fast_lines": 3718,
|
||||
"router_lines": 6152,
|
||||
"router_functions": 17,
|
||||
"today_requests": 0,
|
||||
"today_requests": 2,
|
||||
"today_cost": 0,
|
||||
"avg_latency_ms": 0,
|
||||
"top_provider": "N\/A",
|
||||
"providers_used": 0
|
||||
"avg_latency_ms": 8754,
|
||||
"top_provider": "nvidia",
|
||||
"providers_used": 1
|
||||
},
|
||||
"optimizations": {
|
||||
"recent_commits": [],
|
||||
"auto_fixes": [
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:55: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:55:05.595944"
|
||||
"fact": "AUTONOMY 22Apr 13:25: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:25:05.773153"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:50: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:50:06.163078"
|
||||
"fact": "AUTONOMY 22Apr 13:20: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:20:06.499966"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:45: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:45:06.542555"
|
||||
"fact": "AUTONOMY 22Apr 13:15: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:15:06.860963"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:40: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:40:06.220594"
|
||||
"fact": "AUTONOMY 22Apr 13:10: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:10:05.390973"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:35: 2 fixes. Disk light cleanup 85%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 04:35:05.436317"
|
||||
"fact": "AUTONOMY 22Apr 13:05: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:05:05.583676"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:30: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:30:09.044797"
|
||||
"fact": "AUTONOMY 22Apr 13:00: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:00:10.390288"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 04:25:07.944997"
|
||||
"fact": "AUTONOMY 22Apr 12:55: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:55:05.790119"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:20: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:20:05.987441"
|
||||
"fact": "AUTONOMY 22Apr 12:50: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:50:05.973206"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:15: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:15:06.951973"
|
||||
"fact": "AUTONOMY 22Apr 12:45: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:45:05.70786"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:10: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:10:05.81299"
|
||||
"fact": "AUTONOMY 22Apr 12:40: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:40:05.065451"
|
||||
}
|
||||
],
|
||||
"architecture_decisions": [
|
||||
@@ -1943,14 +1953,14 @@
|
||||
{
|
||||
"severity": "opportunity",
|
||||
"category": "SCALABILITY",
|
||||
"title": "Qdrant: 22,121 vecteurs",
|
||||
"title": "Qdrant: 22,123 vecteurs",
|
||||
"detail": "Volume vectoriel croissant. Planifier sharding ou migration vers cluster Qdrant.",
|
||||
"action": "opportunity",
|
||||
"fix_cmd": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 4858,
|
||||
"scan_time_ms": 3889,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -36,5 +36,11 @@
|
||||
"reason": "OVH credentials missing in /etc/weval/secrets.env. Add OVH_EMAIL + OVH_PASSWORD to enable automation.",
|
||||
"ts": "2026-04-21T10:00:02.008746",
|
||||
"status": "needs_credentials"
|
||||
},
|
||||
{
|
||||
"task": "ovh_s151_cancel",
|
||||
"reason": "OVH credentials missing in /etc/weval/secrets.env. Add OVH_EMAIL + OVH_PASSWORD to enable automation.",
|
||||
"ts": "2026-04-22T10:00:02.511432",
|
||||
"status": "needs_credentials"
|
||||
}
|
||||
]
|
||||
@@ -1,140 +1,57 @@
|
||||
{
|
||||
"test": "biz-scenario-v9.29-extended",
|
||||
"timestamp": "2026-04-21T09-19-32",
|
||||
"test": "biz-scenario-v9.28",
|
||||
"timestamp": "2026-04-22T04-00-07",
|
||||
"pages": [
|
||||
{
|
||||
"name": "wtp",
|
||||
"url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 5929,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
|
||||
"ms": 23764,
|
||||
"found": [
|
||||
"WEVAL Technology",
|
||||
"NR ",
|
||||
"Archi complete",
|
||||
"Accueil",
|
||||
"NR "
|
||||
],
|
||||
"content_size": 337979
|
||||
"Accueil"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "erp-gap-fill",
|
||||
"url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3893,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"ms": 4179,
|
||||
"found": [
|
||||
"CLOSED",
|
||||
"25",
|
||||
"Risk",
|
||||
"mitigation"
|
||||
],
|
||||
"content_size": 94849
|
||||
"CLOSED: 25"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "infra-tour",
|
||||
"url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3226,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"ms": 3166,
|
||||
"found": [
|
||||
"S204",
|
||||
"S95",
|
||||
"Blade",
|
||||
"HTTPS"
|
||||
],
|
||||
"content_size": 9303
|
||||
"77%",
|
||||
"82%"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wevia-master",
|
||||
"url": "https://weval-consulting.com/wevia-master.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3862,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/wevia-master.html?dev=1",
|
||||
"ms": 12964,
|
||||
"found": [
|
||||
"master",
|
||||
"WEVIA"
|
||||
],
|
||||
"content_size": 3843
|
||||
},
|
||||
{
|
||||
"name": "ethica-hub",
|
||||
"url": "https://weval-consulting.com/ethica-hub.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3959,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/ethica-hub.html?dev=1",
|
||||
"found": [
|
||||
"Ethica",
|
||||
"HCP",
|
||||
"161",
|
||||
"51K"
|
||||
],
|
||||
"content_size": 32798
|
||||
},
|
||||
{
|
||||
"name": "enterprise-model",
|
||||
"url": "https://weval-consulting.com/enterprise-model.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 4372,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/enterprise-model.html?dev=1",
|
||||
"found": [
|
||||
"Enterprise",
|
||||
"agents"
|
||||
],
|
||||
"content_size": 3847
|
||||
},
|
||||
{
|
||||
"name": "growth-engine",
|
||||
"url": "https://weval-consulting.com/growth-engine-v2.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 5307,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/growth-engine-v2.html?dev=1",
|
||||
"found": [
|
||||
"Growth",
|
||||
"Engine",
|
||||
"growth",
|
||||
"engine",
|
||||
"html",
|
||||
"<body"
|
||||
],
|
||||
"content_size": 3847
|
||||
},
|
||||
{
|
||||
"name": "agents-archi",
|
||||
"url": "https://weval-consulting.com/agents-archi.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 9132,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/agents-archi.html?dev=1",
|
||||
"found": [
|
||||
"agents",
|
||||
"Architecture",
|
||||
"archi"
|
||||
],
|
||||
"content_size": 3843
|
||||
"master"
|
||||
]
|
||||
}
|
||||
],
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-21T09-19-32.webm",
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-22T04-00-07.webm",
|
||||
"screenshots": [
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-wtp.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-wevia-master.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-ethica-hub.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-enterprise-model.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-growth-engine.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-21T09-19-32-agents-archi.png"
|
||||
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-wtp.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-22T04-00-07-wevia-master.png"
|
||||
],
|
||||
"duration_ms": 50075,
|
||||
"duration_ms": 51526,
|
||||
"status": "100%",
|
||||
"pass": 8,
|
||||
"total": 8,
|
||||
"pct": 100,
|
||||
"video_size": 1995296
|
||||
"pass": 4,
|
||||
"total": 4
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T05:15:01.952707",
|
||||
"generated_at": "2026-04-22T15:55:01.534737",
|
||||
"stats": {
|
||||
"total": 48,
|
||||
"pending": 31,
|
||||
"total": 50,
|
||||
"pending": 32,
|
||||
"kaouther_surfaced": 18,
|
||||
"chrome_surfaced": 3,
|
||||
"chrome_surfaced": 4,
|
||||
"notif_only_done": 0,
|
||||
"autofix_archived": 0,
|
||||
"cerebras_archived": 0,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-22T05:00:02.649384",
|
||||
"last_heartbeat": "2026-04-22T05:00:02.649384",
|
||||
"last_heartbeat_ts_epoch": 1776826802,
|
||||
"ts": "2026-04-22T15:45:02.144326",
|
||||
"last_heartbeat": "2026-04-22T15:45:02.144326",
|
||||
"last_heartbeat_ts_epoch": 1776865502,
|
||||
"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: Wed Apr 22 12:00:02 PM CEST 2026
|
||||
|
||||
## APIs (252)
|
||||
## APIs (254)
|
||||
wevia-action-engine.php
|
||||
wevia-actions.php
|
||||
wevia-admin-crm-bridge.php
|
||||
@@ -51,6 +51,7 @@ 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
|
||||
@@ -92,6 +93,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 +257,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 +277,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 +289,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 +304,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 +357,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
|
||||
@@ -381,13 +386,13 @@ wevia-webwide.py
|
||||
## Ollama Models
|
||||
|
||||
## Docker (20 containers)
|
||||
weval-docuseal Up 5 seconds
|
||||
weval-docuseal Up 7 seconds
|
||||
loki Up 5 days
|
||||
listmonk Up 5 days
|
||||
listmonk Up 6 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
|
||||
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
|
||||
|
||||
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-22T10:05:31+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
15
api/blade-tasks/key_github_token_20260422.json
Normal file
15
api/blade-tasks/key_github_token_20260422.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "key_renewal",
|
||||
"provider": "GITHUB_TOKEN",
|
||||
"reason": "EXPIRED",
|
||||
"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-22T10:06:37+00:00",
|
||||
"priority": "P0"
|
||||
}
|
||||
15
api/blade-tasks/key_groq_key_20260422.json
Normal file
15
api/blade-tasks/key_groq_key_20260422.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "key_renewal",
|
||||
"provider": "GROQ_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-22T10:06:37+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
15
api/blade-tasks/key_sambanova_key_20260422.json
Normal file
15
api/blade-tasks/key_sambanova_key_20260422.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "key_renewal",
|
||||
"provider": "SAMBANOVA_KEY",
|
||||
"reason": "NO_BALANCE",
|
||||
"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-22T10:06:37+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
14
api/blade-tasks/task_20260422070012_21267a.json
Normal file
14
api/blade-tasks/task_20260422070012_21267a.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "task_20260422070012_21267a",
|
||||
"name": "CRM Observation Alert",
|
||||
"type": "powershell",
|
||||
"command": "Write-Host 'CRM ALERT: Day4: delta_today=225 < 500 (day 4 after reactivation)'; New-BurntToastNotification -Text 'WEVAL CRM', 'Day4: delta_today=225 < 500 (day 4 after reactivation)' -ErrorAction SilentlyContinue",
|
||||
"cmd": "Write-Host 'CRM ALERT: Day4: delta_today=225 < 500 (day 4 after reactivation)'; New-BurntToastNotification -Text 'WEVAL CRM', 'Day4: delta_today=225 < 500 (day 4 after reactivation)' -ErrorAction SilentlyContinue",
|
||||
"priority": "high",
|
||||
"status": "done",
|
||||
"created": "2026-04-22T07:00:12+00:00",
|
||||
"created_by": "blade-control-ui",
|
||||
"completed_by": "s204-reconciler",
|
||||
"completed_at": "2026-04-22T09:05:01.573422",
|
||||
"reconciler_reason": "notification-only, no action needed"
|
||||
}
|
||||
14
api/blade-tasks/task_20260422080003_fe8049.json
Normal file
14
api/blade-tasks/task_20260422080003_fe8049.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "task_20260422080003_fe8049",
|
||||
"name": "OVH S151 cancel review",
|
||||
"type": "powershell",
|
||||
"command": "\n# OVH S151 cancel via Blade Windows browser\n$url = 'https://www.ovh.com/manager/dedicated/#/configuration/server'\nWrite-Host \"Opening OVH manager for S151 cancel review...\"\nStart-Process chrome -ArgumentList '--app=' + $url\nStart-Sleep 5\n# Notification\nNew-BurntToastNotification -Text 'WEVAL Auto', 'OVH S151 cancel - review needed. Log into OVH manager.' -ErrorAction SilentlyContinue\n",
|
||||
"cmd": "\n# OVH S151 cancel via Blade Windows browser\n$url = 'https://www.ovh.com/manager/dedicated/#/configuration/server'\nWrite-Host \"Opening OVH manager for S151 cancel review...\"\nStart-Process chrome -ArgumentList '--app=' + $url\nStart-Sleep 5\n# Notification\nNew-BurntToastNotification -Text 'WEVAL Auto', 'OVH S151 cancel - review needed. Log into OVH manager.' -ErrorAction SilentlyContinue\n",
|
||||
"priority": "normal",
|
||||
"status": "done",
|
||||
"created": "2026-04-22T08:00:03+00:00",
|
||||
"created_by": "blade-control-ui",
|
||||
"completed_by": "s204-reconciler",
|
||||
"completed_at": "2026-04-22T10:05:01.399775",
|
||||
"reconciler_reason": "surfaced Chrome URL"
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 04:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "19",
|
||||
"docker": "20",
|
||||
"ram": "13Gi/30Gi",
|
||||
"disk": "85%",
|
||||
"load": "13.04",
|
||||
"uptime": "up 1 week, 16 hours, 8 minutes"
|
||||
"disk": "86%",
|
||||
"load": "11.95",
|
||||
"uptime": "up 1 week, 1 day, 8 minutes"
|
||||
},
|
||||
"services": "7/10 OK",
|
||||
"services": "8/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
"qdrant": "21259 vectors",
|
||||
"crons": "44 active",
|
||||
"routes": "446",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "2123 entries",
|
||||
"wiki": "2296 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"ts": "2026-04-21T09:00:13.028409",
|
||||
"day_since_reactivation": 3,
|
||||
"total": 3097643,
|
||||
"delta_today": 294,
|
||||
"ts": "2026-04-22T09:00:12.724505",
|
||||
"day_since_reactivation": 4,
|
||||
"total": 3097756,
|
||||
"delta_today": 225,
|
||||
"runs_ok_24h": 76,
|
||||
"runs_err_24h": 0,
|
||||
"last_run_age": "30min",
|
||||
"last_run_age": "1s",
|
||||
"cron_status": "active",
|
||||
"alert_triggered": true,
|
||||
"alert_reasons": [
|
||||
"delta_today=294 < 500 (day 3 after reactivation)"
|
||||
"delta_today=225 < 500 (day 4 after reactivation)"
|
||||
],
|
||||
"screenshot": "/var/www/html/api/crm-observation-screenshots/crm-pipeline-20260421-090004.png"
|
||||
"screenshot": "/var/www/html/api/crm-observation-screenshots/crm-pipeline-20260422-090004.png"
|
||||
}
|
||||
BIN
api/crm-observation-screenshots/crm-pipeline-20260422-090004.png
Normal file
BIN
api/crm-observation-screenshots/crm-pipeline-20260422-090004.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,286 @@
|
||||
{
|
||||
"ts": "2026-04-22T13:55:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 7.37,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 13644,
|
||||
"ram_free_mb": 17690,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "124G",
|
||||
"disk_free": "20G",
|
||||
"disk_pct": "87%",
|
||||
"fpm_workers": 140,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.18,
|
||||
"disk_pct": "83%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12113
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
"name": "SER6",
|
||||
"ip": "110.239.84.121",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER7",
|
||||
"ip": "110.239.65.64",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER8",
|
||||
"ip": "182.160.55.107",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER9",
|
||||
"ip": "110.239.86.68",
|
||||
"status": "DOWN"
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 328,
|
||||
"php_apis": 1074,
|
||||
"wiki_entries": 2324,
|
||||
"vault_doctrines": 123,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 649,
|
||||
"registry_version": "?"
|
||||
},
|
||||
"sovereign": {
|
||||
"status": "UP",
|
||||
"providers": [
|
||||
"Cerebras-fast",
|
||||
"Cerebras-think",
|
||||
"Groq",
|
||||
"Cloudflare-AI",
|
||||
"Gemini",
|
||||
"SambaNova",
|
||||
"NVIDIA-NIM",
|
||||
"Mistral",
|
||||
"Groq-OSS",
|
||||
"HF-Space",
|
||||
"HF-Router",
|
||||
"OpenRouter",
|
||||
"GitHub-Models"
|
||||
],
|
||||
"active": 13,
|
||||
"total": 13,
|
||||
"primary": "Cerebras-fast",
|
||||
"cost": "0€"
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 166742,
|
||||
"with_email": 110734,
|
||||
"with_phone": 159846,
|
||||
"gap_email": 56008,
|
||||
"pct_email": 66.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 127343,
|
||||
"with_email": 78611,
|
||||
"with_tel": 124087,
|
||||
"pct_email": 61.7,
|
||||
"pct_tel": 97.4
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19724,
|
||||
"with_email": 15084,
|
||||
"with_tel": 18739,
|
||||
"pct_email": 76.5,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17796,
|
||||
"with_email": 15160,
|
||||
"with_tel": 17020,
|
||||
"pct_email": 85.2,
|
||||
"pct_tel": 95.6
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up 10 seconds",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 2 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "88685c283 auto-sync-1555",
|
||||
"dirty": 3,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
"total": 153,
|
||||
"passed": 153,
|
||||
"score": "100%"
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"name": "DeerFlow",
|
||||
"port": 3002,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "DeerFlow API",
|
||||
"port": 8001,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Qdrant",
|
||||
"port": 6333,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Ollama",
|
||||
"port": 11434,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Redis",
|
||||
"port": 6379,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Sovereign",
|
||||
"port": 4000,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "SearXNG",
|
||||
"port": 8080,
|
||||
"status": "UP"
|
||||
}
|
||||
],
|
||||
"whisper": {
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 4518,
|
||||
"health": {
|
||||
"score": 4,
|
||||
"max": 6,
|
||||
"pct": 67
|
||||
},
|
||||
"elapsed_ms": 11296
|
||||
}
|
||||
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,22 +1,25 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 00:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"fast_php_routes": 446,
|
||||
"opt_tools_total": 53,
|
||||
"opt_tools_total": 54,
|
||||
"wired": 51,
|
||||
"not_wired_count": 2,
|
||||
"not_wired_count": 3,
|
||||
"not_wired_tools": [
|
||||
{
|
||||
"name": ".git",
|
||||
"files": 11
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
"files": 4
|
||||
},
|
||||
{
|
||||
"name": "oss",
|
||||
"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",
|
||||
@@ -30,5 +33,5 @@
|
||||
"uptime-kuma",
|
||||
"vaultwarden"
|
||||
],
|
||||
"score": 96.2
|
||||
"score": 94.4
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
"status": "ERROR"
|
||||
},
|
||||
"ports": {
|
||||
"total": 76,
|
||||
"total": 75,
|
||||
"exposed": 20,
|
||||
"ports": [
|
||||
{
|
||||
@@ -14,11 +14,11 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5890",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=12),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=12),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5888",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=10),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=10),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6060",
|
||||
@@ -30,23 +30,23 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5823",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=5),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=5),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5822",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=4),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=4),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5821",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=3),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=3),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5825",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=13),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=13),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5824",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=6),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=6),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6379",
|
||||
@@ -76,14 +76,6 @@
|
||||
"addr": "127.0.0.1:2024",
|
||||
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:34311",
|
||||
"process": "users:((\"ollama\",pid=3712641,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:35283",
|
||||
"process": "users:((\"ollama\",pid=3715510,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.53:53",
|
||||
"process": "users:((\"systemd-resolve\",pid=999,fd=15))"
|
||||
@@ -96,21 +88,21 @@
|
||||
"addr": "127.0.0.1:4001",
|
||||
"process": "users:((\"python3\",pid=1392,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:45395",
|
||||
"process": "users:((\"ollama\",pid=3718575,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:4000",
|
||||
"process": "users:((\"python3\",pid=1394482,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:45675",
|
||||
"process": "users:((\"ollama\",pid=2836223,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:2026",
|
||||
"process": "users:((\"nginx\",pid=3665702,fd=5),(\"nginx\",pid=366"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:443",
|
||||
"process": "users:((\"nginx\",pid=3734221,fd=5),(\"nginx\",pid=373"
|
||||
"process": "users:((\"nginx\",pid=2851406,fd=5),(\"nginx\",pid=285"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:49222",
|
||||
@@ -118,7 +110,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:80",
|
||||
"process": "users:((\"nginx\",pid=3734221,fd=6),(\"nginx\",pid=373"
|
||||
"process": "users:((\"nginx\",pid=2851406,fd=6),(\"nginx\",pid=285"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:22",
|
||||
@@ -127,6 +119,14 @@
|
||||
{
|
||||
"addr": "127.0.0.1:8280",
|
||||
"process": "users:((\"crowdsec\",pid=2454,fd=26))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:8443",
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=11),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:9050",
|
||||
"process": "users:((\"tor\",pid=1408,fd=6))"
|
||||
}
|
||||
],
|
||||
"status": "WARN"
|
||||
@@ -161,7 +161,7 @@
|
||||
"status": "PASS"
|
||||
}
|
||||
},
|
||||
"timestamp": "2026-04-22T00:00:02",
|
||||
"timestamp": "2026-04-22T12:00:02",
|
||||
"oss_tools": [
|
||||
{
|
||||
"name": "Nuclei",
|
||||
|
||||
89
api/learning-analytics.php
Normal file
89
api/learning-analytics.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Cache-Control: no-store');
|
||||
|
||||
try {
|
||||
$pg = @pg_connect("host=127.0.0.1 dbname=adx_system user=admin password=admin123 connect_timeout=3");
|
||||
if (!$pg) throw new Exception("PG connect failed");
|
||||
|
||||
// Summary
|
||||
$r = pg_query($pg, "SELECT
|
||||
COUNT(*)::int as total_learned,
|
||||
SUM(CASE WHEN outcome_success THEN 1 ELSE 0 END)::int as success_total,
|
||||
COUNT(DISTINCT (experience->>'chatbot'))::int as bots_count,
|
||||
COALESCE(ROUND(AVG((experience->>'total_ms')::int))::int, 0) as avg_ms
|
||||
FROM ai_learning_log
|
||||
WHERE learned_at > NOW() - interval '24 hours'");
|
||||
$summary = pg_fetch_assoc($r);
|
||||
$summary['success_pct'] = $summary['total_learned'] > 0
|
||||
? round(100.0 * $summary['success_total'] / $summary['total_learned'])
|
||||
: 0;
|
||||
|
||||
// Conversations count
|
||||
$r = pg_query($pg, "SELECT COUNT(*)::int as total, COUNT(DISTINCT session_id)::int as sessions FROM wevia_conversations");
|
||||
$c = pg_fetch_assoc($r);
|
||||
$summary['conversations'] = (int)$c['total'];
|
||||
$summary['sessions'] = (int)$c['sessions'];
|
||||
|
||||
// Per chatbot (24h)
|
||||
$r = pg_query($pg, "SELECT
|
||||
experience->>'chatbot' as chatbot,
|
||||
COUNT(*)::int as total,
|
||||
SUM(CASE WHEN outcome_success THEN 1 ELSE 0 END)::int as success
|
||||
FROM ai_learning_log
|
||||
WHERE learned_at > NOW() - interval '24 hours' AND experience->>'chatbot' IS NOT NULL
|
||||
GROUP BY experience->>'chatbot'
|
||||
ORDER BY total DESC");
|
||||
$chatbots = [];
|
||||
while ($row = pg_fetch_assoc($r)) {
|
||||
$row['total'] = (int)$row['total'];
|
||||
$row['success'] = (int)$row['success'];
|
||||
$row['success_pct'] = $row['total'] > 0 ? round(100.0 * $row['success'] / $row['total']) : 0;
|
||||
$chatbots[] = $row;
|
||||
}
|
||||
|
||||
// Intents distribution
|
||||
$r = pg_query($pg, "SELECT
|
||||
experience->>'intent' as intent,
|
||||
COUNT(*)::int as count,
|
||||
SUM(CASE WHEN outcome_success THEN 1 ELSE 0 END)::int as success
|
||||
FROM ai_learning_log
|
||||
WHERE learned_at > NOW() - interval '24 hours'
|
||||
GROUP BY experience->>'intent'
|
||||
ORDER BY count DESC");
|
||||
$intents = [];
|
||||
while ($row = pg_fetch_assoc($r)) {
|
||||
$row['count'] = (int)$row['count'];
|
||||
$row['success'] = (int)$row['success'];
|
||||
$row['rate'] = $row['count'] > 0 ? round(100.0 * $row['success'] / $row['count']) : 0;
|
||||
$intents[] = $row;
|
||||
}
|
||||
|
||||
// Latest 10
|
||||
$r = pg_query($pg, "SELECT
|
||||
learned_at,
|
||||
experience->>'chatbot' as chatbot,
|
||||
experience->>'intent' as intent,
|
||||
outcome_success as outcome
|
||||
FROM ai_learning_log
|
||||
ORDER BY learned_at DESC LIMIT 10");
|
||||
$latest = [];
|
||||
while ($row = pg_fetch_assoc($r)) {
|
||||
$row['outcome'] = $row['outcome'] === 't';
|
||||
$latest[] = $row;
|
||||
}
|
||||
|
||||
pg_close($pg);
|
||||
|
||||
echo json_encode([
|
||||
'ts' => date('c'),
|
||||
'window' => '24h',
|
||||
'summary' => $summary,
|
||||
'chatbots' => $chatbots,
|
||||
'intents' => $intents,
|
||||
'latest' => $latest,
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
} catch (Throwable $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode(['error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "daily",
|
||||
"timestamp": "2026-04-21 12:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squads": {
|
||||
"infra": {
|
||||
"name": "INFRA",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T00:30:02.808685",
|
||||
"timestamp": "2026-04-22T12:30:02.650214",
|
||||
"source": "auto-populator-v2-fixed-18avr",
|
||||
"enterprise_total_agents": 747,
|
||||
"docker_total": 19,
|
||||
"docker_total": 20,
|
||||
"rooms": {
|
||||
"strat": {
|
||||
"count": 99,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[00:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[00:30:02] Enterprise: 747 agents
|
||||
[00:30:02] Registry: 11 sections
|
||||
[00:30:02] Docker: 19 containers
|
||||
[00:30:02] strat: 99 agents (38 active)
|
||||
[00:30:02] infra: 308 agents (34 active)
|
||||
[00:30:02] dev: 108 agents (25 active)
|
||||
[00:30:02] sec: 48 agents (13 active)
|
||||
[00:30:02] biz: 114 agents (31 active)
|
||||
[00:30:02] ia: 168 agents (48 active)
|
||||
[00:30:02] transit: 254 agents (27 active)
|
||||
[00:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
[12:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[12:30:02] Enterprise: 747 agents
|
||||
[12:30:02] Registry: 11 sections
|
||||
[12:30:02] Docker: 20 containers
|
||||
[12:30:02] strat: 99 agents (38 active)
|
||||
[12:30:02] infra: 308 agents (34 active)
|
||||
[12:30:02] dev: 108 agents (25 active)
|
||||
[12:30:02] sec: 48 agents (13 active)
|
||||
[12:30:02] biz: 114 agents (31 active)
|
||||
[12:30:02] ia: 168 agents (48 active)
|
||||
[12:30:02] transit: 254 agents (27 active)
|
||||
[12:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
30
api/meetings/daily-2026-04-22-06-00.json
Normal file
30
api/meetings/daily-2026-04-22-06-00.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 06:00",
|
||||
"squad": "infra",
|
||||
"agents": {
|
||||
"cortex": {
|
||||
"done": "13 checks, services 7\/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": "```json\n{\n \"conflicts\": [\n \"gap_detector est bloqué par 3 outils non connectés, ce qui pourrait impacter cortex (seulement 7\/10 services OK) et nonreg si ces outils manquants sont critiques\"\n ],\n \"common_issues\": [\n \"Surveillance continue requise par plusieurs agents (cortex, security) indique une charge opérationnelle soutenue en arrière-plan\",\n \"Absence de blocages déclarés, mais dette d'intégration (outils non câblés) menace la fiabilité globale\"\n ],\n \"priority_actions\": [\n \"Wiring immédiat des 3 outils restants pour gap_detector afin de garantir une couverture complète et permettre une visibilité optimale aux autres agents\",\n \"Vérifier l'impact des 3 services manquants dans cortex par rapport aux outils non câblés\",\n \"Maintenir la vigilance sécurité et les expositions redactées avec monitoring continu\"\n ],\n \"conciliation\": [\n \"Coordonner gap_detector et cortex : valider si les services dégradés sont liés aux outils non câblés\",\n \"S'assurer que la montée en couverture de gap_detector ne perturbe pas la stabilité nonreg (100% actuel)\"\n ]\n}\n```"
|
||||
}
|
||||
30
api/meetings/daily-2026-04-22-06-30.json
Normal file
30
api/meetings/daily-2026-04-22-06-30.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 06: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": "```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```"
|
||||
}
|
||||
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-21 12: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 bloque 'evolution' (nécessite routes\/skills pour générer propositions)\",\n \"Service MiroFish DOWN affecte potentiellement 'mirofish' et tout agent dépendant d'outils collaboratifs\",\n \"gitleaks+trivy mismatch dans 'l99' peut impacter sécurité globale et intégration continue\"\n ],\n \"common_issues\": [\n \"Problèmes de dépendances externes (services, versions, syntaxe)\",\n \"Manque de données ou formats incompatibles (PHP, parsing, versioning)\",\n \"Risque de paralysie partielle si les blocages ne sont pas résolus rapidement\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer 'evolution'\",\n \"Restaurer le service MiroFish ou basculer vers un outil de secours pour les outils collaboratifs\",\n \"Corriger le format de version entre gitleaks et trivy dans 'l99'\",\n \"Allouer un agent temporaire pour assistance multi-blocs si nécessaire\"\n ],\n \"conciliation\": [\n \"Coordonner 'l99' et 'evolution' sur un format de version commun partagé\",\n \"Désigner un relais ('scanner' ?) pour assurer la continuité info si 'mirofish' reste down\"\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,27 +1,27 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-22T03:10:02+00:00",
|
||||
"ts": "2026-04-22T13:50:02+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 44,
|
||||
"wtp_engagement": 70,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 11,
|
||||
"avg_score": 17.5,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
"mql_auto_scored": 18,
|
||||
"sql_auto_scored": 7,
|
||||
"mql_auto_pct": 38,
|
||||
"mql_auto_scored": 19,
|
||||
"sql_auto_scored": 8,
|
||||
"mql_auto_pct": 39,
|
||||
"improvement_vs_manual": {
|
||||
"before_manual_pct": 33.3,
|
||||
"after_auto_pct": 38,
|
||||
"delta": 4.700000000000003
|
||||
"after_auto_pct": 39,
|
||||
"delta": 5.700000000000003
|
||||
},
|
||||
"paperclip_db_ok": true,
|
||||
"paperclip_tables": 2,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
{
|
||||
"name": "weval-l99",
|
||||
"path": "/opt/weval-l99",
|
||||
"files": 664,
|
||||
"files": 669,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
@@ -10,12 +10,12 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.576438"
|
||||
"discovered": "2026-04-22T15:00:06.020676"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
"path": "/opt/wevia-brain",
|
||||
"files": 167,
|
||||
"files": 168,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.773185"
|
||||
"discovered": "2026-04-22T15:00:06.256591"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.181443"
|
||||
"discovered": "2026-04-22T15:00:05.663523"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.155753"
|
||||
"discovered": "2026-04-22T15:00:04.503816"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.530637"
|
||||
"discovered": "2026-04-22T15:00:04.973819"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.419883"
|
||||
"discovered": "2026-04-22T15:00:04.922113"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:02.734645"
|
||||
"discovered": "2026-04-22T15:00:03.828035"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.769431"
|
||||
"discovered": "2026-04-22T15:00:05.141327"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:04.384782"
|
||||
"discovered": "2026-04-22T15:00:05.919696"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:02.729170"
|
||||
"discovered": "2026-04-22T15:00:03.767301"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:02.743498"
|
||||
"discovered": "2026-04-22T15:00:03.944273"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:04.303401"
|
||||
"discovered": "2026-04-22T15:00:05.768185"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.196453"
|
||||
"discovered": "2026-04-22T15:00:04.514582"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.437223"
|
||||
"discovered": "2026-04-22T15:00:04.966196"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.976197"
|
||||
"discovered": "2026-04-22T15:00:05.397007"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:02.726368"
|
||||
"discovered": "2026-04-22T15:00:03.758177"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.660362"
|
||||
"discovered": "2026-04-22T15:00:05.055802"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:04.125761"
|
||||
"discovered": "2026-04-22T15:00:05.573919"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:04.197142"
|
||||
"discovered": "2026-04-22T15:00:05.701201"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:02.927508"
|
||||
"discovered": "2026-04-22T15:00:04.183285"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.716125"
|
||||
"discovered": "2026-04-22T15:00:05.121935"
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": false,
|
||||
"wired": false,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.739048"
|
||||
"discovered": "2026-04-22T15:00:03.863933"
|
||||
},
|
||||
{
|
||||
"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-22T05:00:03.239106"
|
||||
"discovered": "2026-04-22T15:00:04.521566"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.868648"
|
||||
"discovered": "2026-04-22T15:00:05.318985"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.422902"
|
||||
"discovered": "2026-04-22T15:00:05.942654"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.783635"
|
||||
"discovered": "2026-04-22T15:00:05.222467"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.785726"
|
||||
"discovered": "2026-04-22T15:00:05.259980"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.942716"
|
||||
"discovered": "2026-04-22T15:00:05.328074"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.151920"
|
||||
"discovered": "2026-04-22T15:00:05.650179"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.535805"
|
||||
"discovered": "2026-04-22T15:00:06.004213"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.578484"
|
||||
"discovered": "2026-04-22T15:00:06.082053"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.740268"
|
||||
"discovered": "2026-04-22T15:00:06.210244"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.772307"
|
||||
"discovered": "2026-04-22T15:00:04.052165"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.322173"
|
||||
"discovered": "2026-04-22T15:00:04.790298"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.123854"
|
||||
"discovered": "2026-04-22T15:00:05.538041"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -777,7 +777,20 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.360420"
|
||||
"discovered": "2026-04-22T15:00:05.866739"
|
||||
},
|
||||
{
|
||||
"name": "weval-cli",
|
||||
"path": "/opt/weval-cli",
|
||||
"files": 2,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": true,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.964326"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -790,7 +803,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.494641"
|
||||
"discovered": "2026-04-22T15:00:05.988024"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -803,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.662784"
|
||||
"discovered": "2026-04-22T15:00:06.147597"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -816,7 +829,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.701336"
|
||||
"discovered": "2026-04-22T15:00:06.173147"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -829,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.703453"
|
||||
"discovered": "2026-04-22T15:00:06.190247"
|
||||
},
|
||||
{
|
||||
"name": "blade",
|
||||
@@ -842,7 +855,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.058886"
|
||||
"discovered": "2026-04-22T15:00:04.267118"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -855,7 +868,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.252520"
|
||||
"discovered": "2026-04-22T15:00:04.539759"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -868,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.292301"
|
||||
"discovered": "2026-04-22T15:00:04.714038"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -881,7 +894,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.330081"
|
||||
"discovered": "2026-04-22T15:00:04.839802"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -894,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.822364"
|
||||
"discovered": "2026-04-22T15:00:05.288033"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -907,20 +920,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.382525"
|
||||
},
|
||||
{
|
||||
"name": "weval-cli",
|
||||
"path": "/opt/weval-cli",
|
||||
"files": 1,
|
||||
"has_readme": false,
|
||||
"has_skill": false,
|
||||
"has_python": false,
|
||||
"has_node": false,
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.482509"
|
||||
"discovered": "2026-04-22T15:00:05.881799"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -933,7 +933,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.744751"
|
||||
"discovered": "2026-04-22T15:00:06.236032"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -946,7 +946,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.823387"
|
||||
"discovered": "2026-04-22T15:00:06.288662"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -959,7 +959,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.720532"
|
||||
"discovered": "2026-04-22T15:00:03.706404"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -972,7 +972,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.732512"
|
||||
"discovered": "2026-04-22T15:00:03.790756"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -985,7 +985,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.309907"
|
||||
"discovered": "2026-04-22T15:00:04.737189"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -998,6 +998,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.792179"
|
||||
"discovered": "2026-04-22T15:00:06.265704"
|
||||
}
|
||||
]
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 312 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user