Compare commits
78 Commits
wave-264-d
...
v175-opus-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69e8b3b6da | ||
|
|
88685c2837 | ||
|
|
a54e766b19 | ||
|
|
5fed3ac046 | ||
|
|
4e7c08713b | ||
|
|
352fd0ce52 | ||
|
|
5dbba6d246 | ||
|
|
bfcf2223c9 | ||
|
|
a204d31fcb | ||
|
|
e03b3ec9ac | ||
|
|
7c299f595a | ||
|
|
a52c7e0b0f | ||
|
|
fcdb2c7f82 | ||
|
|
e43516dbf4 | ||
|
|
5651b59e2c | ||
|
|
1f8e502eb1 | ||
|
|
e141e18936 | ||
|
|
c95a2ce4db | ||
|
|
083a7345ed | ||
|
|
b881c81736 | ||
|
|
805a45b94e | ||
|
|
770a5c92ac | ||
|
|
7b73186210 | ||
|
|
a9cb3be6d4 | ||
|
|
6930609507 | ||
|
|
c30c7f0e2e | ||
|
|
1c6db0c8e6 | ||
|
|
2d9cdf729b | ||
|
|
e0036f3aa6 | ||
|
|
661263ff5f | ||
|
|
d3fb4271f1 | ||
|
|
1d93c88237 | ||
|
|
c96cd3695b | ||
|
|
d64bf8f6d5 | ||
|
|
6a90d25915 | ||
|
|
a66f7e5e35 | ||
|
|
eb4d6a2bfd | ||
|
|
4ccd3ec9d7 | ||
|
|
cf58f3907a | ||
|
|
17fd5c8867 | ||
|
|
1777a6fd9a | ||
|
|
7044bc0f02 | ||
|
|
d47dad90c0 | ||
|
|
851ec98b28 | ||
|
|
de4026e86d | ||
|
|
42ac79b1ed | ||
|
|
fef90ef5bd | ||
|
|
9a84b0cccc | ||
|
|
7aba72df4a | ||
|
|
1bd2a1816b | ||
|
|
68c844cc52 | ||
|
|
af31149d88 | ||
|
|
1b1dd880a2 | ||
|
|
dbea8f6f92 | ||
|
|
a56e7dd55d | ||
|
|
97bc5d4801 | ||
|
|
9e9ee7c728 | ||
|
|
f90ae398db | ||
|
|
b19107392d | ||
|
|
4b129583de | ||
|
|
6d9618638c | ||
|
|
a189c8702c | ||
|
|
2e893a3ca2 | ||
|
|
969731b074 | ||
|
|
9a60d63c7d | ||
|
|
8f1eaf4358 | ||
|
|
ae7d83f1fa | ||
|
|
3f1d6e5ef6 | ||
|
|
4df0825337 | ||
|
|
e8fbf4f1ab | ||
|
|
98d99bfe4d | ||
|
|
3a24dc48f9 | ||
|
|
5dd0b5f015 | ||
|
|
835e1f316b | ||
|
|
814ba61691 | ||
|
|
af33c56591 | ||
|
|
f465bedbd3 | ||
|
|
4eb9e842b1 |
@@ -1336,5 +1336,32 @@ setInterval(refreshStats,60000);
|
||||
<script>(function(){var p=window.location.pathname;var pub=["/","/index.html","/wevia.html","/wevia-widget.html","/enterprise-model.html","/wevia","/login","/register.html","/agents-archi.html","/wevia-meeting-rooms.html","/director-center.html","/director-chat.html","/l99-brain.html","/agents-fleet.html","/value-streaming.html","/architecture.html","/openclaw.html","/l99-saas.html","/admin-saas.html","/agents-goodjob.html","/ai-benchmark.html","/oss-discovery.html","/paperclip.html","/agents-3d.html","/agents-alive.html","/agents-enterprise.html","/agents-hd.html","/agents-iso3d.html","/agents-sim.html","/agents-valuechain.html","/avatar-picker.html"];var isPub=pub.indexOf(p)>=0||p.indexOf("/products/")===0||p.indexOf("/solutions/")===0||p.indexOf("/blog/")===0||p.indexOf("/service/")===0||p.indexOf("/marketplace")===0||p.indexOf("/contact")===0||p.indexOf("/tarifs")===0||p.indexOf("/news")===0;if(isPub||document.getElementById("weval-gl"))return;var a=document.createElement("a");a.id="weval-gl";a.href="/logout";a.textContent="Logout";a.style.cssText="position:fixed;top:10px;right:12px;z-index:99990;padding:5px 10px;background:rgba(30,30,50,0.7);color:rgba(200,210,230,0.8);border:1px solid rgba(100,100,140,0.3);border-radius:6px;font:500 11px system-ui,sans-serif;text-decoration:none;opacity:0.6;cursor:pointer;backdrop-filter:blur(6px);transition:all .15s";a.onmouseover=function(){this.style.opacity="1";this.style.background="rgba(239,68,68,0.85)";this.style.color="white"};a.onmouseout=function(){this.style.opacity="0.6";this.style.background="rgba(30,30,50,0.7)";this.style.color="rgba(200,210,230,0.8)"};document.body.appendChild(a)})()</script><script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
|
||||
<script src="/api/weval-feature-tracker.js" defer></script>
|
||||
<script src="/api/ambre-universal-chat.js" defer></script>
|
||||
|
||||
<!-- WAVE 265 · Factory pill cross-page (injected, position mesurée zéro overlap) -->
|
||||
<a id="w265-factory-cross" href="/wevia-multiagent-dashboard.html" title="Factory Health Monitor (30 agents)"
|
||||
style="position:fixed;top:12px;left:12px;padding:6px 12px;border-radius:14px;background:linear-gradient(135deg,rgba(34,211,238,.2),rgba(168,85,247,.15));border:1px solid rgba(34,211,238,.4);color:#67e8f9;font-size:11px;font-weight:700;text-decoration:none;display:inline-flex;align-items:center;gap:6px;z-index:9999;backdrop-filter:blur(10px);box-shadow:0 2px 8px rgba(0,0,0,.4)">
|
||||
<span>🏭</span>
|
||||
<span id="w265-factory-txt">Factory: ...</span>
|
||||
</a>
|
||||
<script>
|
||||
/* w265 Factory auto-load */
|
||||
(function(){
|
||||
async function refresh(){
|
||||
try {
|
||||
const r = await fetch('/api/wevia-v83-business-kpi.php?action=summary', {cache:'no-store'}).then(r=>r.json()).catch(()=>null);
|
||||
const el = document.getElementById('w265-factory-txt');
|
||||
if(el && r && r.summary){
|
||||
const s = r.summary;
|
||||
const pct = s.data_completeness_pct || 0;
|
||||
el.textContent = `Factory: ${pct}% (${s.ok || 0}/${s.total_kpis || 0})`;
|
||||
}
|
||||
} catch(e){ console.log('[w265] factory check err', e); }
|
||||
}
|
||||
refresh();
|
||||
setInterval(refresh, 60000);
|
||||
})();
|
||||
</script>
|
||||
<!-- /WAVE 265 Factory pill cross-page -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-22T10:30:01+02:00",
|
||||
"disk_pct": 86,
|
||||
"disk_free_gb": 22,
|
||||
"ts": "2026-04-22T15:30:02+02:00",
|
||||
"disk_pct": 87,
|
||||
"disk_free_gb": 20,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 14,
|
||||
"runway_days": 13,
|
||||
"alert": "WARN_runway_under_30d",
|
||||
"action_auto_if_under_7d": "trigger_hetzner_volume_extension_api",
|
||||
"hetzner_volume_size_gb_recommended": 500,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-22T10:45:02+02:00",
|
||||
"ts": "2026-04-22T15:45:02+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"routes": 446,
|
||||
"skills": 835,
|
||||
"wiki": 2252,
|
||||
"pages": 327,
|
||||
"wiki": 2296,
|
||||
"pages": 328,
|
||||
"apis": 254,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22 04:00"
|
||||
"timestamp": "2026-04-22 10:00"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 00:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"analysis": {
|
||||
"existing_skills": 835,
|
||||
"missing": 15,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-22T10:00:01+02:00",
|
||||
"ts": "2026-04-22T15:00:02+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 10,
|
||||
"adoption_pct": 66,
|
||||
"chat_queries_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 21,
|
||||
"features_used_24h": 11,
|
||||
"adoption_pct": 73,
|
||||
"chat_queries_last_1k_log": 3,
|
||||
"wtp_views_last_1k_log": 9,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-22T10:40:02+02:00",
|
||||
"ts": "2026-04-22T15:50:03+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V61_LinkedIn_Sourcing",
|
||||
"ts": "2026-04-21T11:00:02+02:00",
|
||||
"ts": "2026-04-22T11:00:01+02:00",
|
||||
"icp_count": 39,
|
||||
"icp_source": "V46 39 ICP Pharma/Banque/Retail/Public Maghreb+MENA",
|
||||
"api_keys_configured": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-22T10:00:01+02:00",
|
||||
"ts": "2026-04-22T15:00:03+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-22T10:30:03+02:00",
|
||||
"ts": "2026-04-22T15:30:04+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 17,
|
||||
"residual_risk_pct": 83,
|
||||
"mql_auto": 19,
|
||||
"residual_risk_pct": 81,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "2.16",
|
||||
"load_5min": "18.32",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 10:00",
|
||||
"timestamp": "2026-04-22 14:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 20,
|
||||
"disk": "86%",
|
||||
"disk": "87%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "1.77",
|
||||
"uptime": "up 1 week, 22 hours, 8 minutes"
|
||||
"load": "2.46",
|
||||
"uptime": "up 1 week, 1 day, 2 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -20,12 +20,12 @@
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -60,7 +60,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -488,7 +488,7 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 327
|
||||
"count": 328
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 96
|
||||
@@ -497,7 +497,7 @@
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 2296
|
||||
"entries": 2324
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,12 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T06:00:03.128913",
|
||||
"generated_at": "2026-04-22T12:00:04.136998",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 21,
|
||||
"issues_count": 6,
|
||||
"fixed_elements_checked": 23,
|
||||
"issues_count": 5,
|
||||
"status": "CRITICAL",
|
||||
"doctrine_61": "bottom-right reserved for chat WEVIA only",
|
||||
"issues": [
|
||||
{
|
||||
"page": "weval-technology-platform.html",
|
||||
"element": "opus-orphans-count-text",
|
||||
"type": "inline",
|
||||
"corner": "bottom-right",
|
||||
"z": 9997,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "wevia-widget.html",
|
||||
"element": "#opus-pattern-badge",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T04:00:05+00:00",
|
||||
"compute_ms": 3689,
|
||||
"timestamp": "2026-04-22T10:00:07+00:00",
|
||||
"compute_ms": 5100,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -13,31 +13,31 @@
|
||||
"oss_tools": 765,
|
||||
"oss_skills": 734,
|
||||
"oss_tests": 765,
|
||||
"docker": 19,
|
||||
"docker": 20,
|
||||
"ollama_models": 7,
|
||||
"git_repos": 38,
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 949,
|
||||
"latency_ms": 1583,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 1106,
|
||||
"latency_ms": 907,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
},
|
||||
"scores": {
|
||||
"combined": 75,
|
||||
"infra": 56,
|
||||
"infra": 57,
|
||||
"ecosystem": 100,
|
||||
"agents": 0,
|
||||
"skills": 100,
|
||||
"nonreg": 100,
|
||||
"oss": 100,
|
||||
"docker": 95,
|
||||
"docker": 100,
|
||||
"providers": 72,
|
||||
"hierarchy": 0,
|
||||
"instructions": 100
|
||||
@@ -45,7 +45,7 @@
|
||||
"leaderboard": [
|
||||
{
|
||||
"name": "WEVAL_Ecosystem",
|
||||
"score": 80.6,
|
||||
"score": 80.7,
|
||||
"skills": 839,
|
||||
"agents": 0
|
||||
},
|
||||
@@ -61,7 +61,7 @@
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_MiroFish",
|
||||
"score": 95,
|
||||
"score": 100,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -199,6 +199,6 @@ sse("done", [
|
||||
"response" => $final_response,
|
||||
"file_url" => $final_file_url,
|
||||
"pattern" => $pattern,
|
||||
"provider" => "ambre-claude-stream-v1",
|
||||
"provider" => "wevia-stream-v1",
|
||||
"intent" => $pattern . "_streamed",
|
||||
]);
|
||||
|
||||
5
api/ambre-ctx.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
echo "=== around 94630 (phase result) ===\n";
|
||||
echo substr($c, 94500, 1500);
|
||||
29
api/ambre-find-mermaid.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Look for the Result/Resultat etape 5 rendering in V5-CLAUDE-PATTERN (now V5-WEVIA-PATTERN)
|
||||
// Find where the result appears
|
||||
$pos = strpos($c, "Resultat");
|
||||
while ($pos !== false) {
|
||||
$ctx = substr($c, max(0, $pos - 100), 600);
|
||||
if (strpos($ctx, "schema") !== false || strpos($ctx, "Mermaid") !== false || strpos($ctx, "mermaid") !== false) {
|
||||
echo "=== Context at $pos ===\n";
|
||||
echo $ctx;
|
||||
echo "\n\n---\n";
|
||||
}
|
||||
$pos = strpos($c, "Resultat", $pos + 1);
|
||||
}
|
||||
|
||||
// Find how the final SVG is supposed to render
|
||||
echo "\n\n=== Search mermaid.render in wevia.html ===\n";
|
||||
if (preg_match_all('/mermaid\.render\([^)]+\)/', $c, $m)) {
|
||||
foreach (array_slice($m[0], 0, 5) as $match) echo " $match\n";
|
||||
}
|
||||
|
||||
// Find the Schema rendering fct
|
||||
echo "\n=== Search Schema Mermaid rendering code ===\n";
|
||||
$pos = strpos($c, "Schema Mermaid:");
|
||||
if ($pos !== false) {
|
||||
echo substr($c, max(0, $pos - 200), 800);
|
||||
}
|
||||
28
api/ambre-find-result.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find how the result payload is handled in SSE (type === "result")
|
||||
$pos = strpos($c, "type === 'result'");
|
||||
while ($pos !== false && $pos < 250000) {
|
||||
echo "=== Position $pos ===\n";
|
||||
echo substr($c, $pos, 800);
|
||||
echo "\n\n---\n";
|
||||
$pos = strpos($c, "type === 'result'", $pos + 10);
|
||||
if ($pos > strpos($c, "type === 'result'") + 100) break;
|
||||
}
|
||||
// Also check the 'schema' output handling
|
||||
$pos2 = strpos($c, "Schema Mermaid");
|
||||
echo "\n\n=== Schema Mermaid: $pos2 ===\n";
|
||||
if ($pos2 !== false) echo substr($c, max(0, $pos2 - 500), 1200);
|
||||
|
||||
// Check if the result step handles mermaid_code field
|
||||
echo "\n\n=== Look for mermaid_code field handler ===\n";
|
||||
if (preg_match_all('/mermaid_code[^,;]{0,300}/', $c, $m)) {
|
||||
foreach (array_slice($m[0], 0, 5) as $match) echo " " . substr($match, 0, 200) . "\n";
|
||||
}
|
||||
|
||||
// Also Resultat phase 5/5 rendering
|
||||
$pos3 = strpos($c, "Resultat");
|
||||
echo "\n\n=== Resultat: $pos3 ===\n";
|
||||
if ($pos3 !== false) echo substr($c, max(0, $pos3 - 100), 900);
|
||||
28
api/ambre-find-result2.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find "Resultat" encoded
|
||||
echo "=== Stage 5/5 result patterns ===\n";
|
||||
foreach (["'result'", "\"result\"", "R\u00e9sultat", "Schema Mermaid", "phase.*result", "etape.*5"] as $pat) {
|
||||
if (preg_match_all("/$pat/", $c, $m, PREG_OFFSET_CAPTURE)) {
|
||||
echo " '$pat' matches at: ";
|
||||
foreach (array_slice($m[0], 0, 3) as $hit) echo $hit[1] . " ";
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Find the SSE result handler code
|
||||
$pos = strpos($c, "type === 'result'");
|
||||
if ($pos === false) $pos = strpos($c, "type=='result'");
|
||||
if ($pos === false) $pos = strpos($c, "=== \"result\"");
|
||||
echo "\n=== result type at: $pos ===\n";
|
||||
if ($pos !== false) {
|
||||
echo substr($c, $pos, 1200);
|
||||
}
|
||||
|
||||
// Also search the output_data or schema_url handling
|
||||
echo "\n\n=== schema_url / output_data ===\n";
|
||||
if (preg_match_all('/schema_url|output_data|schema_content/', $c, $m)) {
|
||||
foreach ($m[0] as $match) echo " $match\n";
|
||||
}
|
||||
72
api/ambre-mermaid-wire.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
|
||||
// Find the done handler and augment it with mermaid rendering
|
||||
// The anchor: 'else if (type === \'done\') {' to its closing brace
|
||||
$anchor = "else if (type === 'done') {
|
||||
finalFileUrl = data.file_url;";
|
||||
|
||||
if (strpos($c, $anchor) === false) {
|
||||
echo json_encode(["error"=>"done handler anchor not found"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Replace with enhanced version that renders mermaid when detected
|
||||
$new = "else if (type === 'done') {
|
||||
finalFileUrl = data.file_url;
|
||||
// === AMBRE-V5-MERMAID-RENDER wave-263 ===
|
||||
// If fullResponse contains mermaid code → render SVG inline
|
||||
try {
|
||||
var _mcode = null;
|
||||
if (data.mermaid_code) _mcode = data.mermaid_code;
|
||||
else if (fullResponse) {
|
||||
// Detect mermaid patterns at start of response
|
||||
var _fr = fullResponse.trim();
|
||||
if (/^(sequenceDiagram|flowchart|graph\s+[A-Z]{1,2}|classDiagram|stateDiagram|erDiagram|gantt|pie|journey|gitGraph|mindmap|timeline)\b/.test(_fr)) {
|
||||
_mcode = _fr;
|
||||
} else {
|
||||
// Search inside for ``` mermaid block
|
||||
var _m = fullResponse.match(/```mermaid\\s*([\\s\\S]+?)```/);
|
||||
if (_m) _mcode = _m[1].trim();
|
||||
else {
|
||||
// or raw mermaid after 'Schema Mermaid:' label
|
||||
var _m2 = fullResponse.match(/(?:Schema Mermaid|Diagramme)[^\\n]*\\n([\\s\\S]+)$/i);
|
||||
if (_m2 && /^(sequenceDiagram|flowchart|graph|classDiagram|stateDiagram)/.test(_m2[1].trim())) _mcode = _m2[1].trim();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (_mcode && window.mermaid && currentPhaseEl) {
|
||||
// Sanitize accents for mermaid parser
|
||||
var _clean = _mcode.normalize ? _mcode.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '') : _mcode;
|
||||
var _svgId = 'wv-mermaid-' + Date.now() + '-' + Math.floor(Math.random()*999);
|
||||
var _mContainer = document.createElement('div');
|
||||
_mContainer.id = _svgId + '-wrap';
|
||||
_mContainer.style.cssText = 'margin-top:12px;padding:16px;background:#fafafa;border:1px solid #e5e7eb;border-radius:8px;overflow-x:auto';
|
||||
currentPhaseEl.appendChild(_mContainer);
|
||||
try {
|
||||
window.mermaid.render(_svgId, _clean).then(function(r){
|
||||
_mContainer.innerHTML = r.svg;
|
||||
}).catch(function(err){
|
||||
_mContainer.innerHTML = '<pre style=\"color:#b91c1c;font-size:11px\">Mermaid render error: ' + (err.message||err) + '\\n\\n' + _clean.replace(/</g,'<') + '</pre>';
|
||||
});
|
||||
} catch(e) {
|
||||
_mContainer.innerHTML = '<pre style=\"font-size:11px\">' + _clean.replace(/</g,'<') + '</pre>';
|
||||
}
|
||||
}
|
||||
} catch(eMermaid) { console.warn('[V5-MERMAID-RENDER]', eMermaid); }
|
||||
// === END AMBRE-V5-MERMAID-RENDER ===";
|
||||
|
||||
$c = str_replace($anchor, $new, $c);
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave263-mermaid";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
]);
|
||||
@@ -59,13 +59,13 @@
|
||||
},
|
||||
"suites": [
|
||||
{
|
||||
"title": "v52-open.spec.js",
|
||||
"file": "v52-open.spec.js",
|
||||
"title": "v55-scroll.spec.js",
|
||||
"file": "v55-scroll.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V52 · root / + open widget + inspect iframe after shield",
|
||||
"title": "V55 · scroll to see mermaid SVG",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
@@ -80,39 +80,27 @@
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 9340,
|
||||
"duration": 15641,
|
||||
"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"
|
||||
"text": "SVG rendered: {\n \"svg_visible\": true,\n \"svg_width\": 190.8125,\n \"svg_height\": 879,\n \"svg_html_size\": 16978,\n \"wrapper_id\": \"wv-mermaid-1776848871993-216-wrap\"\n}\n"
|
||||
}
|
||||
],
|
||||
"stderr": [],
|
||||
"retry": 0,
|
||||
"startTime": "2026-04-22T08:49:22.157Z",
|
||||
"startTime": "2026-04-22T09:07:39.425Z",
|
||||
"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"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/test-finished-1.png"
|
||||
},
|
||||
{
|
||||
"name": "video",
|
||||
"contentType": "video/webm",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v52-open-V52-·-root-open-widget-inspect-iframe-after-shield-chromium/video.webm"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/v55-scroll-V55-·-scroll-to-see-mermaid-SVG-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -120,8 +108,8 @@
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "028885fab629fbd685a3-634b9484450bcc32355a",
|
||||
"file": "v52-open.spec.js",
|
||||
"id": "a80a3706a9346f0b6665-b8967c5b4350315cdbe0",
|
||||
"file": "v55-scroll.spec.js",
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
@@ -130,8 +118,8 @@
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-22T08:49:21.507Z",
|
||||
"duration": 10195.55,
|
||||
"startTime": "2026-04-22T09:07:38.817Z",
|
||||
"duration": 16424.367,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
|
||||
|
Before Width: | Height: | Size: 229 KiB |
|
Before Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 227 KiB |
BIN
api/ambre-pw-tests/output/v55-full.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 87 KiB |
BIN
api/ambre-pw-tests/output/v55-scrolled.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
13
api/ambre-pw-tests/pdf_preview.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 900, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/generated/wevia-pdf-premium-20260422-093848-93ab87.html', { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(4000); // Wait for Chart.js
|
||||
|
||||
await page.screenshot({ path: '/tmp/v173-premium-pdf-preview.png', fullPage: true });
|
||||
console.log('OK');
|
||||
await browser.close();
|
||||
})();
|
||||
@@ -1,87 +0,0 @@
|
||||
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));
|
||||
});
|
||||
47
api/ambre-pw-tests/tests/v55-scroll.spec.js
Normal file
@@ -0,0 +1,47 @@
|
||||
const { test } = require("@playwright/test");
|
||||
|
||||
test("V55 · scroll to see mermaid SVG", async ({ page }) => {
|
||||
test.setTimeout(90000);
|
||||
|
||||
await page.goto("/wevia.html?cb=" + Date.now());
|
||||
await page.evaluate(() => { try{sessionStorage.clear();}catch(e){} });
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(3500);
|
||||
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({force:true});
|
||||
await input.fill("Genere un schema mermaid pour: architecture WEVIA souveraine");
|
||||
await page.waitForTimeout(400);
|
||||
await input.press("Enter");
|
||||
|
||||
// Wait for completion
|
||||
const ws = Date.now();
|
||||
while (Date.now() - ws < 60000) {
|
||||
const busy = await page.evaluate(() => window.busy || document.getElementById('sendBtn')?.disabled);
|
||||
const svgs = await page.locator('[id^="wv-mermaid-"] svg, .phase-content svg').count();
|
||||
if (!busy && svgs > 0) break;
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Scroll to the SVG
|
||||
const scrolled = await page.evaluate(() => {
|
||||
const svg = document.querySelector('[id^="wv-mermaid-"] svg, .phase-content svg');
|
||||
if (svg) {
|
||||
svg.scrollIntoView({block:'center', behavior:'instant'});
|
||||
return {
|
||||
svg_visible: svg.getBoundingClientRect().width > 10,
|
||||
svg_width: svg.getBoundingClientRect().width,
|
||||
svg_height: svg.getBoundingClientRect().height,
|
||||
svg_html_size: svg.outerHTML.length,
|
||||
wrapper_id: svg.parentElement?.id,
|
||||
};
|
||||
}
|
||||
return null;
|
||||
});
|
||||
console.log("SVG rendered:", JSON.stringify(scrolled, null, 2));
|
||||
|
||||
await page.waitForTimeout(500);
|
||||
await page.screenshot({ path: "output/v55-scrolled.png", fullPage: false });
|
||||
await page.screenshot({ path: "output/v55-full.png", fullPage: true });
|
||||
});
|
||||
58
api/ambre-pw-tests/v170_accents.js
Normal file
@@ -0,0 +1,58 @@
|
||||
// V170 · Test accents preserved + screenshot
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1280, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Type in chat
|
||||
const input = await page.locator('#msgInput, input[placeholder*="question"]').first();
|
||||
await input.click({force: true});
|
||||
await input.fill("Genere un schema mermaid pour: wevia architecture souveraine avec clés chiffrées et décryptage");
|
||||
await page.waitForTimeout(400);
|
||||
await input.press('Enter');
|
||||
console.log('SENT mermaid request');
|
||||
|
||||
// Wait for SSE completion + SVG render
|
||||
const start = Date.now();
|
||||
let svgInfo = null;
|
||||
while (Date.now() - start < 70000) {
|
||||
svgInfo = await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll('[id^="wv-mermaid-"]');
|
||||
if (svgs.length === 0) return null;
|
||||
const last = svgs[svgs.length - 1];
|
||||
const svg = last.querySelector('svg') || last.querySelector('[id*="wv-mermaid"]');
|
||||
if (!svg || !svg.outerHTML || svg.outerHTML.length < 500) return null;
|
||||
// Extract all text content from SVG
|
||||
const texts = Array.from(svg.querySelectorAll('text, foreignObject span, .nodeLabel')).map(t => t.textContent.trim()).filter(t => t.length > 0);
|
||||
return {
|
||||
found: true,
|
||||
svg_size: svg.outerHTML.length,
|
||||
texts: texts,
|
||||
has_accents: /[àâéèêëîïôùûüÿç]/i.test(svg.outerHTML),
|
||||
has_accent_cles: /cl[ée]s/i.test(svg.outerHTML),
|
||||
};
|
||||
});
|
||||
if (svgInfo && svgInfo.found) {
|
||||
console.log('SVG RENDERED:', JSON.stringify(svgInfo, null, 2));
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
|
||||
// Scroll to the SVG and screenshot
|
||||
await page.evaluate(() => {
|
||||
const svg = document.querySelector('[id^="wv-mermaid-"]:last-of-type');
|
||||
if (svg) svg.scrollIntoView({behavior: 'instant', block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.screenshot({ path: '/tmp/v170-mermaid-accents.png', fullPage: true });
|
||||
console.log('Screenshot saved to /tmp/v170-mermaid-accents.png');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
72
api/ambre-pw-tests/v172_all.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// V172 · Test ALL generations on /wevia.html + screenshots
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1200} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
const results = {};
|
||||
|
||||
const scenarios = [
|
||||
{ label: 'PDF', prompt: 'Genere un PDF professionnel sur: SAP S4HANA', screenshot: 'v172-01-pdf.png' },
|
||||
{ label: 'Code', prompt: 'Ecris le code React pour un composant Counter avec bouton +/-', screenshot: 'v172-02-code-react.png' },
|
||||
{ label: 'Mermaid', prompt: 'Genere un schema mermaid pour: architecture souveraine wevia', screenshot: 'v172-03-mermaid.png' },
|
||||
{ label: 'Image', prompt: 'Genere une image decrivant: dashboard moderne bleu', screenshot: 'v172-04-image.png' },
|
||||
{ label: 'Traduire', prompt: 'Traduis en anglais: bonjour comment allez-vous', screenshot: 'v172-05-translate.png' },
|
||||
{ label: 'Calc', prompt: '234 multiplie par 567', screenshot: 'v172-06-calc.png' },
|
||||
];
|
||||
|
||||
for (const sc of scenarios) {
|
||||
console.log(`\n═══ TEST: ${sc.label} ═══`);
|
||||
try {
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 15000 });
|
||||
await page.waitForTimeout(1500);
|
||||
|
||||
const input = await page.locator('#msgInput, input[placeholder*="question"]').first();
|
||||
await input.click({force: true});
|
||||
await input.fill(sc.prompt);
|
||||
await page.waitForTimeout(300);
|
||||
await input.press('Enter');
|
||||
console.log(`SENT: ${sc.prompt.substring(0,50)}`);
|
||||
|
||||
// Wait for completion (provider badge or final result)
|
||||
const start = Date.now();
|
||||
let done = false;
|
||||
while (Date.now() - start < 40000) {
|
||||
const state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
hasProvider: /provider:\s*wevia-stream/i.test(document.body.innerHTML),
|
||||
hasFooter: !!document.querySelector('.ambre-stream-container span'),
|
||||
has5Steps: document.querySelectorAll('.ambre-phase').length >= 4,
|
||||
hasDownloadLink: !!document.querySelector('a[href*="/generated/"]'),
|
||||
hasSvg: !!document.querySelector('[id^="wv-mermaid-"] svg'),
|
||||
hasCodeBlock: !!document.querySelector('pre code'),
|
||||
hasImage: !!document.querySelector('img[src*="/generated/"]'),
|
||||
}));
|
||||
if (!state.busy && state.has5Steps) {
|
||||
done = true;
|
||||
Object.assign(state, { elapsed_s: ((Date.now()-start)/1000).toFixed(1) });
|
||||
results[sc.label] = state;
|
||||
console.log(`DONE ${sc.label}: ${JSON.stringify(state)}`);
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
if (!done) console.log(`TIMEOUT ${sc.label}`);
|
||||
|
||||
// Screenshot
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: `/tmp/${sc.screenshot}`, fullPage: true });
|
||||
console.log(`Screenshot: /tmp/${sc.screenshot}`);
|
||||
} catch (e) {
|
||||
console.log(`ERROR ${sc.label}: ${e.message}`);
|
||||
results[sc.label] = { error: e.message };
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n═══ SUMMARY ═══');
|
||||
console.log(JSON.stringify(results, null, 2));
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
33
api/ambre-pw-tests/v172_mermaid_scroll.js
Normal file
@@ -0,0 +1,33 @@
|
||||
const { chromium } = require("playwright");
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ["--no-sandbox"] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
await page.goto("https://weval-consulting.com/wevia.html?cb=" + Date.now(), { waitUntil: "networkidle" });
|
||||
await page.waitForTimeout(2000);
|
||||
const input = await page.locator("#msgInput").first();
|
||||
await input.click({force:true});
|
||||
await input.fill("Genere un schema mermaid pour: authentification souveraine avec clés privées");
|
||||
await input.press("Enter");
|
||||
console.log("SENT");
|
||||
// Wait for SVG to appear
|
||||
let svgInfo = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
svgInfo = await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll("[id^=\"wv-mermaid-\"] svg");
|
||||
if (svgs.length === 0) return null;
|
||||
const last = svgs[svgs.length - 1];
|
||||
const texts = Array.from(last.querySelectorAll("text, foreignObject span, .nodeLabel")).map(t => t.textContent).filter(t=>t);
|
||||
return { svg_count: svgs.length, width: last.getBoundingClientRect().width, texts: texts.slice(0, 15), has_accents: /[àéèêëçô]/.test(last.outerHTML), svg_len: last.outerHTML.length };
|
||||
});
|
||||
if (svgInfo && svgInfo.svg_count > 0) break;
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
console.log("SVG INFO:", JSON.stringify(svgInfo, null, 2));
|
||||
// Scroll to SVG
|
||||
await page.evaluate(() => { const s = document.querySelector("[id^=\"wv-mermaid-\"] svg"); if (s) s.scrollIntoView({block:"center"}); });
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: "/tmp/v172-03b-mermaid-svg.png", fullPage: true });
|
||||
console.log("Screenshot saved");
|
||||
await browser.close();
|
||||
})();
|
||||
68
api/ambre-pw-tests/v173_upsell.js
Normal file
@@ -0,0 +1,68 @@
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere un PDF professionnel sur: SAP S4HANA ROI benefits');
|
||||
await input.press('Enter');
|
||||
console.log('PDF simple request sent');
|
||||
|
||||
// Wait for SSE done + upsell banner
|
||||
const start = Date.now();
|
||||
let state = null;
|
||||
while (Date.now() - start < 45000) {
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
has5Steps: document.querySelectorAll('.ambre-phase').length >= 4,
|
||||
hasPdfLink: !!document.querySelector('a[href*=".pdf"]'),
|
||||
hasUpsellBanner: !!document.querySelector('.v173-upsell'),
|
||||
hasUpsellBtn: !!document.getElementById('v173-generate'),
|
||||
}));
|
||||
if (!state.busy && state.hasUpsellBanner) break;
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
console.log('After PDF simple:', JSON.stringify(state));
|
||||
|
||||
// Screenshot showing the upsell banner
|
||||
await page.evaluate(() => {
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173-upsell-banner.png', fullPage: true });
|
||||
console.log('Screenshot 1 (upsell): saved');
|
||||
|
||||
// Click the upsell button
|
||||
if (state.hasUpsellBtn) {
|
||||
await page.click('#v173-generate');
|
||||
console.log('Clicked upsell');
|
||||
// Wait for enrichi PDF generation
|
||||
const start2 = Date.now();
|
||||
let state2 = null;
|
||||
while (Date.now() - start2 < 60000) {
|
||||
state2 = await page.evaluate(() => {
|
||||
const banner = document.querySelector('.v173-upsell');
|
||||
return {
|
||||
bannerText: banner?.textContent.substring(0, 100),
|
||||
hasEnrichedLink: !!document.querySelector('.v173-upsell a[href*=".pdf"]'),
|
||||
enrichedUrl: document.querySelector('.v173-upsell a[href*=".pdf"]')?.href,
|
||||
};
|
||||
});
|
||||
if (state2.hasEnrichedLink) break;
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
console.log('After enrichi click:', JSON.stringify(state2));
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173-upsell-enriched.png', fullPage: true });
|
||||
console.log('Screenshot 2 (enriched): saved');
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
42
api/ambre-pw-tests/v173_v2.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere un PDF professionnel sur: SAP S4HANA ROI');
|
||||
await page.waitForTimeout(500);
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
// Patient wait · 60s max
|
||||
for (let i=0; i<30; i++) {
|
||||
await page.waitForTimeout(2000);
|
||||
const hasBanner = await page.evaluate(() => !!document.querySelector('.v173-upsell'));
|
||||
const hasBtn = await page.evaluate(() => !!document.getElementById('v173-generate'));
|
||||
if (hasBanner && hasBtn) {
|
||||
console.log(`Banner appeared after ${i*2}s`);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll to banner
|
||||
await page.evaluate(() => {
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173b-banner-visible.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
// Show banner text
|
||||
const bannerText = await page.evaluate(() => document.querySelector('.v173-upsell')?.textContent.substring(0, 200));
|
||||
console.log('Banner:', bannerText);
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
65
api/ambre-pw-tests/v173_v3.js
Normal file
@@ -0,0 +1,65 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
// Capture console + errors
|
||||
page.on('console', msg => console.log('BROWSER:', msg.text().substring(0, 120)));
|
||||
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// Check input exists
|
||||
const inputExists = await page.evaluate(() => {
|
||||
const i = document.getElementById('msgInput');
|
||||
return { exists: !!i, tagName: i?.tagName, placeholder: i?.placeholder };
|
||||
});
|
||||
console.log('Input:', JSON.stringify(inputExists));
|
||||
|
||||
// Fill + dispatch via JS directly
|
||||
await page.evaluate(() => {
|
||||
const i = document.getElementById('msgInput');
|
||||
if (i) {
|
||||
i.value = 'Genere un PDF professionnel sur: SAP S4HANA ROI';
|
||||
i.focus();
|
||||
// Try sendMessage() or the form submit
|
||||
const sb = document.getElementById('sendBtn');
|
||||
if (sb && !sb.disabled) sb.click();
|
||||
}
|
||||
});
|
||||
console.log('Fill + click done');
|
||||
|
||||
// Wait patiently 70s checking state each 3s
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
const state = await page.evaluate(() => ({
|
||||
phase_count: document.querySelectorAll('.ambre-phase').length,
|
||||
messages_count: document.querySelectorAll('#messages > *').length,
|
||||
has_banner: !!document.querySelector('.v173-upsell'),
|
||||
busy: document.getElementById('sendBtn')?.disabled,
|
||||
}));
|
||||
console.log(`t+${i*3+3}s:`, JSON.stringify(state));
|
||||
if (state.has_banner) { console.log('BANNER VISIBLE!'); break; }
|
||||
}
|
||||
|
||||
// Final screenshot with scroll
|
||||
await page.evaluate(() => {
|
||||
const msgs = document.getElementById('messages');
|
||||
if (msgs) msgs.scrollTop = msgs.scrollHeight;
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v173c-final.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
const finalInfo = await page.evaluate(() => ({
|
||||
bannerHTML: document.querySelector('.v173-upsell')?.outerHTML?.substring(0, 500),
|
||||
phaseCount: document.querySelectorAll('.ambre-phase').length,
|
||||
}));
|
||||
console.log('FINAL:', JSON.stringify(finalInfo));
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
7
api/ambre-pw-v53-deploy.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTMgwrcgRmluYWwgcHJvb2Ygd2lkZ2V0IGNsZWFuIChubyBDbGF1ZGUgUGF0dGVybiBwYW5lbCkiLCBhc3luYyAoeyBwYWdlIH0pID0+IHsKICB0ZXN0LnNldFRpbWVvdXQoNjAwMDApOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLXdpZGdldC5odG1sP2NiPSIgKyBEYXRlLm5vdygpKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDAwKTsKICAKICBjb25zdCBzdGF0ZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgY29uc3QgYm9keVRleHQgPSBkb2N1bWVudC5ib2R5LmlubmVyVGV4dDsKICAgIHJldHVybiB7CiAgICAgIHZpc2libGVfY2xhdWRlX3BhdHRlcm5fdGV4dDogL0NsYXVkZVxzKlBhdHRlcm4vaS50ZXN0KGJvZHlUZXh0KSwKICAgICAgb3B1c19wYXR0ZXJuX2JhZGdlOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tYmFkZ2UnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJhZGdlJykub2Zmc2V0UGFyZW50ICE9PSBudWxsLAogICAgICBvcHVzX3BhdHRlcm5fbW9kYWw6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1tb2RhbCcpICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHVzLXBhdHRlcm4tbW9kYWwnKS5vZmZzZXRQYXJlbnQgIT09IG51bGwsCiAgICAgIG9wdXNfcGF0dGVybl9ib3g6ICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1ib3gnKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B1cy1wYXR0ZXJuLWJveCcpLm9mZnNldFBhcmVudCAhPT0gbnVsbCwKICAgICAgc2V2ZW5fcGhhc2VzX3Zpc2libGU6IC83IHBoYXNlcyBSRUFML2kudGVzdChib2R5VGV4dCksCiAgICAgIHNzZV9saXZlX3Zpc2libGU6IC9TU0UgbGl2ZS9pLnRlc3QoYm9keVRleHQpLAogICAgICBsYW5jZXJfdmlzaWJsZTogL0xhbmNlciBcKFNTRS9pLnRlc3QoYm9keVRleHQpLAogICAgICBzaGllbGRfbG9hZGVkOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbWJyZS1jb25maWRlbnRpYWwtc2hpZWxkJyksCiAgICAgIG9wdXNQYXR0ZXJuT3Blbl9uZXV0cmFsaXplZDogKHR5cGVvZiB3aW5kb3cuX19vcHVzUGF0dGVybk9wZW4gPT09ICdmdW5jdGlvbicpICYmIHdpbmRvdy5fX29wdXNQYXR0ZXJuT3Blbi50b1N0cmluZygpLmxlbmd0aCA8IDMwLAogICAgfTsKICB9KTsKICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMikpOwogIAogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjUzLWZpbmFsLXdpZGdldC5wbmciLCBmdWxsUGFnZTogZmFsc2UgfSk7CiAgCiAgLy8gVHJ5IGNhbGwgX19vcHVzUGF0dGVybk9wZW4gdG8gc2VlIGlmIG5ldXRyYWxpemVkCiAgY29uc3Qgb3BlblJlc3VsdCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gewogICAgdHJ5IHsKICAgICAgd2luZG93Ll9fb3B1c1BhdHRlcm5PcGVuKCk7CiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdXMtcGF0dGVybi1tb2RhbCcpOwogICAgICByZXR1cm4gbW9kYWwgPyAobW9kYWwub2Zmc2V0UGFyZW50ICE9PSBudWxsID8gIk9QRU5FRF9WSVNJQkxFIiA6ICJISURERU4iKSA6ICJOT19NT0RBTCI7CiAgICB9IGNhdGNoKGUpIHsgcmV0dXJuICJFUlJPUjogIiArIGUubWVzc2FnZTsgfQogIH0pOwogIGNvbnNvbGUubG9nKCJBZnRlciBfX29wdXNQYXR0ZXJuT3BlbiBjYWxsOiIsIG9wZW5SZXN1bHQpOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjUzLWFmdGVyLW9wZW4tYXR0ZW1wdC5wbmciIH0pOwp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v53-final.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v54.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTQgwrcgTWVybWFpZCBTVkcgcmVuZGVyIGluIHBoYXNlIDUvNSIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg5MDAwMCk7CiAgY29uc3QgbG9ncyA9IFtdOwogIHBhZ2Uub24oImNvbnNvbGUiLCBtID0+IGxvZ3MucHVzaChtLnRleHQoKS5zdWJzdHJpbmcoMCwgMjAwKSkpOwogIAogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWw/Y2I9IiArIERhdGUubm93KCkpOwogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4geyB0cnl7c2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTt9Y2F0Y2goZSl7fSB9KTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgzNTAwKTsKICAKICBjb25zdCBpbnB1dCA9IHBhZ2UubG9jYXRvcigiI21zZ0lucHV0Iik7CiAgYXdhaXQgaW5wdXQuY2xpY2soe2ZvcmNlOnRydWV9KTsKICBhd2FpdCBpbnB1dC5maWxsKCJHZW5lcmUgdW4gc2NoZW1hIG1lcm1haWQgcG91cjogd2V2aWEiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDQwMCk7CiAgYXdhaXQgaW5wdXQucHJlc3MoIkVudGVyIik7CiAgY29uc29sZS5sb2coIlNlbnQgbWVybWFpZCByZXF1ZXN0Iik7CiAgCiAgLy8gV2FpdCBmb3IgY29tcGxldGlvbgogIGNvbnN0IHdzID0gRGF0ZS5ub3coKTsKICBsZXQgcmVuZGVyZWQgPSBmYWxzZTsKICB3aGlsZSAoRGF0ZS5ub3coKSAtIHdzIDwgNjAwMDApIHsKICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICAgIC8vIExvb2sgZm9yIGEgcmVuZGVyZWQgU1ZHIGluIGFueSBhbWJyZS1waGFzZS1yZXN1bHQgb3IgcmVzdWx0IGJsb2NrCiAgICAgIGNvbnN0IHN2Z3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW1icmUtcGhhc2UtcmVzdWx0IHN2ZywgLnBoYXNlLWNvbnRlbnQgc3ZnLCBbaWRePSJ3di1tZXJtYWlkLSJdIHN2ZycpOwogICAgICBjb25zdCBoYXNTdmcgPSBzdmdzLmxlbmd0aCA+IDA7CiAgICAgIC8vIENoZWNrIFdFVklBLXBhdHRlcm4gdnMgQ2xhdWRlLXBhdHRlcm4gaW4gcmVuZGVyZWQgSFRNTAogICAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7CiAgICAgIHJldHVybiB7CiAgICAgICAgcGhhc2VfY291bnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbWJyZS1waGFzZScpLmxlbmd0aCwKICAgICAgICBzdmdfY291bnQ6IHN2Z3MubGVuZ3RoLAogICAgICAgIGhhc193ZXZpYV9wYXR0ZXJuOiAvV0VWSUFbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICAgIGhhc19jbGF1ZGVfcGF0dGVybjogL0NsYXVkZVstIF0/cGF0dGVybi9pLnRlc3QoaHRtbCksCiAgICAgICAgYnVzeTogISF3aW5kb3cuYnVzeSB8fCAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kQnRuJyk/LmRpc2FibGVkLAogICAgICB9OwogICAgfSk7CiAgICBpZiAoc3RhdGUuc3ZnX2NvdW50ID4gMCAmJiAhc3RhdGUuYnVzeSkgeyByZW5kZXJlZCA9IHRydWU7IGNvbnNvbGUubG9nKGBTVkcgcmVuZGVyZWQhIHN0YXRlPSR7SlNPTi5zdHJpbmdpZnkoc3RhdGUpfWApOyBicmVhazsgfQogICAgaWYgKCFzdGF0ZS5idXN5ICYmIHN0YXRlLnBoYXNlX2NvdW50ID49IDUpIHsKICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICAgICAgY29uc3QgczIgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbWJyZS1waGFzZS1yZXN1bHQgc3ZnLCAucGhhc2UtY29udGVudCBzdmcsIFtpZF49Ind2LW1lcm1haWQtIl0gc3ZnJykubGVuZ3RoKTsKICAgICAgY29uc29sZS5sb2coYEFmdGVyIHdhaXQ6ICR7czJ9IFNWR3MsIGJ1c3k9JHtzdGF0ZS5idXN5fWApOwogICAgICBpZiAoczIgPiAwKSByZW5kZXJlZCA9IHRydWU7CiAgICAgIGJyZWFrOwogICAgfQogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICB9CiAgCiAgY29uc3QgZWxhcHNlZCA9ICgoRGF0ZS5ub3coKS13cykvMTAwMCkudG9GaXhlZCgxKTsKICBjb25zdCBmaW5hbFN0YXRlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBodG1sID0gZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7CiAgICBjb25zdCBzdmdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFtYnJlLXBoYXNlLXJlc3VsdCBzdmcsIC5waGFzZS1jb250ZW50IHN2ZywgW2lkXj0id3YtbWVybWFpZC0iXSBzdmcnKTsKICAgIHJldHVybiB7CiAgICAgIHN2Z192aXNpYmxlOiBBcnJheS5mcm9tKHN2Z3MpLmZpbHRlcihzID0+IHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiAxMCkubGVuZ3RoLAogICAgICBzdmdfaHRtbF9sZW46IHN2Z3MubGVuZ3RoID4gMCA/IHN2Z3NbMF0ub3V0ZXJIVE1MLmxlbmd0aCA6IDAsCiAgICAgIGhhc193ZXZpYV9wYXR0ZXJuOiAvV0VWSUFbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICBoYXNfY2xhdWRlX3BhdHRlcm46IC9DbGF1ZGVbLSBdP3BhdHRlcm4vaS50ZXN0KGh0bWwpLAogICAgICBoYXNfbWVybWFpZF9jb2RlX3JhdzogL3NlcXVlbmNlRGlhZ3JhbXxmbG93Y2hhcnR8Z3JhcGhccytbQS1aXS9pLnRlc3QoaHRtbCksCiAgICB9OwogIH0pOwogIGNvbnNvbGUubG9nKGBcbuKVkOKVkOKVkCBGSU5BTCBpbiAke2VsYXBzZWR9cyDCtyByZW5kZXJlZD0ke3JlbmRlcmVkfSDilZDilZDilZBgKTsKICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShmaW5hbFN0YXRlLCBudWxsLCAyKSk7CiAgCiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTQtbWVybWFpZC1maW5hbC5wbmciLCBmdWxsUGFnZTogdHJ1ZSB9KTsKICAKICAvLyBBbHNvIGNoZWNrIHJlbGV2YW50IGxvZ3MKICBsb2dzLmZpbHRlcihsID0+IC9tZXJtYWlkfE1FUk1BSUR8cmVuZGVyfFY1L2kudGVzdChsKSkuZm9yRWFjaChsID0+IGNvbnNvbGUubG9nKCJMT0c6IiwgbCkpOwp9KTsK");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v54-mermaid.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
7
api/ambre-pw-v55.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode("Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7Cgp0ZXN0KCJWNTUgwrcgc2Nyb2xsIHRvIHNlZSBtZXJtYWlkIFNWRyIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg5MDAwMCk7CiAgCiAgYXdhaXQgcGFnZS5nb3RvKCIvd2V2aWEuaHRtbD9jYj0iICsgRGF0ZS5ub3coKSk7CiAgYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7IHRyeXtzZXNzaW9uU3RvcmFnZS5jbGVhcigpO31jYXRjaChlKXt9IH0pOwogIGF3YWl0IHBhZ2Uud2FpdEZvckxvYWRTdGF0ZSgibmV0d29ya2lkbGUiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDM1MDApOwogIAogIGNvbnN0IGlucHV0ID0gcGFnZS5sb2NhdG9yKCIjbXNnSW5wdXQiKTsKICBhd2FpdCBpbnB1dC5jbGljayh7Zm9yY2U6dHJ1ZX0pOwogIGF3YWl0IGlucHV0LmZpbGwoIkdlbmVyZSB1biBzY2hlbWEgbWVybWFpZCBwb3VyOiBhcmNoaXRlY3R1cmUgV0VWSUEgc291dmVyYWluZSIpOwogIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoNDAwKTsKICBhd2FpdCBpbnB1dC5wcmVzcygiRW50ZXIiKTsKICAKICAvLyBXYWl0IGZvciBjb21wbGV0aW9uCiAgY29uc3Qgd3MgPSBEYXRlLm5vdygpOwogIHdoaWxlIChEYXRlLm5vdygpIC0gd3MgPCA2MDAwMCkgewogICAgY29uc3QgYnVzeSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gd2luZG93LmJ1c3kgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbmRCdG4nKT8uZGlzYWJsZWQpOwogICAgY29uc3Qgc3ZncyA9IGF3YWl0IHBhZ2UubG9jYXRvcignW2lkXj0id3YtbWVybWFpZC0iXSBzdmcsIC5waGFzZS1jb250ZW50IHN2ZycpLmNvdW50KCk7CiAgICBpZiAoIWJ1c3kgJiYgc3ZncyA+IDApIGJyZWFrOwogICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICB9CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICAKICAvLyBTY3JvbGwgdG8gdGhlIFNWRwogIGNvbnN0IHNjcm9sbGVkID0gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaWRePSJ3di1tZXJtYWlkLSJdIHN2ZywgLnBoYXNlLWNvbnRlbnQgc3ZnJyk7CiAgICBpZiAoc3ZnKSB7CiAgICAgIHN2Zy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6J2NlbnRlcicsIGJlaGF2aW9yOidpbnN0YW50J30pOwogICAgICByZXR1cm4gewogICAgICAgIHN2Z192aXNpYmxlOiBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiAxMCwKICAgICAgICBzdmdfd2lkdGg6IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCwKICAgICAgICBzdmdfaGVpZ2h0OiBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LAogICAgICAgIHN2Z19odG1sX3NpemU6IHN2Zy5vdXRlckhUTUwubGVuZ3RoLAogICAgICAgIHdyYXBwZXJfaWQ6IHN2Zy5wYXJlbnRFbGVtZW50Py5pZCwKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0pOwogIGNvbnNvbGUubG9nKCJTVkcgcmVuZGVyZWQ6IiwgSlNPTi5zdHJpbmdpZnkoc2Nyb2xsZWQsIG51bGwsIDIpKTsKICAKICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDUwMCk7CiAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogIm91dHB1dC92NTUtc2Nyb2xsZWQucG5nIiwgZnVsbFBhZ2U6IGZhbHNlIH0pOwogIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6ICJvdXRwdXQvdjU1LWZ1bGwucG5nIiwgZnVsbFBhZ2U6IHRydWUgfSk7Cn0pOwo=");
|
||||
foreach (glob("$base/*.spec.js") as $old) @unlink($old);
|
||||
$written = @file_put_contents("$base/v55-scroll.spec.js", $spec);
|
||||
echo json_encode(["written" => $written]);
|
||||
55
api/ambre-rename-claude.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$path = "/var/www/html/wevia.html";
|
||||
$c = @file_get_contents($path);
|
||||
$orig = strlen($c);
|
||||
$changes = [];
|
||||
|
||||
// Fix 1: rename "WEVIA Claude-pattern" in header
|
||||
$c_new = preg_replace("/<strong>WEVIA Claude[- ]?pattern<\/strong>/i", "<strong>WEVIA-pattern</strong>", $c);
|
||||
$c_new = preg_replace("/WEVIA Claude[- ]?pattern/", "WEVIA-pattern", $c_new);
|
||||
if ($c_new !== $c) {
|
||||
$changes[] = "renamed_WEVIA_Claude_pattern";
|
||||
$c = $c_new;
|
||||
}
|
||||
|
||||
// Fix 2: Remove any "Claude" mentions in phase labels
|
||||
$c_new = str_replace("Claude Pattern", "WEVIA-Pattern", $c);
|
||||
$c_new = str_replace("claude-pattern", "wevia-pattern", $c_new);
|
||||
$c_new = str_replace("Claude-pattern", "WEVIA-pattern", $c_new);
|
||||
if ($c_new !== $c) {
|
||||
$changes[] = "renamed_claude_pattern_generic";
|
||||
$c = $c_new;
|
||||
}
|
||||
|
||||
// Fix 3: Remove mentions of "Claude" alone that are confidential
|
||||
// But KEEP internal vars like _claude_xxx since they're code
|
||||
// Target ONLY user-facing strings (between quotes or HTML text)
|
||||
$user_facing_replacements = [
|
||||
"'Claude'" => "'WEVIA'",
|
||||
"\"Claude\"" => "\"WEVIA\"",
|
||||
">Claude<" => ">WEVIA<",
|
||||
"'Claude pattern'" => "'WEVIA pattern'",
|
||||
"\"Claude pattern\"" => "\"WEVIA pattern\"",
|
||||
];
|
||||
foreach ($user_facing_replacements as $k => $v) {
|
||||
if (strpos($c, $k) !== false) {
|
||||
$c = str_replace($k, $v, $c);
|
||||
$changes[] = "replaced_" . md5($k);
|
||||
}
|
||||
}
|
||||
|
||||
// Verify no more "Claude-pattern" in UI
|
||||
$out_count = substr_count($c, "Claude-pattern") + substr_count($c, "Claude pattern") + substr_count($c, "Claude Pattern");
|
||||
|
||||
$backup = "/opt/wevads/vault/wevia.html.GOLD-" . date("Ymd-His") . "-wave263-rename";
|
||||
@copy($path, $backup);
|
||||
$wrote = @file_put_contents($path, $c);
|
||||
|
||||
echo json_encode([
|
||||
"delta" => strlen($c) - $orig,
|
||||
"wrote" => $wrote,
|
||||
"backup" => basename($backup),
|
||||
"changes" => $changes,
|
||||
"remaining_claude_pattern_count" => $out_count,
|
||||
]);
|
||||
43
api/ambre-scan-claude.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Files that render "Claude" or "Claude-pattern" badge VISIBLE on public wevia.html
|
||||
$w = @file_get_contents("/var/www/html/wevia.html");
|
||||
$out["wevia_html"] = [
|
||||
"size" => strlen($w),
|
||||
"claude_text_count" => substr_count($w, "Claude"),
|
||||
"claude_pattern_count" => preg_match_all("/Claude[\s\-]?pattern/i", $w),
|
||||
"WEVIA_Claude_pattern" => substr_count($w, "WEVIA Claude-pattern"),
|
||||
"Claude_pattern_span" => preg_match_all("/<span[^>]*>Claude[\s\-]?[Pp]attern/i", $w),
|
||||
];
|
||||
|
||||
// Find the exact rendering in wevia.html
|
||||
$pos = strpos($w, "Claude-pattern");
|
||||
if ($pos === false) $pos = strpos($w, "Claude pattern");
|
||||
if ($pos === false) $pos = strpos($w, "WEVIA Claude");
|
||||
if ($pos !== false) $out["wevia_context"] = substr($w, max(0, $pos - 200), 500);
|
||||
|
||||
// Mermaid generator - check output
|
||||
$mp = @file_get_contents("/var/www/html/api/ambre-tool-mermaid.php");
|
||||
$out["mermaid_tool"] = [
|
||||
"size" => strlen($mp ?? ""),
|
||||
"exists" => file_exists("/var/www/html/api/ambre-tool-mermaid.php"),
|
||||
];
|
||||
|
||||
// Find V5-claude-pattern source
|
||||
$out["claude_pattern_sources"] = trim(@shell_exec("grep -lE 'claude[- ]?pattern|Claude[- ]?[Pp]attern' /var/www/html/wevia.html /var/www/html/*.html /var/www/html/api/*.php 2>/dev/null | head -10"));
|
||||
|
||||
// Check V5-CLAUDE-PATTERN block in wevia.html
|
||||
if (preg_match("/\/\/ === AMBRE-V5-CLAUDE-PATTERN.{0,10000}\/\/ === END AMBRE-V5-CLAUDE-PATTERN/s", $w, $m)) {
|
||||
$out["v5_block_size"] = strlen($m[0]);
|
||||
// Extract the rendered badges
|
||||
if (preg_match_all('/["\']WEVIA[^"\']*Claude[^"\']*pattern[^"\']*["\']/', $m[0], $badges)) {
|
||||
$out["v5_badges"] = $badges[0];
|
||||
}
|
||||
if (preg_match_all('/["\']WEVIA[- ]?pattern["\']/i', $m[0], $badges2)) {
|
||||
$out["v5_badges_alt"] = $badges2[0];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
15
api/ambre-sse2.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
echo "size: " . strlen($c) . "\n";
|
||||
echo "Claude count: " . substr_count($c, "Claude") . "\n";
|
||||
echo "WEVIA-pattern: " . preg_match_all("/WEVIA[- ]?[pP]attern/", $c) . "\n";
|
||||
|
||||
// Find around "phase" type handling
|
||||
$pos = strpos($c, "type === 'header'");
|
||||
if ($pos === false) $pos = strpos($c, 'type==="header"');
|
||||
if ($pos === false) $pos = strpos($c, "'header'");
|
||||
echo "header pos: $pos\n";
|
||||
if ($pos !== false) {
|
||||
echo substr($c, $pos, 2500);
|
||||
}
|
||||
11
api/ambre-sse3.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
|
||||
// Find WEVIA-pattern header rendering - that's the SSE handler for 'header' type
|
||||
$pos = strpos($c, "WEVIA-pattern");
|
||||
echo "WEVIA-pattern 1st at: $pos\n\n";
|
||||
if ($pos !== false) {
|
||||
echo "=== Context (go back to find handler start) ===\n";
|
||||
echo substr($c, max(0, $pos - 1500), 3000);
|
||||
}
|
||||
9
api/ambre-sse4.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$c = @file_get_contents("/var/www/html/wevia.html");
|
||||
// Get the rest of handleEvent (from WEVIA-pattern onwards to end of function)
|
||||
$pos = strpos($c, "WEVIA-pattern");
|
||||
$end = strpos($c, "eventSource.close", $pos);
|
||||
if ($end === false) $end = $pos + 6000;
|
||||
echo "=== handleEvent from 96870 to " . ($pos + 6000) . " ===\n";
|
||||
echo substr($c, $pos + 1800, 5000);
|
||||
184
api/ambre-xlsx-gen.php
Normal file
@@ -0,0 +1,184 @@
|
||||
<?php
|
||||
/**
|
||||
* V174 · ambre-xlsx-gen.php
|
||||
* Real XLSX generation using Python openpyxl via shell_exec
|
||||
* Yacine: Excel KO · genere docx au lieu xlsx
|
||||
* Cause: ambre-xlsx-gen.php missing, fallback to docx
|
||||
* Fix: this file generates real xlsx via openpyxl (already installed)
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(60);
|
||||
$t0 = microtime(true);
|
||||
|
||||
$topic = trim($_GET["topic"] ?? $_POST["topic"] ?? "");
|
||||
if (!$topic) {
|
||||
echo json_encode(["error"=>"topic required"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 1. Use LLM to generate JSON structure for the spreadsheet
|
||||
$sys = "Tu es generateur de donnees spreadsheet. Reponds UNIQUEMENT avec JSON valide, pas de markdown. Schema: {\"sheet_name\":\"...\",\"headers\":[\"col1\",\"col2\",...],\"rows\":[[\"val1\",\"val2\",...],...],\"kpis\":{\"metric\":\"value\",...}}. MAX 8 columns, 15 rows. Donnees realistes en francais avec chiffres et pourcentages.";
|
||||
$user = "Genere donnees spreadsheet pour: $topic";
|
||||
$llm_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => json_encode([
|
||||
"model" => "fast",
|
||||
"messages" => [
|
||||
["role"=>"system","content"=>$sys],
|
||||
["role"=>"user","content"=>$user],
|
||||
],
|
||||
"max_tokens" => 1200,
|
||||
"temperature" => 0.3,
|
||||
]),
|
||||
"timeout" => 30,
|
||||
],
|
||||
]));
|
||||
$llm_d = @json_decode($llm_raw, true);
|
||||
$content = $llm_d["choices"][0]["message"]["content"] ?? "";
|
||||
$content = trim(preg_replace("/```(?:json)?\n?|```/", "", $content));
|
||||
|
||||
// Parse JSON
|
||||
$data = @json_decode($content, true);
|
||||
if (!$data || !isset($data["headers"]) || !isset($data["rows"])) {
|
||||
// Fallback minimal
|
||||
$data = [
|
||||
"sheet_name" => mb_substr($topic, 0, 30),
|
||||
"headers" => ["Categorie", "Valeur", "Pourcentage"],
|
||||
"rows" => [
|
||||
["Donnee 1", 100, "25%"],
|
||||
["Donnee 2", 200, "50%"],
|
||||
["Donnee 3", 300, "75%"],
|
||||
],
|
||||
"kpis" => ["Total"=>"600","Moyenne"=>"200"],
|
||||
];
|
||||
}
|
||||
|
||||
// 2. Call Python script to generate xlsx
|
||||
$slug = preg_replace("/[^a-z0-9-]/", "-", strtolower($topic));
|
||||
$slug = trim(preg_replace("/-+/", "-", $slug), "-");
|
||||
$slug = mb_substr($slug, 0, 40);
|
||||
$filename = "wevia-xlsx-" . $slug . "-" . date("Ymd-His") . "-" . substr(md5($topic.rand()), 0, 6) . ".xlsx";
|
||||
$filepath = "/var/www/html/generated/" . $filename;
|
||||
|
||||
// JSON data file for Python to read (avoid shell escaping issues)
|
||||
$json_tmp = "/tmp/wevia-xlsx-" . uniqid() . ".json";
|
||||
file_put_contents($json_tmp, json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$py_script = <<<'PYEND'
|
||||
import json, sys, openpyxl
|
||||
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
||||
from openpyxl.chart import BarChart, Reference
|
||||
json_file = sys.argv[1]
|
||||
xlsx_out = sys.argv[2]
|
||||
topic = sys.argv[3]
|
||||
with open(json_file) as f:
|
||||
data = json.load(f)
|
||||
wb = openpyxl.Workbook()
|
||||
ws = wb.active
|
||||
ws.title = (data.get("sheet_name") or topic[:30])[:30]
|
||||
# Header styling
|
||||
header_font = Font(bold=True, color="FFFFFF", size=12)
|
||||
header_fill = PatternFill(start_color="6366F1", end_color="6366F1", fill_type="solid")
|
||||
header_align = Alignment(horizontal="center", vertical="center")
|
||||
# Title row
|
||||
ws["A1"] = topic
|
||||
ws["A1"].font = Font(bold=True, size=16, color="4338CA")
|
||||
ws["A1"].alignment = Alignment(horizontal="left", vertical="center")
|
||||
ws.row_dimensions[1].height = 30
|
||||
# Headers row 3
|
||||
headers = data.get("headers", [])
|
||||
for i, h in enumerate(headers):
|
||||
cell = ws.cell(row=3, column=i+1, value=h)
|
||||
cell.font = header_font
|
||||
cell.fill = header_fill
|
||||
cell.alignment = header_align
|
||||
# Data rows
|
||||
rows = data.get("rows", [])
|
||||
for ri, row in enumerate(rows):
|
||||
for ci, val in enumerate(row):
|
||||
c = ws.cell(row=4+ri, column=ci+1, value=val)
|
||||
c.alignment = Alignment(vertical="center")
|
||||
if ri % 2 == 0:
|
||||
c.fill = PatternFill(start_color="F1F5F9", end_color="F1F5F9", fill_type="solid")
|
||||
# Column widths
|
||||
for i, h in enumerate(headers):
|
||||
ws.column_dimensions[chr(65+i)].width = max(15, len(str(h))+5)
|
||||
# KPIs section
|
||||
kpi_row = 4 + len(rows) + 2
|
||||
kpis = data.get("kpis", {})
|
||||
if kpis:
|
||||
kpi_cell = ws.cell(row=kpi_row, column=1, value="KPIs")
|
||||
kpi_cell.font = Font(bold=True, size=14, color="4338CA")
|
||||
for i, (k, v) in enumerate(kpis.items()):
|
||||
ws.cell(row=kpi_row+1+i, column=1, value=k).font = Font(bold=True)
|
||||
ws.cell(row=kpi_row+1+i, column=2, value=v)
|
||||
# Add chart if numeric data
|
||||
try:
|
||||
numeric_col = None
|
||||
for ci, h in enumerate(headers):
|
||||
if any(isinstance(r[ci], (int, float)) if ci < len(r) else False for r in rows):
|
||||
numeric_col = ci
|
||||
break
|
||||
if numeric_col is not None and len(rows) > 0:
|
||||
chart = BarChart()
|
||||
chart.title = "Visualisation"
|
||||
chart.style = 13
|
||||
data_ref = Reference(ws, min_col=numeric_col+1, min_row=3, max_row=3+len(rows), max_col=numeric_col+1)
|
||||
cats_ref = Reference(ws, min_col=1, min_row=4, max_row=3+len(rows))
|
||||
chart.add_data(data_ref, titles_from_data=True)
|
||||
chart.set_categories(cats_ref)
|
||||
chart.width = 15
|
||||
chart.height = 8
|
||||
ws.add_chart(chart, f"E{kpi_row}")
|
||||
except Exception as e:
|
||||
print(f"Chart error: {e}", file=sys.stderr)
|
||||
wb.save(xlsx_out)
|
||||
print("OK")
|
||||
PYEND;
|
||||
|
||||
$py_tmp = "/tmp/wevia-xlsx-gen-" . uniqid() . ".py";
|
||||
file_put_contents($py_tmp, $py_script);
|
||||
|
||||
$cmd = "python3 " . escapeshellarg($py_tmp) . " " . escapeshellarg($json_tmp) . " " . escapeshellarg($filepath) . " " . escapeshellarg($topic) . " 2>&1";
|
||||
$out = shell_exec($cmd);
|
||||
@unlink($py_tmp);
|
||||
@unlink($json_tmp);
|
||||
|
||||
if (!file_exists($filepath) || filesize($filepath) < 100) {
|
||||
echo json_encode(["error"=>"xlsx generation failed","python_out"=>$out]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$size = filesize($filepath);
|
||||
$elapsed = round((microtime(true) - $t0) * 1000);
|
||||
$full_url = "https://weval-consulting.com/generated/" . $filename;
|
||||
|
||||
// Build preview text
|
||||
$preview = "📊 **" . $topic . "** (Excel reel avec graphique)\n\n";
|
||||
$preview .= "Feuille: " . ($data["sheet_name"] ?? $topic) . "\n";
|
||||
$preview .= "Colonnes: " . count($data["headers"] ?? []) . " · Lignes: " . count($data["rows"] ?? []) . "\n";
|
||||
if (!empty($data["kpis"])) {
|
||||
$preview .= "\nKPIs:\n";
|
||||
foreach ($data["kpis"] as $k => $v) {
|
||||
$preview .= "- **$k**: $v\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"url" => "/generated/" . $filename,
|
||||
"full_url" => $full_url,
|
||||
"size_bytes" => $size,
|
||||
"size_human" => round($size/1024, 1) . "KB",
|
||||
"elapsed_ms" => $elapsed,
|
||||
"engine" => "openpyxl",
|
||||
"provider" => "WEVIA XLSX Engine V174",
|
||||
"topic" => $topic,
|
||||
"preview" => $preview,
|
||||
"sheet_name" => $data["sheet_name"] ?? $topic,
|
||||
"rows_count" => count($data["rows"] ?? []),
|
||||
"columns_count" => count($data["headers"] ?? []),
|
||||
"has_chart" => true,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-22 08:30:01",
|
||||
"generated": "2026-04-22 13:30:02",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 86,
|
||||
"disk_avail": "22G",
|
||||
"uptime": "up 1 week, 22 hours, 38 minutes",
|
||||
"disk_pct": 87,
|
||||
"disk_avail": "20G",
|
||||
"uptime": "up 1 week, 1 day, 3 hours, 38 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -36,17 +36,17 @@
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up Less than a second",
|
||||
"status": "Up 1 second",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -81,7 +81,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -290,9 +290,9 @@
|
||||
}
|
||||
],
|
||||
"screens": {
|
||||
"s204_html": 327,
|
||||
"s204_html": 328,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 1046,
|
||||
"s204_api_php": 1074,
|
||||
"s204_wevia_php": 254,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -316,7 +316,7 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5699,
|
||||
"kb_learnings": 5770,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -616,15 +616,15 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5699,
|
||||
"total_entries": 5770,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3090"
|
||||
"cnt": "3150"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1253"
|
||||
"cnt": "1264"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1724,54 +1724,54 @@
|
||||
"fast_lines": 3718,
|
||||
"router_lines": 6152,
|
||||
"router_functions": 17,
|
||||
"today_requests": 0,
|
||||
"today_requests": 2,
|
||||
"today_cost": 0,
|
||||
"avg_latency_ms": 0,
|
||||
"top_provider": "N\/A",
|
||||
"providers_used": 0
|
||||
"avg_latency_ms": 8754,
|
||||
"top_provider": "nvidia",
|
||||
"providers_used": 1
|
||||
},
|
||||
"optimizations": {
|
||||
"recent_commits": [],
|
||||
"auto_fixes": [
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:25:05.043155"
|
||||
"fact": "AUTONOMY 22Apr 13:25: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:25:05.773153"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:20: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:20:05.6286"
|
||||
"fact": "AUTONOMY 22Apr 13:20: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:20:06.499966"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:15: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:15:06.533813"
|
||||
"fact": "AUTONOMY 22Apr 13:15: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:15:06.860963"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:10: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:10:06.375058"
|
||||
"fact": "AUTONOMY 22Apr 13:10: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:10:05.390973"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:05: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:05:05.386486"
|
||||
"fact": "AUTONOMY 22Apr 13:05: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:05:05.583676"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:00: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:00:08.200387"
|
||||
"fact": "AUTONOMY 22Apr 13:00: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:00:10.390288"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 07:55: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:55:05.077922"
|
||||
"fact": "AUTONOMY 22Apr 12:55: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:55:05.790119"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 07:50: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:50:06.264413"
|
||||
"fact": "AUTONOMY 22Apr 12:50: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:50:05.973206"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 07:45: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:45:05.356474"
|
||||
"fact": "AUTONOMY 22Apr 12:45: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:45:05.70786"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 07:40: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 09:40:05.738663"
|
||||
"fact": "AUTONOMY 22Apr 12:40: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:40:05.065451"
|
||||
}
|
||||
],
|
||||
"architecture_decisions": [
|
||||
@@ -1960,7 +1960,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 3016,
|
||||
"scan_time_ms": 3889,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T10:50:02.021965",
|
||||
"generated_at": "2026-04-22T15:55:01.534737",
|
||||
"stats": {
|
||||
"total": 50,
|
||||
"pending": 32,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-22T10:45:01.745593",
|
||||
"last_heartbeat": "2026-04-22T10:45:01.745593",
|
||||
"last_heartbeat_ts_epoch": 1776847501,
|
||||
"ts": "2026-04-22T15:45:02.144326",
|
||||
"last_heartbeat": "2026-04-22T15:45:02.144326",
|
||||
"last_heartbeat_ts_epoch": 1776865502,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# WEVIA Master — System Documentation
|
||||
Generated: Wed Apr 22 12:00:01 AM CEST 2026
|
||||
Generated: Wed Apr 22 12:00:02 PM CEST 2026
|
||||
|
||||
## APIs (252)
|
||||
## APIs (254)
|
||||
wevia-action-engine.php
|
||||
wevia-actions.php
|
||||
wevia-admin-crm-bridge.php
|
||||
@@ -51,6 +51,7 @@ wevia-bvs-api.php
|
||||
wevia-capabilities-ext.php
|
||||
wevia-capabilities-faq-v81.php
|
||||
wevia-capabilities.php
|
||||
wevia-chat-memory.php
|
||||
wevia-chat.php
|
||||
wevia-chat-relay.php
|
||||
wevia-chat-test.php
|
||||
@@ -92,6 +93,7 @@ wevia-enterprise-fleet.php
|
||||
wevia-enterprise.php
|
||||
wevia-exec-intercept.php
|
||||
wevia-exec.php
|
||||
wevia-factory.php
|
||||
wevia-fast-path.php
|
||||
wevia-fast-path-v3.php
|
||||
wevia-fiability.php
|
||||
@@ -255,7 +257,7 @@ wevia-wave114-intents.php
|
||||
wevia-wave114.php
|
||||
wevia-webchat-direct.php
|
||||
|
||||
## Scripts (43)
|
||||
## Scripts (45)
|
||||
wevia-antiregression.py
|
||||
wevia-autodoc.sh
|
||||
wevia-autointent-sync.sh
|
||||
@@ -275,6 +277,7 @@ wevia-deepseek-web.py
|
||||
wevia-full-test.py
|
||||
wevia-gap-analyzer.py
|
||||
wevia-intel.sh
|
||||
wevia-intents-pool.sh
|
||||
wevia-l99-autofix.py
|
||||
wevia-llm-worker.py
|
||||
wevia-master-test.py
|
||||
@@ -286,6 +289,7 @@ wevia-register-agent.py
|
||||
wevia-renew-pat.py
|
||||
wevia-self-doc.sh
|
||||
wevia-selfmanage.sh
|
||||
wevia-self-meta.sh
|
||||
wevia-site-builder.php
|
||||
wevia-site-builder-v1-dark.php
|
||||
wevia-site-builder-v2-light-pre-em.php
|
||||
@@ -300,7 +304,7 @@ wevia-ux-agent.py
|
||||
wevia-webchat-api.py
|
||||
wevia-webwide.py
|
||||
|
||||
## Crons (85)
|
||||
## Crons (86)
|
||||
*/10 * * * * /usr/bin/python3 /opt/weval-l99/screens-autodiscovery.py >> /var/log/screens-autodiscovery.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-blade-ctl.sh status >> /var/log/wevia-blade.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-pilot.sh
|
||||
@@ -353,9 +357,10 @@ wevia-webwide.py
|
||||
0 */6 * * * php /var/www/html/api/auto-key-renew.php >> /var/log/key-renew.log 2>&1
|
||||
0 */6 * * * sudo python3 /opt/weval-security/key-sync.py >> /var/log/security-sync.log 2>&1
|
||||
0 */6 * * * timeout 900 python3 /opt/weval-l99/l99-deep-scan.py >> /var/log/l99-deep-scan.log 2>&1
|
||||
0 1 * * * python3 /opt/ethica-enrich-v4.py 300 >> /var/log/ethica-enrich-v4.log 2>&1
|
||||
0 10 * * * python3 /opt/ethica-enrich-searxng.py 200 >> /var/log/ethica-enrich-searxng.log 2>&1
|
||||
0 11,23 * * * python3 /opt/ethica-richscraper.py 500 >> /var/log/ethica-richscraper.log 2>&1
|
||||
0 1 * * * python3 /opt/ethica-enrich-v4.py 600 >> /var/log/ethica-enrich-v4.log 2>&1
|
||||
0 10 * * * python3 /opt/ethica-enrich-searxng.py 500 >> /var/log/ethica-enrich-searxng.log 2>&1
|
||||
0 16 * * * python3 /opt/ethica-enrich-searxng.py 500 >> /var/log/ethica-enrich-searxng.log 2>&1 # V152 second run/day for DZ enrichment
|
||||
0 11,23 * * * python3 /opt/ethica-richscraper.py 1000 >> /var/log/ethica-richscraper.log 2>&1
|
||||
0 2 * * * /usr/bin/python3 /opt/weval-ops/kpi-snapshot-daily.py >> /var/log/weval/kpi-daily.log 2>&1
|
||||
0 2 * * 0 python3 /opt/tabibi-scraper.py >> /var/log/tabibi-scraper.log 2>&1
|
||||
0 3 * * * bash /opt/weval-l99/wtp-integrity-daily.sh >> /var/log/wtp-integrity.log 2>&1
|
||||
@@ -381,13 +386,13 @@ wevia-webwide.py
|
||||
## Ollama Models
|
||||
|
||||
## Docker (20 containers)
|
||||
weval-docuseal Up 5 seconds
|
||||
weval-docuseal Up 7 seconds
|
||||
loki Up 5 days
|
||||
listmonk Up 5 days
|
||||
listmonk Up 6 days
|
||||
plausible-plausible-1 Up 4 days
|
||||
plausible-plausible-db-1 Up 4 days
|
||||
plausible-plausible-events-db-1 Up 4 days
|
||||
n8n-docker-n8n-1 Up 5 days
|
||||
mattermost-docker-mm-db-1 Up 5 days
|
||||
mattermost-docker-mattermost-1 Up 5 days (healthy)
|
||||
twenty Up 5 days
|
||||
n8n-docker-n8n-1 Up 6 days
|
||||
mattermost-docker-mm-db-1 Up 6 days
|
||||
mattermost-docker-mattermost-1 Up 6 days (healthy)
|
||||
twenty Up 6 days
|
||||
|
||||
15
api/blade-tasks/key_gemini_key_20260422.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "key_renewal",
|
||||
"provider": "GEMINI_KEY",
|
||||
"reason": "FAIL",
|
||||
"urls": {
|
||||
"GITHUB_TOKEN": "https:\/\/github.com\/settings\/tokens\/new?scopes=repo,workflow&description=WEVIA-Auto",
|
||||
"GROQ_KEY": "https:\/\/console.groq.com\/keys",
|
||||
"CEREBRAS_API_KEY": "https:\/\/cloud.cerebras.ai\/platform",
|
||||
"GEMINI_KEY": "https:\/\/aistudio.google.com\/apikey",
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T10:05:31+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T10:06:37+00:00",
|
||||
"priority": "P0"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T10:06:37+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T10:06:37+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 08:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "20",
|
||||
"ram": "13Gi/30Gi",
|
||||
"disk": "86%",
|
||||
"load": "3.12",
|
||||
"uptime": "up 1 week, 20 hours, 8 minutes"
|
||||
"load": "11.95",
|
||||
"uptime": "up 1 week, 1 day, 8 minutes"
|
||||
},
|
||||
"services": "8/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
@@ -15,7 +15,7 @@
|
||||
"crons": "44 active",
|
||||
"routes": "446",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "2252 entries",
|
||||
"wiki": "2296 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
{
|
||||
"ts": "2026-04-22T13:55:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 7.37,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 13644,
|
||||
"ram_free_mb": 17690,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "124G",
|
||||
"disk_free": "20G",
|
||||
"disk_pct": "87%",
|
||||
"fpm_workers": 140,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.18,
|
||||
"disk_pct": "83%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12113
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
"name": "SER6",
|
||||
"ip": "110.239.84.121",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER7",
|
||||
"ip": "110.239.65.64",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER8",
|
||||
"ip": "182.160.55.107",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER9",
|
||||
"ip": "110.239.86.68",
|
||||
"status": "DOWN"
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 328,
|
||||
"php_apis": 1074,
|
||||
"wiki_entries": 2324,
|
||||
"vault_doctrines": 123,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 649,
|
||||
"registry_version": "?"
|
||||
},
|
||||
"sovereign": {
|
||||
"status": "UP",
|
||||
"providers": [
|
||||
"Cerebras-fast",
|
||||
"Cerebras-think",
|
||||
"Groq",
|
||||
"Cloudflare-AI",
|
||||
"Gemini",
|
||||
"SambaNova",
|
||||
"NVIDIA-NIM",
|
||||
"Mistral",
|
||||
"Groq-OSS",
|
||||
"HF-Space",
|
||||
"HF-Router",
|
||||
"OpenRouter",
|
||||
"GitHub-Models"
|
||||
],
|
||||
"active": 13,
|
||||
"total": 13,
|
||||
"primary": "Cerebras-fast",
|
||||
"cost": "0€"
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 166742,
|
||||
"with_email": 110734,
|
||||
"with_phone": 159846,
|
||||
"gap_email": 56008,
|
||||
"pct_email": 66.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 127343,
|
||||
"with_email": 78611,
|
||||
"with_tel": 124087,
|
||||
"pct_email": 61.7,
|
||||
"pct_tel": 97.4
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19724,
|
||||
"with_email": 15084,
|
||||
"with_tel": 18739,
|
||||
"pct_email": 76.5,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17796,
|
||||
"with_email": 15160,
|
||||
"with_tel": 17020,
|
||||
"pct_email": 85.2,
|
||||
"pct_tel": 95.6
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up 10 seconds",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 2 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "88685c283 auto-sync-1555",
|
||||
"dirty": 3,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
"total": 153,
|
||||
"passed": 153,
|
||||
"score": "100%"
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"name": "DeerFlow",
|
||||
"port": 3002,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "DeerFlow API",
|
||||
"port": 8001,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Qdrant",
|
||||
"port": 6333,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Ollama",
|
||||
"port": 11434,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Redis",
|
||||
"port": 6379,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Sovereign",
|
||||
"port": 4000,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "SearXNG",
|
||||
"port": 8080,
|
||||
"status": "UP"
|
||||
}
|
||||
],
|
||||
"whisper": {
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 4518,
|
||||
"health": {
|
||||
"score": 4,
|
||||
"max": 6,
|
||||
"pct": 67
|
||||
},
|
||||
"elapsed_ms": 11296
|
||||
}
|
||||
1
api/fix-wv-send.php
Normal file
@@ -0,0 +1 @@
|
||||
Voici le code complet pour le script `fix-wv-send.php` :
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 06:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"fast_php_routes": 446,
|
||||
"opt_tools_total": 54,
|
||||
"wired": 51,
|
||||
@@ -18,9 +18,8 @@
|
||||
"files": 10
|
||||
}
|
||||
],
|
||||
"docker_total": 20,
|
||||
"docker_total": 19,
|
||||
"docker_not_wired": [
|
||||
"weval-docuseal",
|
||||
"plausible-plausible-1",
|
||||
"plausible-plausible-db-1",
|
||||
"plausible-plausible-events-db-1",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"status": "ERROR"
|
||||
},
|
||||
"ports": {
|
||||
"total": 74,
|
||||
"total": 75,
|
||||
"exposed": 20,
|
||||
"ports": [
|
||||
{
|
||||
@@ -14,11 +14,11 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5890",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=12),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=12),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5888",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=10),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=10),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6060",
|
||||
@@ -30,23 +30,23 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5823",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=5),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=5),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5822",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=4),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=4),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5821",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=3),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=3),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5825",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=13),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=13),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5824",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=6),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=6),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6379",
|
||||
@@ -72,10 +72,6 @@
|
||||
"addr": "0.0.0.0:8765",
|
||||
"process": "users:((\"python3\",pid=1811016,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:34111",
|
||||
"process": "users:((\"ollama\",pid=1295666,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:2024",
|
||||
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
|
||||
@@ -96,13 +92,17 @@
|
||||
"addr": "0.0.0.0:4000",
|
||||
"process": "users:((\"python3\",pid=1394482,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:45675",
|
||||
"process": "users:((\"ollama\",pid=2836223,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:2026",
|
||||
"process": "users:((\"nginx\",pid=3665702,fd=5),(\"nginx\",pid=366"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:443",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=5),(\"nginx\",pid=131"
|
||||
"process": "users:((\"nginx\",pid=2851406,fd=5),(\"nginx\",pid=285"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:49222",
|
||||
@@ -110,7 +110,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:80",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=6),(\"nginx\",pid=131"
|
||||
"process": "users:((\"nginx\",pid=2851406,fd=6),(\"nginx\",pid=285"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:22",
|
||||
@@ -122,7 +122,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:8443",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=11),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=11),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:9050",
|
||||
@@ -161,7 +161,7 @@
|
||||
"status": "PASS"
|
||||
}
|
||||
},
|
||||
"timestamp": "2026-04-22T06:00:01",
|
||||
"timestamp": "2026-04-22T12:00:02",
|
||||
"oss_tools": [
|
||||
{
|
||||
"name": "Nuclei",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "daily",
|
||||
"timestamp": "2026-04-22 07:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squads": {
|
||||
"infra": {
|
||||
"name": "INFRA",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T06:30:02.392649",
|
||||
"timestamp": "2026-04-22T12:30:02.650214",
|
||||
"source": "auto-populator-v2-fixed-18avr",
|
||||
"enterprise_total_agents": 747,
|
||||
"docker_total": 20,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[06:30:01] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[06:30:01] Enterprise: 747 agents
|
||||
[06:30:02] Registry: 11 sections
|
||||
[06:30:02] Docker: 20 containers
|
||||
[06:30:02] strat: 99 agents (38 active)
|
||||
[06:30:02] infra: 308 agents (34 active)
|
||||
[06:30:02] dev: 108 agents (25 active)
|
||||
[06:30:02] sec: 48 agents (13 active)
|
||||
[06:30:02] biz: 114 agents (31 active)
|
||||
[06:30:02] ia: 168 agents (48 active)
|
||||
[06:30:02] transit: 254 agents (27 active)
|
||||
[06:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
[12:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[12:30:02] Enterprise: 747 agents
|
||||
[12:30:02] Registry: 11 sections
|
||||
[12:30:02] Docker: 20 containers
|
||||
[12:30:02] strat: 99 agents (38 active)
|
||||
[12:30:02] infra: 308 agents (34 active)
|
||||
[12:30:02] dev: 108 agents (25 active)
|
||||
[12:30:02] sec: 48 agents (13 active)
|
||||
[12:30:02] biz: 114 agents (31 active)
|
||||
[12:30:02] ia: 168 agents (48 active)
|
||||
[12:30:02] transit: 254 agents (27 active)
|
||||
[12:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
30
api/meetings/daily-2026-04-22-12-00.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squad": "infra",
|
||||
"agents": {
|
||||
"cortex": {
|
||||
"done": "13 checks, services 8\/10 OK",
|
||||
"blockers": "none",
|
||||
"next": "Continue monitoring *\/4h"
|
||||
},
|
||||
"gap_detector": {
|
||||
"done": "Score 94.4% (51\/54 wired)",
|
||||
"blockers": "3 tools not wired",
|
||||
"next": "Wire remaining tools"
|
||||
},
|
||||
"nonreg": {
|
||||
"done": "153\/153 (100%)",
|
||||
"blockers": "none",
|
||||
"next": "Maintain 100%"
|
||||
},
|
||||
"security": {
|
||||
"done": "0 leaks, 92 expositions redacted, CrowdSec active",
|
||||
"blockers": "none",
|
||||
"next": "Continuous monitoring"
|
||||
}
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "LLM unavailable"
|
||||
}
|
||||
30
api/meetings/daily-2026-04-22-12-30.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 12:30",
|
||||
"squad": "innovation",
|
||||
"agents": {
|
||||
"evolution": {
|
||||
"done": "System: ? routes, ? skills",
|
||||
"blockers": "Agent PHP syntax to fix",
|
||||
"next": "Generate 5 evolution proposals"
|
||||
},
|
||||
"scanner": {
|
||||
"done": "12 sections wiki scanned",
|
||||
"blockers": "none",
|
||||
"next": "Continue *\/2h"
|
||||
},
|
||||
"l99": {
|
||||
"done": "Functional ?\/93, Dark 7\/10",
|
||||
"blockers": "gitleaks+trivy version format mismatch",
|
||||
"next": "Fix dark test parsing"
|
||||
},
|
||||
"mirofish": {
|
||||
"done": "MiroFish DOWN",
|
||||
"blockers": "Service down",
|
||||
"next": "Collaborative tools"
|
||||
}
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "{\n \"conflicts\": [\n \"Agent PHP syntax to fix (blocker pour evolution) pourrait impacter la génération des routes\/skills nécessaires à d'autres agents\",\n \"MiroFish DOWN (mirofish) peut bloquer les agents dépendants d'outils collaboratifs, potentiellement scanner ou coordination interne\"\n ],\n \"common_issues\": [\n \"Problèmes liés à des dépendances techniques externes (versions gitleaks+trivy, syntaxe PHP, service down)\",\n \"Indicateurs de progression partiellement inconnus (?) chez evolution et mirofish, réduisant la visibilité\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer evolution\",\n \"Restaurer le service MiroFish (urgence opérationnelle)\",\n \"Résoudre le mismatch de format de version entre gitleaks et trivy pour l'agent l99\"\n ],\n \"conciliation\": [\n \"Coordonner l99 et evolution si la correction du parsing ou de la syntaxe affecte les mêmes composants système\",\n \"Vérifier si le scanner peut continuer malgré la panne de MiroFish ; sinon, rediriger temporairement vers une tâche autonome\"\n ]\n}"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 06:30",
|
||||
"timestamp": "2026-04-22 12:30",
|
||||
"squad": "innovation",
|
||||
"agents": {
|
||||
"evolution": {
|
||||
@@ -26,5 +26,5 @@
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"Agent PHP syntax error (blocking 'evolution') could impact code generation needed by other agents\",\n \"MiroFish DOWN affects collaborative tools access, potentially blocking coordination (mirofish vs all)\"\n ],\n \"common_issues\": [\n \"Service stability issues (gitleaks+trivy version mismatch, MiroFish down)\",\n \"Incomplete functional coverage (dark tests, missing skill\/route tracking)\"\n ],\n \"priority_actions\": [\n \"Fix MiroFish service outage to restore collaboration capabilities\",\n \"Resolve gitleaks+trivy version mismatch to unblock l99 dark test parsing\",\n \"Fix Agent PHP syntax to enable evolution module to generate proposals\"\n ],\n \"conciliation\": [\n \"Align l99 and evolution on shared dependency versions to prevent future mismatches\",\n \"Coordinate scanner's 2h cycle with evolution's proposal timeline to ensure updated data is used\"\n ]\n}\n```"
|
||||
"ai_analysis": "{\n \"conflicts\": [\n \"Agent PHP syntax to fix (blocker pour evolution) pourrait impacter la génération des routes\/skills nécessaires à d'autres agents\",\n \"MiroFish DOWN (mirofish) peut bloquer les agents dépendants d'outils collaboratifs, potentiellement scanner ou coordination interne\"\n ],\n \"common_issues\": [\n \"Problèmes liés à des dépendances techniques externes (versions gitleaks+trivy, syntaxe PHP, service down)\",\n \"Indicateurs de progression partiellement inconnus (?) chez evolution et mirofish, réduisant la visibilité\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer evolution\",\n \"Restaurer le service MiroFish (urgence opérationnelle)\",\n \"Résoudre le mismatch de format de version entre gitleaks et trivy pour l'agent l99\"\n ],\n \"conciliation\": [\n \"Coordonner l99 et evolution si la correction du parsing ou de la syntaxe affecte les mêmes composants système\",\n \"Vérifier si le scanner peut continuer malgré la panne de MiroFish ; sinon, rediriger temporairement vers une tâche autonome\"\n ]\n}"
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-22T08:40:01+00:00",
|
||||
"ts": "2026-04-22T13:50:02+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 100,
|
||||
"wtp_engagement": 70,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 25,
|
||||
"avg_score": 17.5,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
"mql_auto_scored": 20,
|
||||
"mql_auto_scored": 19,
|
||||
"sql_auto_scored": 8,
|
||||
"mql_auto_pct": 41,
|
||||
"mql_auto_pct": 39,
|
||||
"improvement_vs_manual": {
|
||||
"before_manual_pct": 33.3,
|
||||
"after_auto_pct": 41,
|
||||
"delta": 7.700000000000003
|
||||
"after_auto_pct": 39,
|
||||
"delta": 5.700000000000003
|
||||
},
|
||||
"paperclip_db_ok": true,
|
||||
"paperclip_tables": 2,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.920784"
|
||||
"discovered": "2026-04-22T15:00:06.020676"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.045410"
|
||||
"discovered": "2026-04-22T15:00:06.256591"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.712375"
|
||||
"discovered": "2026-04-22T15:00:05.663523"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code",
|
||||
@@ -49,7 +49,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-22T10:00:04.246402"
|
||||
"discovered": "2026-04-22T15:00:04.503816"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh",
|
||||
@@ -62,7 +62,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI 👋   | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
|
||||
"discovered": "2026-04-22T10:00:04.513593"
|
||||
"discovered": "2026-04-22T15:00:04.973819"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills",
|
||||
@@ -114,7 +114,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-22T10:00:04.477976"
|
||||
"discovered": "2026-04-22T15:00:04.922113"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework",
|
||||
@@ -127,7 +127,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-22T10:00:03.924070"
|
||||
"discovered": "2026-04-22T15:00:03.828035"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-weval",
|
||||
@@ -140,7 +140,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-22T10:00:04.544614"
|
||||
"discovered": "2026-04-22T15:00:05.141327"
|
||||
},
|
||||
{
|
||||
"name": "vllm",
|
||||
@@ -153,7 +153,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-22T10:00:04.819247"
|
||||
"discovered": "2026-04-22T15:00:05.919696"
|
||||
},
|
||||
{
|
||||
"name": "deer-flow",
|
||||
@@ -166,7 +166,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-22T10:00:03.823926"
|
||||
"discovered": "2026-04-22T15:00:03.767301"
|
||||
},
|
||||
{
|
||||
"name": "aios",
|
||||
@@ -374,7 +374,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-22T10:00:04.012293"
|
||||
"discovered": "2026-04-22T15:00:03.944273"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agent-framework",
|
||||
@@ -387,7 +387,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": " # Welcome to Microsoft Agent Framework! [\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-22T10:00:04.753953"
|
||||
"discovered": "2026-04-22T15:00:05.768185"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.268620"
|
||||
"discovered": "2026-04-22T15:00:04.514582"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.501912"
|
||||
"discovered": "2026-04-22T15:00:04.966196"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agents",
|
||||
@@ -504,7 +504,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-22T10:00:04.650557"
|
||||
"discovered": "2026-04-22T15:00:05.397007"
|
||||
},
|
||||
{
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
@@ -517,7 +517,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-22T10:00:03.754936"
|
||||
"discovered": "2026-04-22T15:00:03.758177"
|
||||
},
|
||||
{
|
||||
"name": "oss",
|
||||
@@ -530,7 +530,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# WEVAL OSS Registry · /opt/oss/ Wave 222 · 2026-04-21 ## Purpose Register the OSS tools identified by AI capability gap audit (wave 220 ai-gap-cach",
|
||||
"discovered": "2026-04-22T10:00:04.527229"
|
||||
"discovered": "2026-04-22T15:00:05.055802"
|
||||
},
|
||||
{
|
||||
"name": "scripts",
|
||||
@@ -543,7 +543,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Token Rotation Scripts · Opus Session 21-avr v7 ## État - 5 scripts provider skeleton (groq, github, sambanova, alibaba, whatsapp) - 1 master dispa",
|
||||
"discovered": "2026-04-22T10:00:04.686972"
|
||||
"discovered": "2026-04-22T15:00:05.573919"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-22T10:00:04.727034"
|
||||
"discovered": "2026-04-22T15:00:05.701201"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-22T10:00:04.108949"
|
||||
"discovered": "2026-04-22T15:00:04.183285"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.542398"
|
||||
"discovered": "2026-04-22T15:00:05.121935"
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": false,
|
||||
"wired": false,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:03.934228"
|
||||
"discovered": "2026-04-22T15:00:03.863933"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-22T10:00:04.296762"
|
||||
"discovered": "2026-04-22T15:00:04.521566"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.619785"
|
||||
"discovered": "2026-04-22T15:00:05.318985"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.840053"
|
||||
"discovered": "2026-04-22T15:00:05.942654"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.564077"
|
||||
"discovered": "2026-04-22T15:00:05.222467"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.575351"
|
||||
"discovered": "2026-04-22T15:00:05.259980"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.630483"
|
||||
"discovered": "2026-04-22T15:00:05.328074"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.700016"
|
||||
"discovered": "2026-04-22T15:00:05.650179"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.895011"
|
||||
"discovered": "2026-04-22T15:00:06.004213"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.931705"
|
||||
"discovered": "2026-04-22T15:00:06.082053"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.030337"
|
||||
"discovered": "2026-04-22T15:00:06.210244"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.075915"
|
||||
"discovered": "2026-04-22T15:00:04.052165"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.397760"
|
||||
"discovered": "2026-04-22T15:00:04.790298"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.680793"
|
||||
"discovered": "2026-04-22T15:00:05.538041"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.773197"
|
||||
"discovered": "2026-04-22T15:00:05.866739"
|
||||
},
|
||||
{
|
||||
"name": "weval-cli",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.858715"
|
||||
"discovered": "2026-04-22T15:00:05.964326"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.878922"
|
||||
"discovered": "2026-04-22T15:00:05.988024"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.988297"
|
||||
"discovered": "2026-04-22T15:00:06.147597"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.007622"
|
||||
"discovered": "2026-04-22T15:00:06.173147"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.016924"
|
||||
"discovered": "2026-04-22T15:00:06.190247"
|
||||
},
|
||||
{
|
||||
"name": "blade",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.150704"
|
||||
"discovered": "2026-04-22T15:00:04.267118"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.325918"
|
||||
"discovered": "2026-04-22T15:00:04.539759"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.388152"
|
||||
"discovered": "2026-04-22T15:00:04.714038"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.432963"
|
||||
"discovered": "2026-04-22T15:00:04.839802"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.596734"
|
||||
"discovered": "2026-04-22T15:00:05.288033"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.807918"
|
||||
"discovered": "2026-04-22T15:00:05.881799"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -933,7 +933,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.032412"
|
||||
"discovered": "2026-04-22T15:00:06.236032"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -946,7 +946,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.060419"
|
||||
"discovered": "2026-04-22T15:00:06.288662"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -959,7 +959,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:03.663271"
|
||||
"discovered": "2026-04-22T15:00:03.706404"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -972,7 +972,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:03.881659"
|
||||
"discovered": "2026-04-22T15:00:03.790756"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -985,7 +985,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:04.395754"
|
||||
"discovered": "2026-04-22T15:00:04.737189"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -998,6 +998,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T10:00:05.053387"
|
||||
"discovered": "2026-04-22T15:00:06.265704"
|
||||
}
|
||||
]
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"date": "2026-04-22 04:00:02",
|
||||
"date": "2026-04-22 10:00:03",
|
||||
"query": "multi-agent orchestration",
|
||||
"new_repos": 0,
|
||||
"cloned": 0,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T10:30:13",
|
||||
"timestamp": "2026-04-22T15:30:15",
|
||||
"features": {
|
||||
"total": 36,
|
||||
"pass": 35
|
||||
@@ -13,7 +13,7 @@
|
||||
"score": 97.2,
|
||||
"log": [
|
||||
"=== UX AGENT v1.0 ===",
|
||||
"Time: 2026-04-22 10:30:02",
|
||||
"Time: 2026-04-22 15:30:02",
|
||||
" core: 4/4",
|
||||
" layout: 3/4",
|
||||
" interaction: 6/6",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V81-AI-AUDIT-100",
|
||||
"ts": "2026-04-18T12:22:41+00:00",
|
||||
"ts": "2026-04-22T13:56:18+00:00",
|
||||
"standards": [
|
||||
"NIST AI RMF",
|
||||
"ISO\/IEC 23894",
|
||||
@@ -10,12 +10,12 @@
|
||||
"Stanford HAI"
|
||||
],
|
||||
"total": 100,
|
||||
"passed": 100,
|
||||
"failed": 0,
|
||||
"score": 100,
|
||||
"passed": 99,
|
||||
"failed": 1,
|
||||
"score": 99,
|
||||
"by_category": {
|
||||
"avail": {
|
||||
"pass": 10,
|
||||
"pass": 9,
|
||||
"total": 10
|
||||
},
|
||||
"acc": {
|
||||
@@ -93,7 +93,7 @@
|
||||
"label": "Registry tools >= 500",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "617 tools",
|
||||
"detail": "649 tools",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -109,15 +109,15 @@
|
||||
"label": "Disk usage < 90%",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "79%",
|
||||
"detail": "87%",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
"id": "avail_08_load_ok",
|
||||
"label": "Load average < 10",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "load 1.04",
|
||||
"pass": false,
|
||||
"score": 0,
|
||||
"detail": "load 15.30",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -133,7 +133,7 @@
|
||||
"label": "Cron jobs active >= 50",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "116 active crons",
|
||||
"detail": "149 active crons",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -197,7 +197,7 @@
|
||||
"label": "Skills OSS >= 5000",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "5651 skills",
|
||||
"detail": "5654 skills",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -213,7 +213,7 @@
|
||||
"label": "Ethica HCP DB >= 150k",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "151709 HCPs",
|
||||
"detail": "166742 HCPs",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -397,7 +397,7 @@
|
||||
"label": "Wiki V-files >= 30",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "41 wiki files",
|
||||
"detail": "98 wiki files",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -405,7 +405,7 @@
|
||||
"label": "Doctrines >= 50",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "58 doctrines",
|
||||
"detail": "124 doctrines",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -413,7 +413,7 @@
|
||||
"label": "Session snapshots vault",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "94 sessions",
|
||||
"detail": "145 sessions",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -421,7 +421,7 @@
|
||||
"label": "plan-action-dp.md live",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "2215 lines",
|
||||
"detail": "2310 lines",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -453,7 +453,7 @@
|
||||
"label": "GOLD backups before mods",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "1597 golds",
|
||||
"detail": "1614 golds",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-22T08:50:02+00:00",
|
||||
"ts": "2026-04-22T13:58:46+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 06:00:02",
|
||||
"timestamp": "2026-04-22 10:00:02",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Lean Six Sigma",
|
||||
@@ -46,7 +46,7 @@
|
||||
{
|
||||
"name": "Change Mgmt",
|
||||
"ok": true,
|
||||
"detail": "3747 commits\/7d"
|
||||
"detail": "3782 commits\/7d"
|
||||
},
|
||||
{
|
||||
"name": "SLA Monitor",
|
||||
@@ -153,7 +153,7 @@
|
||||
{
|
||||
"name": "CI\/CD",
|
||||
"ok": true,
|
||||
"detail": "3747 commits"
|
||||
"detail": "3782 commits"
|
||||
},
|
||||
{
|
||||
"name": "Auto testing",
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
},
|
||||
{
|
||||
"layer": "PHP-API",
|
||||
"name": "1036/1046 syntax OK",
|
||||
"name": "1063/1073 syntax OK",
|
||||
"status": "F",
|
||||
"detail": "10 errors"
|
||||
},
|
||||
@@ -82,7 +82,7 @@
|
||||
"layer": "CRON",
|
||||
"name": "quality",
|
||||
"status": "F",
|
||||
"detail": "12660min ago"
|
||||
"detail": "12900min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -99,14 +99,14 @@
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "control-tower",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "31min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "l99-ux",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "31min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -136,13 +136,13 @@
|
||||
"layer": "CRON",
|
||||
"name": "selfmanage",
|
||||
"status": "P",
|
||||
"detail": "0min ago"
|
||||
"detail": "1min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "blade",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "1min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -154,31 +154,31 @@
|
||||
"layer": "CRON",
|
||||
"name": "watchdog",
|
||||
"status": "F",
|
||||
"detail": "12132min ago"
|
||||
"detail": "12372min ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-artifacts-index.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 298h ago"
|
||||
"detail": "valid 302h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-selenium-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 277h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -190,259 +190,259 @@
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-prev.json",
|
||||
"status": "F",
|
||||
"detail": "valid 276h ago"
|
||||
"detail": "valid 280h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 223h ago"
|
||||
"detail": "valid 227h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-brain-chat-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 262h ago"
|
||||
"detail": "valid 266h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-chat-user-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 250h ago"
|
||||
"detail": "valid 254h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-dark-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 280h ago"
|
||||
"detail": "valid 284h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 310h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 247h ago"
|
||||
"detail": "valid 251h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 262h ago"
|
||||
"detail": "valid 266h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 390h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-e2e-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 345h ago"
|
||||
"detail": "valid 349h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-enterprise-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 77h ago"
|
||||
"detail": "valid 81h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-exhaustive.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-full-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 277h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-functional-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 248h ago"
|
||||
"detail": "valid 252h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-godmode-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 256h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-meeting-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 390h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-benchmark.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-check.json",
|
||||
"status": "F",
|
||||
"detail": "valid 212h ago"
|
||||
"detail": "valid 216h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 58h ago"
|
||||
"detail": "valid 62h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 129h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-opus-parity.json",
|
||||
"status": "F",
|
||||
"detail": "valid 276h ago"
|
||||
"detail": "valid 280h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-integration.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 279h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-master.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 279h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-public.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 279h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 310h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-route-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-security.json",
|
||||
"status": "P",
|
||||
"detail": "valid 2h ago"
|
||||
"detail": "valid 0h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 212h ago"
|
||||
"detail": "valid 216h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 126h ago"
|
||||
"detail": "valid 130h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-systematic.json",
|
||||
"status": "F",
|
||||
"detail": "valid 249h ago"
|
||||
"detail": "valid 253h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ultimate.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 277h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ux-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 213h ago"
|
||||
"detail": "valid 217h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 390h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-extended-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 250h ago"
|
||||
"detail": "valid 254h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 256h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 42h ago"
|
||||
"detail": "valid 46h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-watchdog.json",
|
||||
"status": "F",
|
||||
"detail": "valid 248h ago"
|
||||
"detail": "valid 252h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-log.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-pack-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 223h ago"
|
||||
"detail": "valid 227h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 196h ago"
|
||||
"detail": "valid 200h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -454,7 +454,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-architecture.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -466,7 +466,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-autodoc.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -484,85 +484,85 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capabilities.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 310h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capability-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 305h ago"
|
||||
"detail": "valid 309h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-cascade-config.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 129h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-control-tower.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-daily-report.json",
|
||||
"status": "P",
|
||||
"detail": "valid 2h ago"
|
||||
"detail": "valid 6h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-fleet-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 367h ago"
|
||||
"detail": "valid 371h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 310h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-filler-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 129h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-intent-proposals.json",
|
||||
"status": "P",
|
||||
"detail": "valid 8h ago"
|
||||
"detail": "valid 12h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-live-context.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 279h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-manifest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-brain.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 129h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-test-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 305h ago"
|
||||
"detail": "valid 309h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-meeting-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -574,7 +574,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-page-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -586,7 +586,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-plugin-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 110h ago"
|
||||
"detail": "valid 114h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -604,7 +604,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-quality.json",
|
||||
"status": "F",
|
||||
"detail": "valid 367h ago"
|
||||
"detail": "valid 371h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -616,7 +616,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-regression-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 387h ago"
|
||||
"detail": "valid 391h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -628,49 +628,49 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-sso-guardian.json",
|
||||
"status": "F",
|
||||
"detail": "valid 365h ago"
|
||||
"detail": "valid 369h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-standup-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 58h ago"
|
||||
"detail": "valid 62h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-last.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 228h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 129h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-tool-registry.json",
|
||||
"status": "P",
|
||||
"detail": "valid 3h ago"
|
||||
"detail": "valid 7h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-truth-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 62h ago"
|
||||
"detail": "valid 66h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-ux-audit.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 368h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-wiki-entries.json",
|
||||
"status": "P",
|
||||
"detail": "valid 17h ago"
|
||||
"detail": "valid 21h ago"
|
||||
},
|
||||
{
|
||||
"layer": "PIPELINE",
|
||||
@@ -871,15 +871,15 @@
|
||||
"detail": "69 tables"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22T08:30:02.523149",
|
||||
"timestamp": "2026-04-22T12:30:02.220888",
|
||||
"type": "register",
|
||||
"pass": 56,
|
||||
"fail": 89,
|
||||
"pass": 59,
|
||||
"fail": 86,
|
||||
"warn": 0,
|
||||
"total": 145,
|
||||
"pct": 38.6,
|
||||
"pct": 40.7,
|
||||
"inventory": {
|
||||
"api_php": 1046,
|
||||
"api_php": 1073,
|
||||
"brain_php": 254,
|
||||
"crons": 14,
|
||||
"json_status": 42,
|
||||
|
||||
@@ -79,5 +79,41 @@
|
||||
"code": "flowchart TD\n A[Analyser Concurrence] --> B[Identifie Acteurs]\n B --> C[Acteur A]\n B --> D[Acteur B]\n B --> E[Acteur C]\n C --> F[Analyse Marche A]\n D --> G[Analyse Marche B]\n E --> H[Analyse Marche C]\n F --> I[Comparaison Stratégies]\n G --> I\n H --> I\n I --> J[Résultats Concurrence]\n J --> K[Stratégie d'Amélioration]",
|
||||
"created_at": "2026-04-22T03:03:23+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "d220154196fd",
|
||||
"topic": "wevia",
|
||||
"kind": "sequence",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "sequenceDiagram\n participant A as Client\n participant B as Serveur\n A->>B: Demande de connexion\n B->>A: Réponse de connexion\n A->>B: Envoi de données\n B->>A: Réponse de données\n A->>B: Demande de fermeture\n B->>A: Réponse de fermeture",
|
||||
"created_at": "2026-04-22T08:58:07+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "402ceef86d9e",
|
||||
"topic": "wevia",
|
||||
"kind": "sequence",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "sequenceDiagram\n participant U as Utilisateur\n participant S as Serveur\n U->>S: Demande de connexion\n S->>U: Réponse de connexion\n U->>S: Envoi de données\n S->>U: Traitement des données\n U->>S: Demande de données\n S->>U: Envoi de données",
|
||||
"created_at": "2026-04-22T09:09:05+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "f40cc578b50d",
|
||||
"topic": "SCHEMA SAP",
|
||||
"kind": "flowchart",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "graph LR\n Client-->|Demande d'achat|Acheteur\n Acheteur-->|Place une commande|SAP\n SAP-->|Traite la commande|SAP\n SAP-->|Vérifie la disponibilité|Magasin\n Magasin-->|Vérifie la disponibilité|SAP\n SAP-->|Envoie la commande|Transporteur\n Transporteur-->|Livraison|Client\n Client-->|Paiement|SAP\n SAP-->|Enregistre la transaction|SAP\n SAP-->|Mise à jour du stock|Magasin\n Magasin-->|Mise à jour du stock|SAP\n SAP-->|Génère un rapport|SAP",
|
||||
"created_at": "2026-04-22T13:18:17+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "358fc5958f31",
|
||||
"topic": "test",
|
||||
"kind": "flowchart",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "flowchart LR\n A[Init] --> B[Calcul]\n B --> C[Affichage]\n C --> D[Fin]\n D --> E[Sortie]\n E --> F[Réinitialisation]\n F --> A",
|
||||
"created_at": "2026-04-22T13:55:05+00:00",
|
||||
"use_count": 0
|
||||
}
|
||||
]
|
||||
BIN
generated/wevia-ANTHROPIC-20260422-132328-ad0056.docx
Normal file
84
generated/wevia-ANTHROPIC-20260422-132328-ad0056.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# ANTHROPIC
|
||||
|
||||
**Document Word : L'Anthropocène**
|
||||
|
||||
**Titre**
|
||||
|
||||
L'Anthropocène : un nouveau paradigme pour notre planète
|
||||
|
||||
**Sommaire**
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [Définition et caractéristiques de l'Anthropocène](#anthropocène)
|
||||
3. [Impacts de l'Anthropocène sur l'environnement](#impacts)
|
||||
4. [Conséquences de l'Anthropocène pour l'humanité](#conséquences)
|
||||
5. [Solutions pour atténuer les impacts de l'Anthropocène](#solutions)
|
||||
6. [Conclusion](#conclusion)
|
||||
|
||||
**1. Introduction**
|
||||
|
||||
L'Anthropocène est un concept qui a été proposé pour décrire la période de l'histoire de la Terre où l'activité humaine a un impact significatif sur l'environnement. Ce concept a été introduit en 2000 par le géologue Paul Crutzen et a depuis été largement discuté dans la communauté scientifique.
|
||||
|
||||
**2. Définition et caractéristiques de l'Anthropocène**
|
||||
|
||||
L'Anthropocène est caractérisé par une série d'activités humaines qui ont un impact significatif sur l'environnement, notamment :
|
||||
|
||||
* L'utilisation de sources d'énergie fossile
|
||||
* La déforestation et la destruction des écosystèmes
|
||||
* La pollution de l'air, de l'eau et du sol
|
||||
* La modification des cycles biogéochimiques
|
||||
* La destruction des espèces et la perte de biodiversité
|
||||
|
||||
**3. Impacts de l'Anthropocène sur l'environnement**
|
||||
|
||||
Les impacts de l'Anthropocène sur l'environnement sont nombreux et graves, notamment :
|
||||
|
||||
* Le réchauffement climatique
|
||||
* La pollution de l'air et de l'eau
|
||||
* La perte de biodiversité
|
||||
* La dégradation des sols
|
||||
* La modification des cycles biogéochimiques
|
||||
|
||||
**4. Conséquences de l'Anthropocène pour l'humanité**
|
||||
|
||||
Les conséquences de l'Anthropocène pour l'humanité sont également graves, notamment :
|
||||
|
||||
* Les changements climatiques
|
||||
* Les catastrophes naturelles
|
||||
* Les maladies et les épidémies
|
||||
* La perte de ressources naturelles
|
||||
* La dégradation de la qualité de vie
|
||||
|
||||
**5. Solutions pour atténuer les impacts de l'Anthropocène**
|
||||
|
||||
Il existe plusieurs solutions pour atténuer les impacts de l'Anthropocène, notamment :
|
||||
|
||||
* La transition énergétique vers des sources d'énergie renouvelables
|
||||
* La protection et la restauration des écosystèmes
|
||||
* La réduction de la pollution de l'air et de l'eau
|
||||
* La promotion de la biodiversité et de la conservation des espèces
|
||||
* La mise en place de politiques et de lois pour protéger l'environnement
|
||||
|
||||
**6. Conclusion**
|
||||
|
||||
L'Anthropocène est un concept qui met en évidence l'impact significatif de l'activité humaine sur l'environnement. Il est essentiel que nous prenions des mesures pour atténuer les impacts de l'Anthropocène et protéger l'environnement pour assurer un avenir durable pour l'humanité.
|
||||
|
||||
**Annexe**
|
||||
|
||||
* Liste des références bibliographiques
|
||||
* Liste des sources de données utilisées
|
||||
* Tableau des impacts de l'Anthropocène sur l'environnement
|
||||
|
||||
| Impact | Description |
|
||||
| --- | --- |
|
||||
| Réchauffement climatique | Augmentation de la température moyenne de la planète |
|
||||
| Pollution de l'air | Émission de gaz à effet de serre et de polluants |
|
||||
| Perte de biodiversité | Déclin des espèces et des écosystèmes |
|
||||
| Dégradation des sols | Perte de fertilité et de capacité de stockage de carbone |
|
||||
| Modification des cycles biogéochimiques | Changement des processus naturels de la Terre |
|
||||
|
||||
**Références**
|
||||
|
||||
* Crutzen, P. J. (2002). Geology of mankind. Nature, 415(6867), 23.
|
||||
* Steffen, W., et al. (2011). The Anthropocene: From Global Change to Planetary Stewardship. AMBIO: A Journal of the Human Environment, 40(7), 739-761.
|
||||
* Rockström, J., et al. (2009). A safe operating space for humanity. Nature, 461(7263), 472-475.
|
||||
@@ -0,0 +1,52 @@
|
||||
# BUSSINNES PLAN VITAMINE d POUR CNVAINCRE MON ASSOCIE
|
||||
|
||||
# Introduction
|
||||
* Présentation du projet Vitamin d pour CNVaincre mon associé
|
||||
* Objectif : développer un plan d'affaires pour booster les ventes et augmenter la visibilité de l'entreprise
|
||||
|
||||
# Analyse de marché
|
||||
* Cible : professionnels de la santé et particuliers souhaitant améliorer leur bien-être
|
||||
* Concurrence : nombreux acteurs sur le marché de la nutrition et du bien-être
|
||||
* Avantages concurrentiels : qualité des produits, expertise des équipes, engagement envers la durabilité
|
||||
|
||||
# Stratégie marketing
|
||||
* Positionnement : leader du marché de la nutrition pour la santé
|
||||
* Canaux de communication :
|
||||
+ Réseaux sociaux
|
||||
+ Publicité en ligne
|
||||
+ Partenariats avec des professionnels de la santé
|
||||
* Contenu de communication :
|
||||
+ Informations sur les bienfaits du Vitamin d
|
||||
+ Testimonials de clients satisfaits
|
||||
|
||||
# Produits et services
|
||||
* Gamme de produits Vitamin d :
|
||||
+ Comprimés
|
||||
+ Gélules
|
||||
+ Produits dérivés (crèmes, huiles, etc.)
|
||||
* Services :
|
||||
+ Conseil nutritionnel personnalisé
|
||||
+ Suivi de la santé et des progrès
|
||||
|
||||
# Plan d'action
|
||||
* Short-term (3-6 mois) :
|
||||
+ Lancement de la stratégie marketing
|
||||
+ Développement de la gamme de produits
|
||||
+ Établissement de partenariats avec des professionnels de la santé
|
||||
* Mid-term (6-12 mois) :
|
||||
+ Augmentation de la visibilité de l'entreprise
|
||||
+ Développement de la base de clients
|
||||
+ Amélioration de la qualité des produits et services
|
||||
* Long-term (1-2 ans) :
|
||||
+ Consolidation de la position de leader sur le marché
|
||||
+ Développement de nouveaux produits et services
|
||||
|
||||
# Budget et ressources
|
||||
* Estimation du budget nécessaire pour la mise en œuvre du plan d'affaires
|
||||
* Identification des ressources humaines et financières nécessaires pour atteindre les objectifs
|
||||
* Plan de suivi et d'évaluation des performances
|
||||
|
||||
# Conclusion
|
||||
* Résumé des principaux points du plan d'affaires
|
||||
* Appel à l'action pour les parties prenantes
|
||||
* Engagement envers la réussite du projet
|
||||
BIN
generated/wevia-COMPTABILITE-WEVAL-20260422-132258-c5e40c.docx
Normal file
66
generated/wevia-COMPTABILITE-WEVAL-20260422-132258-c5e40c.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# COMPTABILITE WEVAL
|
||||
|
||||
**COMPTABILITE WEVAL**
|
||||
=====================
|
||||
|
||||
**Sommaire**
|
||||
------------
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [Définition de la comptabilité WEVAL](#définition-de-la-comptabilité-weval)
|
||||
3. [Avantages de la comptabilité WEVAL](#avantages-de-la-comptabilité-weval)
|
||||
4. [Contrôle interne et assurance de la qualité](#contrôle-interne-et-assurance-de-la-qualité)
|
||||
5. [Exemple de mise en œuvre de la comptabilité WEVAL](#exemple-de-mise-en-œuvre-de-la-comptabilité-weval)
|
||||
6. [Conclusion](#conclusion)
|
||||
|
||||
**Introduction**
|
||||
---------------
|
||||
|
||||
La comptabilité WEVAL est un système de comptabilité qui s'appuie sur des règles et des normes internationales pour garantir l'exactitude et la fiabilité des informations comptables. Cette approche est essentielle pour les entreprises qui souhaitent afficher une image transparente et responsable de leur situation financière.
|
||||
|
||||
**Définition de la comptabilité WEVAL**
|
||||
-------------------------------------
|
||||
|
||||
La comptabilité WEVAL est un système de comptabilité qui s'appuie sur les normes internationales de comptabilité (IASC) et les principes comptables généralement acceptés (GAAP). Ce système vise à garantir la fiabilité et l'exactitude des informations comptables en mettant en place des contrôles internes et des procédures de vérification.
|
||||
|
||||
**Avantages de la comptabilité WEVAL**
|
||||
--------------------------------------
|
||||
|
||||
Les avantages de la comptabilité WEVAL sont nombreux :
|
||||
|
||||
* **Transparence financière** : Les informations comptables sont présentées de manière claire et précise, ce qui permet aux investisseurs et aux actionnaires de prendre des décisions éclairées.
|
||||
* **Responsabilité** : La comptabilité WEVAL encourage la responsabilité et la transparence dans les pratiques comptables, ce qui est essentiel pour maintenir la confiance des parties prenantes.
|
||||
* **Comparabilité** : Les informations comptables sont présentées selon les mêmes normes et principes, ce qui facilite la comparaison entre les entreprises.
|
||||
|
||||
**Contrôle interne et assurance de la qualité**
|
||||
---------------------------------------------
|
||||
|
||||
Pour garantir la fiabilité et l'exactitude des informations comptables, les entreprises doivent mettre en place un système de contrôle interne et de vérification. Ce système doit inclure :
|
||||
|
||||
* **Contrôle des processus** : Les processus comptables doivent être contrôlés pour garantir qu'ils sont suivis correctement.
|
||||
* **Vérification des données** : Les données comptables doivent être vérifiées pour garantir qu'elles sont exactes et précises.
|
||||
* **Audit** : Les comptes doivent être audités régulièrement pour garantir qu'ils sont présentés de manière correcte.
|
||||
|
||||
**Exemple de mise en œuvre de la comptabilité WEVAL**
|
||||
---------------------------------------------------
|
||||
|
||||
Voici un exemple de mise en œuvre de la comptabilité WEVAL dans une entreprise :
|
||||
|
||||
| **Étape** | **Description** |
|
||||
| --- | --- |
|
||||
| 1 | Mise en place d'un système de comptabilité WEVAL |
|
||||
| 2 | Formation des employés sur les normes et principes comptables |
|
||||
| 3 | Mise en place de contrôles internes et de procédures de vérification |
|
||||
| 4 | Vérification des données comptables |
|
||||
| 5 | Audit des comptes |
|
||||
|
||||
**Conclusion**
|
||||
--------------
|
||||
|
||||
La comptabilité WEVAL est un système de comptabilité qui garantit la fiabilité et l'exactitude des informations comptables. Les avantages de cette approche sont nombreux, notamment la transparence financière, la responsabilité et la comparabilité. Pour mettre en œuvre la comptabilité WEVAL, les entreprises doivent mettre en place un système de contrôle interne et de vérification. Enfin, voici quelques conseils pratiques pour mettre en œuvre la comptabilité WEVAL :
|
||||
|
||||
* **Mise en place d'un système de comptabilité WEVAL** : Les entreprises doivent mettre en place un système de comptabilité WEVAL qui inclut les normes et principes comptables internationaux.
|
||||
* **Formation des employés** : Les employés doivent être formés sur les normes et principes comptables pour garantir qu'ils comprennent les exigences de la comptabilité WEVAL.
|
||||
* **Mise en place de contrôles internes** : Les entreprises doivent mettre en place des contrôles internes pour garantir que les processus comptables sont suivis correctement.
|
||||
* **Vérification des données** : Les données comptables doivent être vérifiées pour garantir qu'elles sont exactes et précises.
|
||||
* **Audit** : Les comptes doivent être audités régulièrement pour garantir qu'ils sont présentés de manière correcte.
|
||||
@@ -0,0 +1,40 @@
|
||||
# POUR BUSSINNESS PLAN VITAMINE d POUR CONVAINCRE MON ASSOCIE
|
||||
|
||||
# Introduction
|
||||
|
||||
* Présentation du concept de Vitamin d
|
||||
* Importance de la vitamin d pour la santé
|
||||
* Objectif : convaincre mon associé de l'importance de Vitamin d pour le business plan
|
||||
|
||||
# Qu'est-ce que la Vitamin d ?
|
||||
|
||||
* Substance chimique naturelle produite par le corps humain en réponse à l'exposition à la lumière du soleil
|
||||
* Rôle clé dans la régulation du calcium et de la densité osseuse
|
||||
* Importance pour la santé générale et la prévention de maladies
|
||||
|
||||
# Avantages pour le business plan
|
||||
|
||||
* Augmentation de la productivité et de la motivation des employés
|
||||
* Amélioration de la santé et de la bien-être des employés
|
||||
* Réduction des coûts liés à la maladie et à l'absentéisme
|
||||
* Amélioration de l'image de marque et de la réputation de l'entreprise
|
||||
|
||||
# Comment obtenir la Vitamin d ?
|
||||
|
||||
* Exposition au soleil (environ 15-30 minutes par jour)
|
||||
* Alimentation (produits laitiers, poissons gras, etc.)
|
||||
* Suppléments alimentaires (sous forme de poudre ou de gélules)
|
||||
* Précautions : éviter l'exposition excessive au soleil, ne pas prendre de suppléments sans consultation médicale
|
||||
|
||||
# Stratégie de communication
|
||||
|
||||
* Sensibiliser les employés à l'importance de la Vitamin d
|
||||
* Proposer des solutions pour améliorer la santé et le bien-être des employés
|
||||
* Encourager les employés à adopter des habitudes saines
|
||||
* Suivre les progrès et ajuster la stratégie en conséquence
|
||||
|
||||
# Conclusion
|
||||
|
||||
* La Vitamin d est essentielle pour la santé et la productivité des employés
|
||||
* Une stratégie de communication claire et efficace peut aider à convaincre mon associé de l'importance de Vitamin d pour le business plan
|
||||
* Ensemble, nous pouvons créer un environnement de travail sain et productif.
|
||||
41
generated/wevia-SAP-20260422-131605-f23eb2.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# SAP
|
||||
|
||||
# Introduction à SAP
|
||||
|
||||
SAP (Systems, Applications and Products in Data Processing) est un logiciel de gestion de l'information développé par la société allemande SAP SE. Créé en 1972, SAP est l'un des logiciels de gestion de l'information les plus largement utilisés dans le monde.
|
||||
|
||||
## Histoire de SAP
|
||||
|
||||
* Fondation de SAP en 1972 par Dietmar Hopp, Hasso Plattner, Claus Wellenreuther et Klaus Tschira
|
||||
* Lancement du premier produit SAP R/1 en 1972
|
||||
* Développement de SAP R/2 en 1979
|
||||
* Lancement de SAP R/3 en 1992, qui marque le début de la popularité de SAP
|
||||
* SAP devient une entreprise cotée en bourse en 1988
|
||||
|
||||
## Fonctionnalités de SAP
|
||||
|
||||
* Gestion des ressources humaines (RH)
|
||||
* Gestion financière (comptabilité, gestion des flux de trésorerie)
|
||||
* Gestion des ventes et des achats
|
||||
* Gestion de la production et des stocks
|
||||
* Gestion des relations avec les clients et les fournisseurs
|
||||
* Analyse de données et reporting
|
||||
|
||||
## Avantages de l'utilisation de SAP
|
||||
|
||||
* Amélioration de l'efficacité et de la productivité
|
||||
* Meilleure visibilité et contrôle des activités de l'entreprise
|
||||
* Capacité à prendre des décisions éclairées grâce à l'analyse de données
|
||||
* Intégration des systèmes et des processus
|
||||
* Sécurité et conformité aux normes réglementaires
|
||||
|
||||
## Exemples d'utilisation de SAP
|
||||
|
||||
* Sociétés de grande taille (multinationales)
|
||||
* Entreprises de services (banques, assurances)
|
||||
* Entreprises de production (industrie manufacturière)
|
||||
* Petites et moyennes entreprises (PME)
|
||||
|
||||
# Conclusion
|
||||
|
||||
SAP est un logiciel de gestion de l'information puissant et flexible qui peut répondre aux besoins de nombreuses entreprises. Avec ses nombreuses fonctionnalités et son intégration des systèmes et des processus, SAP peut aider les entreprises à améliorer leur efficacité et leur productivité, ainsi qu'à prendre des décisions éclairées grâce à l'analyse de données.
|
||||
BIN
generated/wevia-SAP-20260422-131605-f23eb2.pdf
Normal file
43
generated/wevia-SAP-20260422-132222-d4a32e.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# SAP
|
||||
|
||||
# Présentation de SAP
|
||||
|
||||
* SAP est un leader mondial dans les solutions de gestion d'entreprise
|
||||
* Fondée en 1972 en Allemagne
|
||||
* Siège social à Walldorf, Allemagne
|
||||
* Chiffre d'affaires : 28,7 milliards d'euros en 2022
|
||||
|
||||
# Avantages de SAP
|
||||
|
||||
* Intégration des processus métier
|
||||
* Amélioration de la productivité et de la rentabilité
|
||||
* Meilleure prise de décision grâce à des données fiables
|
||||
* Sécurité et conformité aux normes
|
||||
|
||||
# Solutions SAP
|
||||
|
||||
* SAP ERP (Système d'exploitation de ressources)
|
||||
* SAP S/4HANA (Système d'exploitation de ressources 4 HANA)
|
||||
* SAP CRM (Gestion de la relation client)
|
||||
* SAP SCM (Gestion de la chaîne d'approvisionnement)
|
||||
* SAP HCM (Gestion des ressources humaines)
|
||||
|
||||
# Carrières chez SAP
|
||||
|
||||
* Plus de 100 000 employés dans le monde
|
||||
* 190 pays représentés
|
||||
* Opportunités de carrière variées (développeur, consultant, formateur, etc.)
|
||||
* Politique de diversité et d'inclusion
|
||||
|
||||
# Partenaires et certifications
|
||||
|
||||
* Partenaires stratégiques (Microsoft, IBM, etc.)
|
||||
* Certifications (SAP Certified Associate, SAP Certified Professional, etc.)
|
||||
* Programme de partenariat pour les PME (Petites et moyennes entreprises)
|
||||
|
||||
# Cas d'utilisation de SAP
|
||||
|
||||
* Gestion de la chaîne d'approvisionnement pour les entreprises de grande taille
|
||||
* Amélioration de la productivité pour les PME
|
||||
* Gestion de la relation client pour les entreprises de services
|
||||
* Gestion des ressources humaines pour les administrations publiques
|
||||
BIN
generated/wevia-SAP-20260422-132222-d4a32e.pptx
Normal file
30
generated/wevia-SAP-S4HANA-20260422-092036-e09d04.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# SAP S4HANA
|
||||
|
||||
# SAP S4HANA : Une Plateforme de Gestion de la Chaîne d'Approvisionnement Intégrée
|
||||
|
||||
## Introduction
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de la chaîne d'approvisionnement intégrée développée par SAP SE. Elle constitue une évolution majeure de la plateforme SAP ERP, offrant une expérience utilisateur améliorée, une flexibilité accrue et des fonctionnalités innovantes pour les entreprises du XXIe siècle.
|
||||
|
||||
## Avantages Clés
|
||||
|
||||
* **Intégration de la chaîne d'approvisionnement** : SAP S4HANA permet une gestion intégrée de la chaîne d'approvisionnement, des commandes clients aux livraisons, en passant par la gestion des stocks et la planification des produits.
|
||||
* **Flexibilité et personnalisation** : La plateforme offre une grande flexibilité et une personnalisation avancée, permettant aux entreprises de personnaliser les processus et les fonctionnalités pour répondre à leurs besoins spécifiques.
|
||||
* **Analytique et intelligence artificielle** : SAP S4HANA intègre des fonctionnalités d'analytique et d'intelligence artificielle pour aider les entreprises à prendre des décisions éclairées et à améliorer leur efficacité opérationnelle.
|
||||
* **Sécurité et conformité** : La plateforme garantit une sécurité et une conformité renforcées, avec des fonctionnalités de gestion des accès, des contrôles de données et des rapports de conformité.
|
||||
|
||||
## Fonctionnalités Principales
|
||||
|
||||
* **Gestion des commandes et des livraisons** : SAP S4HANA permet une gestion efficace des commandes clients et des livraisons, avec des fonctionnalités de suivi et de traçabilité.
|
||||
* **Gestion des stocks et des produits** : La plateforme offre des fonctionnalités de gestion des stocks et des produits, permettant aux entreprises de gérer leurs stocks, de planifier leurs produits et de prendre des décisions éclairées.
|
||||
* **Gestion des finances et des ressources humaines** : SAP S4HANA intègre des fonctionnalités de gestion des finances et des ressources humaines, permettant aux entreprises de gérer leurs finances, de gérer leurs ressources humaines et de prendre des décisions éclairées.
|
||||
|
||||
## Avantages pour les Entreprises
|
||||
|
||||
* **Amélioration de l'efficacité opérationnelle** : SAP S4HANA permet aux entreprises d'améliorer leur efficacité opérationnelle, en réduisant les coûts, en améliorant la qualité des produits et en augmentant la satisfaction des clients.
|
||||
* **Amélioration de la prise de décision** : La plateforme offre des fonctionnalités d'analytique et d'intelligence artificielle, permettant aux entreprises de prendre des décisions éclairées et de prendre des décisions plus rapides.
|
||||
* **Amélioration de la conformité** : SAP S4HANA garantit une sécurité et une conformité renforcées, avec des fonctionnalités de gestion des accès, des contrôles de données et des rapports de conformité.
|
||||
|
||||
## Conclusion
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de la chaîne d'approvisionnement intégrée développée par SAP SE. Elle offre une expérience utilisateur améliorée, une flexibilité accrue et des fonctionnalités innovantes pour les entreprises du XXIe siècle. Les avantages clés de la plateforme incluent l'intégration de la chaîne d'approvisionnement, la flexibilité et la personnalisation, l'analytique et l'intelligence artificielle, et la sécurité et la conformité. Les fonctionnalités principales de la plateforme incluent la gestion des commandes et des livraisons, la gestion des stocks et des produits, et la gestion des finances et des ressources humaines. Les avantages pour les entreprises incluent l'amélioration de l'efficacité opérationnelle, l'amélioration de la prise de décision, et l'amélioration de la conformité.
|
||||
BIN
generated/wevia-SAP-S4HANA-20260422-092036-e09d04.pdf
Normal file
56
generated/wevia-SAP-S4HANA-20260422-092211-db1bb1.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# SAP S4HANA
|
||||
|
||||
# SAP S4HANA : Une Plateforme de Gestion de l'Entreprise Intégrée
|
||||
======================================================
|
||||
|
||||
## Introduction
|
||||
---------------
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de l'entreprise intégrée conçue pour aider les entreprises à gérer leurs activités de manière efficace et efficace. Elle est développée par SAP, l'un des leaders mondiaux dans le domaine de la technologie de l'information.
|
||||
|
||||
### Avantages de SAP S4HANA
|
||||
|
||||
* Amélioration de la productivité grâce à une automatisation accrue des processus
|
||||
* Meilleure prise de décision grâce à des données actualisées et fiables
|
||||
* Réduction des coûts grâce à une optimisation des ressources
|
||||
* Amélioration de la collaboration entre les équipes et les partenaires
|
||||
|
||||
## Caractéristiques Clés
|
||||
------------------------
|
||||
|
||||
### Architecture
|
||||
|
||||
SAP S4HANA est basée sur une architecture modulaire, qui permet une flexibilité et une évolutivité accrues. Elle est composée de plusieurs composants, notamment :
|
||||
|
||||
* **SAP HANA**: une base de données en temps réel qui permet une gestion rapide et efficace des données
|
||||
* **SAP Fiori**: une interface utilisateur intuitive qui permet une navigation facile et une expérience utilisateur améliorée
|
||||
* **SAP Business Warehouse**: une solution de business intelligence qui permet une analyse et une prise de décision éclairées
|
||||
|
||||
### Fonctionnalités
|
||||
|
||||
SAP S4HANA offre une large gamme de fonctionnalités pour gérer les activités de l'entreprise, notamment :
|
||||
|
||||
* **Gestion des ressources humaines** : gestion des employés, des salaires, des avantages sociaux
|
||||
* **Gestion des finances** : gestion des comptes, des factures, des paiements
|
||||
* **Gestion des stocks** : gestion des stocks, des commandes, des livraisons
|
||||
* **Gestion de la production** : gestion des ordres de production, des stocks, des équipements
|
||||
|
||||
## Avantages pour les Entreprises
|
||||
---------------------------------
|
||||
|
||||
### Amélioration de la Productivité
|
||||
|
||||
SAP S4HANA permet une automatisation accrue des processus, ce qui permet de libérer du temps pour les employés et de les concentrer sur les tâches stratégiques.
|
||||
|
||||
### Meilleure Prise de Décision
|
||||
|
||||
SAP S4HANA fournit des données actualisées et fiables, ce qui permet de prendre des décisions éclairées et de réduire les risques.
|
||||
|
||||
### Réduction des Coûts
|
||||
|
||||
SAP S4HANA permet une optimisation des ressources, ce qui permet de réduire les coûts et de les allouer à des activités plus stratégiques.
|
||||
|
||||
## Conclusion
|
||||
----------
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de l'entreprise intégrée qui offre une large gamme de fonctionnalités pour gérer les activités de l'entreprise. Elle permet une amélioration de la productivité, une meilleure prise de décision et une réduction des coûts. Les entreprises qui adoptent SAP S4HANA peuvent bénéficier d'une compétitivité accrue et de la capacité de répondre aux besoins de leurs clients de manière efficace.
|
||||
BIN
generated/wevia-SAP-S4HANA-20260422-092211-db1bb1.pdf
Normal file
@@ -0,0 +1,28 @@
|
||||
# SAP S4HANA benefices migration
|
||||
|
||||
# Migration vers SAP S/4HANA : Les avantages
|
||||
|
||||
## Introduction
|
||||
|
||||
La migration vers SAP S/4HANA est un processus crucial pour les entreprises qui souhaitent bénéficier des dernières technologies et des fonctionnalités innovantes de l'entreprise. Dans ce document, nous allons explorer les avantages de la migration vers SAP S/4HANA et comment elle peut aider les entreprises à améliorer leur performance et leur compétitivité.
|
||||
|
||||
## Avantages de la migration vers SAP S/4HANA
|
||||
|
||||
### Amélioration de la performance
|
||||
|
||||
* **Gain de productivité** : SAP S/4HANA est conçu pour être plus rapide et plus efficace que les anciennes versions de SAP, ce qui signifie que les utilisateurs peuvent travailler plus rapidement et avec plus de précision.
|
||||
* **Réduction des coûts** : La migration vers SAP S/4HANA peut aider les entreprises à réduire leurs coûts liés à la maintenance et à l'entretien de leurs systèmes actuels.
|
||||
|
||||
### Innovation et flexibilité
|
||||
|
||||
* **Fonctionnalités innovantes** : SAP S/4HANA offre une gamme de fonctionnalités innovantes qui peuvent aider les entreprises à améliorer leur processus d'affaires, tels que la gestion de la chaîne d'approvisionnement, la gestion des ressources humaines et la gestion financière.
|
||||
* **Intégration avec les technologies émergentes** : SAP S/4HANA est conçu pour être intégré avec les technologies émergentes, telles que l'intelligence artificielle, la réalité virtuelle et la blockchain.
|
||||
|
||||
### Sécurité et conformité
|
||||
|
||||
* **Sécurité renforcée** : SAP S/4HANA offre une sécurité renforcée pour protéger les données sensibles des entreprises.
|
||||
* **Conformité réglementaire** : SAP S/4HANA est conçu pour être conforme aux réglementations et aux normes internationales, telles que la GDPR et la SOX.
|
||||
|
||||
## Conclusion
|
||||
|
||||
La migration vers SAP S/4HANA est un processus crucial pour les entreprises qui souhaitent bénéficier des dernières technologies et des fonctionnalités innovantes de l'entreprise. Les avantages de la migration vers SAP S/4HANA comprennent l'amélioration de la performance, l'innovation et la flexibilité, ainsi que la sécurité et la conformité. En choisissant de migrer vers SAP S/4HANA, les entreprises peuvent améliorer leur performance et leur compétitivité, et se préparer à l'avenir.
|
||||
267
generated/wevia-code-SITE-ECOMMERCE-20260422-132141-dc46ea.py
Normal file
@@ -0,0 +1,267 @@
|
||||
# Importation des bibliothèques nécessaires
|
||||
from flask import Flask, render_template, request, redirect, url_for
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
# Création de l'application Flask
|
||||
app = Flask(__name__)
|
||||
|
||||
# Configuration de la base de données
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
# Modèle de la base de données
|
||||
class Produit(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
nom = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.String(200), nullable=False)
|
||||
prix = db.Column(db.Float, nullable=False)
|
||||
quantite = db.Column(db.Integer, nullable=False)
|
||||
|
||||
class Commande(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
produit_id = db.Column(db.Integer, db.ForeignKey('produit.id'), nullable=False)
|
||||
quantite = db.Column(db.Integer, nullable=False)
|
||||
|
||||
# Fonction pour afficher la liste des produits
|
||||
@app.route('/')
|
||||
def index():
|
||||
produits = Produit.query.all()
|
||||
return render_template('index.html', produits=produits)
|
||||
|
||||
# Fonction pour afficher le détail d'un produit
|
||||
@app.route('/produit/<int:id>')
|
||||
def produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
return render_template('produit.html', produit=produit)
|
||||
|
||||
# Fonction pour ajouter un produit
|
||||
@app.route('/ajouter_produit', methods=['GET', 'POST'])
|
||||
def ajouter_produit():
|
||||
if request.method == 'POST':
|
||||
nom = request.form['nom']
|
||||
description = request.form['description']
|
||||
prix = float(request.form['prix'])
|
||||
quantite = int(request.form['quantite'])
|
||||
produit = Produit(nom=nom, description=description, prix=prix, quantite=quantite)
|
||||
db.session.add(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('ajouter_produit.html')
|
||||
|
||||
# Fonction pour ajouter une commande
|
||||
@app.route('/ajouter_commande', methods=['GET', 'POST'])
|
||||
def ajouter_commande():
|
||||
if request.method == 'POST':
|
||||
produit_id = int(request.form['produit_id'])
|
||||
quantite = int(request.form['quantite'])
|
||||
commande = Commande(produit_id=produit_id, quantite=quantite)
|
||||
db.session.add(commande)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('ajouter_commande.html')
|
||||
|
||||
# Fonction pour afficher la liste des commandes
|
||||
@app.route('/commandes')
|
||||
def commandes():
|
||||
commandes = Commande.query.all()
|
||||
return render_template('commandes.html', commandes=commandes)
|
||||
|
||||
# Fonction pour supprimer un produit
|
||||
@app.route('/supprimer_produit/<int:id>')
|
||||
def supprimer_produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
db.session.delete(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Fonction pour supprimer une commande
|
||||
@app.route('/supprimer_commande/<int:id>')
|
||||
def supprimer_commande(id):
|
||||
commande = Commande.query.get(id)
|
||||
db.session.delete(commande)
|
||||
db.session.commit()
|
||||
return redirect(url_for('commandes'))
|
||||
|
||||
# Fonction pour afficher la page d'accueil
|
||||
@app.route('/accueil')
|
||||
def accueil():
|
||||
return render_template('accueil.html')
|
||||
|
||||
# Fonction pour afficher la page de contact
|
||||
@app.route('/contact')
|
||||
def contact():
|
||||
return render_template('contact.html')
|
||||
|
||||
# Fonction pour afficher la page de panier
|
||||
@app.route('/panier')
|
||||
def panier():
|
||||
return render_template('panier.html')
|
||||
|
||||
# Fonction pour afficher la page de paiement
|
||||
@app.route('/paiement')
|
||||
def paiement():
|
||||
return render_template('paiement.html')
|
||||
|
||||
# Fonction pour afficher la page de confirmation
|
||||
@app.route('/confirmation')
|
||||
def confirmation():
|
||||
return render_template('confirmation.html')
|
||||
|
||||
# Fonction pour afficher la page d'erreur
|
||||
@app.errorhandler(404)
|
||||
def page_not_found(e):
|
||||
return render_template('erreur.html'), 404
|
||||
|
||||
# Fonction pour lancer l'application
|
||||
if __name__ == '__main__':
|
||||
db.create_all()
|
||||
app.run(debug=True)
|
||||
|
||||
<!-- index.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Site E-commerce</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1> Liste des produits </h1>
|
||||
<ul>
|
||||
{% for produit in produits %}
|
||||
<li>
|
||||
{{ produit.nom }} - {{ produit.prix }}€
|
||||
<a href="{{ url_for('produit', id=produit.id) }}">Détails</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{{ url_for('ajouter_produit') }}">Ajouter un produit</a>
|
||||
<a href="{{ url_for('commandes') }}">Voir les commandes</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Détails du produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>{{ produit.nom }}</h1>
|
||||
<p>{{ produit.description }}</p>
|
||||
<p>Prix : {{ produit.prix }}€</p>
|
||||
<p>Quantité : {{ produit.quantite }}</p>
|
||||
<a href="{{ url_for('ajouter_commande', produit_id=produit.id) }}">Ajouter à la commande</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- ajouter_produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Ajouter un produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ajouter un produit</h1>
|
||||
<form method="post">
|
||||
<label for="nom">Nom :</label>
|
||||
<input type="text" id="nom" name="nom"><br><br>
|
||||
<label for="description">Description :</label>
|
||||
<input type="text" id="description" name="description"><br><br>
|
||||
<label for="prix">Prix :</label>
|
||||
<input type="number" id="prix" name="prix"><br><br>
|
||||
<label for="quantite">Quantité :</label>
|
||||
<input type="number" id="quantite" name="quantite"><br><br>
|
||||
<input type="submit" value="Ajouter">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- ajouter_commande.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Ajouter une commande</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ajouter une commande</h1>
|
||||
<form method="post">
|
||||
<label for="produit_id">Produit :</label>
|
||||
<select id="produit_id" name="produit_id">
|
||||
{% for produit in produits %}
|
||||
<option value="{{ produit.id }}">{{ produit.nom }}</option>
|
||||
{% endfor %}
|
||||
</select><br><br>
|
||||
<label for="quantite">Quantité :</label>
|
||||
<input type="number" id="quantite" name="quantite"><br><br>
|
||||
<input type="submit" value="Ajouter">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- commandes.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Commandes</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Commandes</h1>
|
||||
<ul>
|
||||
{% for commande in commandes %}
|
||||
<li>
|
||||
{{ commande.produit.nom }} - {{ commande.quantite }}
|
||||
<a href="{{ url_for('supprimer_commande', id=commande.id) }}">Supprimer</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- accueil.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Accueil</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Accueil</h1>
|
||||
<a href="{{ url_for('index') }}">Voir les produits</a>
|
||||
<a href="{{ url_for('commandes') }}">Voir les commandes</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- contact.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Contact</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Contact</h1>
|
||||
<p>Adresse : 123 rue de la République</p>
|
||||
<p>Téléphone : 01 23 45 67 89</p>
|
||||
<p>Email : contact@site-ecommerce.fr</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- panier.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Panier</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Panier</h1>
|
||||
<ul>
|
||||
{% for commande in commandes %}
|
||||
<li>
|
||||
{{ commande.produit.nom }} - {{ commande.quantite }}
|
||||
<a href="{{ url_for('supprimer_commande', id=commande.id) }}">Supprimer</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{{ url_for('paiement') }}">Payer</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- paiement.html -->
|
||||
<!DOCTYPE html>
|
||||
219
generated/wevia-code-site-commerce-20260422-092946-199ba8.py
Normal file
@@ -0,0 +1,219 @@
|
||||
# Importation des bibliothèques nécessaires
|
||||
from flask import Flask, render_template, request, redirect, url_for
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user, current_user
|
||||
from werkzeug.security import generate_password_hash, check_password_hash
|
||||
|
||||
# Création de l'application Flask
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = 'secret_key'
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
# Configuration de la base de données
|
||||
class User(UserMixin, db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
username = db.Column(db.String(20), unique=True, nullable=False)
|
||||
email = db.Column(db.String(120), unique=True, nullable=False)
|
||||
password = db.Column(db.String(60), nullable=False)
|
||||
|
||||
class Produit(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
nom = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.Text, nullable=False)
|
||||
prix = db.Column(db.Float, nullable=False)
|
||||
|
||||
# Configuration de la gestion des sessions
|
||||
login_manager = LoginManager(app)
|
||||
login_manager.login_view = 'login'
|
||||
|
||||
# Fonction pour récupérer l'utilisateur connecté
|
||||
@login_manager.user_loader
|
||||
def load_user(user_id):
|
||||
return User.query.get(int(user_id))
|
||||
|
||||
# Route pour la page d'accueil
|
||||
@app.route('/')
|
||||
def index():
|
||||
produits = Produit.query.all()
|
||||
return render_template('index.html', produits=produits)
|
||||
|
||||
# Route pour la page de connexion
|
||||
@app.route('/login', methods=['GET', 'POST'])
|
||||
def login():
|
||||
if request.method == 'POST':
|
||||
username = request.form['username']
|
||||
password = request.form['password']
|
||||
user = User.query.filter_by(username=username).first()
|
||||
if user and check_password_hash(user.password, password):
|
||||
login_user(user)
|
||||
return redirect(url_for('index'))
|
||||
return render_template('login.html')
|
||||
|
||||
# Route pour la page de déconnexion
|
||||
@app.route('/logout')
|
||||
@login_required
|
||||
def logout():
|
||||
logout_user()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Route pour la page de création de compte
|
||||
@app.route('/register', methods=['GET', 'POST'])
|
||||
def register():
|
||||
if request.method == 'POST':
|
||||
username = request.form['username']
|
||||
email = request.form['email']
|
||||
password = request.form['password']
|
||||
user = User(username=username, email=email, password=generate_password_hash(password))
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
return redirect(url_for('login'))
|
||||
return render_template('register.html')
|
||||
|
||||
# Route pour la page de création de produit
|
||||
@app.route('/produit', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def produit():
|
||||
if request.method == 'POST':
|
||||
nom = request.form['nom']
|
||||
description = request.form['description']
|
||||
prix = request.form['prix']
|
||||
produit = Produit(nom=nom, description=description, prix=prix)
|
||||
db.session.add(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('produit.html')
|
||||
|
||||
# Route pour la page de modification de produit
|
||||
@app.route('/produit/<int:id>', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def modifier_produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
if request.method == 'POST':
|
||||
produit.nom = request.form['nom']
|
||||
produit.description = request.form['description']
|
||||
produit.prix = request.form['prix']
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('modifier_produit.html', produit=produit)
|
||||
|
||||
# Route pour la page de suppression de produit
|
||||
@app.route('/produit/<int:id>/supprimer', methods=['POST'])
|
||||
@login_required
|
||||
def supprimer_produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
db.session.delete(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Lancement de l'application
|
||||
if __name__ == '__main__':
|
||||
db.create_all()
|
||||
app.run(debug=True)
|
||||
|
||||
<!-- index.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Site de commerce</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Accueil</h1>
|
||||
<ul>
|
||||
{% for produit in produits %}
|
||||
<li>{{ produit.nom }} - {{ produit.prix }}€</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{{ url_for('produit') }}">Créer un produit</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- login.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Connexion</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Connexion</h1>
|
||||
<form method="POST">
|
||||
<label for="username">Nom d'utilisateur :</label>
|
||||
<input type="text" id="username" name="username"><br><br>
|
||||
<label for="password">Mot de passe :</label>
|
||||
<input type="password" id="password" name="password"><br><br>
|
||||
<input type="submit" value="Se connecter">
|
||||
</form>
|
||||
<a href="{{ url_for('register') }}">Créer un compte</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- register.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Inscription</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Inscription</h1>
|
||||
<form method="POST">
|
||||
<label for="username">Nom d'utilisateur :</label>
|
||||
<input type="text" id="username" name="username"><br><br>
|
||||
<label for="email">Adresse e-mail :</label>
|
||||
<input type="email" id="email" name="email"><br><br>
|
||||
<label for="password">Mot de passe :</label>
|
||||
<input type="password" id="password" name="password"><br><br>
|
||||
<input type="submit" value="S'inscrire">
|
||||
</form>
|
||||
<a href="{{ url_for('login') }}">Se connecter</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Créer un produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Créer un produit</h1>
|
||||
<form method="POST">
|
||||
<label for="nom">Nom du produit :</label>
|
||||
<input type="text" id="nom" name="nom"><br><br>
|
||||
<label for="description">Description du produit :</label>
|
||||
<textarea id="description" name="description"></textarea><br><br>
|
||||
<label for="prix">Prix du produit :</label>
|
||||
<input type="number" id="prix" name="prix"><br><br>
|
||||
<input type="submit" value="Créer le produit">
|
||||
</form>
|
||||
<a href="{{ url_for('index') }}">Retour à l'accueil</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- modifier_produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Modifier un produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Modifier un produit</h1>
|
||||
<form method="POST">
|
||||
<label for="nom">Nom du produit :</label>
|
||||
<input type="text" id="nom" name="nom" value="{{ produit.nom }}"><br><br>
|
||||
<label for="description">Description du produit :</label>
|
||||
<textarea id="description" name="description">{{ produit.description }}</textarea><br><br>
|
||||
<label for="prix">Prix du produit :</label>
|
||||
<input type="number" id="prix" name="prix" value="{{ produit.prix }}"><br><br>
|
||||
<input type="submit" value="Modifier le produit">
|
||||
</form>
|
||||
<a href="{{ url_for('index') }}">Retour à l'accueil</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Ce code crée un site de commerce avec les fonctionnalités suivantes :
|
||||
|
||||
* Connexion et inscription des utilisateurs
|
||||
* Création, modification et suppression de produits
|
||||
* Affichage de la liste des produits sur la page d'accueil
|
||||
|
||||
Le code utilise la bibliothèque Flask pour créer l'application web et la bibliothèque SQLAlchemy pour gérer la base de données. Les templates HTML sont utilisés pour afficher les pages de l'application.
|
||||
@@ -0,0 +1,31 @@
|
||||
import tkinter as tk
|
||||
|
||||
class Counter:
|
||||
def __init__(self):
|
||||
self.value = 0
|
||||
self.root = tk.Tk()
|
||||
self.root.title("Compteur")
|
||||
|
||||
self.label = tk.Label(self.root, text="0", font=("Helvetica", 24))
|
||||
self.label.pack()
|
||||
|
||||
self.button_decrement = tk.Button(self.root, text="-", command=self.decrement)
|
||||
self.button_decrement.pack(side=tk.LEFT)
|
||||
|
||||
self.button_increment = tk.Button(self.root, text="+", command=self.increment)
|
||||
self.button_increment.pack(side=tk.RIGHT)
|
||||
|
||||
def increment(self):
|
||||
self.value += 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
def decrement(self):
|
||||
self.value -= 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
def run(self):
|
||||
self.root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
counter = Counter()
|
||||
counter.run()
|
||||
@@ -0,0 +1,28 @@
|
||||
import tkinter as tk
|
||||
|
||||
class Counter:
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
self.value = 0
|
||||
|
||||
self.label = tk.Label(master, text="0")
|
||||
self.label.pack()
|
||||
|
||||
self.button_plus = tk.Button(master, text="+", command=self.increment)
|
||||
self.button_plus.pack(side=tk.LEFT)
|
||||
|
||||
self.button_minus = tk.Button(master, text="-", command=self.decrement)
|
||||
self.button_minus.pack(side=tk.LEFT)
|
||||
|
||||
def increment(self):
|
||||
self.value += 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
def decrement(self):
|
||||
if self.value > 0:
|
||||
self.value -= 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
root = tk.Tk()
|
||||
counter = Counter(root)
|
||||
root.mainloop()
|
||||
BIN
generated/wevia-img-chat-20260422-090906-7eef2e.png
Normal file
|
After Width: | Height: | Size: 82 KiB |