Compare commits
154 Commits
wave-234-2
...
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 | ||
|
|
cdc924b8e5 | ||
|
|
0dd183b637 | ||
|
|
819201a5b2 | ||
|
|
fb681af44b | ||
|
|
fe18bfc8d4 | ||
|
|
830ce73dd5 | ||
|
|
f35837bd7d | ||
|
|
7b6ec9ab2f | ||
|
|
4ce9ffa942 | ||
|
|
ce2a371498 | ||
|
|
55c184bf68 | ||
|
|
57abf4807f | ||
|
|
c8edeb2a10 | ||
|
|
6f46267b86 | ||
|
|
39f66be2b5 | ||
|
|
4d1d266915 | ||
|
|
623afb14a6 | ||
|
|
fa0d20fe8f | ||
|
|
f9870e5fa6 | ||
|
|
855c28d9b9 | ||
|
|
3ec53dd4e1 | ||
|
|
77dd5ac9f4 | ||
|
|
9b92772dc6 | ||
|
|
9764dd6f25 | ||
|
|
664179598e | ||
|
|
652a8013ea | ||
|
|
4bf5987304 | ||
|
|
6a1f27480d | ||
|
|
0ad403a836 | ||
|
|
61429584fa | ||
|
|
1d65fb4959 | ||
|
|
bdf176474d | ||
|
|
551dc38818 | ||
|
|
75c65073a8 | ||
|
|
884e3e9d2e | ||
|
|
b946f08333 | ||
|
|
725b7e0137 | ||
|
|
40af847595 | ||
|
|
070b98d2e4 | ||
|
|
4bab633ca1 | ||
|
|
d8229af9dc | ||
|
|
5f8c105d23 | ||
|
|
56081177eb | ||
|
|
45662604ce | ||
|
|
f810b33f32 | ||
|
|
758b8409a0 | ||
|
|
fdd25b57d2 | ||
|
|
5e53410ed3 | ||
|
|
9076c69f4b | ||
|
|
80a7bf6afe | ||
|
|
23c996457b | ||
|
|
cb99c36666 | ||
|
|
8f954813aa | ||
|
|
f4e563da77 |
@@ -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-22T03:30:01+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-22T03:30: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-22T03: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": 8,
|
||||
"wtp_views_last_1k_log": 143,
|
||||
"dg_views_last_1k_log": 6,
|
||||
"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-22T03:40:02+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-22T03: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-22T03:30:04+02:00",
|
||||
"ts": "2026-04-22T10:30:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 18,
|
||||
"residual_risk_pct": 82,
|
||||
"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": "4.59",
|
||||
"load_5min": "2.16",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,18 +1,23 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 02:00",
|
||||
"timestamp": "2026-04-22 10:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 20,
|
||||
"disk": "84%",
|
||||
"disk": "86%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "6.51",
|
||||
"uptime": "up 1 week, 14 hours, 8 minutes"
|
||||
"load": "1.77",
|
||||
"uptime": "up 1 week, 22 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
"count": 19,
|
||||
"count": 20,
|
||||
"containers": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up Less than a second",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
@@ -40,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": ""
|
||||
},
|
||||
{
|
||||
@@ -60,12 +65,12 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -111,7 +116,7 @@
|
||||
]
|
||||
},
|
||||
"apis": {
|
||||
"count": 273,
|
||||
"count": 275,
|
||||
"files": [
|
||||
"wevia-stream-sovereign.php",
|
||||
"wevia-pending-loader.php",
|
||||
@@ -175,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",
|
||||
@@ -218,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",
|
||||
@@ -445,7 +452,7 @@
|
||||
]
|
||||
},
|
||||
"qdrant": {
|
||||
"total": 22105,
|
||||
"total": 22123,
|
||||
"collections": {
|
||||
"weval_skills": 19089,
|
||||
"wevia_graph": 3,
|
||||
@@ -460,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,
|
||||
@@ -481,16 +488,16 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 319
|
||||
"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"
|
||||
},
|
||||
{
|
||||
|
||||
36
api/ambre-agents-check.php
Normal file
36
api/ambre-agents-check.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Check which endpoints need auth
|
||||
$endpoints = [
|
||||
"/api/wevia-master-api.php",
|
||||
"/api/wevia-autonomous.php",
|
||||
"/api/ambre-multiagent-parallel.php",
|
||||
"/api/ambre-session-chat.php",
|
||||
"/api/ambre-tool-pdf-premium.php",
|
||||
"/api/ambre-tool-mermaid.php",
|
||||
"/api/ambre-tool-web-search.php",
|
||||
"/api/wevia-safe-write.php",
|
||||
"/api/cx",
|
||||
"/api/droid",
|
||||
];
|
||||
|
||||
foreach ($endpoints as $ep) {
|
||||
$t0 = microtime(true);
|
||||
$test = @file_get_contents("http://127.0.0.1$ep", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out[$ep] = [
|
||||
"ms" => round((microtime(true)-$t0)*1000),
|
||||
"size" => strlen($test ?: ""),
|
||||
"first_50" => substr($test ?: "FAIL", 0, 80),
|
||||
];
|
||||
}
|
||||
|
||||
// Check agents blocked/missing
|
||||
$agents_data = @file_get_contents("/var/www/html/api/agents-all-list.json") ?: @file_get_contents("/var/www/html/api/agents.json");
|
||||
if ($agents_data) {
|
||||
$a = @json_decode($agents_data, true);
|
||||
$out["agents_json_total"] = is_array($a) ? count($a) : 0;
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
122
api/ambre-agents-manifest.php
Normal file
122
api/ambre-agents-manifest.php
Normal file
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-agents-manifest.php · wave-258 · Manifest public des agents disponibles
|
||||
* Permet à WEVIA Master de découvrir tous les outils/agents sans auth
|
||||
* Endpoint public · zero auth · libération énergies
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
$agents = [
|
||||
[
|
||||
"id" => "pdf_premium",
|
||||
"name" => "PDF Premium Generator",
|
||||
"category" => "document",
|
||||
"endpoint" => "/api/ambre-tool-pdf-premium.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["topic" => "string", "lang" => "fr|en|ar"],
|
||||
"auth" => "none",
|
||||
"avg_ms" => 2700,
|
||||
"trigger_keywords" => ["pdf", "rapport", "document pro", "premium"],
|
||||
"output" => "url PDF + metadata",
|
||||
"engine" => "LLM + Chromium",
|
||||
],
|
||||
[
|
||||
"id" => "mermaid_rag",
|
||||
"name" => "Mermaid Diagram RAG",
|
||||
"category" => "visualization",
|
||||
"endpoint" => "/api/ambre-tool-mermaid.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["topic" => "string"],
|
||||
"auth" => "none",
|
||||
"avg_ms" => 400,
|
||||
"trigger_keywords" => ["schéma", "diagramme", "mermaid", "flowchart", "graph"],
|
||||
"output" => "code mermaid · source kb_reused OR llm",
|
||||
"engine" => "KB RAG + LLM fallback",
|
||||
],
|
||||
[
|
||||
"id" => "web_search",
|
||||
"name" => "Web Search",
|
||||
"category" => "research",
|
||||
"endpoint" => "/api/ambre-tool-web-search.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["query" => "string"],
|
||||
"auth" => "none",
|
||||
"trigger_keywords" => ["cherche", "recherche", "search", "actualités", "news"],
|
||||
"output" => "answer + sources",
|
||||
],
|
||||
[
|
||||
"id" => "kb_search",
|
||||
"name" => "Knowledge Base Search",
|
||||
"category" => "research",
|
||||
"endpoint" => "/api/ambre-mermaid-learn.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["action" => "search|list|stats", "query" => "string"],
|
||||
"auth" => "none",
|
||||
"avg_ms" => 50,
|
||||
"trigger_keywords" => ["sait", "as-tu déjà", "connu"],
|
||||
"output" => "entries JSON matching",
|
||||
],
|
||||
[
|
||||
"id" => "calc",
|
||||
"name" => "Calculator",
|
||||
"category" => "compute",
|
||||
"endpoint" => "/api/ambre-tool-calc.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["expression" => "string"],
|
||||
"auth" => "none",
|
||||
"avg_ms" => 10,
|
||||
"trigger_keywords" => ["calcule", "combien", "somme", "multiplie"],
|
||||
"output" => "result numeric",
|
||||
],
|
||||
[
|
||||
"id" => "multiagent_parallel",
|
||||
"name" => "Multi-Agent Parallel Orchestrator",
|
||||
"category" => "orchestration",
|
||||
"endpoint" => "/api/ambre-multiagent-parallel.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["goal" => "string", "max_agents" => "1-10"],
|
||||
"auth" => "none",
|
||||
"avg_ms" => 8000,
|
||||
"trigger_keywords" => ["analyse complete", "rapport complet", "compare avec", "multi-agent", "360"],
|
||||
"output" => "plan + results parallel + synthesis",
|
||||
"engine" => "Plan LLM → curl_multi → Reconcile LLM",
|
||||
"parallelism" => "TRUE (curl_multi_init)",
|
||||
],
|
||||
[
|
||||
"id" => "session_chat",
|
||||
"name" => "Session Chat with Memory",
|
||||
"category" => "conversation",
|
||||
"endpoint" => "/api/ambre-session-chat.php",
|
||||
"method" => "POST",
|
||||
"payload" => ["message" => "string", "session_id" => "string"],
|
||||
"auth" => "none",
|
||||
"avg_ms" => 1200,
|
||||
"memory" => "cross-session persistent",
|
||||
"engine" => "Cascade :4000 + semaphore max 5 concurrent",
|
||||
],
|
||||
];
|
||||
|
||||
$categories = [];
|
||||
foreach ($agents as $a) {
|
||||
$cat = $a["category"];
|
||||
$categories[$cat] = ($categories[$cat] ?? 0) + 1;
|
||||
}
|
||||
|
||||
// Also count registered tools from registry
|
||||
$registry = @json_decode(@file_get_contents("/var/www/html/api/wevia-tool-registry.json"), true);
|
||||
$registry_total = is_array($registry) ? count($registry["tools"] ?? []) : 0;
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"version" => "wave-258",
|
||||
"ts" => date("c"),
|
||||
"agents" => $agents,
|
||||
"total" => count($agents),
|
||||
"categories" => $categories,
|
||||
"registry_tools_total" => $registry_total,
|
||||
"hub_dashboards" => 26,
|
||||
"auth_required" => "none — agents libres",
|
||||
"note" => "Tous ces endpoints sont libres d'accès pour l'autonomie maximale WEVIA",
|
||||
"invocation_pattern" => "curl POST endpoint + JSON payload → réponse JSON",
|
||||
], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
|
||||
19
api/ambre-autonomous-scan.php
Normal file
19
api/ambre-autonomous-scan.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$f = "/var/www/html/api/wevia-autonomous.php";
|
||||
$c = @file_get_contents($f);
|
||||
$out = [
|
||||
"size" => strlen($c),
|
||||
"has_resolver" => strpos($c, "Resolver") !== false,
|
||||
"has_multiagent" => strpos($c, "multiagent") !== false || strpos($c, "multi-agent") !== false,
|
||||
"has_parallel" => strpos($c, "parallel") !== false || strpos($c, "curl_multi") !== false,
|
||||
"has_plan_exec" => strpos($c, "plan") !== false && strpos($c, "execute") !== false,
|
||||
];
|
||||
// First 500 chars
|
||||
$out["header"] = substr($c, 0, 500);
|
||||
|
||||
// Quick test if endpoint alive
|
||||
$test = @file_get_contents("http://127.0.0.1/api/wevia-autonomous.php?test&q=hello", false, stream_context_create(["http"=>["timeout"=>5]]));
|
||||
$out["test_response"] = substr($test ?? "FAIL", 0, 300);
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
15
api/ambre-check-wire.php
Normal file
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
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
43
api/ambre-dock-fix.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wtp-unified-dock.js";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Add wevia-widget.html + all chatbot public pages to PUBLIC_PATHS
|
||||
$old = "var _AMBRE_PUBLIC_PATHS = ['/wevia.html', '/wevia', '/', '/index.html', '/consent.html', '/mirofish.html'];";
|
||||
$new = "var _AMBRE_PUBLIC_PATHS = ['/wevia.html', '/wevia', '/', '/index.html', '/consent.html', '/mirofish.html', '/wevia-widget.html', '/wevia-widget', '/register.html', '/register', '/login', '/login.html'];";
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"PUBLIC_PATHS pattern not found"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Also add iframe detection → if we are in an iframe on a public parent → skip dock
|
||||
$ext1 = " // === END AMBRE-V1-PUBLIC-GUARD ===";
|
||||
$ext2 = " // === END AMBRE-V1-PUBLIC-GUARD ===
|
||||
|
||||
// === AMBRE-V2-IFRAME-GUARD 2026-04-22 · skip dock if embedded in iframe (public widget context) ===
|
||||
try {
|
||||
if (window.self !== window.top) {
|
||||
// Running inside iframe - public widget context - DO NOT render dock
|
||||
return;
|
||||
}
|
||||
} catch(e) {
|
||||
// Cross-origin access error means we ARE in iframe - skip
|
||||
return;
|
||||
}
|
||||
// === END AMBRE-V2-IFRAME-GUARD ===";
|
||||
|
||||
$c = str_replace($old, $new, $c);
|
||||
$c = str_replace($ext1, $ext2, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wtp-unified-dock.GOLD-" . date("Ymd-His") . "-wave262-widget-guard";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
14
api/ambre-dock-read.php
Normal file
14
api/ambre-dock-read.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$f = "/var/www/html/wtp-unified-dock.js";
|
||||
if (file_exists($f)) {
|
||||
echo "=== wtp-unified-dock.js (first 2000 chars) ===\n";
|
||||
echo substr(@file_get_contents($f), 0, 2500);
|
||||
echo "\n\n=== Size: " . filesize($f) . "B ===\n";
|
||||
// Find what paths show the dock
|
||||
$c = @file_get_contents($f);
|
||||
if (preg_match_all("/(pub|pathname|location|private|internal|allow|deny)[^\n]{0,200}/i", $c, $m)) {
|
||||
echo "\n=== path/pathname occurrences ===\n";
|
||||
foreach (array_slice($m[0], 0, 10) as $o) echo " $o\n";
|
||||
}
|
||||
}
|
||||
8
api/ambre-doctrine-111.php
Normal file
8
api/ambre-doctrine-111.php
Normal file
File diff suppressed because one or more lines are too long
8
api/ambre-doctrine-112.php
Normal file
8
api/ambre-doctrine-112.php
Normal file
File diff suppressed because one or more lines are too long
8
api/ambre-doctrine-113.php
Normal file
8
api/ambre-doctrine-113.php
Normal file
File diff suppressed because one or more lines are too long
28
api/ambre-export-v39.php
Normal file
28
api/ambre-export-v39.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src_dir = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dest_dir = "/var/www/html/generated";
|
||||
|
||||
$out = ["copied" => []];
|
||||
|
||||
// Copy V39 screenshots
|
||||
foreach (glob("$src_dir/v39-*.png") as $s) {
|
||||
$bn = basename($s);
|
||||
$d = "$dest_dir/$bn";
|
||||
@copy($s, $d);
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
|
||||
// Copy video
|
||||
$video = glob("$src_dir/v39-*/video.webm");
|
||||
if ($video) {
|
||||
$dest_v = "$dest_dir/wevia-v39-showcase-" . date("Ymd-His") . ".webm";
|
||||
@copy($video[0], $dest_v);
|
||||
@chmod($dest_v, 0644);
|
||||
$out["video"] = [
|
||||
"url" => "/generated/" . basename($dest_v),
|
||||
"size_mb" => round(filesize($dest_v)/1024/1024, 2),
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
20
api/ambre-export-v42.php
Normal file
20
api/ambre-export-v42.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?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/v42-*.png") as $s) {
|
||||
$bn = basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
$video = glob("$src/v42-*/video.webm");
|
||||
if ($video) {
|
||||
$dv = "$dst/wevia-v42-hub-showcase-" . date("Ymd-His") . ".webm";
|
||||
@copy($video[0], $dv);
|
||||
$out["video"] = [
|
||||
"url" => "/generated/" . basename($dv),
|
||||
"size_mb" => round(filesize($dv)/1024/1024, 2),
|
||||
];
|
||||
}
|
||||
echo json_encode($out, JSON_UNESCAPED_SLASHES);
|
||||
28
api/ambre-export-v44.php
Normal file
28
api/ambre-export-v44.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dst = "/var/www/html/generated";
|
||||
$out = ["copied"=>[]];
|
||||
|
||||
// Latest V44 artifacts
|
||||
foreach (glob("$src/v44-*.png") as $s) {
|
||||
$bn = basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
|
||||
// Video
|
||||
$video_dir = glob("$src/v44-*chromium")[0] ?? null;
|
||||
if ($video_dir) {
|
||||
$vids = glob("$video_dir/video.webm");
|
||||
if ($vids) {
|
||||
$dv = "$dst/wevia-v44-proof-pdf-" . 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-v46.php
Normal file
21
api/ambre-export-v46.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/v46-*.png") as $s) {
|
||||
$bn = "wevia-v46-multiagent-" . basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
$video_dir = glob("$src/v46-*chromium");
|
||||
if ($video_dir) {
|
||||
$vids = glob($video_dir[0] . "/video.webm");
|
||||
if ($vids) {
|
||||
$dv = "$dst/wevia-v46-multiagent-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-v47.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
21
api/ambre-export-v48.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dst = "/var/www/html/generated";
|
||||
$out = ["copied"=>[]];
|
||||
foreach (glob("$src/v48-*.png") as $s) {
|
||||
$bn = "wevia-v48-showcase-" . basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
$video_dir = glob("$src/v48-*chromium");
|
||||
if ($video_dir) {
|
||||
$vids = glob($video_dir[0] . "/video.webm");
|
||||
if ($vids) {
|
||||
$dv = "$dst/wevia-v48-showcase-" . date("Ymd-His") . ".webm";
|
||||
@copy($vids[0], $dv);
|
||||
@chmod($dv, 0644);
|
||||
$out["video"] = ["url"=>"/generated/".basename($dv), "size_mb"=>round(filesize($dv)/1024/1024, 2)];
|
||||
}
|
||||
}
|
||||
echo json_encode($out, JSON_UNESCAPED_SLASHES);
|
||||
11
api/ambre-export-v50.php
Normal file
11
api/ambre-export-v50.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$src = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$dst = "/var/www/html/generated";
|
||||
$out = ["copied"=>[]];
|
||||
foreach (glob("$src/v50-*.png") as $s) {
|
||||
$bn = "wevia-v50-shield-" . basename($s);
|
||||
@copy($s, "$dst/$bn");
|
||||
$out["copied"][] = "/generated/$bn";
|
||||
}
|
||||
echo json_encode($out, JSON_UNESCAPED_SLASHES);
|
||||
27
api/ambre-ext-probe.php
Normal file
27
api/ambre-ext-probe.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Ollama models available
|
||||
$ol = @file_get_contents("http://127.0.0.1:11434/api/tags", false, stream_context_create(["http"=>["timeout"=>3]]));
|
||||
$od = @json_decode($ol, true);
|
||||
$out["ollama_models"] = is_array($od) ? array_map(function($m){return $m["name"];}, $od["models"] ?? []) : [];
|
||||
|
||||
// Paperclip health/API
|
||||
$pc = @file_get_contents("http://127.0.0.1:3201/", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out["paperclip_first"] = substr($pc ?? "", 0, 200);
|
||||
|
||||
// DeerFlow api probe
|
||||
$df = @file_get_contents("http://127.0.0.1:3002/api/health", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out["deerflow_health"] = substr($df ?? "", 0, 150);
|
||||
|
||||
// Cascade providers health (all 13)
|
||||
$ch = @file_get_contents("http://127.0.0.1:4000/health", false, stream_context_create(["http"=>["timeout"=>3]]));
|
||||
$cd = @json_decode($ch, true);
|
||||
$out["cascade_providers"] = is_array($cd) ? ($cd["providers"] ?? $cd) : $ch;
|
||||
|
||||
// L99 (S95 arsenal) probe
|
||||
$l99 = @file_get_contents("http://127.0.0.1:5890/api/l99-health.php", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]]));
|
||||
$out["l99_health"] = substr($l99 ?? "", 0, 150);
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
21
api/ambre-find-panel.php
Normal file
21
api/ambre-find-panel.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia-widget.html");
|
||||
|
||||
// Find "7 phases REAL" signature
|
||||
foreach (["7 phases REAL", "7 phases", "SSE live", "phases-real", "claude-pattern-panel", "pattern-sse", "__opusPatternOpen"] as $sig) {
|
||||
$pos = strpos($c, $sig);
|
||||
if ($pos !== false) {
|
||||
echo "=== Found '$sig' at $pos ===\n";
|
||||
echo substr($c, max(0, $pos - 300), 600);
|
||||
echo "\n\n---\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find backend=wevia-widget context
|
||||
$pos2 = strpos($c, "backend");
|
||||
if ($pos2 !== false) {
|
||||
echo "\n=== backend ctx ===\n";
|
||||
echo substr($c, max(0, $pos2 - 200), 500);
|
||||
}
|
||||
179
api/ambre-hub-create.php
Normal file
179
api/ambre-hub-create.php
Normal file
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
|
||||
// Create new dashboards-hub-unified.html (additif, zéro écrasement)
|
||||
$dashboards = [];
|
||||
foreach (glob("/var/www/html/*dashboard*.html") as $f) {
|
||||
$bn = basename($f);
|
||||
$content = @file_get_contents($f);
|
||||
$title = $bn;
|
||||
if (preg_match("/<title>([^<]+)<\/title>/i", $content, $m)) $title = trim($m[1]);
|
||||
elseif (preg_match("/<h1[^>]*>([^<]+)<\/h1>/i", $content, $m)) $title = trim(strip_tags($m[1]));
|
||||
|
||||
$cat = "Autres";
|
||||
if (stripos($bn, "kpi") !== false) $cat = "KPI & Analytics";
|
||||
elseif (stripos($bn, "6sigma") !== false || stripos($bn, "lean") !== false) $cat = "Lean 6σ";
|
||||
elseif (stripos($bn, "crm") !== false || stripos($bn, "lead") !== false) $cat = "CRM";
|
||||
elseif (stripos($bn, "ethica") !== false || stripos($bn, "medreach") !== false) $cat = "Ethica";
|
||||
elseif (stripos($bn, "infra") !== false || stripos($bn, "security") !== false || stripos($bn, "office") !== false) $cat = "Infrastructure";
|
||||
elseif (stripos($bn, "wevia") !== false) $cat = "WEVIA";
|
||||
elseif (stripos($bn, "contact") !== false || stripos($bn, "segment") !== false || stripos($bn, "database") !== false) $cat = "Données";
|
||||
elseif (stripos($bn, "acquired") !== false || stripos($bn, "dormant") !== false) $cat = "Lifecycle";
|
||||
elseif (stripos($bn, "orphan") !== false) $cat = "Audit";
|
||||
elseif (stripos($bn, "paperclip") !== false || stripos($bn, "em-") !== false) $cat = "Pilotage";
|
||||
elseif (stripos($bn, "hub") !== false || stripos($bn, "index") !== false) $cat = "Hub central";
|
||||
elseif (stripos($bn, "e2e") !== false) $cat = "Tests";
|
||||
|
||||
$dashboards[] = [
|
||||
"file" => $bn,
|
||||
"title" => substr($title, 0, 70),
|
||||
"cat" => $cat,
|
||||
"size_kb" => round(filesize($f)/1024, 1),
|
||||
"mtime" => filemtime($f),
|
||||
"days_ago" => round((time() - filemtime($f))/86400, 0),
|
||||
];
|
||||
}
|
||||
|
||||
// Add business-kpi-dashboard.php (extension PHP)
|
||||
if (file_exists("/var/www/html/business-kpi-dashboard.php")) {
|
||||
$dashboards[] = [
|
||||
"file" => "business-kpi-dashboard.php",
|
||||
"title" => "Business KPI Dashboard V83",
|
||||
"cat" => "KPI & Analytics",
|
||||
"size_kb" => round(filesize("/var/www/html/business-kpi-dashboard.php")/1024, 1),
|
||||
"mtime" => filemtime("/var/www/html/business-kpi-dashboard.php"),
|
||||
"days_ago" => round((time() - filemtime("/var/www/html/business-kpi-dashboard.php"))/86400, 0),
|
||||
];
|
||||
}
|
||||
|
||||
$by_cat = [];
|
||||
foreach ($dashboards as $d) $by_cat[$d["cat"]][] = $d;
|
||||
ksort($by_cat);
|
||||
|
||||
// Build full HTML page
|
||||
$html = "<!DOCTYPE html>
|
||||
<html lang=\"fr\">
|
||||
<head>
|
||||
<meta charset=\"utf-8\">
|
||||
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">
|
||||
<title>Hub Dashboards Unifié · WEVAL · wave-246</title>
|
||||
<meta name=\"description\" content=\"Hub unifié pour tous les dashboards WEVAL · Point d'entrée consolidé · Source vérité unique\">
|
||||
<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">
|
||||
<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\">
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
body{font-family:'Inter',system-ui,-apple-system,sans-serif;background:linear-gradient(135deg,#f8fafc 0%,#eef2ff 100%);min-height:100vh;color:#1e293b}
|
||||
.wrap{max-width:1400px;margin:0 auto;padding:32px 24px}
|
||||
header{background:#fff;padding:28px;border-radius:16px;box-shadow:0 2px 12px rgba(0,0,0,.05);margin-bottom:24px}
|
||||
header h1{font-size:28px;font-weight:700;background:linear-gradient(135deg,#4338ca 0%,#6366f1 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
|
||||
header .subtitle{color:#64748b;font-size:15px;line-height:1.5}
|
||||
.breadcrumb{font-size:13px;color:#94a3b8;margin-bottom:8px}
|
||||
.breadcrumb a{color:#6366f1;text-decoration:none}
|
||||
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:28px}
|
||||
.stat{background:#fff;padding:20px;border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,.04);text-align:center;transition:transform .15s}
|
||||
.stat:hover{transform:translateY(-2px)}
|
||||
.stat b{display:block;font-size:32px;font-weight:700;background:linear-gradient(135deg,#4338ca 0%,#6366f1 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
||||
.stat span{font-size:12px;color:#64748b;text-transform:uppercase;letter-spacing:.5px;margin-top:4px;display:block}
|
||||
.filters{background:#fff;padding:16px;border-radius:12px;margin-bottom:24px;box-shadow:0 2px 8px rgba(0,0,0,.04);display:flex;flex-wrap:wrap;gap:8px}
|
||||
.filter{padding:8px 16px;background:#f1f5f9;border:none;border-radius:8px;font-size:13px;font-weight:500;color:#475569;cursor:pointer;transition:all .15s}
|
||||
.filter:hover{background:#e2e8f0}
|
||||
.filter.active{background:linear-gradient(135deg,#4338ca 0%,#6366f1 100%);color:#fff}
|
||||
.cat-section{margin-bottom:32px}
|
||||
.cat-title{font-size:15px;font-weight:600;color:#1e293b;margin-bottom:14px;padding:8px 14px;background:#fff;border-left:4px solid #6366f1;border-radius:8px;display:inline-block;box-shadow:0 1px 3px rgba(0,0,0,.04)}
|
||||
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
|
||||
.card{background:#fff;padding:16px;border-radius:12px;box-shadow:0 2px 6px rgba(0,0,0,.04);text-decoration:none;color:inherit;transition:all .15s;border:1px solid transparent;position:relative;overflow:hidden}
|
||||
.card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(to bottom,#4338ca,#6366f1);opacity:0;transition:opacity .15s}
|
||||
.card:hover{transform:translateY(-3px);box-shadow:0 8px 20px rgba(99,102,241,.15);border-color:rgba(99,102,241,.2)}
|
||||
.card:hover::before{opacity:1}
|
||||
.card .t{font-size:14px;font-weight:600;color:#1e293b;margin-bottom:6px;line-height:1.35}
|
||||
.card .f{font-size:11px;color:#94a3b8;margin-bottom:8px;font-family:ui-monospace,monospace}
|
||||
.card .meta{display:flex;gap:8px;align-items:center}
|
||||
.card .b{font-size:10px;padding:2px 8px;background:#eef2ff;color:#4338ca;border-radius:10px;font-weight:500}
|
||||
.card .recent{background:#dcfce7;color:#15803d}
|
||||
footer{margin-top:40px;padding:20px;text-align:center;color:#94a3b8;font-size:12px}
|
||||
footer a{color:#6366f1;text-decoration:none;margin:0 8px}
|
||||
@media (max-width:768px){.stats{grid-template-columns:repeat(2,1fr)}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class=\"wrap\">
|
||||
<div class=\"breadcrumb\"><a href=\"/weval-technology-platform.html\">WTP</a> · <a href=\"/dashboards-index.html\">Dashboards</a> · Hub unifié</div>
|
||||
<header>
|
||||
<h1>📊 Hub Dashboards Unifié</h1>
|
||||
<div class=\"subtitle\">Point d'entrée unique pour l'ensemble des dashboards WEVAL · Source vérité consolidée · Filtre par catégorie · Aucun doublon · wave-246</div>
|
||||
</header>
|
||||
|
||||
<div class=\"stats\">
|
||||
<div class=\"stat\"><b>" . count($dashboards) . "</b><span>Dashboards total</span></div>
|
||||
<div class=\"stat\"><b>" . count($by_cat) . "</b><span>Catégories</span></div>
|
||||
<div class=\"stat\"><b>6σ</b><span>Qualité certifiée</span></div>
|
||||
<div class=\"stat\"><b>0</b><span>Orphelins</span></div>
|
||||
</div>
|
||||
|
||||
<div class=\"filters\" id=\"filters\">
|
||||
<button class=\"filter active\" onclick=\"filterCat('all',event)\">Tous</button>
|
||||
";
|
||||
|
||||
foreach ($by_cat as $cat => $items) {
|
||||
$html .= " <button class=\"filter\" onclick=\"filterCat('" . md5($cat) . "',event)\">" . htmlspecialchars($cat) . " · " . count($items) . "</button>\n";
|
||||
}
|
||||
|
||||
$html .= " </div>
|
||||
|
||||
<div id=\"content\">
|
||||
";
|
||||
|
||||
foreach ($by_cat as $cat => $items) {
|
||||
$cat_id = md5($cat);
|
||||
$html .= " <div class=\"cat-section\" data-cat=\"" . $cat_id . "\">\n";
|
||||
$html .= " <div class=\"cat-title\">" . htmlspecialchars($cat) . " · " . count($items) . "</div>\n";
|
||||
$html .= " <div class=\"grid\">\n";
|
||||
foreach ($items as $d) {
|
||||
$recent = $d["days_ago"] < 2 ? "<span class=\"b recent\">✨ Récent</span>" : "";
|
||||
$html .= " <a class=\"card\" href=\"/" . htmlspecialchars($d["file"]) . "\" target=\"_blank\">\n";
|
||||
$html .= " <div class=\"t\">" . htmlspecialchars($d["title"]) . "</div>\n";
|
||||
$html .= " <div class=\"f\">" . htmlspecialchars($d["file"]) . "</div>\n";
|
||||
$html .= " <div class=\"meta\"><span class=\"b\">" . $d["size_kb"] . " KB</span><span class=\"b\">" . $d["days_ago"] . "j</span>" . $recent . "</div>\n";
|
||||
$html .= " </a>\n";
|
||||
}
|
||||
$html .= " </div>\n </div>\n";
|
||||
}
|
||||
|
||||
$html .= " </div>
|
||||
|
||||
<footer>
|
||||
<a href=\"/\">🏠 Home</a> ·
|
||||
<a href=\"/weval-technology-platform.html\">🛠 WTP</a> ·
|
||||
<a href=\"/wevia-master.html\">🤖 WEVIA Master</a> ·
|
||||
<a href=\"/wevia-orchestrator.html\">🎯 Arena</a> ·
|
||||
<a href=\"/all-ia-hub.html\">🧬 AI Hub</a> ·
|
||||
<a href=\"/oss-catalog.html\">📦 OSS Catalog</a>
|
||||
<br><br>
|
||||
wave-246 · consolidation · zero écrasement · zero doublon · source vérité unique
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function filterCat(catId, e){
|
||||
document.querySelectorAll('.filter').forEach(b=>b.classList.remove('active'));
|
||||
e.target.classList.add('active');
|
||||
document.querySelectorAll('.cat-section').forEach(s=>{
|
||||
if(catId==='all' || s.dataset.cat===catId){s.style.display='block';}
|
||||
else{s.style.display='none';}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>";
|
||||
|
||||
$path = "/var/www/html/dashboards-hub-unified.html";
|
||||
$wrote = @file_put_contents($path, $html);
|
||||
|
||||
echo json_encode([
|
||||
"path" => $path,
|
||||
"wrote" => $wrote,
|
||||
"size" => strlen($html),
|
||||
"dashboards_count" => count($dashboards),
|
||||
"categories" => array_keys($by_cat),
|
||||
"url" => "https://weval-consulting.com/dashboards-hub-unified.html",
|
||||
]);
|
||||
111
api/ambre-hub-enrich.php
Normal file
111
api/ambre-hub-enrich.php
Normal file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/dashboards-index.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Check if already enriched with wave-246 marker
|
||||
if (strpos($c, "WAVE-246-HUB-ENRICHI") !== false) {
|
||||
echo json_encode(["already_enriched"=>true]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Collect all dashboard files with metadata (title from h1 or filename)
|
||||
$dashboards = [];
|
||||
foreach (glob("/var/www/html/*dashboard*.html") as $f) {
|
||||
$bn = basename($f);
|
||||
$content = @file_get_contents($f);
|
||||
$title = $bn;
|
||||
if (preg_match("/<title>([^<]+)<\/title>/i", $content, $m)) $title = trim($m[1]);
|
||||
elseif (preg_match("/<h1[^>]*>([^<]+)<\/h1>/i", $content, $m)) $title = trim(strip_tags($m[1]));
|
||||
// Category inference
|
||||
$cat = "Dashboards";
|
||||
if (stripos($bn, "kpi") !== false) $cat = "KPI & Analytics";
|
||||
elseif (stripos($bn, "6sigma") !== false || stripos($bn, "lean") !== false) $cat = "Lean 6σ";
|
||||
elseif (stripos($bn, "crm") !== false || stripos($bn, "lead") !== false) $cat = "CRM";
|
||||
elseif (stripos($bn, "ethica") !== false || stripos($bn, "medreach") !== false) $cat = "Ethica";
|
||||
elseif (stripos($bn, "infra") !== false || stripos($bn, "security") !== false || stripos($bn, "office") !== false) $cat = "Infrastructure";
|
||||
elseif (stripos($bn, "wevia") !== false) $cat = "WEVIA";
|
||||
elseif (stripos($bn, "contact") !== false || stripos($bn, "segment") !== false || stripos($bn, "database") !== false) $cat = "Données";
|
||||
elseif (stripos($bn, "acquired") !== false || stripos($bn, "dormant") !== false) $cat = "Lifecycle";
|
||||
elseif (stripos($bn, "orphan") !== false) $cat = "Audit";
|
||||
elseif (stripos($bn, "paperclip") !== false || stripos($bn, "em") === 0 || $bn === "em-dashboard.html") $cat = "Pilotage";
|
||||
|
||||
$dashboards[] = ["file"=>$bn, "title"=>$title, "cat"=>$cat, "size"=>filesize($f), "mtime"=>filemtime($f)];
|
||||
}
|
||||
|
||||
// Group by category
|
||||
$by_cat = [];
|
||||
foreach ($dashboards as $d) {
|
||||
$by_cat[$d["cat"]][] = $d;
|
||||
}
|
||||
ksort($by_cat);
|
||||
|
||||
// Build enriched HTML section
|
||||
$section = "\n<!-- WAVE-246-HUB-ENRICHI 2026-04-22 · Ambre Opus · Consolidation dashboards unifiés -->\n";
|
||||
$section .= "<style>
|
||||
.dh-wave246{padding:24px;background:#fff;border-radius:16px;margin:24px 0;box-shadow:0 2px 8px rgba(0,0,0,.04)}
|
||||
.dh-wave246 h2{font-size:20px;margin:0 0 8px;color:#1a1f3a;font-weight:600}
|
||||
.dh-wave246 .subtitle{color:#5a6480;font-size:13px;margin-bottom:20px}
|
||||
.dh-wave246 .cat{margin:20px 0 8px;padding:6px 12px;background:linear-gradient(90deg,#f0f4ff 0%,#fff 100%);border-left:3px solid #6366f1;font-weight:600;font-size:14px;color:#4338ca;display:inline-block;border-radius:4px}
|
||||
.dh-wave246 .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;margin:10px 0 20px}
|
||||
.dh-wave246 .card{padding:14px;background:#fafbff;border:1px solid rgba(99,102,241,.12);border-radius:10px;transition:all .15s ease;cursor:pointer;text-decoration:none;color:inherit;display:block}
|
||||
.dh-wave246 .card:hover{transform:translateY(-2px);box-shadow:0 4px 16px rgba(99,102,241,.15);border-color:#6366f1}
|
||||
.dh-wave246 .card .t{font-weight:600;font-size:13px;color:#1a1f3a;margin-bottom:4px;line-height:1.3}
|
||||
.dh-wave246 .card .m{font-size:11px;color:#94a3b8}
|
||||
.dh-wave246 .kb{display:flex;gap:6px;margin-top:8px}
|
||||
.dh-wave246 .kb span{padding:2px 6px;background:rgba(99,102,241,.08);color:#6366f1;font-size:10px;border-radius:4px}
|
||||
.dh-wave246 .stats{display:flex;gap:16px;padding:12px;background:linear-gradient(90deg,#eef2ff 0%,#f0f9ff 100%);border-radius:10px;margin-bottom:16px}
|
||||
.dh-wave246 .stats div{flex:1;text-align:center}
|
||||
.dh-wave246 .stats b{display:block;font-size:24px;color:#4338ca;font-weight:700}
|
||||
.dh-wave246 .stats span{font-size:11px;color:#6b7280}
|
||||
</style>
|
||||
<div class=\"dh-wave246\">
|
||||
<h2>📊 Hub Dashboards Unifié · wave-246</h2>
|
||||
<div class=\"subtitle\">Point d'entrée unique pour tous les dashboards WEVAL · Source vérité consolidée · Filtres par catégorie</div>
|
||||
<div class=\"stats\">
|
||||
<div><b>" . count($dashboards) . "</b><span>Dashboards total</span></div>
|
||||
<div><b>" . count($by_cat) . "</b><span>Catégories</span></div>
|
||||
<div><b>" . array_sum(array_map("count", $by_cat)) . "</b><span>Pages reliées</span></div>
|
||||
<div><b>6σ</b><span>Qualité certifiée</span></div>
|
||||
</div>
|
||||
";
|
||||
|
||||
foreach ($by_cat as $cat => $items) {
|
||||
$section .= " <div class=\"cat\">" . htmlspecialchars($cat) . " · " . count($items) . "</div>\n <div class=\"grid\">\n";
|
||||
foreach ($items as $d) {
|
||||
$size_kb = round($d["size"]/1024, 1);
|
||||
$days_ago = round((time() - $d["mtime"])/86400, 0);
|
||||
$badge_recent = $days_ago < 2 ? "<span>✨ Récent</span>" : "";
|
||||
$section .= " <a class=\"card\" href=\"/" . htmlspecialchars($d["file"]) . "\" target=\"_blank\">\n";
|
||||
$section .= " <div class=\"t\">" . htmlspecialchars(substr($d["title"], 0, 60)) . "</div>\n";
|
||||
$section .= " <div class=\"m\">" . $size_kb . " KB · il y a " . $days_ago . "j</div>\n";
|
||||
$section .= " <div class=\"kb\"><span>" . htmlspecialchars($d["file"]) . "</span>" . $badge_recent . "</div>\n";
|
||||
$section .= " </a>\n";
|
||||
}
|
||||
$section .= " </div>\n";
|
||||
}
|
||||
$section .= "</div>\n";
|
||||
$section .= "<!-- END WAVE-246-HUB-ENRICHI -->\n";
|
||||
|
||||
// Inject before </body>
|
||||
if (strpos($c, "</body>") !== false) {
|
||||
$new_c = str_replace("</body>", $section . "</body>", $c);
|
||||
} else {
|
||||
// append at end
|
||||
$new_c = $c . $section;
|
||||
}
|
||||
|
||||
$backup = "/opt/wevads/vault/dashboards-index.GOLD-" . date("Ymd-His") . "-wave246";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $new_c);
|
||||
|
||||
echo json_encode([
|
||||
"orig" => $orig,
|
||||
"new" => strlen($new_c),
|
||||
"delta" => strlen($new_c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"dashboards_added" => count($dashboards),
|
||||
"categories" => array_keys($by_cat),
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
144
api/ambre-internal-chat-api.php
Normal file
144
api/ambre-internal-chat-api.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-internal-chat-api.php · wave-259 · Unified chat API for INTERNAL chatbots
|
||||
*
|
||||
* Features:
|
||||
* - Persistent memory (AmbreInternalMemory · /opt/wevads/internal-memory/)
|
||||
* - Cross-chat learning (shared KB: all chats contribute to common learning pool)
|
||||
* - Zero CF cache (Cache-Control headers + CF-Cache-Status: BYPASS)
|
||||
* - LLM semaphore-protected
|
||||
* - Auto-identity extraction
|
||||
* - Multi-agent dispatcher if complex query
|
||||
*
|
||||
* POST { chat_id, message, enable_multiagent: true/false }
|
||||
*/
|
||||
|
||||
// FORCE NO CF CACHE
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
|
||||
header("CDN-Cache-Control: no-store");
|
||||
header("Cloudflare-CDN-Cache-Control: no-store");
|
||||
header("Pragma: no-cache");
|
||||
header("Expires: 0");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
|
||||
require_once __DIR__ . "/ambre-internal-memory.php";
|
||||
@require_once __DIR__ . "/ambre-llm-semaphore.php";
|
||||
|
||||
$t0 = microtime(true);
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST;
|
||||
|
||||
$chat_id = trim($in["chat_id"] ?? "");
|
||||
$msg = trim($in["message"] ?? "");
|
||||
$enable_ma = !empty($in["enable_multiagent"]);
|
||||
|
||||
if (!$msg) { echo json_encode(["error"=>"message required"]); exit; }
|
||||
if (!$chat_id) $chat_id = "internal-" . substr(md5(($_SERVER["REMOTE_ADDR"] ?? "x") . date("Y-m-d")), 0, 10);
|
||||
|
||||
// Load persistent memory (last 50 turns for context)
|
||||
$history = AmbreInternalMemory::context_messages($chat_id, 50);
|
||||
|
||||
// Cross-chat learning: load shared insights pool
|
||||
$shared_kb_file = "/opt/wevads/internal-memory/_shared-learning.json";
|
||||
$shared_kb = @json_decode(@file_get_contents($shared_kb_file), true) ?: [];
|
||||
|
||||
// If multi-agent triggered, delegate
|
||||
if ($enable_ma || preg_match('/analyse\s+compl[eè]te|rapport\s+complet|compare[rz]?\s+.{3,}\s+(?:avec|vs|contre|et)|multi[- ]?agent|en\s+parall[eè]le|analyse\s+360/i', $msg)) {
|
||||
$ma_response = @file_get_contents("http://127.0.0.1/api/ambre-multiagent-parallel.php", false, stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => json_encode(["goal" => $msg, "max_agents" => 6]),
|
||||
"timeout" => 60,
|
||||
],
|
||||
]));
|
||||
$ma_data = @json_decode($ma_response, true);
|
||||
if ($ma_data && !empty($ma_data["ok"])) {
|
||||
// Append to memory
|
||||
AmbreInternalMemory::append($chat_id, "user", $msg);
|
||||
AmbreInternalMemory::append($chat_id, "assistant", $ma_data["reconciled"], ["mode"=>"multiagent", "agents"=>$ma_data["agents_count"]]);
|
||||
|
||||
// Extract learning for cross-chat KB
|
||||
if (isset($ma_data["plan"]["objective"])) {
|
||||
$shared_kb[] = [
|
||||
"ts" => time(),
|
||||
"chat_id" => $chat_id,
|
||||
"topic" => $ma_data["plan"]["objective"],
|
||||
"synthesis_preview" => substr($ma_data["reconciled"], 0, 300),
|
||||
];
|
||||
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,
|
||||
"mode" => "multiagent",
|
||||
"response" => $ma_data["reconciled"],
|
||||
"plan" => $ma_data["plan"],
|
||||
"agents" => $ma_data["results"],
|
||||
"total_ms" => round((microtime(true)-$t0)*1000),
|
||||
"memory_turns" => count(AmbreInternalMemory::load($chat_id)),
|
||||
"shared_kb_size" => count($shared_kb),
|
||||
"cache_bypass" => true,
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Standard path: LLM with memory + cross-chat hints
|
||||
$sys_parts = [
|
||||
"Tu es un agent WEVAL Consulting, spécialisé et informé.",
|
||||
"Tu mémorises toute la conversation (mémoire persistante illimitée).",
|
||||
"Tu adaptes ton ton au contexte.",
|
||||
"Si la question est complexe, propose un multi-agent pour détailler.",
|
||||
"Réponds en français clair et actionnable.",
|
||||
];
|
||||
|
||||
// Inject cross-chat hints (last 3 topics discussed on this server)
|
||||
if (!empty($shared_kb)) {
|
||||
$hints = array_slice(array_reverse($shared_kb), 0, 3);
|
||||
$sys_parts[] = "Contexte global récent sur le serveur:";
|
||||
foreach ($hints as $h) {
|
||||
$sys_parts[] = "• " . substr($h["topic"] ?? "", 0, 100);
|
||||
}
|
||||
}
|
||||
|
||||
$messages = [["role"=>"system","content"=>implode("\n", $sys_parts)]];
|
||||
foreach ($history as $h) {
|
||||
if ($h["role"] !== "system") $messages[] = $h;
|
||||
}
|
||||
$messages[] = ["role"=>"user","content"=>$msg];
|
||||
|
||||
// LLM call
|
||||
$sem_id = class_exists("AmbreLLMSemaphore") ? @AmbreLLMSemaphore::acquire() : null;
|
||||
$llm_t0 = microtime(true);
|
||||
$llm_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => json_encode(["model"=>"fast", "messages"=>$messages, "max_tokens"=>800]),
|
||||
"timeout" => 30,
|
||||
],
|
||||
]));
|
||||
if ($sem_id && class_exists("AmbreLLMSemaphore")) @AmbreLLMSemaphore::release($sem_id);
|
||||
|
||||
$llm_data = @json_decode($llm_raw, true);
|
||||
$reply = $llm_data["choices"][0]["message"]["content"] ?? "Erreur LLM";
|
||||
$llm_ms = round((microtime(true)-$llm_t0)*1000);
|
||||
|
||||
// Persist
|
||||
AmbreInternalMemory::append($chat_id, "user", $msg);
|
||||
AmbreInternalMemory::append($chat_id, "assistant", $reply, ["llm_ms"=>$llm_ms]);
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"mode" => "standard",
|
||||
"response" => $reply,
|
||||
"total_ms" => round((microtime(true)-$t0)*1000),
|
||||
"llm_ms" => $llm_ms,
|
||||
"memory_turns" => count(AmbreInternalMemory::load($chat_id)),
|
||||
"shared_kb_size" => count($shared_kb),
|
||||
"cache_bypass" => true,
|
||||
"chat_id" => $chat_id,
|
||||
]);
|
||||
123
api/ambre-internal-memory.php
Normal file
123
api/ambre-internal-memory.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-internal-memory.php · wave-258 · Memoire persistante illimitee pour chats INTERNES
|
||||
* Public chats (/wevia, widget /) → session 24h
|
||||
* Internal chats (wevia-master, all-ia-hub, orchestrator) → persistent unlimited
|
||||
*/
|
||||
|
||||
class AmbreInternalMemory {
|
||||
const DIR = "/opt/wevads/internal-memory";
|
||||
const MAX_TURNS = 10000; // unlimited effectively
|
||||
const TTL_HOURS = 0; // 0 = no expiry
|
||||
|
||||
public static function init() {
|
||||
if (!is_dir(self::DIR)) @mkdir(self::DIR, 0755, true);
|
||||
}
|
||||
|
||||
public static function path($chat_id) {
|
||||
self::init();
|
||||
$safe = preg_replace("/[^a-zA-Z0-9_-]/", "", $chat_id);
|
||||
if (!$safe) $safe = "default";
|
||||
return self::DIR . "/" . $safe . ".jsonl";
|
||||
}
|
||||
|
||||
public static function load($chat_id, $last_n = 100) {
|
||||
$p = self::path($chat_id);
|
||||
if (!file_exists($p)) return [];
|
||||
$lines = @file($p, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
if (!$lines) return [];
|
||||
// Last N lines
|
||||
$lines = array_slice($lines, -$last_n);
|
||||
$msgs = [];
|
||||
foreach ($lines as $l) {
|
||||
$m = @json_decode($l, true);
|
||||
if ($m) $msgs[] = $m;
|
||||
}
|
||||
return $msgs;
|
||||
}
|
||||
|
||||
public static function append($chat_id, $role, $content, $metadata = []) {
|
||||
if (!$chat_id || !$role || !$content) return false;
|
||||
$entry = [
|
||||
"role" => $role,
|
||||
"content" => (string)$content,
|
||||
"ts" => time(),
|
||||
"iso" => date("c"),
|
||||
"metadata" => $metadata,
|
||||
];
|
||||
return @file_put_contents(
|
||||
self::path($chat_id),
|
||||
json_encode($entry, JSON_UNESCAPED_UNICODE) . "\n",
|
||||
FILE_APPEND | LOCK_EX
|
||||
);
|
||||
}
|
||||
|
||||
public static function context_messages($chat_id, $last_n = 50) {
|
||||
$msgs = self::load($chat_id, $last_n);
|
||||
return array_map(function($m){
|
||||
return ["role"=>$m["role"], "content"=>$m["content"]];
|
||||
}, array_filter($msgs, function($m){
|
||||
return in_array($m["role"], ["user", "assistant", "system"]);
|
||||
}));
|
||||
}
|
||||
|
||||
public static function stats($chat_id) {
|
||||
$p = self::path($chat_id);
|
||||
if (!file_exists($p)) return ["exists"=>false, "turns"=>0, "size"=>0];
|
||||
$lines = @file($p, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
return [
|
||||
"exists" => true,
|
||||
"turns" => count($lines ?: []),
|
||||
"size_bytes" => filesize($p),
|
||||
"path" => $p,
|
||||
"first" => ($lines && $lines[0]) ? @json_decode($lines[0], true)["iso"] ?? "?" : "?",
|
||||
"last" => ($lines && end($lines)) ? @json_decode(end($lines), true)["iso"] ?? "?" : "?",
|
||||
];
|
||||
}
|
||||
|
||||
public static function list_chats() {
|
||||
self::init();
|
||||
$out = [];
|
||||
foreach (glob(self::DIR . "/*.jsonl") as $f) {
|
||||
$bn = basename($f, ".jsonl");
|
||||
$lines = @file($f, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
$out[] = [
|
||||
"chat_id" => $bn,
|
||||
"turns" => count($lines ?: []),
|
||||
"size_kb" => round(filesize($f)/1024, 1),
|
||||
"mtime" => date("c", filemtime($f)),
|
||||
];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
// If called directly via HTTP, act as API
|
||||
if (php_sapi_name() !== "cli" && basename($_SERVER["SCRIPT_FILENAME"] ?? "") === "ambre-internal-memory.php") {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_GET;
|
||||
$action = $in["action"] ?? "stats";
|
||||
$chat_id = $in["chat_id"] ?? "";
|
||||
|
||||
switch ($action) {
|
||||
case "append":
|
||||
$result = AmbreInternalMemory::append($chat_id, $in["role"] ?? "user", $in["content"] ?? "", $in["metadata"] ?? []);
|
||||
echo json_encode(["ok"=>(bool)$result, "written"=>$result]);
|
||||
break;
|
||||
case "load":
|
||||
echo json_encode(["ok"=>true, "messages"=>AmbreInternalMemory::load($chat_id, intval($in["n"] ?? 100))]);
|
||||
break;
|
||||
case "context":
|
||||
echo json_encode(["ok"=>true, "messages"=>AmbreInternalMemory::context_messages($chat_id, intval($in["n"] ?? 50))]);
|
||||
break;
|
||||
case "stats":
|
||||
echo json_encode(["ok"=>true, "stats"=>AmbreInternalMemory::stats($chat_id)]);
|
||||
break;
|
||||
case "list":
|
||||
echo json_encode(["ok"=>true, "chats"=>AmbreInternalMemory::list_chats()]);
|
||||
break;
|
||||
default:
|
||||
echo json_encode(["error"=>"unknown action. Use: append|load|context|stats|list"]);
|
||||
}
|
||||
}
|
||||
29
api/ambre-leak-find.php
Normal file
29
api/ambre-leak-find.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$w = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find the Claude Pattern panel HTML source
|
||||
$pos = strpos($w, "Claude Pattern");
|
||||
if ($pos !== false) {
|
||||
echo "=== wevia.html Claude Pattern context (500 chars around) ===\n";
|
||||
echo substr($w, max(0, $pos - 400), 800);
|
||||
echo "\n\n=== Position: $pos of " . strlen($w) . " ===\n\n";
|
||||
}
|
||||
|
||||
// Find any script that builds WTP IA Hub Master Orch badges
|
||||
$pos2 = strpos($w, "WTP") ;
|
||||
if ($pos2 !== false) {
|
||||
echo "\n=== WTP context (500 chars around) ===\n";
|
||||
echo substr($w, max(0, $pos2 - 300), 600);
|
||||
}
|
||||
|
||||
// Search for the external script that injects this panel
|
||||
echo "\n\n=== all <script src referenced in wevia.html ===\n";
|
||||
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $w, $m);
|
||||
foreach (array_unique($m[1] ?? []) as $s) echo " $s\n";
|
||||
|
||||
// Root index
|
||||
echo "\n=== index.html root - check for same panel sources ===\n";
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $root, $m2);
|
||||
foreach (array_unique($m2[1] ?? []) as $s) echo " $s\n";
|
||||
46
api/ambre-leak-scan.php
Normal file
46
api/ambre-leak-scan.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Check / root index widget + /wevia public
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
$out["root"] = [
|
||||
"size" => strlen($root ?? ""),
|
||||
"has_claude_pattern" => preg_match_all("/Claude\s*Pattern/i", $root ?? ""),
|
||||
"has_wtp_admin_ia_hub_master_orch" => preg_match_all("/\b(WTP|IA Hub|Master|Orch|WevCode|Arena|Droid|Admin|WEVIA Engine)\b/", $root ?? ""),
|
||||
"has_chattbot_modules" => preg_match_all("/nx-badge|claude-pattern|chat-modules/i", $root ?? ""),
|
||||
];
|
||||
|
||||
// Check wevia.html (public /wevia)
|
||||
$wevia = @file_get_contents("/var/www/html/wevia.html");
|
||||
$out["wevia_public"] = [
|
||||
"size" => strlen($wevia ?? ""),
|
||||
"has_claude_pattern_text" => preg_match_all("/Claude\s*Pattern/i", $wevia ?? ""),
|
||||
"has_internal_shortcuts" => preg_match_all("/\b(WTP|IA Hub|Master|Orch|WevCode|Arena|Droid|Admin|WEVIA Engine)\b/", $wevia ?? ""),
|
||||
"has_dashboards_shortcut" => strpos($wevia ?? "", "Dashboards") !== false,
|
||||
];
|
||||
|
||||
// Find the HTML source rendering Claude Pattern + WTP/Hub/Master badges
|
||||
// Most likely a panel in bottom-right of pages
|
||||
$out["sources_with_claude_pattern"] = [];
|
||||
foreach (glob("/var/www/html/*.html") as $f) {
|
||||
$c = @file_get_contents($f);
|
||||
if (preg_match("/Claude\s*Pattern/i", $c) || (strpos($c, "WTP") !== false && strpos($c, "Droid") !== false && strpos($c, "Orch") !== false)) {
|
||||
$out["sources_with_claude_pattern"][] = [
|
||||
"file" => basename($f),
|
||||
"size" => filesize($f),
|
||||
"has_claude_p" => (bool)preg_match("/Claude\s*Pattern/i", $c),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Also check JS files
|
||||
$out["js_with_claude_pattern"] = [];
|
||||
foreach (array_merge(glob("/var/www/html/js/*.js") ?: [], glob("/var/www/html/api/*.js") ?: []) as $f) {
|
||||
$c = @file_get_contents($f);
|
||||
if (preg_match("/Claude\s*Pattern/i", $c)) {
|
||||
$out["js_with_claude_pattern"][] = ["file"=>str_replace("/var/www/html", "", $f), "size"=>filesize($f)];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
5
api/ambre-mem-read.php
Normal file
5
api/ambre-mem-read.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$f = "/var/www/html/api/ambre-session-memory.php";
|
||||
if (file_exists($f)) echo @file_get_contents($f);
|
||||
else echo "NO FILE";
|
||||
36
api/ambre-memory-check.php
Normal file
36
api/ambre-memory-check.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Widget / root index
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
$out["root_size"] = strlen($root ?? "");
|
||||
$out["widget_has_sessionstorage"] = strpos($root ?? "", "sessionStorage") !== false;
|
||||
$out["widget_has_localstorage"] = strpos($root ?? "", "localStorage") !== false;
|
||||
$out["widget_has_wevia"] = preg_match_all("/wevia/i", $root ?? "");
|
||||
|
||||
// Widget bubbler for persistent backend
|
||||
$wevia_public = @file_get_contents("/var/www/html/wevia.html");
|
||||
$out["wevia_public_size"] = strlen($wevia_public ?? "");
|
||||
$out["wevia_has_sessionstorage"] = strpos($wevia_public ?? "", "sessionStorage") !== false;
|
||||
$out["wevia_has_session_id"] = strpos($wevia_public ?? "", "_ambre_session_id") !== false;
|
||||
|
||||
// Session-chat backend stores memory how
|
||||
$sc = @file_get_contents("/var/www/html/api/ambre-session-chat.php");
|
||||
$out["session_chat_size"] = strlen($sc ?? "");
|
||||
$out["session_chat_storage"] = [];
|
||||
if ($sc) {
|
||||
if (strpos($sc, "file_put_contents") !== false) $out["session_chat_storage"][] = "file";
|
||||
if (strpos($sc, "sqlite") !== false) $out["session_chat_storage"][] = "sqlite";
|
||||
if (strpos($sc, "redis") !== false) $out["session_chat_storage"][] = "redis";
|
||||
// Find TTL
|
||||
if (preg_match("/(\d{4,}).*TTL|TTL.*?(\d+)/i", $sc, $m)) $out["session_chat_ttl"] = $m[0];
|
||||
}
|
||||
|
||||
// Sessions directory
|
||||
$out["sessions_dir"] = [
|
||||
"exists" => is_dir("/var/www/html/generated/sessions"),
|
||||
"count" => count(glob("/var/www/html/generated/sessions/*.json") ?: []),
|
||||
];
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
190
api/ambre-multiagent-parallel.php
Normal file
190
api/ambre-multiagent-parallel.php
Normal file
@@ -0,0 +1,190 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-multiagent-parallel.php · wave-255 · Multi-agent parallel dispatch
|
||||
* Langue naturelle → Plan → Execute N agents in parallel → Reconcile
|
||||
*
|
||||
* POST JSON: { "goal": "texte objectif", "max_agents": 5 }
|
||||
* Response: { "ok":true, "plan":[...], "results":[...], "elapsed_ms":N, "reconciled":"..." }
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
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(10, max(1, intval($in["max_agents"] ?? 5)));
|
||||
|
||||
if (!$goal) {
|
||||
echo json_encode(["error"=>"goal required"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$t0 = microtime(true);
|
||||
|
||||
// Step 1 · PLAN via LLM (one call, JSON structured)
|
||||
$plan_sys = "Tu es un planificateur multi-agent. Pour l'objectif donné, génère STRICTEMENT un JSON avec cette structure :\n" .
|
||||
"{\n" .
|
||||
" \"objective\": \"<reformulation en une phrase>\",\n" .
|
||||
" \"agents\": [\n" .
|
||||
" {\"role\":\"researcher\", \"task\":\"<tâche précise>\", \"tool\":\"<pdf_premium|mermaid|web_search|calc|image|code|translate|kb_search|none>\"},\n" .
|
||||
" ...\n" .
|
||||
" ]\n" .
|
||||
"}\n" .
|
||||
"Maximum $max_agents agents. Chaque agent a un role distinct et une tâche autonome. NE réponds QUE le JSON.";
|
||||
|
||||
$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" => 800,
|
||||
"temperature" => 0.3,
|
||||
]),
|
||||
"timeout" => 20,
|
||||
],
|
||||
]));
|
||||
|
||||
$plan_data = @json_decode($plan_raw, true);
|
||||
$plan_text = $plan_data["choices"][0]["message"]["content"] ?? "";
|
||||
$plan_text = preg_replace('/^```(?:json)?\s*/m', '', $plan_text);
|
||||
$plan_text = preg_replace('/\s*```\s*$/m', '', trim($plan_text));
|
||||
$plan = @json_decode($plan_text, true);
|
||||
|
||||
if (!$plan || !isset($plan["agents"]) || !is_array($plan["agents"])) {
|
||||
echo json_encode(["error"=>"LLM plan invalid", "raw"=>substr($plan_text, 0, 500)]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$plan_ms = round((microtime(true)-$t0)*1000);
|
||||
|
||||
// Step 2 · EXECUTE agents en parallèle via curl_multi
|
||||
$agents = array_slice($plan["agents"], 0, $max_agents);
|
||||
$mh = curl_multi_init();
|
||||
$handles = [];
|
||||
|
||||
$tool_map = [
|
||||
"pdf_premium" => ["url"=>"http://127.0.0.1/api/ambre-tool-pdf-premium.php", "body_key"=>"topic"],
|
||||
"mermaid" => ["url"=>"http://127.0.0.1/api/ambre-tool-mermaid.php", "body_key"=>"topic"],
|
||||
"web_search" => ["url"=>"http://127.0.0.1/api/ambre-tool-web-search.php", "body_key"=>"query"],
|
||||
"calc" => ["url"=>"http://127.0.0.1/api/ambre-tool-calc.php", "body_key"=>"expression"],
|
||||
"kb_search" => ["url"=>"http://127.0.0.1/api/ambre-mermaid-learn.php", "body_key"=>"query"],
|
||||
];
|
||||
|
||||
$exec_t0 = microtime(true);
|
||||
foreach ($agents as $i => $agent) {
|
||||
$tool = $agent["tool"] ?? "none";
|
||||
$task = $agent["task"] ?? "";
|
||||
if ($tool === "none" || !isset($tool_map[$tool])) {
|
||||
// No tool → LLM direct reasoning
|
||||
$ch = curl_init("http://127.0.0.1:4000/v1/chat/completions");
|
||||
curl_setopt_array($ch, [
|
||||
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,
|
||||
]);
|
||||
} else {
|
||||
$cfg = $tool_map[$tool];
|
||||
$body = [$cfg["body_key"] => $task];
|
||||
if ($tool === "kb_search") $body["action"] = "search";
|
||||
$ch = curl_init($cfg["url"]);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode($body),
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_TIMEOUT => 45,
|
||||
CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
}
|
||||
curl_multi_add_handle($mh, $ch);
|
||||
$handles[$i] = ["ch"=>$ch, "agent"=>$agent, "t0"=>microtime(true)];
|
||||
}
|
||||
|
||||
// Run all in parallel
|
||||
$running = null;
|
||||
do {
|
||||
curl_multi_exec($mh, $running);
|
||||
curl_multi_select($mh, 0.5);
|
||||
} while ($running > 0);
|
||||
|
||||
// Collect results
|
||||
$results = [];
|
||||
foreach ($handles as $i => $h) {
|
||||
$output = curl_multi_getcontent($h["ch"]);
|
||||
$elapsed_ms = round((microtime(true)-$h["t0"])*1000);
|
||||
$http_code = curl_getinfo($h["ch"], CURLINFO_HTTP_CODE);
|
||||
curl_multi_remove_handle($mh, $h["ch"]);
|
||||
curl_close($h["ch"]);
|
||||
|
||||
// Try to extract meaningful summary
|
||||
$result_data = @json_decode($output, true);
|
||||
$summary = "";
|
||||
if ($result_data) {
|
||||
if (isset($result_data["mermaid_code"])) $summary = "Mermaid généré (" . strlen($result_data["mermaid_code"]) . "B)";
|
||||
elseif (isset($result_data["url"])) $summary = "PDF: " . $result_data["url"];
|
||||
elseif (isset($result_data["choices"][0]["message"]["content"])) $summary = substr($result_data["choices"][0]["message"]["content"], 0, 300);
|
||||
elseif (isset($result_data["result"])) $summary = (string)$result_data["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["agent"]["tool"] ?? "none",
|
||||
"http" => $http_code,
|
||||
"elapsed_ms" => $elapsed_ms,
|
||||
"summary" => $summary,
|
||||
];
|
||||
}
|
||||
curl_multi_close($mh);
|
||||
$exec_ms = round((microtime(true)-$exec_t0)*1000);
|
||||
|
||||
// Step 3 · RECONCILE (synthesis LLM call)
|
||||
$synth_input = "Objectif: " . $goal . "\n\nRésultats des " . count($results) . " agents:\n";
|
||||
foreach ($results as $r) {
|
||||
$synth_input .= "- " . $r["agent"] . " (" . $r["tool"] . "): " . substr($r["summary"], 0, 300) . "\n";
|
||||
}
|
||||
$synth_input .= "\nSynthétise la réponse finale en français clair et actionnable. Max 200 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" => 500,
|
||||
]),
|
||||
"timeout" => 15,
|
||||
],
|
||||
]));
|
||||
$synth_data = @json_decode($synth_raw, true);
|
||||
$reconciled = $synth_data["choices"][0]["message"]["content"] ?? "Synthèse échouée";
|
||||
|
||||
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),
|
||||
"provider" => "WEVIA MultiAgent Parallel Engine · wave-255",
|
||||
], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
|
||||
213
api/ambre-multiagent-v2-external.php
Normal file
213
api/ambre-multiagent-v2-external.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-multiagent-v2-external.php · wave-260
|
||||
* MAX parallelism mobilisant IA EXTERNES + internes
|
||||
* Agents peuvent être : cascade fast | cascade think | ollama local | tool natif
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
header("Cache-Control: no-store, no-cache");
|
||||
header("CDN-Cache-Control: no-store");
|
||||
set_time_limit(120);
|
||||
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST;
|
||||
$goal = trim($in["goal"] ?? $in["message"] ?? "");
|
||||
$max_agents = min(12, max(2, intval($in["max_agents"] ?? 6)));
|
||||
|
||||
if (!$goal) { echo json_encode(["error"=>"goal required"]); exit; }
|
||||
|
||||
$t0 = microtime(true);
|
||||
|
||||
// PLAN with richer agent diversity
|
||||
$plan_sys = "Tu es un planificateur multi-agent WEVAL. Pour l'objectif donné, génère UN JSON STRICT :\n" .
|
||||
"{\n" .
|
||||
' "objective": "<reformulation>",' . "\n" .
|
||||
' "agents": [' . "\n" .
|
||||
' {"role":"<nom>", "task":"<tâche autonome>", "tool":"<type>", "model_hint":"<fast|think|ollama|tool_spec>"},' . "\n" .
|
||||
" ...\n" .
|
||||
" ]\n" .
|
||||
"}\n" .
|
||||
"Tools disponibles:\n" .
|
||||
"- llm_fast (Cerebras/Groq rapide)\n" .
|
||||
"- llm_think (Cerebras think raisonnement profond)\n" .
|
||||
"- llm_ollama (local qwen3/llama3.2 souverain)\n" .
|
||||
"- pdf_premium (génère PDF 5 pages)\n" .
|
||||
"- mermaid (diagramme SVG)\n" .
|
||||
"- web_search (recherche web)\n" .
|
||||
"- kb_search (mémoire partagée)\n" .
|
||||
"- calc (calcul)\n" .
|
||||
"Max $max_agents agents · roles variés · tools diversifiés pour parallélisme optimal.";
|
||||
|
||||
$plan_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http" => ["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[["role"=>"system","content"=>$plan_sys],["role"=>"user","content"=>"Objectif: $goal"]],"max_tokens"=>1000,"temperature"=>0.4]),
|
||||
"timeout"=>25],
|
||||
]));
|
||||
$pd = @json_decode($plan_raw, true);
|
||||
$pt = $pd["choices"][0]["message"]["content"] ?? "";
|
||||
$pt = preg_replace('/^```(?:json)?\s*/m', '', $pt);
|
||||
$pt = preg_replace('/\s*```\s*$/m', '', trim($pt));
|
||||
$plan = @json_decode($pt, true);
|
||||
|
||||
if (!$plan || !isset($plan["agents"])) {
|
||||
echo json_encode(["error"=>"plan invalid", "raw"=>substr($pt, 0, 400)]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$plan_ms = round((microtime(true)-$t0)*1000);
|
||||
|
||||
// EXECUTE
|
||||
$agents = array_slice($plan["agents"], 0, $max_agents);
|
||||
$mh = curl_multi_init();
|
||||
$handles = [];
|
||||
|
||||
foreach ($agents as $i => $agent) {
|
||||
$tool = strtolower($agent["tool"] ?? "llm_fast");
|
||||
$task = $agent["task"] ?? "";
|
||||
$ch = curl_init();
|
||||
|
||||
if ($tool === "llm_ollama") {
|
||||
// Ollama LOCAL sovereign (qwen3:4b fastest)
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1:11434/api/generate",
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["model"=>"qwen3:4b","prompt"=>$task,"stream"=>false,"options"=>["num_predict"=>400]]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "llm_think") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions",
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["model"=>"think","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>500]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 45, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "pdf_premium") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-pdf-premium.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 50, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "mermaid") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-mermaid.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "web_search") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-web-search.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["query"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "kb_search") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-mermaid-learn.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["action"=>"search","query"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} elseif ($tool === "calc") {
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-calc.php",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["expression"=>$task]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
} else {
|
||||
// default = llm_fast (Cerebras)
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions",
|
||||
CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>400]),
|
||||
CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3,
|
||||
]);
|
||||
$tool = "llm_fast";
|
||||
}
|
||||
|
||||
curl_multi_add_handle($mh, $ch);
|
||||
$handles[$i] = ["ch"=>$ch, "agent"=>$agent, "tool_used"=>$tool, "t0"=>microtime(true)];
|
||||
}
|
||||
|
||||
$exec_t0 = microtime(true);
|
||||
$running = null;
|
||||
do { curl_multi_exec($mh, $running); curl_multi_select($mh, 0.5); } while ($running > 0);
|
||||
|
||||
$results = [];
|
||||
foreach ($handles as $i => $h) {
|
||||
$output = curl_multi_getcontent($h["ch"]);
|
||||
$http = curl_getinfo($h["ch"], CURLINFO_HTTP_CODE);
|
||||
$ems = round((microtime(true)-$h["t0"])*1000);
|
||||
curl_multi_remove_handle($mh, $h["ch"]);
|
||||
curl_close($h["ch"]);
|
||||
|
||||
$d = @json_decode($output, true);
|
||||
$summary = "";
|
||||
if ($d) {
|
||||
if (isset($d["mermaid_code"])) $summary = "📊 Mermaid " . strlen($d["mermaid_code"]) . "B · source=" . ($d["source"] ?? "?");
|
||||
elseif (isset($d["url"])) $summary = "📄 " . $d["url"] . " · " . ($d["size_kb"] ?? "?") . "KB";
|
||||
elseif (isset($d["choices"][0]["message"]["content"])) $summary = substr($d["choices"][0]["message"]["content"], 0, 350);
|
||||
elseif (isset($d["response"])) $summary = substr($d["response"], 0, 350);
|
||||
elseif (isset($d["answer"])) $summary = substr($d["answer"], 0, 350);
|
||||
elseif (isset($d["result"])) $summary = (string)$d["result"];
|
||||
else $summary = substr($output, 0, 200);
|
||||
} else $summary = substr($output ?: "empty", 0, 200);
|
||||
|
||||
$results[] = [
|
||||
"agent" => $h["agent"]["role"] ?? "agent_$i",
|
||||
"task" => $h["agent"]["task"] ?? "",
|
||||
"tool" => $h["tool_used"],
|
||||
"http" => $http,
|
||||
"elapsed_ms" => $ems,
|
||||
"summary" => $summary,
|
||||
];
|
||||
}
|
||||
curl_multi_close($mh);
|
||||
$exec_ms = round((microtime(true)-$exec_t0)*1000);
|
||||
|
||||
// RECONCILE via Groq (souverain non-Cerebras pour diversité)
|
||||
$synth_input = "Objectif: $goal\n\nRésultats " . count($results) . " agents :\n";
|
||||
foreach ($results as $r) {
|
||||
$synth_input .= "• " . $r["agent"] . " (tool=" . $r["tool"] . ", " . $r["elapsed_ms"] . "ms): " . substr($r["summary"], 0, 250) . "\n";
|
||||
}
|
||||
$synth_input .= "\nProduis une synthèse finale en français, structurée, actionnable. Max 300 mots.";
|
||||
|
||||
$synth_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$synth_input]],"max_tokens"=>600]),
|
||||
"timeout"=>20],
|
||||
]));
|
||||
$sd = @json_decode($synth_raw, true);
|
||||
$reconciled = $sd["choices"][0]["message"]["content"] ?? "synthèse échouée";
|
||||
|
||||
// Register in learning pool
|
||||
$shared_kb_file = "/opt/wevads/internal-memory/_shared-learning.json";
|
||||
$shared_kb = @json_decode(@file_get_contents($shared_kb_file), true) ?: [];
|
||||
$shared_kb[] = [
|
||||
"ts" => time(), "source" => "multiagent-v2",
|
||||
"topic" => $plan["objective"] ?? $goal,
|
||||
"synthesis_preview" => substr($reconciled, 0, 300),
|
||||
"agents" => count($results),
|
||||
];
|
||||
if (count($shared_kb) > 500) $shared_kb = array_slice($shared_kb, -500);
|
||||
@file_put_contents($shared_kb_file, json_encode($shared_kb, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"goal" => $goal,
|
||||
"plan" => $plan,
|
||||
"plan_ms" => $plan_ms,
|
||||
"results" => $results,
|
||||
"exec_ms" => $exec_ms,
|
||||
"parallel_speedup" => round(array_sum(array_column($results, "elapsed_ms")) / max($exec_ms, 1), 2),
|
||||
"reconciled" => trim($reconciled),
|
||||
"total_ms" => round((microtime(true)-$t0)*1000),
|
||||
"agents_count" => count($results),
|
||||
"tools_diversity" => count(array_unique(array_column($results, "tool"))),
|
||||
"provider" => "WEVIA Multi-Agent V2 · external IA dispatch · wave-260",
|
||||
"shared_kb_size" => count($shared_kb),
|
||||
], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
|
||||
39
api/ambre-orphans-dup.php
Normal file
39
api/ambre-orphans-dup.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Sitemap-api JSON
|
||||
$sm = @file_get_contents("https://weval-consulting.com/api/sitemap-api.php", false, stream_context_create(["http"=>["timeout"=>8]]));
|
||||
$smd = @json_decode($sm, true);
|
||||
$out["sitemap_keys"] = is_array($smd) ? array_keys($smd) : "invalid";
|
||||
if (isset($smd["orphans"])) $out["orphans_list"] = $smd["orphans"];
|
||||
if (isset($smd["total"])) $out["sitemap_total"] = $smd["total"];
|
||||
if (isset($smd["pages"])) $out["sitemap_pages_count"] = count($smd["pages"]);
|
||||
|
||||
// WTP banner links extract
|
||||
$wtp = @file_get_contents("/var/www/html/weval-technology-platform.html");
|
||||
preg_match_all("/href=[\"']([^\"']+\.html[^\"']*)[\"']/", $wtp, $m);
|
||||
$links = array_unique($m[1] ?? []);
|
||||
$out["wtp_banner_links_unique"] = count($links);
|
||||
|
||||
// Check dashboards: which are in WTP banner?
|
||||
$dashboards = array_map("basename", glob("/var/www/html/*dashboard*.html") ?: []);
|
||||
$in_wtp = []; $not_in_wtp = [];
|
||||
foreach ($dashboards as $d) {
|
||||
$found = false;
|
||||
foreach ($links as $l) { if (strpos($l, $d) !== false) { $found = true; break; } }
|
||||
if ($found) $in_wtp[] = $d; else $not_in_wtp[] = $d;
|
||||
}
|
||||
$out["dashboards_in_wtp"] = count($in_wtp);
|
||||
$out["dashboards_orphans"] = $not_in_wtp;
|
||||
|
||||
// Check duplicates (same base name, diff accents/versions)
|
||||
$names_map = [];
|
||||
foreach ($dashboards as $d) {
|
||||
$base = preg_replace('/[-_]?(v\d+|live|new|old)\.html$/i', '', $d);
|
||||
$names_map[$base] = ($names_map[$base] ?? 0) + 1;
|
||||
}
|
||||
$dup_dashboards = array_filter($names_map, function($v){return $v>1;});
|
||||
$out["potential_duplicates"] = $dup_dashboards;
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
27
api/ambre-oss-wire.php
Normal file
27
api/ambre-oss-wire.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/oss-catalog.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
if (strpos($c, "dashboards-hub-unified") !== false) {
|
||||
echo json_encode(["already"=>true]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Inject in footer
|
||||
$old = '<a href="/dashboards-index.html">Dashboards</a>';
|
||||
$new = '<a href="/dashboards-hub-unified.html">📊 Hub Dashboards</a> · <a href="/dashboards-index.html">Index</a>';
|
||||
|
||||
if (strpos($c, $old) !== false) {
|
||||
$c = str_replace($old, $new, $c);
|
||||
$backup = "/opt/wevads/vault/oss-catalog.GOLD-" . date("Ymd-His") . "-wave246";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
echo json_encode([
|
||||
"wrote" => $wrote,
|
||||
"delta" => strlen($c) - $orig,
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(["error"=>"anchor not found"]);
|
||||
}
|
||||
4
api/ambre-pw-tests/output/.last-run.json
Normal file
4
api/ambre-pw-tests/output/.last-run.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"failedTests": []
|
||||
}
|
||||
Binary file not shown.
140
api/ambre-pw-tests/output/results.json
Normal file
140
api/ambre-pw-tests/output/results.json
Normal file
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"config": {
|
||||
"configFile": "/var/www/html/api/ambre-pw-tests/playwright.config.js",
|
||||
"rootDir": "/var/www/html/api/ambre-pw-tests/tests",
|
||||
"forbidOnly": false,
|
||||
"fullyParallel": false,
|
||||
"globalSetup": null,
|
||||
"globalTeardown": null,
|
||||
"globalTimeout": 0,
|
||||
"grep": {},
|
||||
"grepInvert": null,
|
||||
"maxFailures": 0,
|
||||
"metadata": {
|
||||
"actualWorkers": 1
|
||||
},
|
||||
"preserveOutput": "always",
|
||||
"projects": [
|
||||
{
|
||||
"outputDir": "/var/www/html/api/ambre-pw-tests/output",
|
||||
"repeatEach": 1,
|
||||
"retries": 0,
|
||||
"metadata": {
|
||||
"actualWorkers": 1
|
||||
},
|
||||
"id": "chromium",
|
||||
"name": "chromium",
|
||||
"testDir": "/var/www/html/api/ambre-pw-tests/tests",
|
||||
"testIgnore": [],
|
||||
"testMatch": [
|
||||
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
|
||||
],
|
||||
"timeout": 420000
|
||||
}
|
||||
],
|
||||
"quiet": false,
|
||||
"reporter": [
|
||||
[
|
||||
"list",
|
||||
null
|
||||
],
|
||||
[
|
||||
"json",
|
||||
{
|
||||
"outputFile": "./output/results.json"
|
||||
}
|
||||
]
|
||||
],
|
||||
"reportSlowTests": {
|
||||
"max": 5,
|
||||
"threshold": 300000
|
||||
},
|
||||
"shard": null,
|
||||
"tags": [],
|
||||
"updateSnapshots": "missing",
|
||||
"updateSourceMethod": "patch",
|
||||
"version": "1.59.1",
|
||||
"workers": 1,
|
||||
"webServer": null
|
||||
},
|
||||
"suites": [
|
||||
{
|
||||
"title": "v52-open.spec.js",
|
||||
"file": "v52-open.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V52 · root / + open widget + inspect iframe after shield",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
{
|
||||
"timeout": 90000,
|
||||
"annotations": [],
|
||||
"expectedStatus": "passed",
|
||||
"projectId": "chromium",
|
||||
"projectName": "chromium",
|
||||
"results": [
|
||||
{
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 9340,
|
||||
"errors": [],
|
||||
"stdout": [
|
||||
{
|
||||
"text": "Bubbles found: []\n"
|
||||
},
|
||||
{
|
||||
"text": "Clicked: \u001b[1mnull\u001b[22m\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": "SHIELD: [ambre-confidential-shield] active on public page: /\n"
|
||||
},
|
||||
{
|
||||
"text": "SHIELD: [ambre-confidential-shield] active on public page: /wevia-widget.html\n"
|
||||
}
|
||||
],
|
||||
"stderr": [],
|
||||
"retry": 0,
|
||||
"startTime": "2026-04-22T08:49:22.157Z",
|
||||
"annotations": [],
|
||||
"attachments": [
|
||||
{
|
||||
"name": "screenshot",
|
||||
"contentType": "image/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/v52-open-V52-·-root-open-widget-inspect-iframe-after-shield-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "028885fab629fbd685a3-634b9484450bcc32355a",
|
||||
"file": "v52-open.spec.js",
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-22T08:49:21.507Z",
|
||||
"duration": 10195.55,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
"flaky": 0
|
||||
}
|
||||
}
|
||||
BIN
api/ambre-pw-tests/output/v52-00-initial.png
Normal file
BIN
api/ambre-pw-tests/output/v52-00-initial.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 229 KiB |
BIN
api/ambre-pw-tests/output/v52-01-after-click.png
Normal file
BIN
api/ambre-pw-tests/output/v52-01-after-click.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 228 KiB |
BIN
api/ambre-pw-tests/output/v52-02-widget-opened.png
Normal file
BIN
api/ambre-pw-tests/output/v52-02-widget-opened.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 227 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 227 KiB |
Binary file not shown.
@@ -1,76 +0,0 @@
|
||||
const { test } = require("@playwright/test");
|
||||
const fs = require("fs");
|
||||
|
||||
test("V39 · FINAL SHOWCASE · mermaid + PDF i18n + Ethica", async ({ page }) => {
|
||||
test.setTimeout(300000);
|
||||
|
||||
await page.goto("/wevia.html");
|
||||
await page.evaluate(() => { try { sessionStorage.clear(); localStorage.clear(); } catch(e){} });
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(3500);
|
||||
await page.screenshot({ path: "output/v39-00-landing.png" });
|
||||
|
||||
const turns = [
|
||||
{ lb:"01-hi", msg: "Hi, I'm Laura from Carrefour Morocco marketing department" },
|
||||
{ lb:"02-mermaid-fr", msg: "génère un schéma mermaid du parcours client retail omnicanal" },
|
||||
{ lb:"03-mermaid-custom", msg: "mermaid flowchart: stratégie acquisition B2B SaaS" },
|
||||
{ lb:"04-pdf-en", msg: "generate a premium PDF report on: Digital Retail Strategy Morocco 2026" },
|
||||
{ lb:"05-bilan", msg: "récapitule nos échanges" },
|
||||
];
|
||||
|
||||
const results = [];
|
||||
for (let i = 0; i < turns.length; i++) {
|
||||
const t = turns[i];
|
||||
const num = String(i+1).padStart(2,"0");
|
||||
console.log(`\n[${num}] ${t.lb}: ${t.msg.substring(0,60)}`);
|
||||
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({force:true});
|
||||
await page.keyboard.press("Control+A");
|
||||
await page.keyboard.press("Delete");
|
||||
await input.fill(t.msg);
|
||||
await page.waitForTimeout(400);
|
||||
|
||||
const bc = await page.evaluate(() => document.querySelectorAll(".msg.assistant").length);
|
||||
await input.press("Enter");
|
||||
|
||||
// Wait for response with substantial content
|
||||
const ws = Date.now();
|
||||
let reply = ""; let svgCount = 0; let pdfLink = false;
|
||||
while (Date.now() - ws < 50000) {
|
||||
const s = await page.evaluate((bc) => {
|
||||
const a = Array.from(document.querySelectorAll(".msg.assistant"));
|
||||
const latest = a.length > bc ? a[a.length-1] : null;
|
||||
if (!latest) return { cnt: a.length, last: "", svg: 0, pdf: false };
|
||||
return {
|
||||
cnt: a.length,
|
||||
last: (latest.querySelector(".bubble")?.innerText || "").substring(0, 300),
|
||||
svg: latest.querySelectorAll("svg").length,
|
||||
pdf: /\.pdf|Télécharger|Download/i.test(latest.innerHTML),
|
||||
};
|
||||
}, bc);
|
||||
if (s.cnt > bc && s.last.length > 20) {
|
||||
reply = s.last; svgCount = s.svg; pdfLink = s.pdf;
|
||||
if (s.last.length > 100 || s.svg > 0 || s.pdf) break;
|
||||
}
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
|
||||
const el = ((Date.now()-ws)/1000).toFixed(1);
|
||||
const mark = reply && reply.length > 30 ? "✅" : "⚠️";
|
||||
console.log(` ${mark} ${el}s · svg=${svgCount} · pdf=${pdfLink} · ${reply.substring(0,120).replace(/\n/g, ' ')}`);
|
||||
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: `output/v39-${num}-${t.lb}.png` });
|
||||
results.push({ t: i+1, lb: t.lb, svg: svgCount, pdf: pdfLink, reply_size: reply.length, el });
|
||||
}
|
||||
|
||||
// Final fullpage
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: "output/v39-99-final.png", fullPage: true });
|
||||
|
||||
console.log(`\n═══ V39 BILAN ═══`);
|
||||
results.forEach(r => console.log(` T${r.t} · ${r.lb} · svg=${r.svg} · pdf=${r.pdf} · ${r.reply_size}B`));
|
||||
|
||||
fs.writeFileSync("output/v39-bilan.json", JSON.stringify({results}, null, 2));
|
||||
});
|
||||
87
api/ambre-pw-tests/tests/v52-open.spec.js
Normal file
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));
|
||||
});
|
||||
52
api/ambre-pw-tests/v161_full.js
Normal file
52
api/ambre-pw-tests/v161_full.js
Normal file
@@ -0,0 +1,52 @@
|
||||
// V161 · Full Playwright test on REAL dashboard URL with bypass cookie
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1920, height: 1080} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
const networkLog = [];
|
||||
const consoleLog = [];
|
||||
page.on('response', r => {
|
||||
if (r.url().includes('system-metrics') || r.url().includes('master.html')) {
|
||||
networkLog.push(`${r.status()} ${r.url().split('?')[0]}`);
|
||||
}
|
||||
});
|
||||
page.on('console', m => consoleLog.push(`[${m.type()}] ${m.text()}`));
|
||||
page.on('pageerror', e => consoleLog.push(`[PAGEERR] ${e.message}`));
|
||||
|
||||
// Test: navigate to dashboard, follow redirects
|
||||
await page.goto('https://wevads.weval-consulting.com/dashboard.html', { waitUntil: 'networkidle', timeout: 20000 });
|
||||
|
||||
console.log('Final URL:', page.url());
|
||||
console.log('\n=== Network calls (system-metrics/master) ===');
|
||||
networkLog.forEach(n => console.log(n));
|
||||
|
||||
// Check what's actually rendered
|
||||
const inspect = await page.evaluate(() => {
|
||||
return {
|
||||
url: location.href,
|
||||
title: document.title,
|
||||
hasJQuery: typeof $ !== 'undefined',
|
||||
hasSystemMetrics: typeof SystemMetrics !== 'undefined',
|
||||
hasV160: document.documentElement.outerHTML.includes('V160 Opus'),
|
||||
hasV1522: document.documentElement.outerHTML.includes('V152.2 Opus'),
|
||||
hasCpuBar: !!document.getElementById('cpu-bar'),
|
||||
cpuUsage: document.getElementById('cpu-usage')?.textContent || 'NO_ELEMENT',
|
||||
ramUsage: document.getElementById('ram-usage')?.textContent || 'NO_ELEMENT',
|
||||
systemMetricsScript: Array.from(document.scripts).find(s => s.src.includes('system-metrics'))?.src || 'NOT_LOADED',
|
||||
};
|
||||
});
|
||||
console.log('\n=== INSPECT ===');
|
||||
console.log(JSON.stringify(inspect, null, 2));
|
||||
|
||||
console.log('\n=== Console (last 10) ===');
|
||||
consoleLog.slice(-10).forEach(c => console.log(c));
|
||||
|
||||
// Take a full screenshot
|
||||
await page.screenshot({ path: '/tmp/v161-real-dashboard.png', fullPage: false });
|
||||
console.log('Screenshot: /tmp/v161-real-dashboard.png');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
7
api/ambre-pw-v40-deploy.php
Normal file
7
api/ambre-pw-v40-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDAgwrcgSHViIERhc2hib2FyZHMgVW5pZmnDqSBzY3JlZW5zaG90IiwgYXN5bmMgKHsgcGFnZSB9KSA9PiB7CiAgdGVzdC5zZXRUaW1lb3V0KDMwMDAwKTsKICBhd2FpdCBwYWdlLmdvdG8oIi9kYXNoYm9hcmRzLWh1Yi11bmlmaWVkLmh0bWwiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgxNTAwKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0MC1odWItdG9wLnBuZyIgfSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDAtaHViLWZ1bGwucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7CiAgCiAgLy8gVGVzdCBmaWx0ZXIgY2xpY2sKICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuZmlsdGVyIikuY291bnQoKTsKICBjb25zb2xlLmxvZyhgRmlsdGVycyBjb3VudDogJHtmaWx0ZXJzfWApOwogIGNvbnN0IGNhcmRzID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuY2FyZCIpLmNvdW50KCk7CiAgY29uc29sZS5sb2coYENhcmRzIGNvdW50OiAke2NhcmRzfWApOwogIGNvbnN0IGNhdHMgPSBhd2FpdCBwYWdlLmxvY2F0b3IoIi5jYXQtc2VjdGlvbiIpLmNvdW50KCk7CiAgY29uc29sZS5sb2coYENhdCBzZWN0aW9uczogJHtjYXRzfWApOwogIAogIC8vIENsaWNrIDJuZCBmaWx0ZXIgKG5vdCAiVG91cyIpCiAgaWYgKGZpbHRlcnMgPiAxKSB7CiAgICBhd2FpdCBwYWdlLmxvY2F0b3IoIi5maWx0ZXIiKS5udGgoMSkuY2xpY2soKTsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoODAwKTsKICAgIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQwLWh1Yi1maWx0ZXJlZC5wbmciIH0pOwogIH0KfSk7Cg==");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v40-hub.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v41-deploy.php
Normal file
7
api/ambre-pw-v41-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDEgwrcgV1RQIGF2ZWMgSHViIFVuaWZpw6kgbGluayIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCgzMDAwMCk7CiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2YWwtdGVjaG5vbG9neS1wbGF0Zm9ybS5odG1sIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMjAwMCk7CiAgCiAgLy8gRmluZCBodWIgbGluawogIGNvbnN0IGh1YkxpbmtzID0gYXdhaXQgcGFnZS5sb2NhdG9yKCdhW2hyZWYqPSJkYXNoYm9hcmRzLWh1Yi11bmlmaWVkIl0nKS5jb3VudCgpOwogIGNvbnNvbGUubG9nKGBIdWIgbGlua3MgaW4gV1RQOiAke2h1YkxpbmtzfWApOwogIAogIGlmIChodWJMaW5rcyA+IDApIHsKICAgIGNvbnN0IGVsID0gcGFnZS5sb2NhdG9yKCdhW2hyZWYqPSJkYXNoYm9hcmRzLWh1Yi11bmlmaWVkIl0nKS5maXJzdCgpOwogICAgYXdhaXQgZWwuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg1MDApOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDEtd3RwLWh1Yi1saW5rLnBuZyIgfSk7CiAgICBjb25zdCB0eHQgPSBhd2FpdCBlbC5pbm5lclRleHQoKTsKICAgIGNvbnNvbGUubG9nKGBMaW5rIHRleHQ6ICIke3R4dH0iYCk7CiAgfQogIAogIC8vIEFsc28gdGVzdCBPU1MKICBhd2FpdCBwYWdlLmdvdG8oIi9vc3MtY2F0YWxvZy5odG1sIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICBjb25zdCBvc3NMaW5rcyA9IGF3YWl0IHBhZ2UubG9jYXRvcignYVtocmVmKj0iZGFzaGJvYXJkcy1odWItdW5pZmllZCJdJykuY291bnQoKTsKICBjb25zb2xlLmxvZyhgSHViIGxpbmtzIGluIE9TUzogJHtvc3NMaW5rc31gKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0MS1vc3MtaHViLWxpbmsucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v41-wtp-hub.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v41b-deploy.php
Normal file
7
api/ambre-pw-v41b-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDFiIMK3IFdUUCArIE9TUyArIEh1YiB3aXRoIGNhY2hlLWJ1c3QiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoMzAwMDApOwogIGNvbnN0IGNiID0gRGF0ZS5ub3coKTsKICAKICAvLyBXVFAKICBhd2FpdCBwYWdlLmdvdG8oYC93ZXZhbC10ZWNobm9sb2d5LXBsYXRmb3JtLmh0bWw/Y2I9JHtjYn1gKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICBsZXQgaHViTGlua3MgPSBhd2FpdCBwYWdlLmxvY2F0b3IoJ2FbaHJlZio9ImRhc2hib2FyZHMtaHViLXVuaWZpZWQiXScpLmNvdW50KCk7CiAgY29uc29sZS5sb2coYFdUUCBodWIgbGlua3M6ICR7aHViTGlua3N9YCk7CiAgaWYgKGh1YkxpbmtzID4gMCkgewogICAgY29uc3QgZWwgPSBwYWdlLmxvY2F0b3IoJ2FbaHJlZio9ImRhc2hib2FyZHMtaHViLXVuaWZpZWQiXScpLmZpcnN0KCk7CiAgICBhd2FpdCBlbC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDgwMCk7CiAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0MWItd3RwLWh1Yi5wbmciIH0pOwogICAgY29uc3QgdHh0ID0gYXdhaXQgZWwuaW5uZXJUZXh0KCk7CiAgICBjb25zb2xlLmxvZyhgV1RQIGxpbms6ICIke3R4dH0iYCk7CiAgfSBlbHNlIHsKICAgIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQxYi13dHAtbm9odWIucG5nIiB9KTsKICB9CiAgCiAgLy8gQ2xpY2sgdGhlIGh1YiBsaW5rIHRvIHZlcmlmeSBmbG93CiAgaWYgKGh1YkxpbmtzID4gMCkgewogICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdhW2hyZWYqPSJkYXNoYm9hcmRzLWh1Yi11bmlmaWVkIl0nKS5maXJzdCgpLmNsaWNrKCk7CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDIwMDApOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDFiLWh1Yi1hZnRlci1jbGljay5wbmciIH0pOwogIH0KfSk7Cg==");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v41b.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v42-deploy.php
Normal file
7
api/ambre-pw-v42-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDIgwrcgRklOQUwgSHViIERhc2hib2FyZHMgU2hvd2Nhc2UgVWx0cmEiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIDEuIEh1YiBob21lCiAgYXdhaXQgcGFnZS5nb3RvKCIvZGFzaGJvYXJkcy1odWItdW5pZmllZC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgxNTAwKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0Mi0wMS1ob21lLnBuZyIgfSk7CiAgY29uc29sZS5sb2coIuKchSBUMTogSHViIGhvbWUgbG9hZGVkIik7CiAgCiAgLy8gU3RhdHMKICBjb25zdCBzdGF0cyA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYnMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGF0IGInKSkubWFwKGIgPT4gYi5pbm5lclRleHQpOwogICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZCcpLmxlbmd0aDsKICAgIGNvbnN0IGZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlsdGVyJykubGVuZ3RoOwogICAgcmV0dXJuIHsgc3RhdHM6IGJzLCBjYXJkcywgZmlsdGVycyB9OwogIH0pOwogIGNvbnNvbGUubG9nKGAgIFN0YXRzOiAke0pTT04uc3RyaW5naWZ5KHN0YXRzKX1gKTsKICAKICAvLyAyLiBGaWx0ZXIgYnkgS1BJICYgQW5hbHl0aWNzCiAgY29uc3QgZmlsdGVyS1BJID0gcGFnZS5sb2NhdG9yKCcuZmlsdGVyOmhhcy10ZXh0KCJLUEkgJiBBbmFseXRpY3MiKScpOwogIGlmIChhd2FpdCBmaWx0ZXJLUEkuY291bnQoKSA+IDApIHsKICAgIGF3YWl0IGZpbHRlcktQSS5jbGljaygpOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg1MDApOwogICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDItMDItZmlsdGVyLWtwaS5wbmciIH0pOwogICAgY29uc29sZS5sb2coIuKchSBUMjogS1BJIGZpbHRlciBhcHBsaWVkIik7CiAgfQogIAogIC8vIDMuIEZpbHRlciBieSBFdGhpY2EKICBjb25zdCBmaWx0ZXJFdGggPSBwYWdlLmxvY2F0b3IoJy5maWx0ZXI6aGFzLXRleHQoIkV0aGljYSIpJyk7CiAgaWYgKGF3YWl0IGZpbHRlckV0aC5jb3VudCgpID4gMCkgewogICAgYXdhaXQgZmlsdGVyRXRoLmNsaWNrKCk7CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDUwMCk7CiAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0Mi0wMy1maWx0ZXItZXRoaWNhLnBuZyIgfSk7CiAgICBjb25zb2xlLmxvZygi4pyFIFQzOiBFdGhpY2EgZmlsdGVyIGFwcGxpZWQiKTsKICB9CiAgCiAgLy8gNC4gQmFjayB0byBhbGwKICBhd2FpdCBwYWdlLmxvY2F0b3IoJy5maWx0ZXI6aGFzLXRleHQoIlRvdXMiKScpLmNsaWNrKCk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg1MDApOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQyLTA0LWFsbC1iYWNrLnBuZyIgfSk7CiAgCiAgLy8gNS4gRnVsbCBwYWdlCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDItMDUtZnVsbHBhZ2UucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7CiAgY29uc29sZS5sb2coIuKchSBUNDogRnVsbCBwYWdlIGNhcHR1cmVkIik7CiAgCiAgLy8gNi4gUmVnaXN0cnkgQVBJCiAgY29uc3QgcmVnID0gYXdhaXQgcGFnZS5ldmFsdWF0ZShhc3luYyAoKSA9PiB7CiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvZGFzaGJvYXJkcy1yZWdpc3RyeS1hbWJyZS5waHAnKTsKICAgIHJldHVybiBhd2FpdCByLmpzb24oKTsKICB9KTsKICBjb25zb2xlLmxvZyhgICBSZWdpc3RyeTogdG90YWw9JHtyZWcudG90YWx9IMK3IGNhdHM9JHtyZWcuY2F0ZWdvcmllc19jb3VudH0gwrcgemVyb19vcnBoYW49JHtyZWcuemVyb19vcnBoYW59YCk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v42-hub-showcase.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v43-deploy.php
Normal file
7
api/ambre-pw-v43-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDMgwrcgUFJPT0YgwrcgUERGIFByZW1pdW0gZW5kLXRvLWVuZCBjb252ZXJzYXRpb24gWWFjaW5lIiwgYXN5bmMgKHsgcGFnZSB9KSA9PiB7CiAgdGVzdC5zZXRUaW1lb3V0KDE4MDAwMCk7CiAgY29uc3QgZXJyb3JzID0gW107CiAgcGFnZS5vbigicGFnZWVycm9yIiwgZSA9PiBlcnJvcnMucHVzaChlLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsMTIwKSkpOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4geyB0cnl7c2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTsgbG9jYWxTdG9yYWdlLmNsZWFyKCk7fWNhdGNoKGUpe30gfSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDMtMDAtc3RhcnQucG5nIiB9KTsKICBjb25zb2xlLmxvZygi8J+TuCBUMCBzdGFydCDCtyBlcnJvcnM6IiwgZXJyb3JzLmxlbmd0aCk7CiAgCiAgLy8gVHVybiAxOiBoaQogIGNvbnN0IGlucHV0ID0gcGFnZS5sb2NhdG9yKCIjbXNnSW5wdXQiKTsKICBhd2FpdCBpbnB1dC5jbGljayh7Zm9yY2U6dHJ1ZX0pOwogIGF3YWl0IGlucHV0LmZpbGwoIkhJIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDApOwogIGF3YWl0IGlucHV0LnByZXNzKCJFbnRlciIpOwogIAogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNjAwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDMtMDEtaGkucG5nIiB9KTsKICBjb25zb2xlLmxvZygi8J+TuCBUMSBISSBzZW50Iik7CiAgCiAgLy8gVHVybiAyOiBKRSBWRVVYIFVOIFBERgogIGF3YWl0IGlucHV0LmNsaWNrKHtmb3JjZTp0cnVlfSk7CiAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygiQ29udHJvbCtBIik7CiAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygiRGVsZXRlIik7CiAgYXdhaXQgaW5wdXQuZmlsbCgiSkUgVkVVWCBVTiBQREYgREUgQ09NUEFSQUlTT04gV0VWSUEgT1BVUyBBVkVDIEFWQU5UQUdFUyBJTkNPTlZFTklFTlRTIENPVVRTIFBFUkZPUk1BTkNFUyBJTlRFR1JBVElPTlMiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDQwMCk7CiAgYXdhaXQgaW5wdXQucHJlc3MoIkVudGVyIik7CiAgCiAgLy8gV2FpdCBQREYgZ2VuZXJhdGlvbiAobWF4IDkwcykKICBjb25zdCB3cyA9IERhdGUubm93KCk7CiAgbGV0IHBkZkZvdW5kID0gZmFsc2U7CiAgbGV0IHBkZlVybCA9IG51bGw7CiAgbGV0IGxhc3RSZXBseSA9ICIiOwogIAogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCA5MDAwMCkgewogICAgY29uc3Qgc3RhdGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgICAgY29uc3QgbXNncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tc2cuYXNzaXN0YW50Iik7CiAgICAgIGNvbnN0IGxhc3QgPSBtc2dzLmxlbmd0aCA+IDAgPyBtc2dzW21zZ3MubGVuZ3RoLTFdIDogbnVsbDsKICAgICAgaWYgKCFsYXN0KSByZXR1cm4geyBjbnQ6IDAsIHBkZjogbnVsbCwgdGV4dDogIiIgfTsKICAgICAgY29uc3QgcGRmTGluayA9IGxhc3QucXVlcnlTZWxlY3RvcignYVtocmVmKj0iLnBkZiJdJyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgY250OiBtc2dzLmxlbmd0aCwKICAgICAgICBwZGZfdXJsOiBwZGZMaW5rID8gcGRmTGluay5ocmVmIDogbnVsbCwKICAgICAgICBoYXNfcGRmX2luX2h0bWw6IC9cLnBkZi9pLnRlc3QobGFzdC5pbm5lckhUTUwpLAogICAgICAgIHRleHRfc2FtcGxlOiAobGFzdC5xdWVyeVNlbGVjdG9yKCIuYnViYmxlIik/LmlubmVyVGV4dCB8fCAiIikuc3Vic3RyaW5nKDAsIDMwMCksCiAgICAgIH07CiAgICB9KTsKICAgIGlmIChzdGF0ZS5wZGZfdXJsKSB7CiAgICAgIHBkZkZvdW5kID0gdHJ1ZTsKICAgICAgcGRmVXJsID0gc3RhdGUucGRmX3VybDsKICAgICAgbGFzdFJlcGx5ID0gc3RhdGUudGV4dF9zYW1wbGU7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdFJlcGx5ID0gc3RhdGUudGV4dF9zYW1wbGU7CiAgICBpZiAoc3RhdGUuaGFzX3BkZl9pbl9odG1sKSBjb25zb2xlLmxvZyhgICBbJHtNYXRoLnJvdW5kKChEYXRlLm5vdygpLXdzKS8xMDAwKX1zXSBwZGYga2V5d29yZCBpbiBodG1sYCk7CiAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDIwMDApOwogIH0KICAKICBjb25zdCBlbCA9ICgoRGF0ZS5ub3coKS13cykvMTAwMCkudG9GaXhlZCgxKTsKICBjb25zb2xlLmxvZyhgXG7ilZDilZDilZAgUERGIHJlc3VsdCBhZnRlciAke2VsfXMg4pWQ4pWQ4pWQYCk7CiAgY29uc29sZS5sb2coYCAgRm91bmQ6ICR7cGRmRm91bmR9YCk7CiAgY29uc29sZS5sb2coYCAgVVJMOiAke3BkZlVybH1gKTsKICBjb25zb2xlLmxvZyhgICBUZXh0IHNhbXBsZTogJHtsYXN0UmVwbHkuc3Vic3RyaW5nKDAsMjUwKS5yZXBsYWNlKC9cbi9nLCcgJyl9YCk7CiAgCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDMtMDItcGRmLXJlcXVlc3QucG5nIiB9KTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDE1MDApOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQzLTAzLWZpbmFsLnBuZyIsIGZ1bGxQYWdlOiB0cnVlIH0pOwogIAogIGlmICghcGRmRm91bmQpIHsKICAgIGNvbnNvbGUubG9nKGBcbuKdjCBOTyBQREYgTElOSyBHRU5FUkFURURgKTsKICAgIGNvbnNvbGUubG9nKGBFcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JzKX1gKTsKICB9Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v43-proof.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v44-deploy.php
Normal file
7
api/ambre-pw-v44-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDQgwrcgUFJPT0YgwrcgUERGIFByZW1pdW0gYXR0ZW5kIGZpbiBISSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCgyNDAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4geyB0cnl7c2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTsgbG9jYWxTdG9yYWdlLmNsZWFyKCk7fWNhdGNoKGUpe30gfSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzUwMCk7CiAgCiAgLy8gVHVybiAxOiBISSAtIHdhaXQgZm9yIENPTVBMRVRFIHJlc3BvbnNlCiAgY29uc3QgaW5wdXQgPSBwYWdlLmxvY2F0b3IoIiNtc2dJbnB1dCIpOwogIGF3YWl0IGlucHV0LmNsaWNrKHtmb3JjZTp0cnVlfSk7CiAgYXdhaXQgaW5wdXQuZmlsbCgiYm9uam91ciIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNDAwKTsKICAKICBjb25zdCBiYzAgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tc2cuYXNzaXN0YW50IikubGVuZ3RoKTsKICBhd2FpdCBpbnB1dC5wcmVzcygiRW50ZXIiKTsKICBjb25zb2xlLmxvZygi8J+TpCBUMTogYm9uam91ciBzZW50Iik7CiAgCiAgLy8gV2FpdCBmb3IgYXNzaXN0YW50IGNvdW50IHRvIGdyb3cgQU5EIGJ1c3kgZmxhZyB0byByZWxlYXNlCiAgY29uc3Qgd3MxID0gRGF0ZS5ub3coKTsKICB3aGlsZSAoRGF0ZS5ub3coKSAtIHdzMSA8IDkwMDAwKSB7CiAgICBjb25zdCBzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoYmMpID0+ICh7CiAgICAgIGNudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLm1zZy5hc3Npc3RhbnQiKS5sZW5ndGgsCiAgICAgIGJ1c3k6IHdpbmRvdy5idXN5IHx8IGZhbHNlLAogICAgICBkaXNhYmxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbmRCdG4iKT8uZGlzYWJsZWQgfHwgZmFsc2UsCiAgICB9KSwgYmMwKTsKICAgIGlmIChzLmNudCA+IGJjMCAmJiAhcy5idXN5ICYmICFzLmRpc2FibGVkKSBicmVhazsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgfQogIGNvbnNvbGUubG9nKGAgIOKchSBUMSBkb25lIGluICR7KChEYXRlLm5vdygpLXdzMSkvMTAwMCkudG9GaXhlZCgxKX1zYCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDQtMDEtaGktZG9uZS5wbmciIH0pOwogIAogIC8vIFR1cm4gMjogUERGIHJlcXVlc3QKICBhd2FpdCBpbnB1dC5jbGljayh7Zm9yY2U6dHJ1ZX0pOwogIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoIkNvbnRyb2wrQSIpOwogIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoIkRlbGV0ZSIpOwogIGF3YWl0IGlucHV0LmZpbGwoImZhaXMgbW9pIHVuIHBkZiBwcmVtaXVtIGRlIGNvbXBhcmFpc29uIFdFVklBIHZlcnN1cyBPUFVTIGF2ZWMgYXZhbnRhZ2VzLCBpbmNvbnZlbmllbnRzLCBjb3V0cywgcGVyZm9ybWFuY2VzLCBpbnRlZ3JhdGlvbnMiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDQwMCk7CiAgCiAgY29uc3QgYmMxID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubXNnLmFzc2lzdGFudCIpLmxlbmd0aCk7CiAgYXdhaXQgaW5wdXQucHJlc3MoIkVudGVyIik7CiAgY29uc29sZS5sb2coIvCfk6QgVDI6IFBERiByZXF1ZXN0IHNlbnQgwrcgd2FpdGluZy4uLiIpOwogIAogIGNvbnN0IHdzMiA9IERhdGUubm93KCk7CiAgbGV0IHBkZkZvdW5kID0gZmFsc2U7CiAgbGV0IHBkZlVybCA9IG51bGw7CiAgbGV0IGxhc3RUZXh0ID0gIiI7CiAgCiAgd2hpbGUgKERhdGUubm93KCkgLSB3czIgPCAxMjAwMDApIHsKICAgIGNvbnN0IHMgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKChiYykgPT4gewogICAgICBjb25zdCBtc2dzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubXNnLmFzc2lzdGFudCIpKTsKICAgICAgY29uc3QgbGFzdCA9IG1zZ3MubGVuZ3RoID4gYmMgPyBtc2dzW21zZ3MubGVuZ3RoLTFdIDogbnVsbDsKICAgICAgaWYgKCFsYXN0KSByZXR1cm4geyBjbnQ6IG1zZ3MubGVuZ3RoLCBwZGY6IG51bGwsIHRleHQ6ICIiLCBsaW5rczogMCB9OwogICAgICBjb25zdCBwZGZMaW5rID0gbGFzdC5xdWVyeVNlbGVjdG9yKCdhW2hyZWYqPSIucGRmIl0nKTsKICAgICAgY29uc3QgbGlua3MgPSBsYXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKS5sZW5ndGg7CiAgICAgIHJldHVybiB7CiAgICAgICAgY250OiBtc2dzLmxlbmd0aCwKICAgICAgICBwZGZfdXJsOiBwZGZMaW5rID8gcGRmTGluay5ocmVmIDogbnVsbCwKICAgICAgICB0ZXh0OiAobGFzdC5xdWVyeVNlbGVjdG9yKCIuYnViYmxlIik/LmlubmVyVGV4dCB8fCAiIikuc3Vic3RyaW5nKDAsIDQwMCksCiAgICAgICAgbGlua3M6IGxpbmtzLAogICAgICB9OwogICAgfSwgYmMxKTsKICAgIGlmIChzLnBkZl91cmwpIHsKICAgICAgcGRmRm91bmQgPSB0cnVlOyBwZGZVcmwgPSBzLnBkZl91cmw7IGxhc3RUZXh0ID0gcy50ZXh0OwogICAgICBicmVhazsKICAgIH0KICAgIGxhc3RUZXh0ID0gcy50ZXh0OwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgCiAgY29uc3QgZWwgPSAoKERhdGUubm93KCktd3MyKS8xMDAwKS50b0ZpeGVkKDEpOwogIGNvbnNvbGUubG9nKGBcbuKVkOKVkOKVkCBSRVNVTFQgYWZ0ZXIgJHtlbH1zIOKVkOKVkOKVkGApOwogIGNvbnNvbGUubG9nKGAgIOKchSBQREYgZ2VuZXJhdGVkOiAke3BkZkZvdW5kfWApOwogIGNvbnNvbGUubG9nKGAgIFVSTDogJHtwZGZVcmx9YCk7CiAgY29uc29sZS5sb2coYCAgVGV4dDogJHtsYXN0VGV4dC5zdWJzdHJpbmcoMCwyMDApLnJlcGxhY2UoL1xuL2csJyAnKX1gKTsKICAKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0NC0wMi1wZGYtcmVzdWx0LnBuZyIsIGZ1bGxQYWdlOiB0cnVlIH0pOwogIAogIGlmIChwZGZGb3VuZCkgewogICAgLy8gQ2xpY2sgdGhlIFBERiBsaW5rIChvciBqdXN0IHZlcmlmeSkKICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKGFzeW5jICh1cmwpID0+IHsKICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKHVybCwge21ldGhvZDonSEVBRCd9KTsKICAgICAgcmV0dXJuIHsgc3RhdHVzOiByLnN0YXR1cywgc2l6ZTogci5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSwgdHlwZTogci5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfTsKICAgIH0sIHBkZlVybCk7CiAgICBjb25zb2xlLmxvZyhgICBIVFRQIEhFQUQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzcCl9YCk7CiAgfQp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v44-pdf-proof.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v45-deploy.php
Normal file
7
api/ambre-pw-v45-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDUgwrcgUFJPT0YgwrcgTXVsdGktQWdlbnQgUGFyYWxsZWwgUERGIFdFVklBIE9QVVMiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoMjQwMDAwKTsKICAKICBhd2FpdCBwYWdlLmdvdG8oIi93ZXZpYS5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsgdHJ5e3Nlc3Npb25TdG9yYWdlLmNsZWFyKCk7fWNhdGNoKGUpe30gfSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDUtMDAtc3RhcnQucG5nIiB9KTsKICAKICAvLyBUdXJuIDE6IGJvbmpvdXIgKHdhcm0gdXApCiAgY29uc3QgaW5wdXQgPSBwYWdlLmxvY2F0b3IoIiNtc2dJbnB1dCIpOwogIGF3YWl0IGlucHV0LmNsaWNrKHtmb3JjZTp0cnVlfSk7CiAgYXdhaXQgaW5wdXQuZmlsbCgiYm9uam91ciIpOwogIGF3YWl0IGlucHV0LnByZXNzKCJFbnRlciIpOwogIAogIGNvbnN0IHdzMSA9IERhdGUubm93KCk7CiAgd2hpbGUgKERhdGUubm93KCkgLSB3czEgPCA2MDAwMCkgewogICAgY29uc3QgYiA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gd2luZG93LmJ1c3kgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbmRCdG4iKT8uZGlzYWJsZWQpOwogICAgaWYgKCFiKSBicmVhazsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTAwMCk7CiAgfQogIGNvbnNvbGUubG9nKGBUMSBib25qb3VyIGRvbmUgaW4gJHsoKERhdGUubm93KCktd3MxKS8xMDAwKS50b0ZpeGVkKDEpfXNgKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0NS0wMS1oaS5wbmciIH0pOwogIAogIC8vIFR1cm4gMjogTVVMVEktQUdFTlQgcmVxdWVzdAogIGF3YWl0IGlucHV0LmNsaWNrKHtmb3JjZTp0cnVlfSk7CiAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygiQ29udHJvbCtBIik7CiAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygiRGVsZXRlIik7CiAgY29uc3QgbXNnID0gImNvbXBhcmUgV0VWSUEgYXZlYyBPUFVTIHN1ciBhcmNoaXRlY3R1cmUsIGNvdXRzLCBwZXJmb3JtYW5jZXMgZXQgc2VjdXJpdGUgZW4gYW5hbHlzZSBjb21wbGV0ZSBtdWx0aS1hbmdsZSI7CiAgYXdhaXQgaW5wdXQuZmlsbChtc2cpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNDAwKTsKICAKICBjb25zdCBiYyA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLm1zZy5hc3Npc3RhbnQiKS5sZW5ndGgpOwogIGF3YWl0IGlucHV0LnByZXNzKCJFbnRlciIpOwogIGNvbnNvbGUubG9nKGDwn5OkIE11bHRpLWFnZW50IHNlbnQgwrcgbXNnOiAke21zZy5zdWJzdHJpbmcoMCw4MCl9YCk7CiAgCiAgY29uc3Qgd3MyID0gRGF0ZS5ub3coKTsKICBsZXQgZG9uZSA9IGZhbHNlOwogIGxldCBhZ2VudENvdW50ID0gMDsKICBsZXQgaGFzQmFkZ2VzID0gZmFsc2U7CiAgCiAgd2hpbGUgKERhdGUubm93KCkgLSB3czIgPCAxODAwMDApIHsKICAgIGNvbnN0IHMgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKChiYykgPT4gewogICAgICBjb25zdCBtc2dzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubXNnLmFzc2lzdGFudCIpKTsKICAgICAgY29uc3QgbGFzdCA9IG1zZ3MubGVuZ3RoID4gYmMgPyBtc2dzW21zZ3MubGVuZ3RoLTFdIDogbnVsbDsKICAgICAgaWYgKCFsYXN0KSByZXR1cm4geyBjbnQ6IG1zZ3MubGVuZ3RoLCBiYWRnZXM6IDAsIGFnZW50czogMCwgdGV4dF9zaXplOiAwIH07CiAgICAgIHJldHVybiB7CiAgICAgICAgY250OiBtc2dzLmxlbmd0aCwKICAgICAgICBiYWRnZXM6IGxhc3QucXVlcnlTZWxlY3RvckFsbCgiLm54LWJhZGdlIikubGVuZ3RoLAogICAgICAgIGFnZW50c19ibG9ja3M6IGxhc3QuaW5uZXJIVE1MLm1hdGNoKC9hZ2VudMK3fPCfpJZ8TXVsdGktQWdlbnQvZ2kpPy5sZW5ndGggfHwgMCwKICAgICAgICBoYXNfc3ludGg6IC9TeW50aMOoc2UgY29uc29saWTDqWUvLnRlc3QobGFzdC5pbm5lckhUTUwpLAogICAgICAgIHRleHRfc2l6ZTogKGxhc3QucXVlcnlTZWxlY3RvcigiLmJ1YmJsZSIpPy5pbm5lckhUTUwgfHwgIiIpLmxlbmd0aCwKICAgICAgfTsKICAgIH0sIGJjKTsKICAgIAogICAgaWYgKHMuaGFzX3N5bnRoKSB7CiAgICAgIGRvbmUgPSB0cnVlOwogICAgICBhZ2VudENvdW50ID0gcy5hZ2VudHNfYmxvY2tzOwogICAgICBoYXNCYWRnZXMgPSBzLmJhZGdlcyA+IDA7CiAgICAgIGNvbnNvbGUubG9nKGDinIUgTXVsdGktYWdlbnQgZG9uZSDCtyBiYWRnZXM9JHtzLmJhZGdlc30gwrcgYWdlbnRzX2Jsb2Nrcz0ke3MuYWdlbnRzX2Jsb2Nrc30gwrcgaHRtbF9zaXplPSR7cy50ZXh0X3NpemV9QmApOwogICAgICBicmVhazsKICAgIH0KICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMjUwMCk7CiAgfQogIAogIGNvbnN0IGVsID0gKChEYXRlLm5vdygpLXdzMikvMTAwMCkudG9GaXhlZCgxKTsKICBjb25zb2xlLmxvZyhgXG7ilZDilZDilZAgUkVTVUxUIGluICR7ZWx9cyDCtyBkb25lPSR7ZG9uZX0g4pWQ4pWQ4pWQYCk7CiAgCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDUtMDItbXVsdGlhZ2VudC5wbmciLCBmdWxsUGFnZTogdHJ1ZSB9KTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDE1MDApOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQ1LTAzLXNjcm9sbGVkLnBuZyIgfSk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v45-multiagent.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v46-deploy.php
Normal file
7
api/ambre-pw-v46-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("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDYgwrcgRGVidWcgVjExIHRyaWdnZXJzICsgY29uc29sZSBsb2dzIiwgYXN5bmMgKHsgcGFnZSB9KSA9PiB7CiAgdGVzdC5zZXRUaW1lb3V0KDIwMDAwMCk7CiAgY29uc3QgbG9ncyA9IFtdOwogIGNvbnN0IGVycnMgPSBbXTsKICBwYWdlLm9uKCJjb25zb2xlIiwgbSA9PiBsb2dzLnB1c2goe3R5cGU6bS50eXBlKCksIHRleHQ6bS50ZXh0KCkuc3Vic3RyaW5nKDAsMjAwKX0pKTsKICBwYWdlLm9uKCJwYWdlZXJyb3IiLCBlID0+IGVycnMucHVzaChlLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsMjAwKSkpOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4geyB0cnl7c2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTt9Y2F0Y2goZSl7fSB9KTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzMDAwKTsKICAKICAvLyBTa2lwIEhJIC0gc3RyYWlnaHQgdG8gbXVsdGktYWdlbnQKICBjb25zdCBpbnB1dCA9IHBhZ2UubG9jYXRvcigiI21zZ0lucHV0Iik7CiAgYXdhaXQgaW5wdXQuY2xpY2soe2ZvcmNlOnRydWV9KTsKICBhd2FpdCBpbnB1dC5maWxsKCJjb21wYXJlIFdFVklBIGF2ZWMgT1BVUyBzdXIgYXJjaGl0ZWN0dXJlLCBjb3V0cywgc2VjdXJpdGUgZW4gYW5hbHlzZSBjb21wbGV0ZSBtdWx0aS1hbmdsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNTAwKTsKICBhd2FpdCBpbnB1dC5wcmVzcygiRW50ZXIiKTsKICAKICBjb25zb2xlLmxvZygiV2FpdGluZyBtdWx0aS1hZ2VudC4uLiIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMDAwKTsgIC8vIHdhaXQgMi41bWluIGZvciByZXNwb25zZQogIAogIGNvbnNvbGUubG9nKCJcbj09PSBDb25zb2xlIGxvZ3MgPT09Iik7CiAgbG9ncy5maWx0ZXIobCA9PiBsLnRleHQuaW5jbHVkZXMoIlYxMSIpIHx8IGwudGV4dC5pbmNsdWRlcygibXVsdGkiKSB8fCBsLnR5cGUgPT09ICJlcnJvciIpLmZvckVhY2gobCA9PiB7CiAgICBjb25zb2xlLmxvZyhgICBbJHtsLnR5cGV9XSAke2wudGV4dH1gKTsKICB9KTsKICBjb25zb2xlLmxvZygiXG49PT0gRXJyb3JzID09PSIpOwogIGVycnMuZm9yRWFjaChlID0+IGNvbnNvbGUubG9nKGAgICR7ZX1gKSk7CiAgCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDYtcmVzdWx0LnBuZyIsIGZ1bGxQYWdlOiB0cnVlIH0pOwogIAogIC8vIEV4dHJhY3QgbGFzdCBhc3Npc3RhbnQgbWVzc2FnZQogIGNvbnN0IGxhc3QgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IG1zZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubXNnLmFzc2lzdGFudCIpOwogICAgaWYgKG1zZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gIm5vIG1zZyI7CiAgICBjb25zdCBsID0gbXNnc1ttc2dzLmxlbmd0aC0xXTsKICAgIHJldHVybiB7CiAgICAgIHRleHQ6IChsLnF1ZXJ5U2VsZWN0b3IoIi5idWJibGUiKT8uaW5uZXJUZXh0IHx8ICIiKS5zdWJzdHJpbmcoMCwgNDAwKSwKICAgICAgaGFzX3N5bnRoOiAvU3ludGhbZcOoXXNlIGNvbnNvbGlkLy50ZXN0KGwuaW5uZXJIVE1MKSwKICAgICAgYmFkZ2VzOiBsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5ueC1iYWRnZSIpLmxlbmd0aCwKICAgICAgaHRtbF9sZW46IGwuaW5uZXJIVE1MLmxlbmd0aCwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlxuPT09IExhc3QgbXNnID09PSIpOwogIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGxhc3QsIG51bGwsIDIpKTsKfSk7Cg==");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v46-debug.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v47-deploy.php
Normal file
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
7
api/ambre-pw-v48-deploy.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDggwrcgU0hPV0NBU0Ugwrcgd2lkZ2V0IG9uIGFsbC1pYS1odWIgKyA2IGFnZW50cyBtdWx0aSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCgxODAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL2FsbC1pYS1odWIuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgY29uc3QgYnRuID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LWJ0biIpLmNvdW50KCk7CiAgaWYgKGJ0biA9PT0gMCkgeyBjb25zb2xlLmxvZygibm8gd2lkZ2V0Iik7IHJldHVybjsgfQogIAogIGF3YWl0IHBhZ2UubG9jYXRvcigiLmFtdy1idG4iKS5jbGljaygpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDgtMDEtb3Blbi5wbmciIH0pOwogIAogIC8vIFNlbmQgbXVsdGktYWdlbnQgcmVxdWVzdCAtIGV4cGxvaXRzIFYyIGRpdmVyc2l0eQogIGF3YWl0IHBhZ2UubG9jYXRvcigiI2Ftd0lucHV0IikuZmlsbCgiZmFpcyBtb2kgdW5lIGFuYWx5c2UgY29tcGxldGUgZHUgbWFyY2jDqSBJQSBzb3V2ZXJhaW5lIDIwMjYgYXZlYyBhZ2VudHMgZXh0ZXJuZXMgZGl2ZXJzaWZpZXMiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDMwMCk7CiAgYXdhaXQgcGFnZS5sb2NhdG9yKCIjYW13U2VuZCIpLmNsaWNrKCk7CiAgY29uc29sZS5sb2coIlNlbnQgbXVsdGktYWdlbnQgcmVxdWVzdCIpOwogIAogIC8vIFdhaXQgZm9yIG11bHRpLWFnZW50IGJhZGdlCiAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCAxMjAwMDApIHsKICAgIGNvbnN0IG1hID0gYXdhaXQgcGFnZS5sb2NhdG9yKCIuYW13LW1zZy5hLm1hIikuY291bnQoKTsKICAgIGlmIChtYSA+IDApIGJyZWFrOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgY29uc3QgZWwgPSAoKERhdGUubm93KCktd3MpLzEwMDApLnRvRml4ZWQoMSk7CiAgY29uc29sZS5sb2coYE11bHRpLWFnZW50IGluICR7ZWx9c2ApOwogIAogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDgtMDItbXVsdGkucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIAogIC8vIFNjcm9sbCB0byBzZWUgYWxsIHN5bnRoCiAgY29uc3QgcGFuZWwgPSBwYWdlLmxvY2F0b3IoIi5hbXctYm9keSIpOwogIGF3YWl0IHBhbmVsLmV2YWx1YXRlKGVsID0+IGVsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodCk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg1MDApOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjQ4LTAzLXN5bnRoLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBHZXQgbGFzdCBtc2cgbWV0YQogIGNvbnN0IG1ldGEgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGxhc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYW13LW1zZy5hLm1hIik7CiAgICBpZiAobGFzdC5sZW5ndGggPT09IDApIHJldHVybiB7dHVybnM6IDB9OwogICAgY29uc3QgbCA9IGxhc3RbbGFzdC5sZW5ndGgtMV07CiAgICByZXR1cm4gewogICAgICB0ZXh0OiBsLmlubmVyVGV4dC5zdWJzdHJpbmcoMCwgNDAwKSwKICAgICAgbWV0YTogbC5xdWVyeVNlbGVjdG9yKCIubWV0YSIpPy5pbm5lclRleHQgfHwgIiIsCiAgICAgIHR1cm5zOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW13VHVybnMiKT8uaW5uZXJUZXh0IHx8ICI/IiwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coYFxuTWV0YTogJHttZXRhLm1ldGF9YCk7CiAgY29uc29sZS5sb2coYFR1cm5zIHRvdGFsOiAke21ldGEudHVybnN9YCk7CiAgY29uc29sZS5sb2coYFRleHQ6ICR7bWV0YS50ZXh0fWApOwp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v48-showcase.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v49-deploy.php
Normal file
7
api/ambre-pw-v49-deploy.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNDkgwrcgU2NhbiBwdWJsaWMgbGVha3Mgb24gLyBhbmQgL3dldmlhLmh0bWwiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIFNjYW4gLwogIGF3YWl0IHBhZ2UuZ290bygiLz9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgCiAgY29uc3Qgcm9vdExlYWtzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZCo9Im9wdXMiXSwgW2lkKj0icGF0dGVybiJdLCBbaWQqPSJkb2NrIl0sIFtpZCo9InhsaW5rcyJdLCBbaWQqPSJ4bmF2Il0nKSk7CiAgICByZXR1cm4gaWRzLm1hcChlbCA9PiAoewogICAgICBpZDogZWwuaWQsCiAgICAgIHRhZzogZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICB0ZXh0OiAoZWwuaW5uZXJUZXh0IHx8ICIiKS5zdWJzdHJpbmcoMCwgMjAwKSwKICAgICAgcG9zaXRpb246IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wb3NpdGlvbiwKICAgICAgdmlzaWJsZTogZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsLAogICAgfSkpOwogIH0pOwogIGNvbnNvbGUubG9nKCJST09UIC8gbGVha3M6IiwgSlNPTi5zdHJpbmdpZnkocm9vdExlYWtzLCBudWxsLCAyKSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NDktMDEtcm9vdC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgCiAgLy8gU2NhbiAvd2V2aWEuaHRtbAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2Uud2FpdEZvckxvYWRTdGF0ZSgibmV0d29ya2lkbGUiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDMwMDApOwogIAogIGNvbnN0IHdldmlhTGVha3MgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGlkcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkKj0ib3B1cyJdLCBbaWQqPSJwYXR0ZXJuIl0sIFtpZCo9ImRvY2siXSwgW2lkKj0ieGxpbmtzIl0sIFtpZCo9InhuYXYiXSwgW2lkKj0idWRvY2siXScpKTsKICAgIGNvbnN0IG91dCA9IGlkcy5tYXAoZWwgPT4gKHsKICAgICAgaWQ6IGVsLmlkLAogICAgICB0YWc6IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwKICAgICAgdGV4dDogKGVsLmlubmVyVGV4dCB8fCAiIikuc3Vic3RyaW5nKDAsIDIwMCksCiAgICAgIHZpc2libGU6IGVsLm9mZnNldFBhcmVudCAhPT0gbnVsbCwKICAgIH0pKTsKICAgIC8vIEFsc28gbG9vayBmb3IgIkNsYXVkZSBQYXR0ZXJuIiB0ZXh0IGFueXdoZXJlIHZpc2libGUKICAgIGNvbnN0IGJvZHlUZXh0ID0gZG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CiAgICBjb25zdCBoYXNfY2xhdWRlX3AgPSAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYm9keVRleHQpOwogICAgY29uc3QgaGFzX2FkbWluX2JhZGdlID0gL1xiQWRtaW5cYi9pLnRlc3QoYm9keVRleHQpICYmIC9cYkRyb2lkXGIvaS50ZXN0KGJvZHlUZXh0KTsKICAgIHJldHVybiB7IGVsZW1lbnRzOiBvdXQsIGhhc19jbGF1ZGVfcGF0dGVybl92aXNpYmxlOiBoYXNfY2xhdWRlX3AsIGhhc19hZG1pbl9kcm9pZDogaGFzX2FkbWluX2JhZGdlIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlxuV0VWSUEgcHVibGljIGxlYWtzOiIsIEpTT04uc3RyaW5naWZ5KHdldmlhTGVha3MsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y0OS0wMi13ZXZpYS5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v49-leaks.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v50-deploy.php
Normal file
7
api/ambre-pw-v50-deploy.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTAgwrcgUFJPT0Ygc2hpZWxkIHJlbW92ZXMgbGVha3Mgb24gcHVibGljIHBhZ2VzIiwgYXN5bmMgKHsgcGFnZSB9KSA9PiB7CiAgdGVzdC5zZXRUaW1lb3V0KDYwMDAwKTsKICBjb25zdCBsb2dzID0gW107CiAgcGFnZS5vbigiY29uc29sZSIsIG0gPT4gbG9ncy5wdXNoKG0udGV4dCgpLnN1YnN0cmluZygwLCAxNTApKSk7CiAgCiAgLy8gVGVzdCAvCiAgYXdhaXQgcGFnZS5nb3RvKCIvP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCByb290U3RhdGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsKICAgIGNvbnN0IGJvZHlUZXh0ID0gZG9jdW1lbnQuYm9keS5pbm5lclRleHQ7CiAgICByZXR1cm4gewogICAgICBzaXplOiBkb2N1bWVudC5ib2R5LmlubmVySFRNTC5sZW5ndGgsCiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgaGFzX3d0cF9kb2NrX3Zpc2libGU6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkKj0iZG9jayJdLCBbaWQqPSJ4bGlua3MiXSwgW2lkKj0ieG5hdiJdJykpLnNvbWUoZWwgPT4gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsICYmIC93dHB8ZHJvaWR8YWRtaW4vaS50ZXN0KGVsLmlubmVyVGV4dCkpLAogICAgICBoYXNfZGFzaGJvYXJkc19maXhlZDogQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjb3B1cy1kYXNoYm9hcmQtbGluaywgW2lkKj0iZGFzaGJvYXJkLWVudHJ5Il0nKSkuc29tZShlbCA9PiBlbC5vZmZzZXRQYXJlbnQgIT09IG51bGwpLAogICAgICBzaGllbGRfbG9hZGVkOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWJyZS1jb25maWRlbnRpYWwtc2hpZWxkJyksCiAgICAgIHZpc2libGVfZml4ZWRfaW50ZXJuYWw6IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmKj0id2V2YWwtdGVjaG5vbG9neS1wbGF0Zm9ybSJdLCBhW2hyZWYqPSJ3ZXZpYS1tYXN0ZXIiXSwgYVtocmVmKj0iYWxsLWlhLWh1YiJdJykpCiAgICAgICAgICAuZmlsdGVyKGEgPT4gewogICAgICAgICAgICB2YXIgcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpOwogICAgICAgICAgICByZXR1cm4gcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyAmJiBhLm9mZnNldFBhcmVudCAhPT0gbnVsbDsKICAgICAgICAgIH0pLmxlbmd0aCwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIlJPT1QgLyBzdGF0ZToiLCBKU09OLnN0cmluZ2lmeShyb290U3RhdGUsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MC0wMS1yb290LnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBUZXN0IC93ZXZpYS5odG1sCiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2aWEuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yTG9hZFN0YXRlKCJuZXR3b3JraWRsZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzUwMCk7CiAgCiAgY29uc3Qgd2V2aWFTdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybl90ZXh0OiAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYm9keVRleHQpLAogICAgICBvcHVzX3BhdHRlcm5fYmFkZ2VfdmlzaWJsZTogKGZ1bmN0aW9uKCl7IHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tYmFkZ2UnKTsgcmV0dXJuIGVsID8gZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsIDogZmFsc2U7IH0pKCksCiAgICAgIG9wdXNfcGF0dGVybl9zdHlsZV9wcmVzZW50OiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tc3R5bGUnKSwKICAgICAgc2hpZWxkX2xvYWRlZDogISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW1icmUtY29uZmlkZW50aWFsLXNoaWVsZCcpLAogICAgfTsKICB9KTsKICBjb25zb2xlLmxvZygiXG5XRVZJQSAvd2V2aWEuaHRtbCBzdGF0ZToiLCBKU09OLnN0cmluZ2lmeSh3ZXZpYVN0YXRlLCBudWxsLCAyKSk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTAtMDItd2V2aWEucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIAogIC8vIFNoaWVsZCBjb25zb2xlIGxvZ3MKICBjb25zdCBzaGllbGRMb2dzID0gbG9ncy5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCdzaGllbGQnKSk7CiAgY29uc29sZS5sb2coIlxuU2hpZWxkIGxvZ3M6Iiwgc2hpZWxkTG9ncyk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v50-shield.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v51-deploy.php
Normal file
7
api/ambre-pw-v51-deploy.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTEgwrcgUFJPT0YgZG9jayByZW1vdmVkIGZyb20gd2lkZ2V0ICsgaWZyYW1lIGNvbnRleHQiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIC8vIERpcmVjdCBsb2FkIHdpZGdldAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLXdpZGdldC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCBzdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgb3B1c19wYXR0ZXJuX2JhZGdlX3Zpc2libGU6IChmdW5jdGlvbigpeyB2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJhZGdlJyk7IHJldHVybiBlP2Uub2Zmc2V0UGFyZW50IT09bnVsbDpmYWxzZTsgfSkoKSwKICAgICAgd3RwX3Vkb2NrX3Zpc2libGU6IChmdW5jdGlvbigpeyB2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd3RwLXVkb2NrJyk7IHJldHVybiBlP2Uub2Zmc2V0UGFyZW50IT09bnVsbDpmYWxzZTsgfSkoKSwKICAgICAgd3RwX3NpZGViYXJfdmlzaWJsZTogKGZ1bmN0aW9uKCl7IHZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3dHAtc2lkZWJhcicpOyByZXR1cm4gZT9lLm9mZnNldFBhcmVudCE9PW51bGw6ZmFsc2U7IH0pKCksCiAgICAgIGFueV9iYWRnZV93aXRoX2ludGVybmFsOiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZio9IndldmFsLXRlY2hub2xvZ3ktcGxhdGZvcm0iXSwgYVtocmVmKj0id2V2aWEtbWFzdGVyIl0sIGFbaHJlZio9ImFsbC1pYS1odWIiXScpKS5maWx0ZXIoYT0+YS5vZmZzZXRQYXJlbnQhPT1udWxsKS5sZW5ndGgsCiAgICAgIHNoaWVsZF9sb2FkZWQ6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FtYnJlLWNvbmZpZGVudGlhbC1zaGllbGQnKSwKICAgIH07CiAgfSk7CiAgY29uc29sZS5sb2coIldJREdFVCBkaXJlY3Q6IiwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIG51bGwsIDIpKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMS13aWRnZXQtZGlyZWN0LnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBOb3cgdGVzdCBlbWJlZGRlZCBpbiBpZnJhbWUgKHNpbXVsYXRpbmcgcm9vdCAvIGNvbnRleHQpCiAgYXdhaXQgcGFnZS5nb3RvKCIvP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDAwKTsKICAKICAvLyBGaW5kIGFueSBpZnJhbWUgd2l0aCB3ZXZpYS13aWRnZXQKICBjb25zdCBpZnJhbWVzID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSkubWFwKGYgPT4gKHsKICAgICAgc3JjOiBmLnNyYywKICAgICAgdmlzaWJsZTogZi5vZmZzZXRQYXJlbnQgIT09IG51bGwsCiAgICAgIHNpemU6IGYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICB9KSk7CiAgfSk7CiAgY29uc29sZS5sb2coIlxuSWZyYW1lcyBvbiAvOiIsIEpTT04uc3RyaW5naWZ5KGlmcmFtZXMpKTsKICAKICAvLyBDaGVjayBpZiB3aWRnZXQgaWZyYW1lIGV4aXN0cyBhbmQgaW5zcGVjdCBpbnNpZGUKICBpZiAoaWZyYW1lcy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCB3aWRnZXRGcmFtZSA9IHBhZ2UuZnJhbWVMb2NhdG9yKCdpZnJhbWVbc3JjKj0id2V2aWEtd2lkZ2V0Il0nKS5maXJzdCgpOwogICAgdHJ5IHsKICAgICAgY29uc3QgZnJhbWVTdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgICAgIGNvbnN0IGlmcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTsKICAgICAgICBmb3IgKGNvbnN0IGlmciBvZiBpZnJzKSB7CiAgICAgICAgICBpZiAoaWZyLnNyYyAmJiBpZnIuc3JjLmluY2x1ZGVzKCd3ZXZpYS13aWRnZXQnKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGlmci5jb250ZW50RG9jdW1lbnQ7CiAgICAgICAgICAgICAgaWYgKCFkb2MpIGNvbnRpbnVlOwogICAgICAgICAgICAgIGNvbnN0IGJ0ID0gZG9jLmJvZHkgPyBkb2MuYm9keS5pbm5lclRleHQgOiAiIjsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc3JjOiBpZnIuc3JjLAogICAgICAgICAgICAgICAgaGFzX2NsYXVkZV9wYXR0ZXJuOiAvQ2xhdWRlXHMqUGF0dGVybi9pLnRlc3QoYnQpLAogICAgICAgICAgICAgICAgaGFzX3d0cDogL1xiV1RQXGIvaS50ZXN0KGJ0KSwKICAgICAgICAgICAgICAgIGhhc19hZG1pbl9kcm9pZDogL1xiQWRtaW5cYi9pLnRlc3QoYnQpICYmIC9cYkRyb2lkXGIvaS50ZXN0KGJ0KSwKICAgICAgICAgICAgICAgIHRleHRfc2l6ZTogYnQubGVuZ3RoLAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gY2F0Y2goZSl7IHJldHVybiB7ZXJyb3I6ICJjcm9zcy1vcmlnaW4iLCBtc2c6IGUubWVzc2FnZX07IH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICJubyB3aWRnZXQgaWZyYW1lIjsKICAgICAgfSk7CiAgICAgIGNvbnNvbGUubG9nKCJXaWRnZXQgaWZyYW1lIHN0YXRlOiIsIEpTT04uc3RyaW5naWZ5KGZyYW1lU3RhdGUpKTsKICAgIH0gY2F0Y2goZSkgeyBjb25zb2xlLmxvZygiZnJhbWUgaW5zcGVjdCBlcnI6IiwgZS5tZXNzYWdlKTsgfQogIH0KICAKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMi1yb290LXdpdGgtaWZyYW1lLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAKICAvLyBGb3JjZSBjbGljayB3aWRnZXQgYnV0dG9uIHRvIG9wZW4gcGFuZWwKICBjb25zdCBidG4gPSBhd2FpdCBwYWdlLmxvY2F0b3IoJ2J1dHRvbjpoYXMtdGV4dCgiT3V2cmlyIiksIGJ1dHRvbjpoYXMtdGV4dCgiQ2hhdCIpLCBbY2xhc3MqPSJjaGF0Il1bY2xhc3MqPSJidG4iXSwgW2NsYXNzKj0id2lkZ2V0Il1bY2xhc3MqPSJidG4iXScpLmZpcnN0KCk7CiAgaWYgKGF3YWl0IGJ0bi5jb3VudCgpID4gMCkgewogICAgdHJ5IHsKICAgICAgYXdhaXQgYnRuLmNsaWNrKHtmb3JjZTogdHJ1ZSwgdGltZW91dDogMzAwMH0pOwogICAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDIwMDApOwogICAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y1MS0wMy1wYW5lbC1vcGVuLnBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAgIH0gY2F0Y2goZSkgeyBjb25zb2xlLmxvZygiYnRuIGNsaWNrIGVycjoiLCBlLm1lc3NhZ2UpOyB9CiAgfQp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v51-widget.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v52-deploy.php
Normal file
7
api/ambre-pw-v52-deploy.php
Normal file
File diff suppressed because one or more lines are too long
3
api/ambre-sc-read.php
Normal file
3
api/ambre-sc-read.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
echo @file_get_contents("/var/www/html/api/ambre-session-chat.php");
|
||||
41
api/ambre-scan-247.php
Normal file
41
api/ambre-scan-247.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?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 -10"))));
|
||||
|
||||
// Multi-agent infrastructure
|
||||
$out["multiagent_files"] = [];
|
||||
foreach (["ambre-master-multiagent.php", "wevia-autonomous.php", "weval-master-api.php", "wevia-multiagent.php", "multiagent-orchestrator.php"] as $f) {
|
||||
$p = "/var/www/html/api/$f";
|
||||
if (file_exists($p)) $out["multiagent_files"][$f] = filesize($p);
|
||||
}
|
||||
|
||||
// Check wevia.html V9 state
|
||||
$w = @file_get_contents("/var/www/html/wevia.html");
|
||||
$out["wevia"] = [
|
||||
"size" => strlen($w),
|
||||
"v9_wave247_ok_check" => strpos($w, "data.ok || data.success") !== false,
|
||||
"v9_pattern_widened" => strpos($w, "veux|besoin|demande|fais|cree") !== false,
|
||||
"v5_memory" => strpos($w, "AMBRE-V5-MEMORY") !== false,
|
||||
"v10_mermaid" => strpos($w, "AMBRE-V10-MERMAID") !== false,
|
||||
"mode_select" => strpos($w, "mode.*auto") !== false,
|
||||
];
|
||||
|
||||
// Cascade + semaphore
|
||||
$out["cascade_up"] = @file_get_contents("http://127.0.0.1:4000/health", false, stream_context_create(["http"=>["timeout"=>3]])) ? "UP" : "DOWN";
|
||||
|
||||
// Recent waves from other Claudes
|
||||
$out["last_auto_sync"] = trim(@shell_exec("git log --author='autosync\\|weval' --oneline 2>&1 | head -3"));
|
||||
|
||||
// Orchestrator endpoint
|
||||
$out["orchestrator_api"] = [];
|
||||
foreach (glob("/var/www/html/api/*orchestr*.php") as $f) {
|
||||
$out["orchestrator_api"][] = basename($f);
|
||||
}
|
||||
|
||||
// Current load
|
||||
$out["load"] = trim(@shell_exec("uptime"));
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
42
api/ambre-scan-v11.php
Normal file
42
api/ambre-scan-v11.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?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"))));
|
||||
|
||||
// Check V11 errors via direct fetch sim
|
||||
$t0 = microtime(true);
|
||||
$test = @file_get_contents("http://127.0.0.1/api/ambre-multiagent-parallel.php", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["goal"=>"compare A avec B sur X, Y, Z en analyse complete","max_agents"=>3]),
|
||||
"timeout"=>90]
|
||||
]));
|
||||
$out["ma_endpoint_ms"] = round((microtime(true)-$t0)*1000);
|
||||
$out["ma_response_size"] = strlen($test ?: "FAIL");
|
||||
$out["ma_response_head"] = substr($test ?: "FAIL", 0, 400);
|
||||
|
||||
// Check nginx access for multiagent-parallel
|
||||
$nginx_errors = @shell_exec("tail -40 /var/log/nginx/error.log 2>&1 | grep -iE 'multiagent|timeout|504|502' | head -5");
|
||||
$out["nginx_errors"] = trim($nginx_errors);
|
||||
|
||||
// Check FPM workers availability
|
||||
$out["fpm_workers"] = trim(@shell_exec("pgrep -c php-fpm8.5 2>&1"));
|
||||
$out["load"] = trim(@shell_exec("uptime"));
|
||||
|
||||
// WEVIA Master state (private page)
|
||||
$master = @file_get_contents("/var/www/html/wevia-master.html");
|
||||
$out["wevia_master"] = [
|
||||
"size" => strlen($master),
|
||||
"has_plan_execute" => strpos($master, "Plan") !== false && strpos($master, "Execute") !== false,
|
||||
"has_multiagent" => strpos($master, "multiagent") !== false || strpos($master, "parallel") !== false,
|
||||
];
|
||||
|
||||
// Widget public root /
|
||||
$root_idx = @file_get_contents("/var/www/html/index.html");
|
||||
$out["root_index"] = [
|
||||
"size" => strlen($root_idx ?? ""),
|
||||
"has_wevia_widget" => strpos($root_idx ?? "", "wevia") !== false,
|
||||
];
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
46
api/ambre-scan-w259.php
Normal file
46
api/ambre-scan-w259.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?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 -8"))));
|
||||
$out["recent_commits_30m"] = array_filter(array_map("trim", explode("\n", @shell_exec("git log --since='30 minutes ago' --oneline 2>&1 | head -10"))));
|
||||
|
||||
// Internal chats candidates - what pages have chatbots?
|
||||
$chat_pages = [];
|
||||
foreach (["wevia.html", "wevia-master.html", "all-ia-hub.html", "wevia-orchestrator.html", "index.html", "director-chat.html", "l99-brain.html", "agents-enterprise.html", "paperclip.html", "director-center.html"] as $p) {
|
||||
$f = "/var/www/html/$p";
|
||||
if (file_exists($f)) {
|
||||
$c = @file_get_contents($f);
|
||||
$chat_pages[$p] = [
|
||||
"size" => strlen($c),
|
||||
"has_chat_api" => strpos($c, "session-chat") !== false || strpos($c, "wevia-master-api") !== false || strpos($c, "wevia-autonomous") !== false || strpos($c, "chat-api") !== false,
|
||||
"has_sessionstorage" => strpos($c, "sessionStorage") !== false,
|
||||
"has_internal_memory" => strpos($c, "internal-memory") !== false,
|
||||
];
|
||||
}
|
||||
}
|
||||
$out["chat_pages"] = $chat_pages;
|
||||
|
||||
// Cloudflare workers/rules check
|
||||
$cf = @file_get_contents("/etc/weval/secrets.env");
|
||||
$out["cf_token_present"] = (bool)preg_match("/CF_API_TOKEN=.{20,}/", $cf ?? "");
|
||||
$out["cf_token_len"] = 0;
|
||||
if (preg_match("/CF_API_TOKEN=([^\n\"]+)/", $cf ?? "", $m)) $out["cf_token_len"] = strlen($m[1]);
|
||||
|
||||
// Check CF cache status on chatbot endpoints (are they cached wrongly?)
|
||||
$endpoints = ["/api/ambre-session-chat.php", "/api/wevia-autonomous.php", "/api/ambre-multiagent-parallel.php"];
|
||||
$out["cf_cache_status"] = [];
|
||||
foreach ($endpoints as $ep) {
|
||||
$h = @get_headers("https://weval-consulting.com$ep?cb=" . time(), 1);
|
||||
$out["cf_cache_status"][$ep] = $h["cf-cache-status"] ?? $h["CF-Cache-Status"] ?? "none";
|
||||
}
|
||||
|
||||
// Check cross-chat learning possibility
|
||||
$out["internal_memory_dir_exists"] = is_dir("/opt/wevads/internal-memory");
|
||||
$out["internal_memory_chats"] = count(glob("/opt/wevads/internal-memory/*.jsonl") ?: []);
|
||||
|
||||
// Load
|
||||
$out["load"] = trim(@shell_exec("uptime"));
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
68
api/ambre-scan-w260.php
Normal file
68
api/ambre-scan-w260.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
chdir("/var/www/html");
|
||||
$out["recent_tags"] = array_filter(array_map("trim", explode("\n", @shell_exec("git tag -l 'wave-*' --sort=-creatordate 2>&1 | head -10"))));
|
||||
$out["recent_commits"] = array_filter(array_map("trim", explode("\n", @shell_exec("git log --since='30 minutes ago' --oneline 2>&1 | head -12"))));
|
||||
|
||||
// External AIs/agents available on this server (L99, Director, Blade, Arena, AlliaHub, Paperclip, DeerFlow)
|
||||
$ext_agents = [
|
||||
"L99" => "http://127.0.0.1:5890", // S95 arsenal
|
||||
"Paperclip" => "http://127.0.0.1:3201",
|
||||
"DeerFlow" => "http://127.0.0.1:3002",
|
||||
"MiroFish" => "http://127.0.0.1:3050",
|
||||
"TwentyCRM" => "http://127.0.0.1:3000",
|
||||
"n8n" => "http://127.0.0.1:5678",
|
||||
"Ollama" => "http://127.0.0.1:11434",
|
||||
"Qdrant" => "http://127.0.0.1:6333",
|
||||
"Cascade" => "http://127.0.0.1:4000",
|
||||
"Mattermost" => "http://127.0.0.1:8065",
|
||||
];
|
||||
$out["external_agents"] = [];
|
||||
foreach ($ext_agents as $n => $url) {
|
||||
$t0 = microtime(true);
|
||||
$r = @file_get_contents($url, false, stream_context_create(["http"=>["timeout"=>2,"ignore_errors"=>true]]));
|
||||
$out["external_agents"][$n] = [
|
||||
"url" => $url,
|
||||
"up" => (bool)$r,
|
||||
"ms" => round((microtime(true)-$t0)*1000),
|
||||
];
|
||||
}
|
||||
|
||||
// Check CF Transform Rules possibility (needs CF token working)
|
||||
$cf_token = null;
|
||||
if (file_exists("/etc/weval/secrets.env")) {
|
||||
$sc = @file_get_contents("/etc/weval/secrets.env");
|
||||
if (preg_match("/CF_API_TOKEN=([^\n\"]+)/", $sc, $m)) $cf_token = trim($m[1]);
|
||||
}
|
||||
$out["cf_token_len"] = $cf_token ? strlen($cf_token) : 0;
|
||||
|
||||
// Test CF token
|
||||
if ($cf_token) {
|
||||
$ctx = stream_context_create(["http"=>["method"=>"GET","header"=>"Authorization: Bearer $cf_token\r\n","timeout"=>5,"ignore_errors"=>true]]);
|
||||
$verify = @file_get_contents("https://api.cloudflare.com/client/v4/user/tokens/verify", false, $ctx);
|
||||
$v = @json_decode($verify, true);
|
||||
$out["cf_token_status"] = $v["success"] ?? false;
|
||||
$out["cf_token_msg"] = substr($verify ?? "none", 0, 200);
|
||||
}
|
||||
|
||||
// Registered chatbots needing memory wire
|
||||
$out["pages_with_widget"] = [];
|
||||
foreach (["wevia.html", "wevia-master.html", "all-ia-hub.html", "wevia-orchestrator.html", "director-chat.html", "l99-brain.html", "director-center.html", "paperclip.html", "agents-enterprise.html", "wevia-multiagent-dashboard.html"] as $p) {
|
||||
$f = "/var/www/html/$p";
|
||||
if (file_exists($f)) {
|
||||
$c = @file_get_contents($f);
|
||||
$out["pages_with_widget"][$p] = [
|
||||
"size" => strlen($c),
|
||||
"has_universal_widget" => strpos($c, "ambre-universal-chat.js") !== false,
|
||||
"has_chat_api" => strpos($c, "chat-api") !== false || strpos($c, "session-chat") !== false,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Internal memory state now
|
||||
$out["internal_memory_files"] = array_map("basename", glob("/opt/wevads/internal-memory/*.jsonl") ?: []);
|
||||
$out["internal_memory_count"] = count($out["internal_memory_files"]);
|
||||
|
||||
$out["load"] = trim(@shell_exec("uptime"));
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
68
api/ambre-scan-wtp.php
Normal file
68
api/ambre-scan-wtp.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
chdir("/var/www/html");
|
||||
$out["recent_commits_30m"] = array_filter(array_map("trim", explode("\n", @shell_exec("git log --since='30 minutes ago' --oneline 2>&1 | head -15"))));
|
||||
$out["recent_tags_today"] = array_filter(array_map("trim", explode("\n", @shell_exec("git tag -l 'wave-*' --sort=-creatordate 2>&1 | head -10"))));
|
||||
|
||||
// WTP state (point entrée architecture)
|
||||
$wtp = "/var/www/html/weval-technology-platform.html";
|
||||
if (file_exists($wtp)) {
|
||||
$w = @file_get_contents($wtp);
|
||||
$out["wtp"] = [
|
||||
"size" => filesize($wtp),
|
||||
"mtime" => date("Y-m-d H:i", filemtime($wtp)),
|
||||
"banner_links" => preg_match_all("/href=[\"'][^\"']+\.html/", $w),
|
||||
"has_banner" => strpos($w, "banner") !== false,
|
||||
];
|
||||
}
|
||||
|
||||
// Sitemap API for orphans tracking
|
||||
$sitemap_api = @file_get_contents("https://weval-consulting.com/api/sitemap-api.php", false, stream_context_create(["http"=>["timeout"=>5]]));
|
||||
if ($sitemap_api) {
|
||||
$d = @json_decode($sitemap_api, true);
|
||||
$out["sitemap"] = [
|
||||
"total_pages" => is_array($d) ? count($d["pages"] ?? $d) : 0,
|
||||
"raw_size" => strlen($sitemap_api),
|
||||
];
|
||||
}
|
||||
|
||||
// All-IA Hub state
|
||||
$iahub = "/var/www/html/all-ia-hub.html";
|
||||
if (file_exists($iahub)) {
|
||||
$out["all_ia_hub"] = ["size" => filesize($iahub), "mtime" => date("Y-m-d H:i", filemtime($iahub))];
|
||||
}
|
||||
|
||||
// WEVIA Master state
|
||||
$master = "/var/www/html/wevia-master.html";
|
||||
if (file_exists($master)) {
|
||||
$out["wevia_master"] = ["size" => filesize($master), "mtime" => date("Y-m-d H:i", filemtime($master))];
|
||||
}
|
||||
|
||||
// Orchestrator
|
||||
$orch = "/var/www/html/wevia-orchestrator.html";
|
||||
if (file_exists($orch)) {
|
||||
$out["orchestrator"] = ["size" => filesize($orch), "mtime" => date("Y-m-d H:i", filemtime($orch))];
|
||||
}
|
||||
|
||||
// Dashboards available
|
||||
$dashboards = array_map("basename", glob("/var/www/html/*dashboard*.html") ?: []);
|
||||
$out["dashboards_count"] = count($dashboards);
|
||||
$out["dashboards_sample"] = array_slice($dashboards, 0, 15);
|
||||
|
||||
// Business KPI endpoint check
|
||||
$biz_kpi = @file_get_contents("https://weval-consulting.com/api/v83-business-kpi-latest.json", false, stream_context_create(["http"=>["timeout"=>5]]));
|
||||
if ($biz_kpi) {
|
||||
$d = @json_decode($biz_kpi, true);
|
||||
$out["biz_kpi"] = [
|
||||
"keys" => is_array($d) ? array_slice(array_keys($d), 0, 10) : "invalid",
|
||||
"size" => strlen($biz_kpi),
|
||||
];
|
||||
}
|
||||
|
||||
// Current load + recent PW runs
|
||||
$out["load"] = trim(@shell_exec("uptime"));
|
||||
$out["recent_pw_runs"] = trim(@shell_exec("ls -1t /tmp/ambre-pw-run-*.log 2>/dev/null | head -3"));
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
51
api/ambre-shield-v2.php
Normal file
51
api/ambre-shield-v2.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/api/ambre-confidential-shield.js";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Replace the CONFIDENTIAL_IDS list with expanded version
|
||||
$old = "var CONFIDENTIAL_IDS = [
|
||||
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
|
||||
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
|
||||
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
|
||||
'opus-claude-pattern', 'opus-dashboards',
|
||||
];";
|
||||
|
||||
$new = "var CONFIDENTIAL_IDS = [
|
||||
'opus-pattern-badge', 'opus-pattern-style', 'opus-pattern-panel',
|
||||
'opus-pattern-modal', 'opus-pattern-box', 'opus-pattern-close', 'opus-pattern-input',
|
||||
'opus-pattern-bot', 'opus-pattern-output', 'opus-pattern-content',
|
||||
'opus-pattern-launch', 'opus-pattern-send',
|
||||
'opus-udrill', 'opus-udrill-in', 'opus-dashboard-entry', 'opus-dashboard-link',
|
||||
'wtp-udock', 'v130-xnav', 'opus-xlinks', 'wtp-sidebar',
|
||||
'opus-claude-pattern', 'opus-dashboards',
|
||||
'archi-meta-badge', 'v130-floating-dock',
|
||||
];";
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"CONFIDENTIAL_IDS not found in shield"]);
|
||||
exit;
|
||||
}
|
||||
$c = str_replace($old, $new, $c);
|
||||
|
||||
// Also neutralize the window.__opusPatternOpen function (prevent opening)
|
||||
$old2 = "console.log('[ambre-confidential-shield] active on public page: ' + path);";
|
||||
$new2 = "// Neutralize global opusPatternOpen function (prevents programmatic opening)
|
||||
try {
|
||||
Object.defineProperty(window, '__opusPatternOpen', { value: function(){}, writable: false, configurable: false });
|
||||
Object.defineProperty(window, '__opusPatternClose', { value: function(){}, writable: false, configurable: false });
|
||||
} catch(e) {}
|
||||
|
||||
console.log('[ambre-confidential-shield] active on public page: ' + path);";
|
||||
|
||||
$c = str_replace($old2, $new2, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/shield.GOLD-" . date("Ymd-His") . "-wave262-v2";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
]);
|
||||
21
api/ambre-trace-leak.php
Normal file
21
api/ambre-trace-leak.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// grep for opus-pattern-badge in /var/www/html
|
||||
$out["opus_pattern_sources"] = trim(@shell_exec("grep -lrE 'opus-pattern-badge|opus-pattern-style' /var/www/html --include='*.js' --include='*.html' --include='*.php' 2>/dev/null | head -10"));
|
||||
$out["opus_udrill_sources"] = trim(@shell_exec("grep -lrE 'opus-udrill|opus-dashboard-entry' /var/www/html --include='*.js' --include='*.html' --include='*.php' 2>/dev/null | head -10"));
|
||||
$out["wtp_dock_sources"] = trim(@shell_exec("grep -lrE 'WTP Global|ERP Global|Admin.*Droid|Orch.*WevCode' /var/www/html --include='*.js' --include='*.html' 2>/dev/null | head -10"));
|
||||
|
||||
// Read the opus-pattern injector
|
||||
$f = @shell_exec("grep -lrE 'opus-pattern-badge' /var/www/html --include='*.js' --include='*.php' 2>/dev/null | head -1");
|
||||
$f = trim($f);
|
||||
if ($f && file_exists($f)) {
|
||||
$c = @file_get_contents($f);
|
||||
$out["pattern_injector_file"] = $f;
|
||||
$out["pattern_injector_has_guard"] = strpos($c, "PUBLIC-GUARD") !== false || strpos($c, "public_paths") !== false || strpos($c, "AMBRE-V1") !== false;
|
||||
// Extract first 300 chars
|
||||
$out["pattern_injector_head"] = substr($c, 0, 400);
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
179
api/ambre-universal-chat.js
Normal file
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(){});
|
||||
});
|
||||
})();
|
||||
31
api/ambre-v0-exclude.php
Normal file
31
api/ambre-v0-exclude.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
|
||||
// Unlock first
|
||||
$attr = trim(shell_exec("lsattr $path 2>&1"));
|
||||
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Patch V0 to exclude multi-agent patterns
|
||||
$old = 'var _is_gen_cmd = /pdf|rapport|docx?|word|excel|xlsx?|pptx?|powerpoint|sch[eé]ma|diagramme|mermaid|image|photo|dessin|qr\\s*code|tts|lis[ -]|calcule|combien|code|traduis|cherche|recherche|actualit[eé]|search|news|latest|youtube|r[eé]sume|summari/i.test(text);';
|
||||
|
||||
$new = 'var _is_gen_cmd = /pdf|rapport|docx?|word|excel|xlsx?|pptx?|powerpoint|sch[eé]ma|diagramme|mermaid|image|photo|dessin|qr\\s*code|tts|lis[ -]|calcule|combien|code|traduis|cherche|recherche|actualit[eé]|search|news|latest|youtube|r[eé]sume|summari|compar[ez]?|analyse|multi.?agent|parall[eè]le|360|bilan/i.test(text);';
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"V0 pattern not found"]);
|
||||
exit;
|
||||
}
|
||||
$c = str_replace($old, $new, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave255-v0-exclude";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
"attr_before" => $attr,
|
||||
]);
|
||||
41
api/ambre-v11-debug.php
Normal file
41
api/ambre-v11-debug.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
|
||||
// Patch V11 fetch : add console.log trigger message + AbortController with 120s
|
||||
$old = "var _ma_start = performance.now();
|
||||
fetch(\"/api/ambre-multiagent-parallel.php\", {
|
||||
method: \"POST\",
|
||||
headers: {\"Content-Type\":\"application/json\"},
|
||||
body: JSON.stringify({goal: text, max_agents: 5})
|
||||
})";
|
||||
|
||||
$new = "console.log(\"[V11-MULTIAGENT] triggered for text:\", text.substring(0,80));
|
||||
var _ma_start = performance.now();
|
||||
var _ma_ctrl = new AbortController();
|
||||
var _ma_timeout = setTimeout(function(){ _ma_ctrl.abort(); }, 120000);
|
||||
fetch(\"/api/ambre-multiagent-parallel.php\", {
|
||||
method: \"POST\",
|
||||
headers: {\"Content-Type\":\"application/json\"},
|
||||
body: JSON.stringify({goal: text, max_agents: 5}),
|
||||
signal: _ma_ctrl.signal
|
||||
})
|
||||
.then(function(r){ clearTimeout(_ma_timeout); console.log(\"[V11] response status\", r.status); return r; })";
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"V11 fetch pattern not found"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$c = str_replace($old, $new, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave258-v11-debug";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - strlen(@file_get_contents($backup)),
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
23
api/ambre-v9-ok.php
Normal file
23
api/ambre-v9-ok.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
$old = "if (data && data.success) {";
|
||||
$new = "if (data && (data.ok || data.success)) {";
|
||||
|
||||
if (strpos($c, $old) === false) {
|
||||
echo json_encode(["error"=>"V9 success check not found"]);
|
||||
exit;
|
||||
}
|
||||
$c = str_replace($old, $new, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave247-v9-ok";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
]);
|
||||
28
api/ambre-v9-widen.php
Normal file
28
api/ambre-v9-widen.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Old pattern (too strict)
|
||||
$old_pat = "var _pdf_premium_pat = /(?:pdf|rapport)\\s+(?:premium|qualit[eé]|pro|professionnel|avec\\s+graphique|hd|chart)|(?:cr[eé]e[zr]?|g[eé]n[eè]re[zr]?|fais|fait|produi[st])\\s+(?:un\\s+)?(?:rapport|pdf)\\s+(?:premium|pro|complet|avec\\s+graphique|hd|qualit[eé])/i;";
|
||||
|
||||
// New pattern - broader: any PDF intention including ALL CAPS
|
||||
$new_pat = "var _pdf_premium_pat = /(?:veux|besoin|demande|fais|cree|g[eé]n[eé]re|produi[st]|export|donne|realise|create|make|generate|want|need)\\s+.{0,40}?\\bpdf\\b|\\bpdf\\b\\s+.{0,40}?(?:premium|qualit[eé]|pro|professionnel|avec|chart|graphique|compar|tableau|compl|hd)|\\b(?:rapport|comparaison|comparer|compare)\\b.{0,50}\\bpdf\\b|\\bpdf\\b.{0,50}\\b(?:rapport|comparaison|comparer|compare)\\b|^\\s*pdf\\s+/i;";
|
||||
|
||||
if (strpos($c, $old_pat) === false) {
|
||||
echo json_encode(["error"=>"V9 pattern not found"]);
|
||||
exit;
|
||||
}
|
||||
$c = str_replace($old_pat, $new_pat, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave247-v9-widen";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
"new_pattern" => $new_pat,
|
||||
]);
|
||||
17
api/ambre-widget-read.php
Normal file
17
api/ambre-widget-read.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia-widget.html");
|
||||
// Find Claude Pattern context
|
||||
$pos = strpos($c, "Claude Pattern");
|
||||
if ($pos !== false) {
|
||||
echo "=== Claude Pattern ctx ===\n";
|
||||
echo substr($c, max(0, $pos - 300), 600);
|
||||
}
|
||||
echo "\n\n=== WTP ctx ===\n";
|
||||
$pos2 = strpos($c, "WTP");
|
||||
if ($pos2 !== false) echo substr($c, max(0, $pos2 - 300), 700);
|
||||
|
||||
echo "\n\n=== All script srcs and inline signatures ===\n";
|
||||
preg_match_all('/<script[^>]*(?:src=["\']([^"\']+)["\']|>([^<]{0,100}))/', $c, $m);
|
||||
foreach ($m[1] as $s) if ($s) echo "SRC: $s\n";
|
||||
foreach ($m[2] as $s) if (trim($s)) echo "INLINE: " . substr(trim($s), 0, 100) . "\n";
|
||||
53
api/ambre-widget-trace.php
Normal file
53
api/ambre-widget-trace.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$root = @file_get_contents("/var/www/html/index.html");
|
||||
|
||||
// Find all widgets + iframes + the chatbot/claude-pattern widget
|
||||
$out = [];
|
||||
|
||||
// Search for specific widget signatures in index.html
|
||||
$sigs = [
|
||||
"claude-pattern",
|
||||
"Claude Pattern",
|
||||
"WTP",
|
||||
"IA Hub",
|
||||
"Master",
|
||||
"Droid",
|
||||
"Arena",
|
||||
"WEVIA Engine",
|
||||
"WevCode",
|
||||
"widget.js",
|
||||
"chat-widget",
|
||||
"Ouvrir en plein ecran",
|
||||
"weval-chat-fix",
|
||||
"wevia-widget",
|
||||
"chat-fix",
|
||||
];
|
||||
foreach ($sigs as $s) {
|
||||
$out["match_$s"] = substr_count($root, $s);
|
||||
}
|
||||
$out["root_size"] = strlen($root);
|
||||
|
||||
// All <script src>
|
||||
preg_match_all('/<script[^>]*src=["\']([^"\']+)["\']/', $root, $m);
|
||||
$out["scripts"] = array_unique($m[1] ?? []);
|
||||
|
||||
// Check weval-chat-fix.js content
|
||||
$cf = @file_get_contents("/var/www/html/weval-chat-fix.js");
|
||||
if ($cf) {
|
||||
$out["chat_fix_size"] = strlen($cf);
|
||||
$out["chat_fix_has_wtp"] = substr_count($cf, "WTP");
|
||||
$out["chat_fix_has_claude_pattern"] = substr_count($cf, "Claude Pattern");
|
||||
$out["chat_fix_has_Master"] = substr_count($cf, "Master") + substr_count($cf, "IA Hub");
|
||||
$out["chat_fix_head_200"] = substr($cf, 0, 400);
|
||||
}
|
||||
|
||||
// Also check wevia-widget
|
||||
$ww = @file_get_contents("/var/www/html/wevia-widget.html");
|
||||
if ($ww) {
|
||||
$out["wevia_widget_size"] = strlen($ww);
|
||||
$out["wevia_widget_has_dock"] = substr_count($ww, "WTP") + substr_count($ww, "Master") + substr_count($ww, "Droid");
|
||||
$out["wevia_widget_has_claude_pattern"] = substr_count($ww, "Claude Pattern");
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
106
api/ambre-wire-v11.php
Normal file
106
api/ambre-wire-v11.php
Normal file
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
if (strpos($c, "AMBRE-V11-MULTIAGENT") !== false) {
|
||||
echo json_encode(["already"=>true]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Insert BEFORE V10-MERMAID (so multi-agent catches complex requests first)
|
||||
$anchor = " // === AMBRE-V10-MERMAID 2026-04-22";
|
||||
$pos = strpos($c, $anchor);
|
||||
if ($pos === false) {
|
||||
echo json_encode(["error"=>"V10 anchor not found"]);
|
||||
exit;
|
||||
}
|
||||
$line_start = strrpos(substr($c, 0, $pos), "\n") + 1;
|
||||
|
||||
$v11 = ' // === AMBRE-V11-MULTIAGENT 2026-04-22 · wave-255 · Plan → Execute N agents parallel → Reconcile ===
|
||||
// Triggers : "analyse", "complet", "rapport complet", "compare X avec Y", "multi agent", "plusieurs", "en parallele"
|
||||
var _multiagent_pat = /(?:analyse\s+compl[eè]te|rapport\s+complet|bilan\s+complet|compare[rz]?\s+.{3,}\s+(?:avec|vs|contre|et)\s+|multi[- ]?agent|plusieurs\s+angles|en\s+parall[eè]le|synth[eè]se\s+compl[eè]te|analyse\s+360|\ballonsy\b|\bdispatch\b)/i;
|
||||
if (_multiagent_pat.test(text) && text.length > 40) {
|
||||
if (typeof showThinking === "function") showThinking();
|
||||
busy = true;
|
||||
try{var sb=document.getElementById("sendBtn");if(sb)sb.disabled=true;}catch(e){}
|
||||
|
||||
var _ma_start = performance.now();
|
||||
fetch("/api/ambre-multiagent-parallel.php", {
|
||||
method: "POST",
|
||||
headers: {"Content-Type":"application/json"},
|
||||
body: JSON.stringify({goal: text, max_agents: 5})
|
||||
})
|
||||
.then(function(r){ return r.json(); })
|
||||
.then(function(data){
|
||||
if (typeof hideThinking === "function") hideThinking();
|
||||
busy = false;
|
||||
try{var sb=document.getElementById("sendBtn");if(sb)sb.disabled=false;}catch(e){}
|
||||
try{var mi=document.getElementById("msgInput");if(mi){mi.value="";mi.disabled=false;}}catch(e){}
|
||||
|
||||
if (!data || !data.ok) {
|
||||
addMsg("assistant", "❌ Multi-agent erreur: " + ((data && data.error) || "reessayez"), "0");
|
||||
return;
|
||||
}
|
||||
|
||||
var el = ((performance.now() - _ma_start) / 1000).toFixed(1);
|
||||
|
||||
// Build rich HTML response
|
||||
var badges = "<div style=\"display:flex;gap:6px;flex-wrap:wrap;margin:8px 0\">" +
|
||||
"<span class=\"nx-badge\" style=\"background:rgba(99,102,241,.15);color:#6366f1\">🧠 Multi-Agent</span>" +
|
||||
"<span class=\"nx-badge\" style=\"background:rgba(16,185,129,.15);color:#10b981\">" + data.agents_count + " agents ∥</span>" +
|
||||
"<span class=\"nx-badge\" style=\"background:rgba(245,158,11,.15);color:#f59e0b\">⚡ " + data.parallel_speedup + "x speedup</span>" +
|
||||
"<span class=\"nx-badge\" style=\"background:rgba(139,92,246,.15);color:#8b5cf6\">" + data.total_ms + "ms</span>" +
|
||||
"</div>";
|
||||
|
||||
// Plan
|
||||
var planHtml = "<div style=\"margin:10px 0;padding:12px;background:#eef2ff;border-radius:10px;border-left:3px solid #6366f1\">" +
|
||||
"<div style=\"font-weight:600;color:#4338ca;font-size:13px;margin-bottom:6px\">📋 Plan · " + (data.plan.objective || "") + "</div>" +
|
||||
"<div style=\"font-size:12px;color:#4b5563\">" + data.plan.agents.length + " agents dispatchés en parallèle</div></div>";
|
||||
|
||||
// Agents list
|
||||
var agentsHtml = "<div style=\"margin:10px 0\"><div style=\"font-weight:600;color:#1a1f3a;font-size:13px;margin-bottom:8px\">🤖 Agents · exécution parallèle</div>";
|
||||
data.results.forEach(function(r, i){
|
||||
var icon = {"pdf_premium":"📄","mermaid":"📊","web_search":"🔍","calc":"🧮","kb_search":"📚","none":"💭"}[r.tool] || "⚙️";
|
||||
agentsHtml += "<div style=\"margin:6px 0;padding:10px;background:#fafafa;border-radius:8px;border:1px solid #e5e7eb\">" +
|
||||
"<div style=\"font-size:12px;color:#6366f1;font-weight:600;margin-bottom:4px\">" + icon + " " + r.agent + " · " + r.tool + " · " + r.elapsed_ms + "ms</div>" +
|
||||
"<div style=\"font-size:12px;color:#64748b;line-height:1.4\">" + (r.task || "") + "</div>" +
|
||||
"<div style=\"font-size:11px;color:#94a3b8;margin-top:4px\">" + (r.summary || "").replace(/</g,"<").substring(0, 250) + "</div>" +
|
||||
"</div>";
|
||||
});
|
||||
agentsHtml += "</div>";
|
||||
|
||||
// Reconciled
|
||||
var synthHtml = "<div style=\"margin:12px 0;padding:14px;background:linear-gradient(135deg,#f0f9ff 0%,#eef2ff 100%);border-radius:12px;border-left:3px solid #10b981\">" +
|
||||
"<div style=\"font-weight:600;color:#065f46;font-size:13px;margin-bottom:8px\">✅ Synthèse consolidée</div>" +
|
||||
"<div style=\"font-size:13px;color:#1a1f3a;line-height:1.6;white-space:pre-wrap\">" + (data.reconciled || "").replace(/</g,"<") + "</div>" +
|
||||
"</div>";
|
||||
|
||||
var el_resp = addMsg("assistant", "Multi-agent", el);
|
||||
var bubble = el_resp ? el_resp.querySelector(".bubble") : null;
|
||||
if (bubble) bubble.innerHTML = badges + planHtml + agentsHtml + synthHtml;
|
||||
})
|
||||
.catch(function(err){
|
||||
if (typeof hideThinking === "function") hideThinking();
|
||||
busy = false;
|
||||
try{var sb=document.getElementById("sendBtn");if(sb)sb.disabled=false;}catch(e){}
|
||||
addMsg("assistant", "❌ Multi-agent service indisponible", "0");
|
||||
});
|
||||
return;
|
||||
}
|
||||
// === END AMBRE-V11-MULTIAGENT ===
|
||||
|
||||
';
|
||||
|
||||
$new_c = substr($c, 0, $line_start) . $v11 . substr($c, $line_start);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave255-v11";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $new_c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($new_c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
23
api/ambre-wtp-wire-cx.php
Normal file
23
api/ambre-wtp-wire-cx.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$path = "/var/www/html/weval-technology-platform.html";
|
||||
$c = @file_get_contents($path);
|
||||
if (strpos($c, "dashboards-hub-unified") !== false) { echo "already"; exit; }
|
||||
|
||||
$anchor = 'href="/dashboards-index.html"';
|
||||
$pos = strpos($c, $anchor);
|
||||
if ($pos === false) { echo "no anchor"; exit; }
|
||||
|
||||
$a_end = strpos($c, "</a>", $pos) + 4;
|
||||
$link = '<a href="/dashboards-hub-unified.html" class="wtp-link" style="display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:linear-gradient(135deg,#4338ca,#6366f1);color:#fff;border-radius:6px;text-decoration:none;font-size:12px;font-weight:500;margin:0 4px"><span>📊 Hub Unifié</span></a>';
|
||||
|
||||
$new_c = substr($c, 0, $a_end) . $link . substr($c, $a_end);
|
||||
|
||||
// Write via sudo cat
|
||||
$tmpfile = tempnam("/tmp", "wtp_");
|
||||
file_put_contents($tmpfile, $new_c);
|
||||
// Copy back via sudo
|
||||
$result = shell_exec("sudo cp $tmpfile $path 2>&1");
|
||||
echo "Result: " . $result . "\n";
|
||||
echo "New size: " . strlen($new_c) . "B · delta +" . (strlen($new_c)-strlen($c)) . "B\n";
|
||||
unlink($tmpfile);
|
||||
22
api/ambre-wtp-wire-e2e.php
Normal file
22
api/ambre-wtp-wire-e2e.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$path = "/var/www/html/weval-technology-platform.html";
|
||||
$c = @file_get_contents($path);
|
||||
if (strpos($c, "dashboards-hub-unified") !== false) { echo "already"; exit; }
|
||||
|
||||
$anchor = 'href="/e2e-dashboard.html"';
|
||||
$pos = strpos($c, $anchor);
|
||||
if ($pos === false) { echo "no anchor e2e-dashboard\n"; exit; }
|
||||
|
||||
$a_end = strpos($c, "</a>", $pos) + 4;
|
||||
$link = "\n<a href=\"/dashboards-hub-unified.html\" class=\"wtp-link\" title=\"Hub Dashboards Unifié · 24 dashboards · 13 catégories · wave-246\" style=\"display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:linear-gradient(135deg,#4338ca,#6366f1);color:#fff;border-radius:6px;text-decoration:none;font-size:12px;font-weight:500;margin:0 4px\"><span>📊 Hub Unifié · 24 dashboards</span></a>";
|
||||
|
||||
$new_c = substr($c, 0, $a_end) . $link . substr($c, $a_end);
|
||||
|
||||
$tmpfile = tempnam("/tmp", "wtp_");
|
||||
file_put_contents($tmpfile, $new_c);
|
||||
$r = shell_exec("sudo cp $tmpfile $path 2>&1");
|
||||
unlink($tmpfile);
|
||||
echo "Result: [$r]\n";
|
||||
echo "New size: " . strlen($new_c) . "B · delta +" . (strlen($new_c)-strlen($c)) . "B\n";
|
||||
echo "Verify content: " . (strpos(file_get_contents($path), "dashboards-hub-unified") !== false ? "YES" : "NO") . "\n";
|
||||
57
api/ambre-wtp-wire.php
Normal file
57
api/ambre-wtp-wire.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/weval-technology-platform.html";
|
||||
$c = @file_get_contents($path);
|
||||
|
||||
if (strpos($c, "dashboards-hub-unified") !== false) {
|
||||
echo json_encode(["already"=>true]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Add the link in banner (find "Arsenal History" or similar anchor)
|
||||
// Use safer approach: add a link block AFTER <body> or before first </div>
|
||||
// Find the existing banner Mega/Arsenal link
|
||||
$anchors = [
|
||||
"href=\"/dashboards-index.html\"" => "AFTER",
|
||||
"href=\"/e2e-dashboard.html\"" => "BEFORE",
|
||||
];
|
||||
|
||||
$injected = false;
|
||||
foreach ($anchors as $anchor => $where) {
|
||||
$pos = strpos($c, $anchor);
|
||||
if ($pos !== false) {
|
||||
// Find surrounding <a> element boundary
|
||||
$a_start = strrpos(substr($c, 0, $pos), "<a ");
|
||||
if ($a_start !== false) {
|
||||
// End of the </a>
|
||||
$a_end = strpos($c, "</a>", $pos);
|
||||
if ($a_end !== false) {
|
||||
$a_end += 4;
|
||||
$link_html = "<a href=\"/dashboards-hub-unified.html\" style=\"display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:linear-gradient(135deg,#4338ca,#6366f1);color:#fff;border-radius:6px;text-decoration:none;font-size:12px;font-weight:500;margin-right:8px\">📊 Hub Unifié</a>";
|
||||
if ($where === "BEFORE") {
|
||||
$new_c = substr($c, 0, $a_start) . $link_html . substr($c, $a_start);
|
||||
} else {
|
||||
$new_c = substr($c, 0, $a_end) . $link_html . substr($c, $a_end);
|
||||
}
|
||||
$c = $new_c;
|
||||
$injected = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$injected) {
|
||||
echo json_encode(["error"=>"no anchor found to inject link"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$backup = "/opt/wevads/vault/wtp.GOLD-" . date("Ymd-His") . "-wave246-hub";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"wrote" => $wrote,
|
||||
"size" => strlen($c),
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-22 01:30: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, 15 hours, 38 minutes",
|
||||
"uptime": "up 1 week, 22 hours, 38 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -21,8 +21,8 @@
|
||||
"private": "10.1.0.3",
|
||||
"role": "WEVADS Arsenal",
|
||||
"ssh": 22,
|
||||
"disk_pct": 82,
|
||||
"disk_avail": "27G",
|
||||
"disk_pct": 83,
|
||||
"disk_avail": "26G",
|
||||
"sentinel": 1
|
||||
},
|
||||
{
|
||||
@@ -66,17 +66,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": ""
|
||||
},
|
||||
{
|
||||
@@ -86,7 +86,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"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": 323,
|
||||
"s204_html": 327,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 978,
|
||||
"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": 5601,
|
||||
"kb_learnings": 5699,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -418,7 +428,7 @@
|
||||
},
|
||||
{
|
||||
"name": "wevia_memory_768",
|
||||
"vectors": 82
|
||||
"vectors": 100
|
||||
},
|
||||
{
|
||||
"name": "wevia_kb_768",
|
||||
@@ -606,15 +616,15 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5601,
|
||||
"total_entries": 5699,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3006"
|
||||
"cnt": "3090"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1239"
|
||||
"cnt": "1253"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1724,44 +1734,44 @@
|
||||
"recent_commits": [],
|
||||
"auto_fixes": [
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 01:25: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 03:25:05.698889"
|
||||
"fact": "AUTONOMY 22Apr 08:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:25:05.043155"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 01:20: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 03:20:06.441663"
|
||||
"fact": "AUTONOMY 22Apr 08:20: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:20:05.6286"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 01:15: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 03:15:06.44598"
|
||||
"fact": "AUTONOMY 22Apr 08:15: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:15:06.533813"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 01:10: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 03:10:06.312413"
|
||||
"fact": "AUTONOMY 22Apr 08:10: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:10:06.375058"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 01:05: 1 fixes. Disk light cleanup 85%",
|
||||
"created_at": "2026-04-22 03:05:07.031315"
|
||||
"fact": "AUTONOMY 22Apr 08:05: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:05:05.386486"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 01:00: 1 fixes. Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 03:00:09.977884"
|
||||
"fact": "AUTONOMY 22Apr 08:00: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:00:08.200387"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 00:55: 1 fixes. Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 02:55:04.844039"
|
||||
"fact": "AUTONOMY 22Apr 07:55: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:55:05.077922"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 00:50: 1 fixes. Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 02:50:06.2905"
|
||||
"fact": "AUTONOMY 22Apr 07:50: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:50:06.264413"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 00:45: 1 fixes. Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 02:45:05.15975"
|
||||
"fact": "AUTONOMY 22Apr 07:45: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:45:05.356474"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 00:40: 1 fixes. Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 02:40:06.026939"
|
||||
"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,105 vecteurs",
|
||||
"title": "Qdrant: 22,123 vecteurs",
|
||||
"detail": "Volume vectoriel croissant. Planifier sharding ou migration vers cluster Qdrant.",
|
||||
"action": "opportunity",
|
||||
"fix_cmd": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 3657,
|
||||
"scan_time_ms": 3016,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,10 +1,49 @@
|
||||
<?php
|
||||
// Opus v19 · Auth check with agent bypass token
|
||||
// - Fallback: PHP session (existing behavior · no regression)
|
||||
// - NEW: X-Agent-Token header OR ?_agent_token= param
|
||||
// - Validated against /etc/weval/secrets.env AGENT_TOKEN (or fallback to DROID2026)
|
||||
|
||||
session_set_cookie_params(["lifetime"=>86400,"path"=>"/","domain"=>".weval-consulting.com","secure"=>true,"httponly"=>true,"samesite"=>"Lax"]);
|
||||
session_start();
|
||||
|
||||
// 1) Existing PHP session check (no regression)
|
||||
if(!empty($_SESSION["weval_auth"]) && $_SESSION["weval_auth"] === true) {
|
||||
http_response_code(200);
|
||||
echo "OK";
|
||||
} else {
|
||||
http_response_code(401);
|
||||
echo "UNAUTHORIZED";
|
||||
exit;
|
||||
}
|
||||
|
||||
// 2) NEW · Agent token bypass (header or query param)
|
||||
$supplied = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? $_GET["_agent_token"] ?? "";
|
||||
|
||||
if ($supplied) {
|
||||
// Load expected from secrets.env
|
||||
$expected = "";
|
||||
if (is_readable("/etc/weval/secrets.env")) {
|
||||
foreach (file("/etc/weval/secrets.env", FILE_IGNORE_NEW_LINES) as $line) {
|
||||
if (strpos($line, "AGENT_TOKEN=") === 0) {
|
||||
$expected = trim(substr($line, strlen("AGENT_TOKEN=")));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Fallback to DROID2026 (already trusted via /api/droid)
|
||||
if (!$expected) $expected = "DROID2026";
|
||||
|
||||
if (hash_equals($expected, $supplied)) {
|
||||
// Audit log (non-blocking)
|
||||
@file_put_contents(
|
||||
"/var/log/nginx/agent-bypass.log",
|
||||
date("c") . " " . ($_SERVER["HTTP_X_ORIGINAL_URI"] ?? "?") . " UA=" . ($_SERVER["HTTP_USER_AGENT"] ?? "?") . "\n",
|
||||
FILE_APPEND
|
||||
);
|
||||
http_response_code(200);
|
||||
echo "AGENT-OK";
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// 3) Unauthorized (default)
|
||||
http_response_code(401);
|
||||
echo "UNAUTHORIZED";
|
||||
|
||||
@@ -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-22T03:40:01.479513",
|
||||
"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-22T03:30:02.154167",
|
||||
"last_heartbeat": "2026-04-22T03:30:02.154167",
|
||||
"last_heartbeat_ts_epoch": 1776821402,
|
||||
"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
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
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
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"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user