Compare commits
100 Commits
opus-sessi
...
wave-262-w
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
7e36744551 | ||
|
|
4e69151c4a | ||
|
|
3c7099fc3a | ||
|
|
9c83d0f4cc | ||
|
|
419f3cf02a | ||
|
|
c50ed34776 | ||
|
|
dd8bd30324 | ||
|
|
4d172d8b02 | ||
|
|
5a95677119 |
@@ -1335,5 +1335,6 @@ setInterval(refreshStats,60000);
|
||||
</div>
|
||||
<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>
|
||||
</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,7 +1,7 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-22T05:00:02+02:00",
|
||||
"disk_pct": 85,
|
||||
"ts": "2026-04-22T10:30:01+02:00",
|
||||
"disk_pct": 86,
|
||||
"disk_free_gb": 22,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 14,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-22T05:00:03+02:00",
|
||||
"ts": "2026-04-22T10: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": 2252,
|
||||
"pages": 327,
|
||||
"apis": 254,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
{
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-21 22:00"
|
||||
"timestamp": "2026-04-22 04:00"
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-22T05:00:02+02:00",
|
||||
"ts": "2026-04-22T10:00:01+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": 10,
|
||||
"adoption_pct": 66,
|
||||
"chat_queries_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 21,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
"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:00:04+02:00",
|
||||
"ts": "2026-04-22T10:40:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-22T05:00:03+02:00",
|
||||
"ts": "2026-04-22T10:00:01+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-22T10:30:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 80,
|
||||
"mql_auto": 17,
|
||||
"residual_risk_pct": 83,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "10.82",
|
||||
"load_5min": "2.16",
|
||||
"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 10:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 19,
|
||||
"disk": "85%",
|
||||
"docker": 20,
|
||||
"disk": "86%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "13.04",
|
||||
"uptime": "up 1 week, 16 hours, 8 minutes"
|
||||
"load": "1.77",
|
||||
"uptime": "up 1 week, 22 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -45,17 +45,17 @@
|
||||
},
|
||||
{
|
||||
"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": ""
|
||||
},
|
||||
{
|
||||
@@ -65,7 +65,7 @@
|
||||
},
|
||||
{
|
||||
"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": 327
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 95
|
||||
"count": 96
|
||||
},
|
||||
"dataset": {
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 2123
|
||||
"entries": 2296
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T00:00:03.159161",
|
||||
"generated_at": "2026-04-22T06:00:03.128913",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 19,
|
||||
"issues_count": 5,
|
||||
"fixed_elements_checked": 21,
|
||||
"issues_count": 6,
|
||||
"status": "CRITICAL",
|
||||
"doctrine_61": "bottom-right reserved for chat WEVIA only",
|
||||
"issues": [
|
||||
@@ -15,6 +15,14 @@
|
||||
"z": 9997,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "wevia-widget.html",
|
||||
"element": "#opus-pattern-badge",
|
||||
"type": "css_rule",
|
||||
"corner": "bottom-right",
|
||||
"z": 99990,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "agents-archi.html",
|
||||
"element": "mImg",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-21T22:00:06+00:00",
|
||||
"compute_ms": 4023,
|
||||
"timestamp": "2026-04-22T04:00:05+00:00",
|
||||
"compute_ms": 3689,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -13,31 +13,31 @@
|
||||
"oss_tools": 765,
|
||||
"oss_skills": 734,
|
||||
"oss_tests": 765,
|
||||
"docker": 20,
|
||||
"docker": 19,
|
||||
"ollama_models": 7,
|
||||
"git_repos": 38,
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 968,
|
||||
"latency_ms": 949,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 1001,
|
||||
"latency_ms": 1106,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
},
|
||||
"scores": {
|
||||
"combined": 75,
|
||||
"infra": 57,
|
||||
"infra": 56,
|
||||
"ecosystem": 100,
|
||||
"agents": 0,
|
||||
"skills": 100,
|
||||
"nonreg": 100,
|
||||
"oss": 100,
|
||||
"docker": 100,
|
||||
"docker": 95,
|
||||
"providers": 72,
|
||||
"hierarchy": 0,
|
||||
"instructions": 100
|
||||
@@ -45,7 +45,7 @@
|
||||
"leaderboard": [
|
||||
{
|
||||
"name": "WEVAL_Ecosystem",
|
||||
"score": 80.7,
|
||||
"score": 80.6,
|
||||
"skills": 839,
|
||||
"agents": 0
|
||||
},
|
||||
@@ -61,7 +61,7 @@
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_MiroFish",
|
||||
"score": 100,
|
||||
"score": 95,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
|
||||
15
api/ambre-check-wire.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
foreach (["wevia-master.html", "wevia-orchestrator.html", "director-chat.html", "l99-brain.html"] as $p) {
|
||||
$f = "/var/www/html/$p";
|
||||
if (!file_exists($f)) { $out[$p] = "missing"; continue; }
|
||||
$c = @file_get_contents($f);
|
||||
$out[$p] = [
|
||||
"size" => strlen($c),
|
||||
"widget" => substr_count($c, "ambre-universal-chat.js"),
|
||||
"last_body_pos" => strrpos($c, "</body>"),
|
||||
"ends_with" => substr(trim($c), -200),
|
||||
];
|
||||
}
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
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);
|
||||
})();
|
||||
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
@@ -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
21
api/ambre-export-v47.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/v47-*.png") as $s) {
|
||||
$bn = "wevia-v47-widget-" . basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
$video_dir = glob("$src/v47-*chromium");
|
||||
if ($video_dir) {
|
||||
$vids = glob($video_dir[0] . "/video.webm");
|
||||
if ($vids) {
|
||||
$dv = "$dst/wevia-v47-widget-proof-" . 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);
|
||||
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
@@ -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
@@ -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);
|
||||
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);
|
||||
}
|
||||
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
@@ -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);
|
||||
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": "v46-debug.spec.js",
|
||||
"file": "v46-debug.spec.js",
|
||||
"title": "v52-open.spec.js",
|
||||
"file": "v52-open.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V46 · Debug V11 triggers + console logs",
|
||||
"title": "V52 · root / + open widget + inspect iframe after shield",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
{
|
||||
"timeout": 200000,
|
||||
"timeout": 90000,
|
||||
"annotations": [],
|
||||
"expectedStatus": "passed",
|
||||
"projectId": "chromium",
|
||||
@@ -80,60 +80,39 @@
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 166633,
|
||||
"duration": 9340,
|
||||
"errors": [],
|
||||
"stdout": [
|
||||
{
|
||||
"text": "Waiting multi-agent...\n"
|
||||
"text": "Bubbles found: []\n"
|
||||
},
|
||||
{
|
||||
"text": "\n=== Console logs ===\n"
|
||||
"text": "Clicked: \u001b[1mnull\u001b[22m\n"
|
||||
},
|
||||
{
|
||||
"text": " [error] Failed to load resource: the server responded with a status of 503 ()\n"
|
||||
"text": "\nLeak state: {\n \"doc_has_wtp_admin\": false,\n \"doc_has_claude_pattern\": false,\n \"iframes\": [\n {\n \"idx\": 0,\n \"src\": \"https://weval-consulting.com/wevia-widget.html\",\n \"visible\": false,\n \"has_wtp_admin_droid\": false,\n \"has_claude_pattern\": true,\n \"pattern_badge_visible\": false,\n \"dock_visible\": false,\n \"shield_loaded\": true\n }\n ]\n}\n"
|
||||
},
|
||||
{
|
||||
"text": " [error] Failed to load resource: the server responded with a status of 503 ()\n"
|
||||
"text": "SHIELD: [ambre-confidential-shield] active on public page: /\n"
|
||||
},
|
||||
{
|
||||
"text": " [log] [V11-MULTIAGENT] triggered for text: compare WEVIA avec OPUS sur architecture, couts, securite en analyse complete mu\n"
|
||||
},
|
||||
{
|
||||
"text": " [error] Failed to load resource: the server responded with a status of 503 ()\n"
|
||||
},
|
||||
{
|
||||
"text": " [error] Failed to load resource: the server responded with a status of 502 ()\n"
|
||||
},
|
||||
{
|
||||
"text": " [warning] [retry] /api/ambre-multiagent-parallel.php got 502, retry #1\n"
|
||||
},
|
||||
{
|
||||
"text": " [log] [V11] response status 200\n"
|
||||
},
|
||||
{
|
||||
"text": "\n=== Errors ===\n"
|
||||
},
|
||||
{
|
||||
"text": "\n=== Last msg ===\n"
|
||||
},
|
||||
{
|
||||
"text": "{\n \"text\": \"🧠 Multi-Agent\\n5 agents ∥\\n⚡ 5x speedup\\n16905ms\\n📋 Plan · Comparer WEVIA avec OPUS en matière d'architecture, de coûts et de sécurité selon une analyse complète et multi-angle.\\n5 agents dispatchés en parallèle\\n🤖 Agents · exécution parallèle\\n🔍 researcher · web_search · 12176ms\\nRecueillir des informations détaillées sur l'architecture technique de WEVIA et d'OPUS à partir de sources fiables.\\n{\\\"quer\",\n \"has_synth\": true,\n \"badges\": 4,\n \"html_len\": 6620\n}\n"
|
||||
"text": "SHIELD: [ambre-confidential-shield] active on public page: /wevia-widget.html\n"
|
||||
}
|
||||
],
|
||||
"stderr": [],
|
||||
"retry": 0,
|
||||
"startTime": "2026-04-22T02:54:24.596Z",
|
||||
"startTime": "2026-04-22T08:49:22.157Z",
|
||||
"annotations": [],
|
||||
"attachments": [
|
||||
{
|
||||
"name": "screenshot",
|
||||
"contentType": "image/png",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v46-debug-V46-·-Debug-V11-triggers-console-logs-chromium/test-finished-1.png"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v52-open-V52-·-root-open-widget-inspect-iframe-after-shield-chromium/test-finished-1.png"
|
||||
},
|
||||
{
|
||||
"name": "video",
|
||||
"contentType": "video/webm",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v46-debug-V46-·-Debug-V11-triggers-console-logs-chromium/video.webm"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v52-open-V52-·-root-open-widget-inspect-iframe-after-shield-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -141,8 +120,8 @@
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "43927d920210b130c5c8-fed91c1b3d281fc0e1a8",
|
||||
"file": "v46-debug.spec.js",
|
||||
"id": "028885fab629fbd685a3-634b9484450bcc32355a",
|
||||
"file": "v52-open.spec.js",
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
@@ -151,8 +130,8 @@
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-22T02:54:23.825Z",
|
||||
"duration": 167589.90399999998,
|
||||
"startTime": "2026-04-22T08:49:21.507Z",
|
||||
"duration": 10195.55,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
|
||||
|
Before Width: | Height: | Size: 281 KiB |
|
Before Width: | Height: | Size: 281 KiB |
BIN
api/ambre-pw-tests/output/v52-00-initial.png
Normal file
|
After Width: | Height: | Size: 229 KiB |
BIN
api/ambre-pw-tests/output/v52-01-after-click.png
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
api/ambre-pw-tests/output/v52-02-widget-opened.png
Normal file
|
After Width: | Height: | Size: 227 KiB |
|
After Width: | Height: | Size: 227 KiB |
@@ -1,48 +0,0 @@
|
||||
const { test } = require("@playwright/test");
|
||||
|
||||
test("V46 · Debug V11 triggers + console logs", async ({ page }) => {
|
||||
test.setTimeout(200000);
|
||||
const logs = [];
|
||||
const errs = [];
|
||||
page.on("console", m => logs.push({type:m.type(), text:m.text().substring(0,200)}));
|
||||
page.on("pageerror", e => errs.push(e.message.substring(0,200)));
|
||||
|
||||
await page.goto("/wevia.html?cb=" + Date.now());
|
||||
await page.evaluate(() => { try{sessionStorage.clear();}catch(e){} });
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// Skip HI - straight to multi-agent
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({force:true});
|
||||
await input.fill("compare WEVIA avec OPUS sur architecture, couts, securite en analyse complete multi-angle");
|
||||
await page.waitForTimeout(500);
|
||||
await input.press("Enter");
|
||||
|
||||
console.log("Waiting multi-agent...");
|
||||
await page.waitForTimeout(150000); // wait 2.5min for response
|
||||
|
||||
console.log("\n=== Console logs ===");
|
||||
logs.filter(l => l.text.includes("V11") || l.text.includes("multi") || l.type === "error").forEach(l => {
|
||||
console.log(` [${l.type}] ${l.text}`);
|
||||
});
|
||||
console.log("\n=== Errors ===");
|
||||
errs.forEach(e => console.log(` ${e}`));
|
||||
|
||||
await page.screenshot({ path: "output/v46-result.png", fullPage: true });
|
||||
|
||||
// Extract last assistant message
|
||||
const last = await page.evaluate(() => {
|
||||
const msgs = document.querySelectorAll(".msg.assistant");
|
||||
if (msgs.length === 0) return "no msg";
|
||||
const l = msgs[msgs.length-1];
|
||||
return {
|
||||
text: (l.querySelector(".bubble")?.innerText || "").substring(0, 400),
|
||||
has_synth: /Synth[eè]se consolid/.test(l.innerHTML),
|
||||
badges: l.querySelectorAll(".nx-badge").length,
|
||||
html_len: l.innerHTML.length,
|
||||
};
|
||||
});
|
||||
console.log("\n=== Last msg ===");
|
||||
console.log(JSON.stringify(last, null, 2));
|
||||
});
|
||||
87
api/ambre-pw-tests/tests/v52-open.spec.js
Normal file
@@ -0,0 +1,87 @@
|
||||
const { test } = require("@playwright/test");
|
||||
|
||||
test("V52 · root / + open widget + inspect iframe after shield", async ({ page }) => {
|
||||
test.setTimeout(90000);
|
||||
const logs = [];
|
||||
page.on("console", m => logs.push(m.text().substring(0, 200)));
|
||||
|
||||
await page.goto("/?cb=" + Date.now());
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(4000);
|
||||
|
||||
// Look for chat bubble (bottom right 🧠)
|
||||
const bubbles = await page.evaluate(() => {
|
||||
return Array.from(document.querySelectorAll('button, div, a')).filter(el => {
|
||||
var t = (el.innerText || el.textContent || '').trim();
|
||||
var s = window.getComputedStyle(el);
|
||||
return (t === '🧠' || t.includes('Claude Patter') || el.className.toString().includes('chat-toggle') || el.className.toString().includes('fab'))
|
||||
&& s.position === 'fixed' && el.offsetParent !== null;
|
||||
}).map(el => ({
|
||||
text: el.innerText.substring(0, 50),
|
||||
id: el.id,
|
||||
class: el.className.toString().substring(0, 100),
|
||||
tag: el.tagName,
|
||||
}));
|
||||
});
|
||||
console.log("Bubbles found:", JSON.stringify(bubbles));
|
||||
await page.screenshot({ path: "output/v52-00-initial.png" });
|
||||
|
||||
// Click any bubble that looks like chat toggle
|
||||
const clicked = await page.evaluate(() => {
|
||||
const cands = Array.from(document.querySelectorAll('button, div, a')).filter(el => {
|
||||
var t = (el.innerText || '').trim();
|
||||
var s = window.getComputedStyle(el);
|
||||
return (t === '🧠' || t.includes('Claude')) && s.position === 'fixed' && el.offsetParent !== null;
|
||||
});
|
||||
if (cands.length > 0) { cands[0].click(); return cands[0].innerText.substring(0,50); }
|
||||
// Try clicking any bottom-right fixed button
|
||||
const fbtns = Array.from(document.querySelectorAll('button, div[role="button"]')).filter(el => {
|
||||
var r = el.getBoundingClientRect();
|
||||
var s = window.getComputedStyle(el);
|
||||
return s.position === 'fixed' && r.right > window.innerWidth - 100 && r.bottom > window.innerHeight - 150 && el.offsetParent !== null;
|
||||
});
|
||||
if (fbtns.length > 0) { fbtns[0].click(); return "fixed-bottom-right"; }
|
||||
return null;
|
||||
});
|
||||
console.log("Clicked:", clicked);
|
||||
await page.waitForTimeout(2500);
|
||||
await page.screenshot({ path: "output/v52-01-after-click.png" });
|
||||
|
||||
// Now re-check: is there visible WTP or Claude Pattern dock?
|
||||
const leakState = await page.evaluate(() => {
|
||||
const state = {};
|
||||
// Direct document
|
||||
const bt = document.body.innerText;
|
||||
state.doc_has_wtp_admin = /\bWTP\b/.test(bt) && /\bAdmin\b/.test(bt) && /\bDroid\b/.test(bt);
|
||||
state.doc_has_claude_pattern = /Claude\s*Pattern/i.test(bt);
|
||||
|
||||
// Iframes - check inside each one
|
||||
const iframes = document.querySelectorAll('iframe');
|
||||
state.iframes = [];
|
||||
iframes.forEach((f, i) => {
|
||||
try {
|
||||
const doc = f.contentDocument;
|
||||
if (!doc) return;
|
||||
const ibt = doc.body ? doc.body.innerText : '';
|
||||
const dock_visible = !!doc.getElementById('wtp-udock') || !!doc.querySelector('#wtp-sidebar');
|
||||
const pattern_visible = !!doc.getElementById('opus-pattern-badge') && doc.getElementById('opus-pattern-badge').offsetParent !== null;
|
||||
state.iframes.push({
|
||||
idx: i,
|
||||
src: f.src,
|
||||
visible: f.offsetParent !== null,
|
||||
has_wtp_admin_droid: /\bWTP\b/.test(ibt) && /\bAdmin\b/.test(ibt) && /\bDroid\b/.test(ibt),
|
||||
has_claude_pattern: /Claude\s*Pattern/i.test(ibt),
|
||||
pattern_badge_visible: pattern_visible,
|
||||
dock_visible: dock_visible,
|
||||
shield_loaded: !!doc.getElementById('ambre-confidential-shield'),
|
||||
});
|
||||
} catch(e) { state.iframes.push({idx:i, src:f.src, cross_origin_blocked:true, err:e.message.substring(0,80)}); }
|
||||
});
|
||||
return state;
|
||||
});
|
||||
console.log("\nLeak state:", JSON.stringify(leakState, null, 2));
|
||||
await page.screenshot({ path: "output/v52-02-widget-opened.png" });
|
||||
|
||||
// console logs shield
|
||||
logs.filter(l => l.includes('shield')).forEach(l => console.log("SHIELD:", l));
|
||||
});
|
||||
7
api/ambre-pw-v47-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDcgwrcgVW5pdmVyc2FsIGNoYXQgd2lkZ2V0IG9uIGFsbC1pYS1odWIiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL2FsbC1pYS1odWIuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgLy8gQ2hlY2sgYnV0dG9uIHByZXNlbnQKICBjb25zdCBidG4gPSBhd2FpdCBwYWdlLmxvY2F0b3IoIi5hbXctYnRuIikuY291bnQoKTsKICBjb25zb2xlLmxvZyhgV2lkZ2V0IGJ1dHRvbiBjb3VudDogJHtidG59YCk7CiAgCiAgaWYgKGJ0biA+IDApIHsKICAgIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQ3LTAwLWluaXRpYWwucG5nIiB9KTsKICAgIAogICAgLy8gQ2xpY2sgdG8gb3BlbiBwYW5lbAogICAgYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LWJ0biIpLmNsaWNrKCk7CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDE1MDApOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDctMDEtb3BlbmVkLnBuZyIgfSk7CiAgICAKICAgIC8vIFNlbmQgYSBtZXNzYWdlCiAgICBhd2FpdCBwYWdlLmxvY2F0b3IoIiNhbXdJbnB1dCIpLmZpbGwoIkJvbmpvdXIsIHF1ZWwgZXN0IG1vbiBjaGF0X2lkID8iKTsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwKTsKICAgIGF3YWl0IHBhZ2UubG9jYXRvcigiI2Ftd1NlbmQiKS5jbGljaygpOwogICAgCiAgICAvLyBXYWl0IGZvciByZXNwb25zZQogICAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogICAgd2hpbGUgKERhdGUubm93KCkgLSB3cyA8IDMwMDAwKSB7CiAgICAgIGNvbnN0IG1zZ3MgPSBhd2FpdCBwYWdlLmxvY2F0b3IoIi5hbXctbXNnLmEiKS5jb3VudCgpOwogICAgICBpZiAobXNncyA+IDEpIGJyZWFrOyAgLy8gV2UgbmVlZCBhdCBsZWFzdCBncmVldGluZyArIHJlc3BvbnNlCiAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTAwMCk7CiAgICB9CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDE1MDApOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDctMDItY2hhdC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgICAKICAgIC8vIEdldCBsYXN0IG1lc3NhZ2UgdGV4dAogICAgY29uc3QgdHh0ID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LW1zZy5hIikubGFzdCgpLmlubmVyVGV4dCgpOwogICAgY29uc29sZS5sb2coYFJlc3BvbnNlOiAke3R4dC5zdWJzdHJpbmcoMCwgNDAwKX1gKTsKICAgIAogICAgLy8gQ2hlY2sgdHVybnMgY291bnRlcgogICAgY29uc3QgdHVybnMgPSBhd2FpdCBwYWdlLmxvY2F0b3IoIiNhbXdUdXJucyIpLmlubmVyVGV4dCgpOwogICAgY29uc29sZS5sb2coYFR1cm5zOiAke3R1cm5zfWApOwogICAgCiAgICAvLyBUZXN0IG11bHRpLWFnZW50CiAgICBhd2FpdCBwYWdlLmxvY2F0b3IoIiNhbXdJbnB1dCIpLmZpbGwoImZhaXMgdW5lIGFuYWx5c2UgY29tcGxldGUgZHUgbWFyY2hlIElBIDIwMjYiKTsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwKTsKICAgIGF3YWl0IHBhZ2UubG9jYXRvcigiI2Ftd1NlbmQiKS5jbGljaygpOwogICAgCiAgICBjb25zdCB3czIgPSBEYXRlLm5vdygpOwogICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHdzMiA8IDkwMDAwKSB7CiAgICAgIGNvbnN0IG1hID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LW1zZy5hLm1hIikuY291bnQoKTsKICAgICAgaWYgKG1hID4gMCkgeyBmb3VuZCA9IHRydWU7IGJyZWFrOyB9CiAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMjAwMCk7CiAgICB9CiAgICBjb25zb2xlLmxvZyhgTXVsdGktYWdlbnQgbW9kZSB0cmlnZ2VyZWQ6ICR7Zm91bmR9IGluICR7KChEYXRlLm5vdygpLXdzMikvMTAwMCkudG9GaXhlZCgxKX1zYCk7CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDE1MDApOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDctMDMtbXVsdGlhZ2VudC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgICAKICB9IGVsc2UgewogICAgY29uc29sZS5sb2coIuKdjCBXaWRnZXQgYnV0dG9uIG5vdCBmb3VuZCIpOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDctbm93aWRnZXQucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7CiAgfQp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v47-widget.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
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
@@ -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
@@ -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
@@ -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
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
@@ -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,
|
||||
]);
|
||||
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);
|
||||
179
api/ambre-universal-chat.js
Normal file
@@ -0,0 +1,179 @@
|
||||
/**
|
||||
* ambre-universal-chat.js · wave-259 · Universal chat widget for all internal pages
|
||||
*
|
||||
* Usage: just <script src="/api/ambre-universal-chat.js"></script>
|
||||
* - Auto-creates minimal chat UI (floating button + panel)
|
||||
* - Uses /api/ambre-internal-chat-api.php (persistent memory + cross-chat learning)
|
||||
* - Auto chat_id = hostname + pathname
|
||||
* - Works on wevia-master, all-ia-hub, orchestrator, director-chat, l99-brain, etc.
|
||||
*/
|
||||
(function(){
|
||||
if (window.__ambreUniversalChat) return;
|
||||
window.__ambreUniversalChat = true;
|
||||
|
||||
var chatId = "internal-" + (location.pathname.replace(/[^a-z0-9]/gi, "-").toLowerCase() || "root");
|
||||
var apiUrl = "/api/ambre-internal-chat-api.php";
|
||||
|
||||
// Styles
|
||||
var style = document.createElement("style");
|
||||
style.textContent = `
|
||||
.amw-btn{position:fixed;bottom:20px;right:20px;width:56px;height:56px;border-radius:50%;
|
||||
background:linear-gradient(135deg,#4338ca,#6366f1);color:#fff;border:none;cursor:pointer;
|
||||
box-shadow:0 4px 20px rgba(99,102,241,.4);z-index:99997;font-size:24px;transition:transform .15s}
|
||||
.amw-btn:hover{transform:scale(1.08)}
|
||||
.amw-panel{position:fixed;bottom:90px;right:20px;width:400px;max-width:calc(100vw - 40px);
|
||||
height:560px;max-height:calc(100vh - 120px);background:#fff;border-radius:16px;
|
||||
box-shadow:0 20px 60px rgba(0,0,0,.25);z-index:99998;display:none;flex-direction:column;
|
||||
overflow:hidden;font-family:system-ui,-apple-system,sans-serif}
|
||||
.amw-panel.open{display:flex;animation:amwSlide .2s ease}
|
||||
@keyframes amwSlide{from{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}
|
||||
.amw-header{padding:14px 16px;background:linear-gradient(135deg,#4338ca,#6366f1);color:#fff;
|
||||
display:flex;justify-content:space-between;align-items:center}
|
||||
.amw-header h3{margin:0;font-size:14px;font-weight:600}
|
||||
.amw-header .meta{font-size:11px;opacity:.85;margin-top:2px}
|
||||
.amw-close{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0 4px}
|
||||
.amw-body{flex:1;overflow-y:auto;padding:14px;background:#f8fafc}
|
||||
.amw-msg{margin:8px 0;padding:10px 12px;border-radius:12px;max-width:85%;font-size:13px;line-height:1.4;word-wrap:break-word}
|
||||
.amw-msg.u{background:#eef2ff;color:#1e293b;margin-left:auto;border-bottom-right-radius:4px}
|
||||
.amw-msg.a{background:#fff;color:#1e293b;border:1px solid #e2e8f0;border-bottom-left-radius:4px}
|
||||
.amw-msg.a .meta{font-size:10px;color:#94a3b8;margin-top:4px}
|
||||
.amw-msg.a.ma{background:linear-gradient(135deg,#f0f9ff,#eef2ff);border-color:#6366f1}
|
||||
.amw-msg.a.ma::before{content:"🧠 Multi-Agent";display:block;font-size:10px;color:#4338ca;font-weight:600;margin-bottom:4px}
|
||||
.amw-input-wrap{padding:10px;background:#fff;border-top:1px solid #e2e8f0;display:flex;gap:8px}
|
||||
.amw-input{flex:1;padding:10px 12px;border:1px solid #cbd5e1;border-radius:10px;font-size:13px;outline:none;font-family:inherit}
|
||||
.amw-input:focus{border-color:#6366f1}
|
||||
.amw-send{padding:0 16px;background:linear-gradient(135deg,#4338ca,#6366f1);color:#fff;border:none;border-radius:10px;cursor:pointer;font-size:13px;font-weight:500}
|
||||
.amw-send:disabled{opacity:.5;cursor:not-allowed}
|
||||
.amw-typing{padding:10px;font-size:11px;color:#94a3b8;font-style:italic}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
|
||||
// Elements
|
||||
var btn = document.createElement("button");
|
||||
btn.className = "amw-btn";
|
||||
btn.innerHTML = "💬";
|
||||
btn.title = "Chat interne WEVIA · mémoire persistante";
|
||||
document.body.appendChild(btn);
|
||||
|
||||
var panel = document.createElement("div");
|
||||
panel.className = "amw-panel";
|
||||
panel.innerHTML = `
|
||||
<div class="amw-header">
|
||||
<div>
|
||||
<h3>💬 Chat Interne · WEVIA</h3>
|
||||
<div class="meta">Mémoire persistante · Multi-agent · <span id="amwTurns">0</span> tours</div>
|
||||
</div>
|
||||
<button class="amw-close">✕</button>
|
||||
</div>
|
||||
<div class="amw-body" id="amwBody"></div>
|
||||
<div class="amw-input-wrap">
|
||||
<input class="amw-input" id="amwInput" placeholder="Écrivez (analyse complete pour multi-agent)..." />
|
||||
<button class="amw-send" id="amwSend">Envoyer</button>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(panel);
|
||||
|
||||
btn.addEventListener("click", function(){ panel.classList.toggle("open"); });
|
||||
panel.querySelector(".amw-close").addEventListener("click", function(){ panel.classList.remove("open"); });
|
||||
|
||||
var body = panel.querySelector("#amwBody");
|
||||
var input = panel.querySelector("#amwInput");
|
||||
var sendBtn = panel.querySelector("#amwSend");
|
||||
var turnsSpan = panel.querySelector("#amwTurns");
|
||||
|
||||
function addMsg(role, text, meta){
|
||||
var m = document.createElement("div");
|
||||
m.className = "amw-msg " + (role === "user" ? "u" : "a") + (meta && meta.mode === "multiagent" ? " ma" : "");
|
||||
var safe = (text || "").replace(/</g,"<").replace(/\n/g,"<br>");
|
||||
m.innerHTML = safe;
|
||||
if (meta && role === "assistant") {
|
||||
var mi = document.createElement("div");
|
||||
mi.className = "meta";
|
||||
mi.textContent = (meta.total_ms || 0) + "ms · " + (meta.mode || "std") + (meta.agents ? " · " + meta.agents + " agents" : "");
|
||||
m.appendChild(mi);
|
||||
}
|
||||
body.appendChild(m);
|
||||
body.scrollTop = body.scrollHeight;
|
||||
}
|
||||
|
||||
function showTyping(){
|
||||
var t = document.createElement("div");
|
||||
t.id = "amwTyping";
|
||||
t.className = "amw-typing";
|
||||
t.textContent = "WEVIA réfléchit...";
|
||||
body.appendChild(t);
|
||||
body.scrollTop = body.scrollHeight;
|
||||
}
|
||||
function hideTyping(){
|
||||
var t = document.getElementById("amwTyping");
|
||||
if (t) t.remove();
|
||||
}
|
||||
|
||||
function send(){
|
||||
var msg = input.value.trim();
|
||||
if (!msg) return;
|
||||
input.value = "";
|
||||
sendBtn.disabled = true;
|
||||
addMsg("user", msg);
|
||||
showTyping();
|
||||
|
||||
var ctrl = new AbortController();
|
||||
var timeout = setTimeout(function(){ ctrl.abort(); }, 120000);
|
||||
|
||||
fetch(apiUrl, {
|
||||
method: "POST",
|
||||
headers: {"Content-Type":"application/json","Cache-Control":"no-cache"},
|
||||
body: JSON.stringify({ chat_id: chatId, message: msg }),
|
||||
signal: ctrl.signal,
|
||||
cache: "no-store",
|
||||
})
|
||||
.then(function(r){ clearTimeout(timeout); return r.json(); })
|
||||
.then(function(d){
|
||||
hideTyping();
|
||||
sendBtn.disabled = false;
|
||||
if (d && d.ok) {
|
||||
addMsg("assistant", d.response || "(empty)", {
|
||||
mode: d.mode,
|
||||
total_ms: d.total_ms,
|
||||
agents: d.agents ? d.agents.length : 0,
|
||||
});
|
||||
turnsSpan.textContent = d.memory_turns || 0;
|
||||
} else {
|
||||
addMsg("assistant", "❌ " + ((d && d.error) || "Erreur"));
|
||||
}
|
||||
})
|
||||
.catch(function(err){
|
||||
hideTyping();
|
||||
sendBtn.disabled = false;
|
||||
addMsg("assistant", "❌ " + (err.name === "AbortError" ? "Timeout 2min" : String(err)));
|
||||
});
|
||||
}
|
||||
|
||||
sendBtn.addEventListener("click", send);
|
||||
input.addEventListener("keydown", function(e){ if (e.key === "Enter" && !e.shiftKey){ e.preventDefault(); send(); } });
|
||||
|
||||
// Load prior context on open
|
||||
var loaded = false;
|
||||
btn.addEventListener("click", function(){
|
||||
if (loaded || !panel.classList.contains("open")) return;
|
||||
loaded = true;
|
||||
fetch("/api/ambre-internal-memory.php", {
|
||||
method: "POST",
|
||||
headers: {"Content-Type":"application/json"},
|
||||
body: JSON.stringify({ action: "load", chat_id: chatId, n: 20 }),
|
||||
cache: "no-store",
|
||||
})
|
||||
.then(function(r){ return r.json(); })
|
||||
.then(function(d){
|
||||
if (d && d.ok && d.messages && d.messages.length > 0) {
|
||||
d.messages.forEach(function(m){
|
||||
if (m.role === "user" || m.role === "assistant") addMsg(m.role, m.content, m.metadata);
|
||||
});
|
||||
turnsSpan.textContent = d.messages.length;
|
||||
} else {
|
||||
addMsg("assistant", "Bonjour ! Je suis WEVIA interne (mémoire persistante illimitée). Chat_id: " + chatId);
|
||||
}
|
||||
})
|
||||
.catch(function(){});
|
||||
});
|
||||
})();
|
||||
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
@@ -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);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-22 03:00:02",
|
||||
"generated": "2026-04-22 08:30:01",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 85,
|
||||
"disk_pct": 86,
|
||||
"disk_avail": "22G",
|
||||
"uptime": "up 1 week, 17 hours, 8 minutes",
|
||||
"uptime": "up 1 week, 22 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
|
||||
},
|
||||
@@ -66,7 +66,7 @@
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"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": 327,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 1025,
|
||||
"s204_api_php": 1046,
|
||||
"s204_wevia_php": 254,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -306,7 +316,7 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5622,
|
||||
"kb_learnings": 5699,
|
||||
"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": 5699,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3024"
|
||||
"cnt": "3090"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1242"
|
||||
"cnt": "1253"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1724,44 +1734,44 @@
|
||||
"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 08:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:25:05.043155"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:50: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:50:06.163078"
|
||||
"fact": "AUTONOMY 22Apr 08:20: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:20:05.6286"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:45: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:45:06.542555"
|
||||
"fact": "AUTONOMY 22Apr 08:15: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:15:06.533813"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:40: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:40:06.220594"
|
||||
"fact": "AUTONOMY 22Apr 08:10: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:10:06.375058"
|
||||
},
|
||||
{
|
||||
"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 08:05: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:05:05.386486"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:30: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:30:09.044797"
|
||||
"fact": "AUTONOMY 22Apr 08:00: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:00:08.200387"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 04:25:07.944997"
|
||||
"fact": "AUTONOMY 22Apr 07:55: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:55:05.077922"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:20: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:20:05.987441"
|
||||
"fact": "AUTONOMY 22Apr 07:50: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:50:06.264413"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:15: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:15:06.951973"
|
||||
"fact": "AUTONOMY 22Apr 07:45: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:45:05.356474"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 02:10: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 04:10:05.81299"
|
||||
"fact": "AUTONOMY 22Apr 07:40: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:40:05.738663"
|
||||
}
|
||||
],
|
||||
"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": 3016,
|
||||
"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:05:01.999106",
|
||||
"generated_at": "2026-04-22T10:50:02.021965",
|
||||
"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-22T10:45:01.745593",
|
||||
"last_heartbeat": "2026-04-22T10:45:01.745593",
|
||||
"last_heartbeat_ts_epoch": 1776847501,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
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-22T04:00:08+00:00",
|
||||
"priority": "P0"
|
||||
}
|
||||
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-22T04:00:08+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
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-22T04:00:08+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
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
@@ -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 08: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": "3.12",
|
||||
"uptime": "up 1 week, 20 hours, 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": "2252 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
|
After Width: | Height: | Size: 24 KiB |
@@ -1,286 +0,0 @@
|
||||
{
|
||||
"ts": "2026-04-22T03:05:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 2.58,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 12564,
|
||||
"ram_free_mb": 18770,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "123G",
|
||||
"disk_free": "22G",
|
||||
"disk_pct": "85%",
|
||||
"fpm_workers": 140,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.99,
|
||||
"disk_pct": "82%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12068
|
||||
},
|
||||
"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": 324,
|
||||
"php_apis": 1033,
|
||||
"wiki_entries": 2252,
|
||||
"vault_doctrines": 114,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 647,
|
||||
"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": 166737,
|
||||
"with_email": 110683,
|
||||
"with_phone": 159842,
|
||||
"gap_email": 56054,
|
||||
"pct_email": 66.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 127343,
|
||||
"with_email": 78569,
|
||||
"with_tel": 124086,
|
||||
"pct_email": 61.7,
|
||||
"pct_tel": 97.4
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19724,
|
||||
"with_email": 15081,
|
||||
"with_tel": 18737,
|
||||
"pct_email": 76.5,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17791,
|
||||
"with_email": 15154,
|
||||
"with_tel": 17019,
|
||||
"pct_email": 85.2,
|
||||
"pct_tel": 95.7
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up 9 seconds",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 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 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 2 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "fb681af44 auto-sync-0505",
|
||||
"dirty": 0,
|
||||
"status": "CLEAN"
|
||||
},
|
||||
"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": 4390,
|
||||
"health": {
|
||||
"score": 6,
|
||||
"max": 6,
|
||||
"pct": 100
|
||||
},
|
||||
"elapsed_ms": 10118
|
||||
}
|
||||
@@ -1,14 +1,18 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 00:00",
|
||||
"timestamp": "2026-04-22 06: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
|
||||
@@ -30,5 +34,5 @@
|
||||
"uptime-kuma",
|
||||
"vaultwarden"
|
||||
],
|
||||
"score": 96.2
|
||||
"score": 94.4
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
"status": "ERROR"
|
||||
},
|
||||
"ports": {
|
||||
"total": 76,
|
||||
"total": 74,
|
||||
"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=2669228,fd=12),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5888",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=10),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2669228,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=2669228,fd=5),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5822",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=4),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=4),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5821",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=3),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=3),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5825",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=13),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=13),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5824",
|
||||
"process": "users:((\"apache2\",pid=2670905,fd=6),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=6),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6379",
|
||||
@@ -72,18 +72,14 @@
|
||||
"addr": "0.0.0.0:8765",
|
||||
"process": "users:((\"python3\",pid=1811016,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:34111",
|
||||
"process": "users:((\"ollama\",pid=1295666,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:2024",
|
||||
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
|
||||
},
|
||||
{
|
||||
"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,10 +92,6 @@
|
||||
"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))"
|
||||
@@ -110,7 +102,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:443",
|
||||
"process": "users:((\"nginx\",pid=3734221,fd=5),(\"nginx\",pid=373"
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=5),(\"nginx\",pid=131"
|
||||
},
|
||||
{
|
||||
"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=1873436,fd=6),(\"nginx\",pid=131"
|
||||
},
|
||||
{
|
||||
"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=2669228,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-22T06:00:01",
|
||||
"oss_tools": [
|
||||
{
|
||||
"name": "Nuclei",
|
||||
|
||||
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 07:00",
|
||||
"squads": {
|
||||
"infra": {
|
||||
"name": "INFRA",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T00:30:02.808685",
|
||||
"timestamp": "2026-04-22T06:30:02.392649",
|
||||
"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
|
||||
[06:30:01] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[06:30:01] Enterprise: 747 agents
|
||||
[06:30:02] Registry: 11 sections
|
||||
[06:30:02] Docker: 20 containers
|
||||
[06:30:02] strat: 99 agents (38 active)
|
||||
[06:30:02] infra: 308 agents (34 active)
|
||||
[06:30:02] dev: 108 agents (25 active)
|
||||
[06:30:02] sec: 48 agents (13 active)
|
||||
[06:30:02] biz: 114 agents (31 active)
|
||||
[06:30:02] ia: 168 agents (48 active)
|
||||
[06:30:02] transit: 254 agents (27 active)
|
||||
[06:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
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
@@ -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```"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-21 12:30",
|
||||
"timestamp": "2026-04-22 06: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": "```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```"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-22T03:00:02+00:00",
|
||||
"ts": "2026-04-22T08:40:01+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
|
||||
@@ -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-22T10:00:04.920784"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:05.045410"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.181443"
|
||||
"discovered": "2026-04-22T10:00:04.712375"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.246402"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.513593"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.477976"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:03.924070"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.544614"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.819247"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:03.823926"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.012293"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.753953"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.196453"
|
||||
"discovered": "2026-04-22T10:00:04.268620"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.437223"
|
||||
"discovered": "2026-04-22T10:00:04.501912"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.650557"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:03.754936"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.527229"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.686972"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.727034"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.108949"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.716125"
|
||||
"discovered": "2026-04-22T10:00:04.542398"
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": false,
|
||||
"wired": false,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.739048"
|
||||
"discovered": "2026-04-22T10:00:03.934228"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.296762"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.868648"
|
||||
"discovered": "2026-04-22T10:00:04.619785"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.422902"
|
||||
"discovered": "2026-04-22T10:00:04.840053"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.783635"
|
||||
"discovered": "2026-04-22T10:00:04.564077"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.785726"
|
||||
"discovered": "2026-04-22T10:00:04.575351"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.942716"
|
||||
"discovered": "2026-04-22T10:00:04.630483"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.151920"
|
||||
"discovered": "2026-04-22T10:00:04.700016"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.535805"
|
||||
"discovered": "2026-04-22T10:00:04.895011"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.578484"
|
||||
"discovered": "2026-04-22T10:00:04.931705"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.740268"
|
||||
"discovered": "2026-04-22T10:00:05.030337"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.772307"
|
||||
"discovered": "2026-04-22T10:00:04.075915"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.322173"
|
||||
"discovered": "2026-04-22T10:00:04.397760"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.123854"
|
||||
"discovered": "2026-04-22T10:00:04.680793"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -777,7 +777,20 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.360420"
|
||||
"discovered": "2026-04-22T10:00:04.773197"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.858715"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -790,7 +803,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.494641"
|
||||
"discovered": "2026-04-22T10:00:04.878922"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -803,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.662784"
|
||||
"discovered": "2026-04-22T10:00:04.988297"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -816,7 +829,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.701336"
|
||||
"discovered": "2026-04-22T10:00:05.007622"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -829,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.703453"
|
||||
"discovered": "2026-04-22T10:00:05.016924"
|
||||
},
|
||||
{
|
||||
"name": "blade",
|
||||
@@ -842,7 +855,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.058886"
|
||||
"discovered": "2026-04-22T10:00:04.150704"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -855,7 +868,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.252520"
|
||||
"discovered": "2026-04-22T10:00:04.325918"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -868,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.292301"
|
||||
"discovered": "2026-04-22T10:00:04.388152"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -881,7 +894,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.330081"
|
||||
"discovered": "2026-04-22T10:00:04.432963"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -894,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.822364"
|
||||
"discovered": "2026-04-22T10:00:04.596734"
|
||||
},
|
||||
{
|
||||
"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-22T10:00:04.807918"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -933,7 +933,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.744751"
|
||||
"discovered": "2026-04-22T10:00:05.032412"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -946,7 +946,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.823387"
|
||||
"discovered": "2026-04-22T10:00:05.060419"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -959,7 +959,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.720532"
|
||||
"discovered": "2026-04-22T10:00:03.663271"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -972,7 +972,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:02.732512"
|
||||
"discovered": "2026-04-22T10:00:03.881659"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -985,7 +985,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:03.309907"
|
||||
"discovered": "2026-04-22T10:00:04.395754"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -998,6 +998,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T05:00:04.792179"
|
||||
"discovered": "2026-04-22T10:00:05.053387"
|
||||
}
|
||||
]
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 292 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 313 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 291 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 289 KiB |
|
After Width: | Height: | Size: 297 KiB |
|
After Width: | Height: | Size: 312 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 215 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 296 KiB |
|
After Width: | Height: | Size: 292 KiB |