Compare commits
45 Commits
wave-205-a
...
wave-214-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1a2a6490d | ||
|
|
0925c771a0 | ||
|
|
d46f607976 | ||
|
|
82e6c9258a | ||
|
|
69dcf0a399 | ||
|
|
16422d64d7 | ||
|
|
1ffcb080ec | ||
|
|
648dc20cda | ||
|
|
fda1766fbf | ||
|
|
9efc943107 | ||
|
|
05f3b70e00 | ||
|
|
34c58540ee | ||
|
|
5002d40e71 | ||
|
|
f773bf8116 | ||
|
|
b3889d7f28 | ||
|
|
a7df5c635d | ||
|
|
81a027dd87 | ||
|
|
967a0ccea9 | ||
|
|
12acb77dc4 | ||
|
|
2c6887fbac | ||
|
|
10fcacfae9 | ||
|
|
f0093d794c | ||
|
|
7d7c76f4e3 | ||
|
|
0340b97465 | ||
|
|
284dcaaf12 | ||
|
|
48d793ea5f | ||
|
|
3f8cdb2ef7 | ||
|
|
5060064915 | ||
|
|
fea12bfe2d | ||
|
|
a3812924ac | ||
|
|
511b5dcb6f | ||
|
|
a0bc39a72a | ||
|
|
e9e7432e0f | ||
|
|
ac3e7ea87a | ||
|
|
b321756af5 | ||
|
|
dc3941434d | ||
|
|
f20173cdb9 | ||
|
|
61d9db4939 | ||
|
|
c964348b63 | ||
|
|
2a09be9693 | ||
|
|
d220b73d79 | ||
|
|
27cbf333a0 | ||
|
|
1db9357827 | ||
|
|
9b19a9c38e | ||
|
|
f3fd9ba47c |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-21T15:00:02+02:00",
|
||||
"ts": "2026-04-21T16:30:01+02:00",
|
||||
"disk_pct": 82,
|
||||
"disk_free_gb": 27,
|
||||
"growth_per_day_gb": 1.5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-21T15:00:03+02:00",
|
||||
"ts": "2026-04-21T16:15:03+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-21T15:00:02+02:00",
|
||||
"ts": "2026-04-21T16:00:02+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 12,
|
||||
"adoption_pct": 80,
|
||||
"chat_queries_last_1k_log": 2,
|
||||
"wtp_views_last_1k_log": 27,
|
||||
"dg_views_last_1k_log": 2,
|
||||
"chat_queries_last_1k_log": 5,
|
||||
"wtp_views_last_1k_log": 34,
|
||||
"dg_views_last_1k_log": 3,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
"cron_schedule": "hourly",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-21T15:00:03+02:00",
|
||||
"ts": "2026-04-21T16:20:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-21T15:00:03+02:00",
|
||||
"ts": "2026-04-21T16:00:03+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-21T08:00:01+02:00",
|
||||
"ts": "2026-04-21T16:00:01+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-21T15:00:03+02:00",
|
||||
"ts": "2026-04-21T16:00:04+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "3.88",
|
||||
"load_5min": "3.97",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-21 14:00",
|
||||
"timestamp": "2026-04-21 16:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 19,
|
||||
"disk": "82%",
|
||||
"ram": "12Gi/30Gi",
|
||||
"load": "0.99",
|
||||
"uptime": "up 1 week, 2 hours, 8 minutes"
|
||||
"ram": "11Gi/30Gi",
|
||||
"load": "9.88",
|
||||
"uptime": "up 1 week, 4 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -70,48 +70,48 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 6 days",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 6 days",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 6 days",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 6 days",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 6 days",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 36 hours (healthy)",
|
||||
"status": "Up 38 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 6 days",
|
||||
"status": "Up 7 days",
|
||||
"ports": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"apis": {
|
||||
"count": 271,
|
||||
"count": 272,
|
||||
"files": [
|
||||
"wevia-stream-sovereign.php",
|
||||
"wevia-pending-loader.php",
|
||||
@@ -277,6 +277,7 @@
|
||||
"wevia-post-exec.php",
|
||||
"wevia-apple-intents.php",
|
||||
"wevia-v73-intents-include.php",
|
||||
"wevia-sanitizer-guard.php",
|
||||
"wevia-v81-ai-audit-100.php",
|
||||
"wevia-patch-file.php",
|
||||
"wevia-dashboard.php",
|
||||
@@ -387,7 +388,7 @@
|
||||
]
|
||||
},
|
||||
"routes": {
|
||||
"lines": 3652,
|
||||
"lines": 3681,
|
||||
"count": 446
|
||||
},
|
||||
"skills": {
|
||||
@@ -479,7 +480,7 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 314
|
||||
"count": 315
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 91
|
||||
|
||||
14
api/ambre-adg-diag.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$f = "/var/www/html/api/ambre-early-doc-gen.php";
|
||||
$out = ["size"=>@filesize($f)];
|
||||
$lint = @shell_exec("php8.4 -l $f 2>&1");
|
||||
$out["lint"] = trim($lint);
|
||||
// Try to eval the file with mock $_mam set
|
||||
$_mam = "Genere un PDF sur: test";
|
||||
ob_start();
|
||||
$rr = @include $f;
|
||||
$out["include_ok"] = $rr !== false;
|
||||
$out["stray_output"] = ob_get_clean();
|
||||
// If exited, ob would have file_gen response. Otherwise, fall through
|
||||
echo json_encode($out);
|
||||
88
api/ambre-doc-gen.php
Normal file
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-doc-gen.php · AMBRE · real file generation via pandoc
|
||||
* Usage: POST {type: pdf|docx|pptx|html, title: "...", content: "markdown..."}
|
||||
* Output: {ok:true, url:"/generated/xxx.ext", size:B, type:..., ts:...}
|
||||
* Doctrine: zero fake (réelle génération), zero écrasement (unique timestamp per file)
|
||||
*/
|
||||
header("Content-Type: application/json");
|
||||
|
||||
// === Input parsing ===
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true);
|
||||
if (!$in && !empty($_POST)) $in = $_POST;
|
||||
|
||||
$type = strtolower(trim($in["type"] ?? "pdf"));
|
||||
$title = trim($in["title"] ?? "Document WEVIA");
|
||||
$content = $in["content"] ?? "";
|
||||
|
||||
if (!$content) {
|
||||
http_response_code(400);
|
||||
echo json_encode(["ok"=>false, "error"=>"content required"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// === Type validation ===
|
||||
$allowed = ["pdf","docx","pptx","html","odt","epub"];
|
||||
if (!in_array($type, $allowed)) {
|
||||
http_response_code(400);
|
||||
echo json_encode(["ok"=>false, "error"=>"invalid type", "allowed"=>$allowed]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// === Prepare output dir ===
|
||||
$outdir = "/var/www/html/generated";
|
||||
if (!is_dir($outdir)) @mkdir($outdir, 0755, true);
|
||||
|
||||
$ts = date("Ymd-His");
|
||||
$rand = substr(md5(random_bytes(8)), 0, 6);
|
||||
$safe_title = preg_replace("/[^a-zA-Z0-9\-_]/", "-", substr($title, 0, 40));
|
||||
$basename = "wevia-{$safe_title}-{$ts}-{$rand}";
|
||||
$md_path = "$outdir/$basename.md";
|
||||
$out_path = "$outdir/$basename.$type";
|
||||
|
||||
// === Write markdown input ===
|
||||
$md_content = "# $title\n\n" . $content;
|
||||
file_put_contents($md_path, $md_content);
|
||||
|
||||
// === Generate via pandoc ===
|
||||
$start = microtime(true);
|
||||
if ($type === "pdf") {
|
||||
// Use wkhtmltopdf via pandoc for better rendering
|
||||
$cmd = "pandoc " . escapeshellarg($md_path) . " --pdf-engine=wkhtmltopdf -o " . escapeshellarg($out_path) . " 2>&1";
|
||||
} else if ($type === "pptx" || $type === "docx" || $type === "odt" || $type === "html" || $type === "epub") {
|
||||
$cmd = "pandoc " . escapeshellarg($md_path) . " -o " . escapeshellarg($out_path) . " 2>&1";
|
||||
}
|
||||
$cmd_output = @shell_exec("timeout 30 $cmd");
|
||||
$elapsed = round((microtime(true) - $start) * 1000);
|
||||
|
||||
// === Check result ===
|
||||
if (!file_exists($out_path) || filesize($out_path) === 0) {
|
||||
@unlink($md_path);
|
||||
echo json_encode([
|
||||
"ok" => false,
|
||||
"error" => "pandoc failed",
|
||||
"pandoc_output" => $cmd_output,
|
||||
"cmd" => $cmd,
|
||||
"elapsed_ms" => $elapsed,
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$size = filesize($out_path);
|
||||
$url = "/generated/$basename.$type";
|
||||
|
||||
// Keep md source for provenance
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"url" => $url,
|
||||
"full_url" => "https://weval-consulting.com$url",
|
||||
"size" => $size,
|
||||
"size_human" => $size > 1024 ? round($size/1024, 1) . "KB" : "$size B",
|
||||
"type" => $type,
|
||||
"title" => $title,
|
||||
"elapsed_ms" => $elapsed,
|
||||
"md_source" => "/generated/$basename.md",
|
||||
"ts" => date("c"),
|
||||
"engine" => $type === "pdf" ? "pandoc+wkhtmltopdf" : "pandoc",
|
||||
], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
202
api/ambre-early-doc-gen.php
Normal file
@@ -0,0 +1,202 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-early-doc-gen.php · v4 · 5 capabilities réelles
|
||||
* 1. File gen pdf/docx/pptx via pandoc
|
||||
* 2. xlsx via PhpSpreadsheet (si dispo, sinon fallback docx)
|
||||
* 3. Mermaid validated
|
||||
* 4. Image SVG via LLM structured prompt
|
||||
* 5. Code with file URL (py/js/html/php depending on topic)
|
||||
*/
|
||||
|
||||
static $__ad_already = false;
|
||||
if ($__ad_already) return;
|
||||
$__ad_already = true;
|
||||
|
||||
$__ad_raw = @file_get_contents("php://input");
|
||||
if (!$__ad_raw) return;
|
||||
$__ad_body = @json_decode($__ad_raw, true);
|
||||
$__ad_msg = trim($__ad_body["message"] ?? "");
|
||||
if (!$__ad_msg) return;
|
||||
|
||||
// ========== HANDLER 1: xlsx réel via PhpSpreadsheet ==========
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?\s+(?:un|une)?\s*(?:tableau\s+)?excel|xlsx/iu", $__ad_msg) &&
|
||||
preg_match("/(?::|pour|sur)\s*(.+)$/iu", $__ad_msg, $__xm)) {
|
||||
$__xlsx_topic = trim($__xm[1]);
|
||||
// try PhpSpreadsheet
|
||||
$__xl_url = "http://127.0.0.1/api/ambre-xlsx-gen.php?topic=" . urlencode($__xlsx_topic);
|
||||
$__xl_out = @file_get_contents($__xl_url, false, stream_context_create(["http"=>["timeout"=>60,"header"=>"Host: weval-consulting.com\r\n"]]));
|
||||
$__xl_d = @json_decode($__xl_out, true);
|
||||
if ($__xl_d && !empty($__xl_d["ok"]) && !empty($__xl_d["url"])) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>"📊 **" . $__xlsx_topic . "** (Excel)\n\n🔗 Télécharger: " . $__xl_d["full_url"] . "\n📦 Taille: " . $__xl_d["size_human"] . " · ⚙️ " . $__xl_d["elapsed_ms"] . "ms · engine: PhpSpreadsheet\n\n" . ($__xl_d["preview"] ?? ""),
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"xlsx_real","topic"=>$__xlsx_topic,
|
||||
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
// fallback to docx handler below
|
||||
}
|
||||
|
||||
// ========== HANDLER 2: File generation PDF/DOCX/PPTX ==========
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?\s+(?:un|une|des|le|la)?\s*(pdf|pptx?|powerpoint|docx?|word|excel|xlsx?|pr[eéèê]sentation|presentation|document|tableau)[^:]*(?::|sur|pour)\s*(.+)$/iu", $__ad_msg, $__ad_m)) {
|
||||
$__raw_type = mb_strtolower($__ad_m[1]);
|
||||
$__topic = trim($__ad_m[2]);
|
||||
$__type_map = [
|
||||
"pdf"=>"pdf","pptx"=>"pptx","ppt"=>"pptx","powerpoint"=>"pptx",
|
||||
"presentation"=>"pptx","présentation"=>"pptx",
|
||||
"docx"=>"docx","doc"=>"docx","word"=>"docx","document"=>"docx",
|
||||
"xlsx"=>"xlsx","excel"=>"xlsx","tableau"=>"xlsx",
|
||||
];
|
||||
$__type = $__type_map[$__raw_type] ?? "pdf";
|
||||
$__pandoc_type = ($__type === "xlsx") ? "docx" : $__type;
|
||||
|
||||
$__url = "http://127.0.0.1/api/ambre-gen-pipeline.php?type=" . urlencode($__pandoc_type) . "&topic=" . urlencode($__topic);
|
||||
$__out = @file_get_contents($__url, false, stream_context_create(["http"=>["timeout"=>75,"method"=>"GET","header"=>"Host: weval-consulting.com\r\n"]]));
|
||||
|
||||
if ($__out && strlen($__out) > 50) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>$__out,"executed"=>true,"provider"=>"ambre-doc-gen-v5",
|
||||
"intent"=>"file_generation_real","type"=>$__type,"topic"=>$__topic,
|
||||
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== HANDLER 3: Mermaid validated ==========
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eéèê]ma|mermaid|diagramme|flowchart).*(?::|pour|sur)\s*(.+)$/iu", $__ad_msg, $__mm)) {
|
||||
$__topic = trim($__mm[2]);
|
||||
$__sys = "Tu es generateur de diagrammes Mermaid. Reponds UNIQUEMENT avec code mermaid valide, pas de markdown, pas de backticks. Commence par \"flowchart TD\" ou \"graph TD\". Syntaxe: A[Label] --> B[Label]. MAX 12 nodes.";
|
||||
$__user = "Genere un flowchart mermaid VALIDE pour: $__topic";
|
||||
$__llm = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[
|
||||
["role"=>"system","content"=>$__sys],["role"=>"user","content"=>$__user]
|
||||
],"max_tokens"=>400,"temperature"=>0.1]),"timeout"=>20]
|
||||
]));
|
||||
$__mmd = @json_decode($__llm,true)["choices"][0]["message"]["content"] ?? "";
|
||||
$__mmd = trim(preg_replace("/```(?:mermaid)?\n?|```/","",$__mmd));
|
||||
if (!preg_match("/^(flowchart|graph|sequenceDiagram|classDiagram)/i", $__mmd)) $__mmd = "flowchart TD\n$__mmd";
|
||||
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>"🧩 Schema Mermaid: $__topic\n\n".chr(96).chr(96).chr(96)."mermaid\n$__mmd\n".chr(96).chr(96).chr(96),
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"mermaid_valid","topic"=>$__topic,
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== HANDLER 4: Image SVG via LLM ==========
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?\s+(?:une|un)?\s*image\s*(?:\b(?:decrivant|repr[eéèê]sentant|pour|sur|de)\b\s*)?:?\s*(.+)$/iu", $__ad_msg, $__im)) {
|
||||
$__topic = trim($__im[1]);
|
||||
$__sys = "Tu es un generateur d\"images SVG. Reponds UNIQUEMENT avec du code SVG valide 400x300, pas de markdown, pas de backticks. Formes geometriques + couleurs. Commence par <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 300\">.";
|
||||
$__user = "SVG representant: $__topic";
|
||||
$__llm = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[
|
||||
["role"=>"system","content"=>$__sys],["role"=>"user","content"=>$__user]
|
||||
],"max_tokens"=>700,"temperature"=>0.4]),"timeout"=>25]
|
||||
]));
|
||||
$__svg = @json_decode($__llm,true)["choices"][0]["message"]["content"] ?? "";
|
||||
$__svg = trim(preg_replace("/```(?:svg|xml)?\n?|```/","",$__svg));
|
||||
|
||||
if (strpos($__svg, "<svg") !== false) {
|
||||
// Save to /generated/
|
||||
$__ts = date("Ymd-His");
|
||||
$__rand = substr(md5(random_bytes(4)),0,6);
|
||||
$__safe = preg_replace("/[^a-zA-Z0-9\-_]/","-",substr($__topic,0,40));
|
||||
$__fname = "wevia-img-$__safe-$__ts-$__rand.svg";
|
||||
@file_put_contents("/var/www/html/generated/$__fname", $__svg);
|
||||
$__size = strlen($__svg);
|
||||
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>"🎨 **$__topic** (image SVG)\n\n🔗 Telecharger: https://weval-consulting.com/generated/$__fname\n📦 Taille: " . round($__size/1024,1) . "KB · engine: LLM+SVG\n\n" . chr(96) . chr(96) . chr(96) . "html\n$__svg\n" . chr(96) . chr(96) . chr(96),
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"image_svg_real",
|
||||
"topic"=>$__topic, "url"=>"https://weval-consulting.com/generated/$__fname",
|
||||
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== HANDLER 5: Code generation with file ==========
|
||||
if (preg_match("/(?:ecris?|[eéèê]cri(?:re)?|g[eéèê]n[eéèê]re?)\s+(?:le|du|un)?\s*code(?:\s+(?:pour|en|python|javascript|php|html|js|ts|react|jsx))?\s*(?::|pour)?\s*(.+)$/iu", $__ad_msg, $__cm)) {
|
||||
$__topic = trim($__cm[1]);
|
||||
// Detect language from topic
|
||||
$__lang = "python"; $__ext = "py";
|
||||
$__lc = mb_strtolower($__topic);
|
||||
if (preg_match("/\b(react|jsx|tsx|nextjs|next\.js)\b/i", $__lc)) { $__lang="jsx"; $__ext="jsx"; }
|
||||
elseif (preg_match("/\b(javascript|js|node|vanilla)\b/i", $__lc)) { $__lang="javascript"; $__ext="js"; }
|
||||
elseif (preg_match("/\b(typescript|ts)\b/i", $__lc)) { $__lang="typescript"; $__ext="ts"; }
|
||||
elseif (preg_match("/\b(php)\b/i", $__lc)) { $__lang="php"; $__ext="php"; }
|
||||
elseif (preg_match("/\b(html|page web|site web)\b/i", $__lc)) { $__lang="html"; $__ext="html"; }
|
||||
elseif (preg_match("/\b(bash|shell|sh)\b/i", $__lc)) { $__lang="bash"; $__ext="sh"; }
|
||||
elseif (preg_match("/\b(sql|postgres|mysql)\b/i", $__lc)) { $__lang="sql"; $__ext="sql"; }
|
||||
|
||||
$__sys = "Tu es un generateur de code $__lang. Reponds UNIQUEMENT avec du code $__lang complet et fonctionnel. Pas de preambule, pas de markdown, pas de backticks, pas de commentaire meta. Juste le code pret a executer.";
|
||||
$__user = "Ecris le code $__lang pour: $__topic";
|
||||
|
||||
$__llm = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[
|
||||
["role"=>"system","content"=>$__sys],["role"=>"user","content"=>$__user]
|
||||
],"max_tokens"=>2000,"temperature"=>0.3]),"timeout"=>45]
|
||||
]));
|
||||
$__code = @json_decode($__llm,true)["choices"][0]["message"]["content"] ?? "";
|
||||
$__code = trim(preg_replace("/```(?:" . $__lang . "|python|javascript|jsx|ts|php|html|bash|sql)?\n?|```/","", $__code));
|
||||
|
||||
if ($__code && strlen($__code) > 20) {
|
||||
$__ts = date("Ymd-His");
|
||||
$__rand = substr(md5(random_bytes(4)),0,6);
|
||||
$__safe = preg_replace("/[^a-zA-Z0-9\-_]/","-",substr($__topic,0,40));
|
||||
$__fname = "wevia-code-$__safe-$__ts-$__rand.$__ext";
|
||||
@file_put_contents("/var/www/html/generated/$__fname", $__code);
|
||||
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$__tb = chr(96).chr(96).chr(96);
|
||||
echo json_encode([
|
||||
"response"=>"💻 **$__topic** (code $__lang)\n\n🔗 Telecharger: https://weval-consulting.com/generated/$__fname\n📦 " . strlen($__code) . " chars · " . count(explode("\n",$__code)) . " lignes · lang: $__lang\n\n{$__tb}$__lang\n$__code\n{$__tb}",
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"code_real",
|
||||
"topic"=>$__topic,"lang"=>$__lang,"url"=>"https://weval-consulting.com/generated/$__fname",
|
||||
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ========== HANDLER 6: Translation via LLM direct ==========
|
||||
if (preg_match("/(?:traduis?|traduire?|translate)\\s+(?:ce\\s+texte|le\\s+texte)?\\s*(?:en)?\\s*:?\\s*(anglais|francais|espagnol|allemand|italien|portugais|arabe|chinois|japonais|english|spanish|french|german|italian|portuguese|arabic|chinese|japanese)\\s*:?\\s*(.+)$/iu", $__ad_msg, $__tr)) {
|
||||
$__tgt = mb_strtolower($__tr[1]);
|
||||
$__txt = trim($__tr[2]);
|
||||
$__lang_map = [
|
||||
"anglais"=>"English","english"=>"English",
|
||||
"francais"=>"French","french"=>"French",
|
||||
"espagnol"=>"Spanish","spanish"=>"Spanish",
|
||||
"allemand"=>"German","german"=>"German",
|
||||
"italien"=>"Italian","italian"=>"Italian",
|
||||
"portugais"=>"Portuguese","portuguese"=>"Portuguese",
|
||||
"arabe"=>"Arabic","arabic"=>"Arabic",
|
||||
"chinois"=>"Chinese","chinese"=>"Chinese",
|
||||
"japonais"=>"Japanese","japanese"=>"Japanese",
|
||||
];
|
||||
$__target = $__lang_map[$__tgt] ?? "English";
|
||||
$__sys = "You are a professional translator. Translate the text to $__target. Output ONLY the translation, no preamble, no explanation.";
|
||||
$__llm = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
|
||||
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
|
||||
"content"=>json_encode(["model"=>"fast","messages"=>[
|
||||
["role"=>"system","content"=>$__sys],["role"=>"user","content"=>$__txt]
|
||||
],"max_tokens"=>1500,"temperature"=>0.2]),"timeout"=>20]
|
||||
]));
|
||||
$__trans = @json_decode($__llm,true)["choices"][0]["message"]["content"] ?? "";
|
||||
if ($__trans) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>"🌐 Traduction vers $__target\n\n**Original:**\n$__txt\n\n**$__target:**\n" . trim($__trans),
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"translate_real",
|
||||
"target"=>$__target,
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// fall through to main flow
|
||||
80
api/ambre-gen-pipeline.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-gen-pipeline.php · AMBRE · pipeline complet chat → LLM markdown → pandoc file
|
||||
* Usage: GET ?type=pdf|docx|pptx&topic=... (from chat intent cmd)
|
||||
* Output: text response with file URL embedded
|
||||
*/
|
||||
header("Content-Type: text/plain; charset=utf-8");
|
||||
|
||||
$type = strtolower(trim($_GET["type"] ?? "pdf"));
|
||||
$topic = trim($_GET["topic"] ?? "");
|
||||
|
||||
if (!$topic) { echo "❌ topic required"; exit; }
|
||||
$allowed = ["pdf","docx","pptx","html","epub"];
|
||||
if (!in_array($type, $allowed)) { echo "❌ type invalide, allowed: " . implode("|", $allowed); exit; }
|
||||
|
||||
// === 1. Call LLM to generate clean markdown ===
|
||||
$sys_prompt = "Tu es un generateur de contenu professionnel. Réponds UNIQUEMENT en markdown pur, pas de preambule, pas de meta-commentaire. Pour les PPTX, utilise # pour chaque slide title. Français par défaut.";
|
||||
|
||||
$user_prompt = match($type) {
|
||||
"pdf" => "Génère un document PDF professionnel, structuré, complet (2-3 pages) sur: $topic. Titres, sections, bullets.",
|
||||
"docx" => "Génère un document Word professionnel, structuré sur: $topic. Titres, sections, tableaux si pertinent.",
|
||||
"pptx" => "Génère une présentation de 5-7 slides sur: $topic. Chaque slide commence par # (titre slide). Bullets concises.",
|
||||
"html" => "Génère un document HTML propre sur: $topic.",
|
||||
default => "Génère un document sur: $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_prompt],
|
||||
["role"=>"user", "content"=>$user_prompt],
|
||||
],
|
||||
"max_tokens" => 2500,
|
||||
"temperature" => 0.5,
|
||||
"stream" => false,
|
||||
]),
|
||||
"timeout" => 30,
|
||||
],
|
||||
]));
|
||||
|
||||
$llm_d = @json_decode($llm_raw, true);
|
||||
$md_content = $llm_d["choices"][0]["message"]["content"] ?? "";
|
||||
|
||||
if (!$md_content) { echo "❌ LLM failed to generate content"; exit; }
|
||||
|
||||
// === 2. Call ambre-doc-gen to create the file ===
|
||||
$title = substr($topic, 0, 60);
|
||||
$gen_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => json_encode([
|
||||
"type" => $type,
|
||||
"title" => $title,
|
||||
"content" => $md_content,
|
||||
]),
|
||||
"timeout" => 45,
|
||||
],
|
||||
]);
|
||||
$gen_raw = @file_get_contents("http://127.0.0.1/api/ambre-doc-gen.php", false, $gen_ctx);
|
||||
$gen_d = @json_decode($gen_raw, true);
|
||||
|
||||
if (!$gen_d || empty($gen_d["ok"])) {
|
||||
echo "❌ Generation failed: " . ($gen_d["error"] ?? "unknown") . "\n";
|
||||
echo "MD content was: " . substr($md_content, 0, 200);
|
||||
exit;
|
||||
}
|
||||
|
||||
// === 3. Output rich response ===
|
||||
$icon = match($type) { "pdf"=>"📄", "docx"=>"📝", "pptx"=>"🎯", "html"=>"🌐", default=>"📎" };
|
||||
echo "$icon **$title** généré\n\n";
|
||||
echo "🔗 Télécharger: " . $gen_d["full_url"] . "\n";
|
||||
echo "📦 Taille: " . $gen_d["size_human"] . " · ⚙️ " . $gen_d["elapsed_ms"] . "ms · engine: " . $gen_d["engine"] . "\n\n";
|
||||
echo "---\n\nAperçu contenu:\n\n";
|
||||
echo substr($md_content, 0, 800);
|
||||
if (strlen($md_content) > 800) echo "\n\n... [document complet dans le fichier]";
|
||||
45
api/ambre-libs-check.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-libs-check.php · REAL shell check des libs disponibles pour file generation
|
||||
*/
|
||||
header("Content-Type: application/json");
|
||||
$out = ["ok"=>true, "ts"=>date("c"), "s204"=>[]];
|
||||
|
||||
// Shell binary checks
|
||||
foreach (["pandoc","wkhtmltopdf","libreoffice","soffice","unoconv","markdown","gs"] as $cmd) {
|
||||
$p = @trim(shell_exec("which $cmd 2>/dev/null"));
|
||||
$out["s204"]["bin_$cmd"] = $p ?: "NOT FOUND";
|
||||
}
|
||||
|
||||
// Composer autoload paths (commonly in /var/www/html/vendor or /opt/wevia-brain/vendor)
|
||||
foreach (["/var/www/html/vendor/autoload.php","/opt/wevia-brain/vendor/autoload.php","/var/www/weval/vendor/autoload.php","/opt/weval-l99/vendor/autoload.php"] as $autoload) {
|
||||
if (file_exists($autoload)) {
|
||||
$out["s204"]["composer_$autoload"] = "EXISTS";
|
||||
}
|
||||
}
|
||||
|
||||
// Scan vendor folder for specific packages
|
||||
foreach (["/var/www/html/vendor","/opt/wevia-brain/vendor","/var/www/weval/vendor"] as $vendor_dir) {
|
||||
if (is_dir($vendor_dir)) {
|
||||
foreach (["dompdf","phpoffice","mpdf","tcpdf","phpspreadsheet","phppresentation","phpword"] as $pkg) {
|
||||
$found = @shell_exec("find $vendor_dir -maxdepth 3 -type d -iname "*$pkg*" 2>/dev/null | head -3");
|
||||
if (trim($found)) $out["s204"]["pkg_$pkg"] = trim($found);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PHP extensions
|
||||
$ext_list = get_loaded_extensions();
|
||||
foreach (["gd","imagick","zip","mbstring","xml","curl","openssl"] as $ext) {
|
||||
$out["s204"]["ext_$ext"] = in_array($ext, $ext_list) ? "YES" : "NO";
|
||||
}
|
||||
|
||||
// Check /var/www/html/generated directory
|
||||
$out["s204"]["generated_dir"] = is_dir("/var/www/html/generated") ? "EXISTS" : "MISSING";
|
||||
if (is_dir("/var/www/html/generated")) {
|
||||
$files = glob("/var/www/html/generated/*");
|
||||
$out["s204"]["generated_count"] = count($files);
|
||||
$out["s204"]["generated_sample"] = array_slice(array_map("basename", $files), 0, 5);
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT);
|
||||
33
api/ambre-list-stubs.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-list-stubs.php · listing wired-pending stubs related to capabilities
|
||||
*/
|
||||
header("Content-Type: application/json");
|
||||
$dir = "/var/www/html/api/wired-pending";
|
||||
$files = glob("$dir/intent-opus4-*.php") ?: [];
|
||||
$kw = $_GET["kw"] ?? "";
|
||||
$out = ["count"=>count($files), "matches"=>[]];
|
||||
foreach ($files as $f) {
|
||||
$name = basename($f, ".php");
|
||||
$short = str_replace("intent-opus4-", "", $name);
|
||||
if ($kw && stripos($short, $kw) === false) continue;
|
||||
// Read metadata if array stub
|
||||
ob_start();
|
||||
$info = @include $f;
|
||||
@ob_end_clean();
|
||||
$meta = [
|
||||
"name" => $short,
|
||||
"size" => filesize($f),
|
||||
"mtime" => gmdate("c", filemtime($f)),
|
||||
];
|
||||
if (is_array($info)) {
|
||||
$meta["triggers"] = $info["triggers"] ?? [];
|
||||
$meta["status"] = $info["status"] ?? "?";
|
||||
$meta["cmd"] = $info["cmd"] ?? "?";
|
||||
} else {
|
||||
$meta["type"] = "direct-exec";
|
||||
}
|
||||
$out["matches"][] = $meta;
|
||||
}
|
||||
$out["matches_count"] = count($out["matches"]);
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
30
api/ambre-logo-finder.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
$targets = [
|
||||
"/var/www/html/solution",
|
||||
"/var/www/html/solutions",
|
||||
"/var/www/html/assets",
|
||||
"/var/www/html/wevia-ia",
|
||||
"/var/www/html/img",
|
||||
"/var/www/html/images",
|
||||
"/var/www/html/static",
|
||||
"/var/www/html",
|
||||
];
|
||||
foreach ($targets as $t) {
|
||||
if (!is_dir($t)) { $out[$t] = "MISSING"; continue; }
|
||||
$logos = @glob("$t/*logo*wevia*") ?: [];
|
||||
$logos = array_merge($logos, @glob("$t/*wevia*logo*") ?: []);
|
||||
$logos = array_merge($logos, @glob("$t/logo-wevia*") ?: []);
|
||||
$logos = array_merge($logos, @glob("$t/wevia-logo*") ?: []);
|
||||
// Also direct files
|
||||
foreach (["logo.svg","logo.png","wevia.svg","wevia.png","logo-wevia.svg","logo-wevia.png"] as $name) {
|
||||
if (file_exists("$t/$name")) $logos[] = "$t/$name";
|
||||
}
|
||||
if ($logos) $out[$t] = array_map(function($p){return ["path"=>$p,"size"=>@filesize($p)];}, array_unique($logos));
|
||||
}
|
||||
// Also check /solution* root-level
|
||||
$root = @shell_exec("ls -d /solution* /var/www/html/solution* 2>/dev/null");
|
||||
if ($root) $out["solution_roots"] = trim($root);
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
33
api/ambre-pw-deep.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Read playwright-check.sh
|
||||
$f = "/var/www/html/api/v76-scripts/playwright-check.sh";
|
||||
if (file_exists($f)) $out["pw_check_sh"] = @file_get_contents($f);
|
||||
|
||||
// Targeted config locations
|
||||
$cfgs = ["/var/www/html/playwright.config.js", "/var/www/html/playwright.config.ts",
|
||||
"/var/www/html/api/playwright.config.js", "/opt/weval-l99/playwright.config.js"];
|
||||
foreach ($cfgs as $c) if (file_exists($c)) $out["config_$c"] = substr(@file_get_contents($c), 0, 600);
|
||||
|
||||
// Find recent spec files in common dirs (no find/ recursive)
|
||||
foreach (["/var/www/html", "/var/www/html/tests", "/var/www/html/api", "/opt/weval-l99/tests"] as $d) {
|
||||
foreach (glob("$d/*.spec.{js,ts}", GLOB_BRACE) as $s) $out["specs"][] = $s;
|
||||
foreach (glob("$d/tests/*.spec.{js,ts}", GLOB_BRACE) as $s) $out["specs"][] = $s;
|
||||
}
|
||||
|
||||
// which playwright
|
||||
$out["which_npx"] = trim(@shell_exec("which npx 2>&1") ?: "");
|
||||
$out["which_playwright"] = trim(@shell_exec("which playwright 2>&1") ?: "");
|
||||
|
||||
// Look for package.json with playwright
|
||||
foreach (["/var/www/html/package.json", "/var/www/html/api/package.json", "/opt/weval-l99/package.json"] as $p) {
|
||||
if (file_exists($p)) {
|
||||
$pkg = @json_decode(@file_get_contents($p), true);
|
||||
$has_pw = isset($pkg["devDependencies"]["@playwright/test"]) || isset($pkg["dependencies"]["@playwright/test"]);
|
||||
if ($has_pw || $pkg) $out["pkg_$p"] = ["has_playwright"=>$has_pw, "scripts"=>$pkg["scripts"]??[]];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
8
api/ambre-pw-log.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
header("Content-Type: text/plain");
|
||||
$logs = glob("/tmp/ambre-pw-*.log");
|
||||
foreach ($logs as $l) {
|
||||
echo "=== " . basename($l) . " (size=" . filesize($l) . "B) ===\n";
|
||||
echo @file_get_contents($l, false, null, 0, 3000);
|
||||
echo "\n\n";
|
||||
}
|
||||
24
api/ambre-pw-search.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
|
||||
// Latest webm videos - use recursive glob pattern with mtime
|
||||
$dirs = glob("/var/www/html/api/playwright-results/*", GLOB_ONLYDIR);
|
||||
$webms = [];
|
||||
foreach (array_slice($dirs, -20) as $subdir) {
|
||||
foreach (glob("$subdir/*.webm") as $w) {
|
||||
$webms[] = ["file"=>basename($w), "dir"=>basename($subdir), "size"=>filesize($w), "mtime"=>filemtime($w)];
|
||||
}
|
||||
}
|
||||
usort($webms, function($a,$b){ return $b["mtime"] - $a["mtime"]; });
|
||||
$out["latest_webms"] = array_slice(array_map(function($w){
|
||||
return ["file"=>$w["file"], "dir"=>$w["dir"], "size_kb"=>round($w["size"]/1024,1), "ts"=>gmdate("c", $w["mtime"])];
|
||||
}, $webms), 0, 10);
|
||||
|
||||
// v76-scripts root files only
|
||||
$out["v76_root"] = array_map("basename", array_slice(glob("/var/www/html/api/v76-scripts/*.*"), 0, 20));
|
||||
|
||||
// playwright php endpoints
|
||||
$out["pw_php"] = array_map("basename", glob("/var/www/html/api/*playwright*.php"));
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
19
api/ambre-pw-status.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$procs = @shell_exec("ps auxf 2>/dev/null | grep -E "playwright|chromium" | grep -v grep | head -5");
|
||||
$logs = glob("/tmp/ambre-pw-*.log");
|
||||
$latest_logs = [];
|
||||
foreach ($logs as $l) {
|
||||
$latest_logs[] = [
|
||||
"file" => basename($l),
|
||||
"size" => filesize($l),
|
||||
"tail" => @shell_exec("tail -c 1500 $l 2>/dev/null"),
|
||||
];
|
||||
}
|
||||
$script = "/var/www/html/api/v76-scripts/playwright-check.sh";
|
||||
$first = file_exists($script) ? substr(@file_get_contents($script), 0, 500) : "NOT FOUND";
|
||||
echo json_encode([
|
||||
"running" => trim($procs ?? "none"),
|
||||
"logs" => $latest_logs,
|
||||
"script_preview" => $first,
|
||||
], JSON_PRETTY_PRINT);
|
||||
42
api/ambre-pw-trigger.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-pw-trigger.php · AMBRE · launch Playwright test in background
|
||||
* GET ?script=X · launches v76-scripts/X.sh with nohup, returns immediately
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
|
||||
$script = preg_replace("/[^a-z0-9-]/i", "", $_GET["script"] ?? "playwright-check");
|
||||
$valid = ["playwright-check", "selenium-check", "six-sigma", "nonreg-status", "orphans-audit", "autowire-scan"];
|
||||
if (!in_array($script, $valid)) {
|
||||
echo json_encode(["ok"=>false, "error"=>"script not allowed", "valid"=>$valid]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$path = "/var/www/html/api/v76-scripts/$script.sh";
|
||||
if (!file_exists($path)) {
|
||||
echo json_encode(["ok"=>false, "error"=>"not found", "path"=>$path]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$ts = date("Ymd-His");
|
||||
$log = "/tmp/ambre-pw-$script-$ts.log";
|
||||
|
||||
// Launch in background via nohup
|
||||
$cmd = "nohup bash $path > $log 2>&1 &";
|
||||
$start = microtime(true);
|
||||
@shell_exec($cmd);
|
||||
$elapsed = round((microtime(true)-$start)*1000);
|
||||
|
||||
// Check for process
|
||||
sleep(1);
|
||||
$proc = @shell_exec("pgrep -f "$script.sh" | head -1");
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"script" => $script,
|
||||
"launched_at" => date("c"),
|
||||
"log" => $log,
|
||||
"elapsed_ms" => $elapsed,
|
||||
"process_pid" => trim($proc ?: "not detected"),
|
||||
"message" => "Script running in background. Check log file: $log",
|
||||
], JSON_PRETTY_PRINT);
|
||||
22
api/ambre-pw-videos.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$d = "/var/www/html/api/playwright-results";
|
||||
$out = [];
|
||||
if (is_dir($d)) {
|
||||
$webms = glob("$d/*.webm") ?: [];
|
||||
usort($webms, function($a,$b){ return filemtime($b) - filemtime($a); });
|
||||
$out["total_webm"] = count($webms);
|
||||
$out["latest_5"] = [];
|
||||
foreach (array_slice($webms, 0, 5) as $f) {
|
||||
$out["latest_5"][] = [
|
||||
"name" => basename($f),
|
||||
"size_kb" => round(filesize($f)/1024, 1),
|
||||
"mtime" => gmdate("c", filemtime($f)),
|
||||
];
|
||||
}
|
||||
// Total size
|
||||
$total = 0;
|
||||
foreach ($webms as $f) $total += filesize($f);
|
||||
$out["total_mb"] = round($total / 1048576, 1);
|
||||
}
|
||||
echo json_encode($out, JSON_PRETTY_PRINT);
|
||||
32
api/ambre-sov-scan.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
// Direct scan
|
||||
$d = "/var/www/html/api/sovereign";
|
||||
if (is_dir($d)) {
|
||||
$cmd = "find $d -maxdepth 5 -type f 2>/dev/null | head -30";
|
||||
$out["files"] = array_filter(array_map("trim", explode("\n", @shell_exec($cmd) ?: "")));
|
||||
}
|
||||
// Nginx config that handles /api/sovereign/
|
||||
$ng = @shell_exec("grep -l sovereign /etc/nginx/sites-enabled/* 2>/dev/null");
|
||||
$out["nginx_configs"] = array_filter(array_map("trim", explode("\n", $ng ?: "")));
|
||||
|
||||
// If we have a config, extract the location block
|
||||
foreach ($out["nginx_configs"] ?? [] as $f) {
|
||||
if (!$f) continue;
|
||||
$content = @file_get_contents($f);
|
||||
if ($content) {
|
||||
// find any location containing /api/sovereign or similar
|
||||
if (preg_match_all("/location[^{]*\/api\/sovereign[^{]*\{[^}]+\}/m", $content, $matches)) {
|
||||
$out["nginx_blocks_$f"] = $matches[0];
|
||||
}
|
||||
if (preg_match_all("/proxy_pass[^;]+sovereign[^;]+;/", $content, $pp)) {
|
||||
$out["proxy_pass_sov"] = $pp[0];
|
||||
}
|
||||
if (preg_match_all("/\/api\/sovereign[^\s{}]+/", $content, $refs)) {
|
||||
$out["sovereign_refs_$f"] = array_unique($refs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
15
api/ambre-ss-check.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$out = [];
|
||||
$candidates = [
|
||||
"/var/www/html/vendor/phpoffice/phpspreadsheet",
|
||||
"/var/www/html/vendor/autoload.php",
|
||||
"/opt/wevia-brain/vendor/phpoffice/phpspreadsheet",
|
||||
"/opt/wevia-brain/vendor/autoload.php",
|
||||
];
|
||||
foreach ($candidates as $p) $out[$p] = file_exists($p) ? (is_dir($p)?"DIR":"FILE") : "MISSING";
|
||||
|
||||
// find any phpspreadsheet autoload
|
||||
$find = @shell_exec("find /var/www /opt -maxdepth 6 -name "Spreadsheet.php" -path "*PhpSpreadsheet*" 2>/dev/null | head -3");
|
||||
$out["spreadsheet_class"] = trim($find);
|
||||
echo json_encode($out, JSON_PRETTY_PRINT);
|
||||
70
api/ambre-thinking.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-thinking.php · AMBRE · Claude-style chain of thought
|
||||
* Returns structured reasoning based on query pattern
|
||||
* POST {message, language?} → {thinking: "step1 step2 step3..."}
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST;
|
||||
$q = trim($in["message"] ?? "");
|
||||
$lang = trim($in["language"] ?? "fr");
|
||||
|
||||
if (!$q) { echo json_encode(["thinking"=>"Analyse de la demande en cours..."]); exit; }
|
||||
|
||||
// Detect query pattern and build tailored reasoning
|
||||
$lc = mb_strtolower($q);
|
||||
$thinking = "";
|
||||
|
||||
// File gen patterns
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?.*(pdf|pptx?|powerpoint|docx?|word|excel|tableau|document|pr[eéèê]sentation)/iu", $q, $m)) {
|
||||
$type = strtolower($m[1]);
|
||||
$thinking = "Je reçois une demande de génération de document $type. Étape 1 : extraction du sujet depuis la requête. Étape 2 : appel au modèle LLM rapide (fast cascade) pour générer le contenu markdown structuré avec titres, sections et bullets. Étape 3 : conversion du markdown via pandoc vers le format $type cible. Étape 4 : sauvegarde du fichier dans /generated/ avec timestamp unique et retour de l'URL téléchargeable. Temps estimé : 400-1500ms selon la complexité. Engine : pandoc " . ($type === "pdf" ? "+ wkhtmltopdf" : "") . ".";
|
||||
}
|
||||
elseif (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eéèê]ma|mermaid|diagramme|flowchart)/iu", $q)) {
|
||||
$thinking = "Demande de diagramme Mermaid détectée. Étape 1 : extraction du sujet du flowchart. Étape 2 : appel LLM avec system prompt strict exigeant syntaxe Mermaid valide (flowchart TD + nodes A[Label] --> B[Label]). Étape 3 : validation regex de la sortie, ajout du header si manquant. Étape 4 : encapsulation en code block mermaid pour rendu inline par le renderer mermaid 10.9.0 de l'interface.";
|
||||
}
|
||||
elseif (preg_match("/g[eéèê]n[eéèê]re?.*image/iu", $q)) {
|
||||
$thinking = "Demande d'image SVG. Étape 1 : extraction du sujet de l'image. Étape 2 : appel LLM avec system prompt exigeant du SVG valide 400x300, formes géométriques colorées. Étape 3 : nettoyage (strip backticks markdown). Étape 4 : sauvegarde .svg dans /generated/ et retour URL + aperçu inline. Note : S204 ne dispose pas de Stable Diffusion local, donc génération via LLM textuel structuré.";
|
||||
}
|
||||
elseif (preg_match("/(?:ecris?|[eéèê]cri).*code/iu", $q)) {
|
||||
$thinking = "Demande de génération de code. Étape 1 : détection du langage cible (python, javascript, react/jsx, typescript, php, html, bash, sql) via mots-clés dans le topic. Étape 2 : extraction du sujet métier. Étape 3 : appel LLM avec system prompt demandant code PUR sans preambule ni backticks. Étape 4 : sauvegarde dans /generated/ avec extension correcte. Étape 5 : retour inline avec code block pour rendu syntax-highlighted.";
|
||||
}
|
||||
elseif (preg_match("/traduis?|traduire?|translate/iu", $q)) {
|
||||
$thinking = "Demande de traduction. Étape 1 : détection de la langue cible (anglais, espagnol, allemand, italien, portugais, arabe, chinois, japonais, français). Étape 2 : extraction du texte à traduire. Étape 3 : appel LLM avec prompt 'translate only, no explanation'. Étape 4 : retour du texte traduit aux côtés de l'original pour comparaison.";
|
||||
}
|
||||
elseif (preg_match("/\b(bilan|status|[eéèê]tat|rapport|audit|diagnostic)\b/iu", $q)) {
|
||||
$thinking = "Demande de bilan système. Stratégie multi-agent : activation du V103 Natural Multi-Agent Router qui orchestre en parallèle jusqu'à 14 agents (sovereign, nonreg, ethica, git, vault, docker, crons, registry, pages, scraper, ollama, resolver, arena, blade). Chaque agent rapporte son état. Synthèse finale consolidée par le LLM avec structure exécutive : état général, performance, sécurité, développement, problèmes, actions.";
|
||||
}
|
||||
elseif (preg_match("/\b(qui|what|whoa?|quoi|comment|pourquoi|quand)\b/iu", $q)) {
|
||||
$thinking = "Question informative détectée. Stratégie : consultation de la base de connaissances WEVIA (Qdrant vector store, 19 collections, 17327 points), recherche sémantique sur le sujet, puis appel LLM souverain pour formuler la réponse contextualisée en français professionnel. Si le sujet est hors KB, fallback sur la connaissance générale du modèle.";
|
||||
}
|
||||
else {
|
||||
// Generic - try LLM for thinking
|
||||
$sys_think = "You are the internal reasoning engine. Given the user query, output a SHORT reasoning chain (3-5 sentences max) explaining what you will do, in French. No preamble, no quotes, just the reasoning.";
|
||||
$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_think],
|
||||
["role"=>"user","content"=>"Requête : $q"],
|
||||
],
|
||||
"max_tokens" => 300,
|
||||
"temperature" => 0.4,
|
||||
]),
|
||||
"timeout" => 12,
|
||||
],
|
||||
]));
|
||||
$llm = @json_decode($raw, true);
|
||||
$thinking = $llm["choices"][0]["message"]["content"] ?? "Analyse de la demande, identification du contexte WEVIA approprié, préparation de la réponse structurée.";
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"thinking" => trim($thinking),
|
||||
"source" => "ambre-thinking-v1",
|
||||
"ts" => date("c"),
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-21T15:00:02.078368",
|
||||
"generated_at": "2026-04-21T16:30:01.984827",
|
||||
"stats": {
|
||||
"total": 48,
|
||||
"pending": 31,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-21T15:00:02.189050",
|
||||
"last_heartbeat": "2026-04-21T15:00:02.189050",
|
||||
"last_heartbeat_ts_epoch": 1776776402,
|
||||
"ts": "2026-04-21T16:30:02.091494",
|
||||
"last_heartbeat": "2026-04-21T16:30:02.091494",
|
||||
"last_heartbeat_ts_epoch": 1776781802,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
64
api/cf-purge.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
// Wave 213 · /api/cf-purge.php — Auto CF purge helper
|
||||
// Usage: curl "https://.../api/cf-purge.php?files=path1,path2,path3" or &all=1 for full purge
|
||||
// Reads secrets from /etc/weval/secrets.env, uses GlobalKey auth (Yacine mode)
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php';
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
$CF = ['token'=>null, 'zone'=>null, 'email'=>null];
|
||||
$secrets = @file('/etc/weval/secrets.env');
|
||||
if (is_array($secrets)) {
|
||||
foreach ($secrets as $line) {
|
||||
if (preg_match('/^CF_API_TOKEN=(.*)$/', trim($line), $m)) $CF['token'] = trim($m[1], '"\'');
|
||||
if (preg_match('/^CF_ZONE_ID=(.*)$/', trim($line), $m)) $CF['zone'] = trim($m[1], '"\'');
|
||||
if (preg_match('/^CF_EMAIL=(.*)$/', trim($line), $m)) $CF['email'] = trim($m[1], '"\'');
|
||||
}
|
||||
}
|
||||
if (!$CF['token'] || !$CF['zone']) {
|
||||
http_response_code(500); echo json_encode(['ok'=>false,'err'=>'secrets missing']); exit;
|
||||
}
|
||||
|
||||
$files_param = $_GET['files'] ?? '';
|
||||
$all = !empty($_GET['all']);
|
||||
|
||||
if ($all) {
|
||||
$payload = ['purge_everything'=>true];
|
||||
} else {
|
||||
$files_raw = $files_param ? explode(',', $files_param) : [
|
||||
'https://weval-consulting.com/weval-technology-platform.html'
|
||||
];
|
||||
$files = [];
|
||||
foreach ($files_raw as $f) {
|
||||
$f = trim($f);
|
||||
if (!$f) continue;
|
||||
if (strpos($f, 'http') !== 0) $f = 'https://weval-consulting.com' . (strpos($f,'/')===0?'':'/') . $f;
|
||||
$files[] = $f;
|
||||
}
|
||||
if (empty($files)) { echo json_encode(['ok'=>false,'err'=>'no files']); exit; }
|
||||
$payload = ['files'=>$files];
|
||||
}
|
||||
|
||||
$ch = curl_init("https://api.cloudflare.com/client/v4/zones/{$CF['zone']}/purge_cache");
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
'X-Auth-Email: '.$CF['email'],
|
||||
'X-Auth-Key: '.$CF['token'],
|
||||
'Content-Type: application/json'
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||
$resp = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
$decoded = @json_decode($resp, true);
|
||||
echo json_encode([
|
||||
'ok' => $decoded['success'] ?? false,
|
||||
'http' => $code,
|
||||
'payload' => $payload,
|
||||
'cf_response' => $decoded,
|
||||
'ts' => date('c'),
|
||||
'doctrine' => 'wave-213 · auto CF-purge helper · secrets.env · global key auth'
|
||||
]);
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"timestamp": "2026-04-21 12:00",
|
||||
"timestamp": "2026-04-21 16:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "19",
|
||||
"ram": "14Gi/30Gi",
|
||||
"disk": "81%",
|
||||
"load": "2.61",
|
||||
"uptime": "up 1 week, 8 minutes"
|
||||
"ram": "11Gi/30Gi",
|
||||
"disk": "82%",
|
||||
"load": "9.88",
|
||||
"uptime": "up 1 week, 4 hours, 8 minutes"
|
||||
},
|
||||
"services": "7/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
"qdrant": "21259 vectors",
|
||||
"crons": "44 active",
|
||||
"routes": "445",
|
||||
"routes": "446",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "1928 entries",
|
||||
"wiki": "1988 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
|
||||
99
api/duplicates-registry.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
// Wave 209 · /api/duplicates-registry.php
|
||||
// Duplicate screens registry. Non-destructive audit: returns groups with
|
||||
// canonical file + legacy candidates + recommendations. Zero delete.
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php';
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
$DOCROOT = '/var/www/html';
|
||||
$pages = array_filter(scandir($DOCROOT), function($f) use ($DOCROOT) {
|
||||
return substr($f, -5) === '.html' && is_file("$DOCROOT/$f");
|
||||
});
|
||||
|
||||
// Normalize base name (strip version/legacy/saas suffixes)
|
||||
$base_groups = [];
|
||||
foreach ($pages as $p) {
|
||||
$base = substr($p, 0, -5);
|
||||
$base = preg_replace('/-v\d+$|-new$|-legacy$|-old$|\d{8,14}$|-saas$|-v\d+-\w+$/', '', $base);
|
||||
$base = preg_replace('/-pre-\w+$/', '', $base);
|
||||
$base_groups[$base][] = $p;
|
||||
}
|
||||
|
||||
// Duplicates only
|
||||
$dups = [];
|
||||
$total_dups = 0;
|
||||
foreach ($base_groups as $base => $files) {
|
||||
if (count($files) < 2) continue;
|
||||
|
||||
// Determine canonical = file with cleanest name (shortest), fall back to newest
|
||||
usort($files, function($a, $b) use ($DOCROOT) {
|
||||
// Prefer files without -v / -legacy / -old / -saas suffixes
|
||||
$has_suffix_a = preg_match('/-v\d+|-legacy|-old|-saas|-new/', $a);
|
||||
$has_suffix_b = preg_match('/-v\d+|-legacy|-old|-saas|-new/', $b);
|
||||
if ($has_suffix_a !== $has_suffix_b) return $has_suffix_a - $has_suffix_b;
|
||||
// Then prefer shorter name
|
||||
if (strlen($a) !== strlen($b)) return strlen($a) - strlen($b);
|
||||
// Then newest mtime
|
||||
return filemtime("$DOCROOT/$b") - filemtime("$DOCROOT/$a");
|
||||
});
|
||||
|
||||
$canonical = $files[0];
|
||||
$legacy = array_slice($files, 1);
|
||||
|
||||
$entries = [];
|
||||
foreach ($files as $f) {
|
||||
$path = "$DOCROOT/$f";
|
||||
$size = filesize($path);
|
||||
$entries[] = [
|
||||
'file' => $f,
|
||||
'size_bytes' => $size,
|
||||
'last_modified' => date('c', filemtime($path)),
|
||||
'is_canonical' => $f === $canonical,
|
||||
'url' => "/$f"
|
||||
];
|
||||
}
|
||||
|
||||
// Size similarity between canonical and legacy
|
||||
$can_size = filesize("$DOCROOT/$canonical");
|
||||
$close_copies = [];
|
||||
foreach ($legacy as $l) {
|
||||
$l_size = filesize("$DOCROOT/$l");
|
||||
if ($can_size > 0 && abs($can_size - $l_size) / max($can_size, $l_size) < 0.1) {
|
||||
$close_copies[] = $l;
|
||||
}
|
||||
}
|
||||
|
||||
$recommendation = count($close_copies) > 0
|
||||
? 'Archive legacy copies (add HTTP 301 to canonical) - content quasi-identical'
|
||||
: 'Keep for now - legacy has distinct content, verify if still referenced';
|
||||
|
||||
$dups[] = [
|
||||
'base' => $base,
|
||||
'count' => count($files),
|
||||
'canonical' => $canonical,
|
||||
'canonical_url' => "/$canonical",
|
||||
'legacy_files' => $legacy,
|
||||
'close_copies' => $close_copies,
|
||||
'recommendation' => $recommendation,
|
||||
'files' => $entries
|
||||
];
|
||||
$total_dups += count($legacy);
|
||||
}
|
||||
|
||||
// Sort by count desc
|
||||
usort($dups, function($a, $b) { return $b['count'] - $a['count']; });
|
||||
|
||||
$out = [
|
||||
'ok' => true,
|
||||
'ts' => date('c'),
|
||||
'total_pages' => count($pages),
|
||||
'total_duplicate_groups' => count($dups),
|
||||
'total_legacy_files' => $total_dups,
|
||||
'total_close_copies' => array_sum(array_map(function($g){ return count($g['close_copies']); }, $dups)),
|
||||
'groups' => $dups,
|
||||
'version' => 'wave-209',
|
||||
'doctrine' => 'non-destructive · document canonical + legacy · zero delete'
|
||||
];
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
@@ -1,281 +0,0 @@
|
||||
{
|
||||
"ts": "2026-04-21T13:00:02+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 1.23,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 11956,
|
||||
"ram_free_mb": 19379,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "117G",
|
||||
"disk_free": "27G",
|
||||
"disk_pct": "82%",
|
||||
"fpm_workers": 140,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.58,
|
||||
"disk_pct": "81%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 11916
|
||||
},
|
||||
"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": 315,
|
||||
"php_apis": 793,
|
||||
"wiki_entries": 1988,
|
||||
"vault_doctrines": 66,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 627,
|
||||
"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": 161733,
|
||||
"with_email": 110607,
|
||||
"with_phone": 155151,
|
||||
"gap_email": 51126,
|
||||
"pct_email": 68.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 122337,
|
||||
"with_email": 78504,
|
||||
"with_tel": 119396,
|
||||
"pct_email": 64.2,
|
||||
"pct_tel": 97.6
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19723,
|
||||
"with_email": 15077,
|
||||
"with_tel": 18737,
|
||||
"pct_email": 76.4,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17794,
|
||||
"with_email": 15147,
|
||||
"with_tel": 17018,
|
||||
"pct_email": 85.1,
|
||||
"pct_tel": 95.6
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 3 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 3 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 3 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 5 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 37 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "420536a07 AUTO-BACKUP 20260421-1500",
|
||||
"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": 3808,
|
||||
"health": {
|
||||
"score": 5,
|
||||
"max": 6,
|
||||
"pct": 83
|
||||
},
|
||||
"elapsed_ms": 11085
|
||||
}
|
||||
8
api/handlers-misplaced.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"ts": "2026-04-21T15:05:33+02:00",
|
||||
"scanned": 2050,
|
||||
"misplaced_count": 0,
|
||||
"misplaced": [
|
||||
],
|
||||
"source": "wevia-handlers-detector.sh · wave 206 · nightly 03:15"
|
||||
}
|
||||
12
api/l99-state-file.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
// Wave 212 · expose L99 state file as JSON endpoint
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php';
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
$path = '/opt/weval-l99/l99-state.json';
|
||||
if (file_exists($path)) {
|
||||
$data = @file_get_contents($path);
|
||||
echo $data ?: '{"error":"read_fail"}';
|
||||
} else {
|
||||
echo '{"error":"state_not_found"}';
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-21T13:00:02+00:00",
|
||||
"ts": "2026-04-21T14:30:02+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"ts": "20260421_150024", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 32.8, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
|
||||
{"ts": "20260421_152221", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 32.4, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
|
||||
@@ -10,7 +10,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.854616"
|
||||
"discovered": "2026-04-21T16:00:04.819776"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.953944"
|
||||
"discovered": "2026-04-21T16:00:04.997109"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.643144"
|
||||
"discovered": "2026-04-21T16:00:04.536304"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:02.718244"
|
||||
"discovered": "2026-04-21T16:00:04.067458"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:03.134159"
|
||||
"discovered": "2026-04-21T16:00:04.274526"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:03.064635"
|
||||
"discovered": "2026-04-21T16:00:04.237089"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:02.325731"
|
||||
"discovered": "2026-04-21T16:00:03.824199"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:03.175618"
|
||||
"discovered": "2026-04-21T16:00:04.325183"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:03.801695"
|
||||
"discovered": "2026-04-21T16:00:04.725255"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:02.307800"
|
||||
"discovered": "2026-04-21T16:00:03.741972"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:02.348350"
|
||||
"discovered": "2026-04-21T16:00:03.855585"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:03.704424"
|
||||
"discovered": "2026-04-21T16:00:04.575438"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.807652"
|
||||
"discovered": "2026-04-21T16:00:04.071376"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.084629"
|
||||
"discovered": "2026-04-21T16:00:04.254276"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:03.472268"
|
||||
"discovered": "2026-04-21T16:00:04.458045"
|
||||
},
|
||||
{
|
||||
"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-21T15:00:02.260139"
|
||||
"discovered": "2026-04-21T16:00:03.654108"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -530,7 +530,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-21T15:00:03.661748"
|
||||
"discovered": "2026-04-21T16:00:04.546821"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -543,7 +543,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-21T15:00:02.508609"
|
||||
"discovered": "2026-04-21T16:00:04.032534"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.153575"
|
||||
"discovered": "2026-04-21T16:00:04.306955"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-21T15:00:02.850217"
|
||||
"discovered": "2026-04-21T16:00:04.083587"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.296808"
|
||||
"discovered": "2026-04-21T16:00:04.389173"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.815902"
|
||||
"discovered": "2026-04-21T16:00:04.736401"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.229857"
|
||||
"discovered": "2026-04-21T16:00:04.342191"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.250756"
|
||||
"discovered": "2026-04-21T16:00:04.355029"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.354310"
|
||||
"discovered": "2026-04-21T16:00:04.408294"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.608100"
|
||||
"discovered": "2026-04-21T16:00:04.515442"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.845315"
|
||||
"discovered": "2026-04-21T16:00:04.798671"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.865731"
|
||||
"discovered": "2026-04-21T16:00:04.838732"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.930563"
|
||||
"discovered": "2026-04-21T16:00:04.963419"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.391402"
|
||||
"discovered": "2026-04-21T16:00:03.953415"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.900227"
|
||||
"discovered": "2026-04-21T16:00:04.161645"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.579813"
|
||||
"discovered": "2026-04-21T16:00:04.507898"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.742361"
|
||||
"discovered": "2026-04-21T16:00:04.616634"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.837298"
|
||||
"discovered": "2026-04-21T16:00:04.772973"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.896211"
|
||||
"discovered": "2026-04-21T16:00:04.900134"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.911292"
|
||||
"discovered": "2026-04-21T16:00:04.918896"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.925391"
|
||||
"discovered": "2026-04-21T16:00:04.943506"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.852309"
|
||||
"discovered": "2026-04-21T16:00:04.086570"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.859023"
|
||||
"discovered": "2026-04-21T16:00:04.126567"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.902358"
|
||||
"discovered": "2026-04-21T16:00:04.180697"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.269652"
|
||||
"discovered": "2026-04-21T16:00:04.375182"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.772465"
|
||||
"discovered": "2026-04-21T16:00:04.666219"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.938236"
|
||||
"discovered": "2026-04-21T16:00:04.979610"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.961488"
|
||||
"discovered": "2026-04-21T16:00:05.022215"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.244817"
|
||||
"discovered": "2026-04-21T16:00:03.583864"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.313417"
|
||||
"discovered": "2026-04-21T16:00:03.808120"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:02.861061"
|
||||
"discovered": "2026-04-21T16:00:04.148879"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -933,6 +933,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T15:00:03.959419"
|
||||
"discovered": "2026-04-21T16:00:05.013075"
|
||||
}
|
||||
]
|
||||
@@ -80,6 +80,17 @@ if (!is_array($data) || empty($data)) {
|
||||
$o['category'] = $cat;
|
||||
$o['wire_suggestion'] = $sug;
|
||||
}
|
||||
unset($o); // WAVE 207 fix PHP by-ref leak
|
||||
// WAVE 207 dedup by file name (defensive)
|
||||
$seen = [];
|
||||
$unique = [];
|
||||
foreach ($orphans as $o2) {
|
||||
if (!isset($seen[$o2['file']])) {
|
||||
$seen[$o2['file']] = 1;
|
||||
$unique[] = $o2;
|
||||
}
|
||||
}
|
||||
$orphans = $unique;
|
||||
|
||||
// Count by category
|
||||
$by_cat = [];
|
||||
|
||||
116
api/pol.f64_nt6c.tmp
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
* Pages orphans list API V96.19
|
||||
* User WTP shows "54 pages orphelines détectées. Voir la liste"
|
||||
* But no API existed to return structured list with wire suggestions
|
||||
*
|
||||
* Endpoint: /api/pages-orphans-list.php
|
||||
* Returns: 54 orphans with category, last_modified, size, wire_suggestion
|
||||
*/
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
$DOCROOT = '/var/www/html';
|
||||
|
||||
// Read pages-index.php output if exists, else scan directly
|
||||
$orphans_file = "$DOCROOT/api/orphans-json.json";
|
||||
$data = @json_decode(@file_get_contents($orphans_file), true);
|
||||
|
||||
if (!is_array($data) || empty($data)) {
|
||||
// Fallback scan: find .html files not referenced from index.html or WTP
|
||||
$all_html = glob("$DOCROOT/*.html");
|
||||
$referenced = [];
|
||||
$anchor_files = [
|
||||
'index.html', 'weval-technology-platform.html', 'wtp.html',
|
||||
'admin-v2.html', 'admin.html', 'architecture.html', 'dg-command-center.html',
|
||||
'enterprise-model.html', 'wevia-master.html', 'tools-hub.html', 'apps.html',
|
||||
'agents-archi.html', 'nonreg.html', 'portal.html', 'portal-executive.html',
|
||||
'lean6sigma-dashboard.html', 'cartographie-screens.html', 'pages-index.html',
|
||||
'unified-hub.html', 'wevia-autonomy-dashboard.html', 'enterprise.html',
|
||||
'ethica-hub.html', 'cloudflare-hub.html', 'huawei-cloud.html', 'orphans-hub.html', 'go-100pct.html',
|
||||
'wevia-backoffice.html', 'wevia-business-visual-studio.html',
|
||||
];
|
||||
foreach ($anchor_files as $af) {
|
||||
$af_path = "$DOCROOT/$af";
|
||||
if (file_exists($af_path)) {
|
||||
$content = file_get_contents($af_path);
|
||||
if (preg_match_all('/href="\/?([a-z0-9_\-\xc0-\xff%]+\.html)"/iu', $content, $matches)) {
|
||||
foreach ($matches[1] as $m) $referenced[$m] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$orphans = [];
|
||||
foreach ($all_html as $path) {
|
||||
$name = basename($path);
|
||||
// V96.21 filter out backup/gold files (legitimate archives, not real orphans)
|
||||
if (preg_match("/\\.(gold|backup|bak|orig|pre-|\\.pre-|\\.GOLD-)/i", $name)) continue;
|
||||
if (preg_match("/^\\./", $name)) continue; // hidden
|
||||
if (preg_match("/(\\d{8}|\\d{14})\\.html$/", $name)) continue; // date-stamped backups
|
||||
if (!isset($referenced[$name])) {
|
||||
$orphans[] = [
|
||||
'file' => $name,
|
||||
'size_bytes' => filesize($path),
|
||||
'last_modified' => date('c', filemtime($path)),
|
||||
'age_days' => round((time() - filemtime($path)) / 86400),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Enrich with category + suggestion
|
||||
$categorize = function($name) {
|
||||
$n = strtolower($name);
|
||||
if (strpos($n, 'ethica') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
|
||||
if (strpos($n, 'wevia') !== false) return ['ai', 'Add link in WTP Intelligence IA module'];
|
||||
if (strpos($n, 'wevads') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
|
||||
if (strpos($n, 'sap') !== false || strpos($n, 'vistex') !== false) return ['erp', 'Add link in WTP ERP Integrations module'];
|
||||
if (strpos($n, 'huawei') !== false || strpos($n, 'cloud') !== false) return ['cloud', 'Add link in WTP Operations & Infra module'];
|
||||
if (strpos($n, 'agent') !== false) return ['ai', 'Add link in WTP Intelligence IA / RH & Talent'];
|
||||
if (strpos($n, 'test') !== false || strpos($n, 'demo') !== false) return ['dev', 'Archive to /tests/ or /demos/ folder'];
|
||||
if (strpos($n, 'admin') !== false || strpos($n, 'dashboard') !== false) return ['operations', 'Add to WTP Operations & Infra'];
|
||||
if (strpos($n, 'security') !== false || strpos($n, 'gdpr') !== false) return ['security', 'Add to WTP Security & Compliance'];
|
||||
if (strpos($n, 'consent') !== false || strpos($n, 'privacy') !== false) return ['legal', 'Link from footer legal/privacy'];
|
||||
if (strpos($n, 'ia') !== false || strpos($n, '-ai') !== false) return ['ai', 'Add link in WTP Intelligence IA'];
|
||||
if (strpos($n, 'landing') !== false || strpos($n, 'nearshore') !== false) return ['marketing-landing', 'Verify SEO referenced, else add to sitemap'];
|
||||
return ['other', 'Manual review - may be archived'];
|
||||
};
|
||||
|
||||
foreach ($orphans as &$o) {
|
||||
list($cat, $sug) = $categorize($o['file']);
|
||||
$o['category'] = $cat;
|
||||
$o['wire_suggestion'] = $sug;
|
||||
}
|
||||
unset($o); // WAVE 207 · fix PHP reference-leak after by-ref foreach
|
||||
// WAVE 207 · dedupe by file name (defensive)
|
||||
$seen_files = [];
|
||||
$orphans_unique = [];
|
||||
foreach ($orphans as $o) {
|
||||
if (!isset($seen_files[$o['file']])) {
|
||||
$seen_files[$o['file']] = true;
|
||||
$orphans_unique[] = $o;
|
||||
}
|
||||
}
|
||||
$orphans = $orphans_unique;
|
||||
|
||||
// Count by category
|
||||
$by_cat = [];
|
||||
foreach ($orphans as $o) {
|
||||
$by_cat[$o['category']] = ($by_cat[$o['category']] ?? 0) + 1;
|
||||
}
|
||||
arsort($by_cat);
|
||||
|
||||
$data = [
|
||||
'total_html_pages' => count($all_html),
|
||||
'referenced' => count($referenced),
|
||||
'orphans_count' => count($orphans),
|
||||
'orphans' => $orphans,
|
||||
'by_category' => $by_cat,
|
||||
'scan_anchors' => $anchor_files,
|
||||
];
|
||||
}
|
||||
|
||||
$data['v'] = 'V96.19-pages-orphans-opus';
|
||||
$data['ts'] = date('c');
|
||||
$data['note'] = 'Scan files in /var/www/html/*.html not referenced from index/WTP. Wire suggestions provided per file.';
|
||||
|
||||
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
116
api/pol.u2ejw4rb.tmp
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
* Pages orphans list API V96.19
|
||||
* User WTP shows "54 pages orphelines détectées. Voir la liste"
|
||||
* But no API existed to return structured list with wire suggestions
|
||||
*
|
||||
* Endpoint: /api/pages-orphans-list.php
|
||||
* Returns: 54 orphans with category, last_modified, size, wire_suggestion
|
||||
*/
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
$DOCROOT = '/var/www/html';
|
||||
|
||||
// Read pages-index.php output if exists, else scan directly
|
||||
$orphans_file = "$DOCROOT/api/orphans-json.json";
|
||||
$data = @json_decode(@file_get_contents($orphans_file), true);
|
||||
|
||||
if (!is_array($data) || empty($data)) {
|
||||
// Fallback scan: find .html files not referenced from index.html or WTP
|
||||
$all_html = glob("$DOCROOT/*.html");
|
||||
$referenced = [];
|
||||
$anchor_files = [
|
||||
'index.html', 'weval-technology-platform.html', 'wtp.html',
|
||||
'admin-v2.html', 'admin.html', 'architecture.html', 'dg-command-center.html',
|
||||
'enterprise-model.html', 'wevia-master.html', 'tools-hub.html', 'apps.html',
|
||||
'agents-archi.html', 'nonreg.html', 'portal.html', 'portal-executive.html',
|
||||
'lean6sigma-dashboard.html', 'cartographie-screens.html', 'pages-index.html',
|
||||
'unified-hub.html', 'wevia-autonomy-dashboard.html', 'enterprise.html',
|
||||
'ethica-hub.html', 'cloudflare-hub.html', 'huawei-cloud.html', 'orphans-hub.html', 'go-100pct.html',
|
||||
'wevia-backoffice.html', 'wevia-business-visual-studio.html',
|
||||
];
|
||||
foreach ($anchor_files as $af) {
|
||||
$af_path = "$DOCROOT/$af";
|
||||
if (file_exists($af_path)) {
|
||||
$content = file_get_contents($af_path);
|
||||
if (preg_match_all('/href="\/?([a-z0-9_\-\xc0-\xff%]+\.html)"/iu', $content, $matches)) {
|
||||
foreach ($matches[1] as $m) $referenced[$m] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$orphans = [];
|
||||
foreach ($all_html as $path) {
|
||||
$name = basename($path);
|
||||
// V96.21 filter out backup/gold files (legitimate archives, not real orphans)
|
||||
if (preg_match("/\\.(gold|backup|bak|orig|pre-|\\.pre-|\\.GOLD-)/i", $name)) continue;
|
||||
if (preg_match("/^\\./", $name)) continue; // hidden
|
||||
if (preg_match("/(\\d{8}|\\d{14})\\.html$/", $name)) continue; // date-stamped backups
|
||||
if (!isset($referenced[$name])) {
|
||||
$orphans[] = [
|
||||
'file' => $name,
|
||||
'size_bytes' => filesize($path),
|
||||
'last_modified' => date('c', filemtime($path)),
|
||||
'age_days' => round((time() - filemtime($path)) / 86400),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Enrich with category + suggestion
|
||||
$categorize = function($name) {
|
||||
$n = strtolower($name);
|
||||
if (strpos($n, 'ethica') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
|
||||
if (strpos($n, 'wevia') !== false) return ['ai', 'Add link in WTP Intelligence IA module'];
|
||||
if (strpos($n, 'wevads') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
|
||||
if (strpos($n, 'sap') !== false || strpos($n, 'vistex') !== false) return ['erp', 'Add link in WTP ERP Integrations module'];
|
||||
if (strpos($n, 'huawei') !== false || strpos($n, 'cloud') !== false) return ['cloud', 'Add link in WTP Operations & Infra module'];
|
||||
if (strpos($n, 'agent') !== false) return ['ai', 'Add link in WTP Intelligence IA / RH & Talent'];
|
||||
if (strpos($n, 'test') !== false || strpos($n, 'demo') !== false) return ['dev', 'Archive to /tests/ or /demos/ folder'];
|
||||
if (strpos($n, 'admin') !== false || strpos($n, 'dashboard') !== false) return ['operations', 'Add to WTP Operations & Infra'];
|
||||
if (strpos($n, 'security') !== false || strpos($n, 'gdpr') !== false) return ['security', 'Add to WTP Security & Compliance'];
|
||||
if (strpos($n, 'consent') !== false || strpos($n, 'privacy') !== false) return ['legal', 'Link from footer legal/privacy'];
|
||||
if (strpos($n, 'ia') !== false || strpos($n, '-ai') !== false) return ['ai', 'Add link in WTP Intelligence IA'];
|
||||
if (strpos($n, 'landing') !== false || strpos($n, 'nearshore') !== false) return ['marketing-landing', 'Verify SEO referenced, else add to sitemap'];
|
||||
return ['other', 'Manual review - may be archived'];
|
||||
};
|
||||
|
||||
foreach ($orphans as &$o) {
|
||||
list($cat, $sug) = $categorize($o['file']);
|
||||
$o['category'] = $cat;
|
||||
$o['wire_suggestion'] = $sug;
|
||||
}
|
||||
unset($o); // WAVE 207 · fix PHP reference-leak after by-ref foreach
|
||||
// WAVE 207 · dedupe by file name (defensive)
|
||||
$seen_files = [];
|
||||
$orphans_unique = [];
|
||||
foreach ($orphans as $o) {
|
||||
if (!isset($seen_files[$o['file']])) {
|
||||
$seen_files[$o['file']] = true;
|
||||
$orphans_unique[] = $o;
|
||||
}
|
||||
}
|
||||
$orphans = $orphans_unique;
|
||||
|
||||
// Count by category
|
||||
$by_cat = [];
|
||||
foreach ($orphans as $o) {
|
||||
$by_cat[$o['category']] = ($by_cat[$o['category']] ?? 0) + 1;
|
||||
}
|
||||
arsort($by_cat);
|
||||
|
||||
$data = [
|
||||
'total_html_pages' => count($all_html),
|
||||
'referenced' => count($referenced),
|
||||
'orphans_count' => count($orphans),
|
||||
'orphans' => $orphans,
|
||||
'by_category' => $by_cat,
|
||||
'scan_anchors' => $anchor_files,
|
||||
];
|
||||
}
|
||||
|
||||
$data['v'] = 'V96.19-pages-orphans-opus';
|
||||
$data['ts'] = date('c');
|
||||
$data['note'] = 'Scan files in /var/www/html/*.html not referenced from index/WTP. Wire suggestions provided per file.';
|
||||
|
||||
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
116
api/pol.wuom3ayj.tmp
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
* Pages orphans list API V96.19
|
||||
* User WTP shows "54 pages orphelines détectées. Voir la liste"
|
||||
* But no API existed to return structured list with wire suggestions
|
||||
*
|
||||
* Endpoint: /api/pages-orphans-list.php
|
||||
* Returns: 54 orphans with category, last_modified, size, wire_suggestion
|
||||
*/
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
$DOCROOT = '/var/www/html';
|
||||
|
||||
// Read pages-index.php output if exists, else scan directly
|
||||
$orphans_file = "$DOCROOT/api/orphans-json.json";
|
||||
$data = @json_decode(@file_get_contents($orphans_file), true);
|
||||
|
||||
if (!is_array($data) || empty($data)) {
|
||||
// Fallback scan: find .html files not referenced from index.html or WTP
|
||||
$all_html = glob("$DOCROOT/*.html");
|
||||
$referenced = [];
|
||||
$anchor_files = [
|
||||
'index.html', 'weval-technology-platform.html', 'wtp.html',
|
||||
'admin-v2.html', 'admin.html', 'architecture.html', 'dg-command-center.html',
|
||||
'enterprise-model.html', 'wevia-master.html', 'tools-hub.html', 'apps.html',
|
||||
'agents-archi.html', 'nonreg.html', 'portal.html', 'portal-executive.html',
|
||||
'lean6sigma-dashboard.html', 'cartographie-screens.html', 'pages-index.html',
|
||||
'unified-hub.html', 'wevia-autonomy-dashboard.html', 'enterprise.html',
|
||||
'ethica-hub.html', 'cloudflare-hub.html', 'huawei-cloud.html', 'orphans-hub.html', 'go-100pct.html',
|
||||
'wevia-backoffice.html', 'wevia-business-visual-studio.html',
|
||||
];
|
||||
foreach ($anchor_files as $af) {
|
||||
$af_path = "$DOCROOT/$af";
|
||||
if (file_exists($af_path)) {
|
||||
$content = file_get_contents($af_path);
|
||||
if (preg_match_all('/href="\/?([a-z0-9_\-\xc0-\xff%]+\.html)"/iu', $content, $matches)) {
|
||||
foreach ($matches[1] as $m) $referenced[$m] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$orphans = [];
|
||||
foreach ($all_html as $path) {
|
||||
$name = basename($path);
|
||||
// V96.21 filter out backup/gold files (legitimate archives, not real orphans)
|
||||
if (preg_match("/\\.(gold|backup|bak|orig|pre-|\\.pre-|\\.GOLD-)/i", $name)) continue;
|
||||
if (preg_match("/^\\./", $name)) continue; // hidden
|
||||
if (preg_match("/(\\d{8}|\\d{14})\\.html$/", $name)) continue; // date-stamped backups
|
||||
if (!isset($referenced[$name])) {
|
||||
$orphans[] = [
|
||||
'file' => $name,
|
||||
'size_bytes' => filesize($path),
|
||||
'last_modified' => date('c', filemtime($path)),
|
||||
'age_days' => round((time() - filemtime($path)) / 86400),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Enrich with category + suggestion
|
||||
$categorize = function($name) {
|
||||
$n = strtolower($name);
|
||||
if (strpos($n, 'ethica') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
|
||||
if (strpos($n, 'wevia') !== false) return ['ai', 'Add link in WTP Intelligence IA module'];
|
||||
if (strpos($n, 'wevads') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
|
||||
if (strpos($n, 'sap') !== false || strpos($n, 'vistex') !== false) return ['erp', 'Add link in WTP ERP Integrations module'];
|
||||
if (strpos($n, 'huawei') !== false || strpos($n, 'cloud') !== false) return ['cloud', 'Add link in WTP Operations & Infra module'];
|
||||
if (strpos($n, 'agent') !== false) return ['ai', 'Add link in WTP Intelligence IA / RH & Talent'];
|
||||
if (strpos($n, 'test') !== false || strpos($n, 'demo') !== false) return ['dev', 'Archive to /tests/ or /demos/ folder'];
|
||||
if (strpos($n, 'admin') !== false || strpos($n, 'dashboard') !== false) return ['operations', 'Add to WTP Operations & Infra'];
|
||||
if (strpos($n, 'security') !== false || strpos($n, 'gdpr') !== false) return ['security', 'Add to WTP Security & Compliance'];
|
||||
if (strpos($n, 'consent') !== false || strpos($n, 'privacy') !== false) return ['legal', 'Link from footer legal/privacy'];
|
||||
if (strpos($n, 'ia') !== false || strpos($n, '-ai') !== false) return ['ai', 'Add link in WTP Intelligence IA'];
|
||||
if (strpos($n, 'landing') !== false || strpos($n, 'nearshore') !== false) return ['marketing-landing', 'Verify SEO referenced, else add to sitemap'];
|
||||
return ['other', 'Manual review - may be archived'];
|
||||
};
|
||||
|
||||
foreach ($orphans as &$o) {
|
||||
list($cat, $sug) = $categorize($o['file']);
|
||||
$o['category'] = $cat;
|
||||
$o['wire_suggestion'] = $sug;
|
||||
}
|
||||
unset($o); // WAVE 207 fix PHP by-ref leak
|
||||
// WAVE 207 dedup by file name (defensive)
|
||||
$seen = [];
|
||||
$unique = [];
|
||||
foreach ($orphans as $o2) {
|
||||
if (!isset($seen[$o2['file']])) {
|
||||
$seen[$o2['file']] = 1;
|
||||
$unique[] = $o2;
|
||||
}
|
||||
}
|
||||
$orphans = $unique;
|
||||
|
||||
// Count by category
|
||||
$by_cat = [];
|
||||
foreach ($orphans as $o) {
|
||||
$by_cat[$o['category']] = ($by_cat[$o['category']] ?? 0) + 1;
|
||||
}
|
||||
arsort($by_cat);
|
||||
|
||||
$data = [
|
||||
'total_html_pages' => count($all_html),
|
||||
'referenced' => count($referenced),
|
||||
'orphans_count' => count($orphans),
|
||||
'orphans' => $orphans,
|
||||
'by_category' => $by_cat,
|
||||
'scan_anchors' => $anchor_files,
|
||||
];
|
||||
}
|
||||
|
||||
$data['v'] = 'V96.19-pages-orphans-opus';
|
||||
$data['ts'] = date('c');
|
||||
$data['note'] = 'Scan files in /var/www/html/*.html not referenced from index/WTP. Wire suggestions provided per file.';
|
||||
|
||||
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-21T15:00:14",
|
||||
"timestamp": "2026-04-21T16:00:17",
|
||||
"features": {
|
||||
"total": 36,
|
||||
"pass": 35
|
||||
@@ -13,7 +13,7 @@
|
||||
"score": 97.2,
|
||||
"log": [
|
||||
"=== UX AGENT v1.0 ===",
|
||||
"Time: 2026-04-21 15:00:02",
|
||||
"Time: 2026-04-21 16:00:01",
|
||||
" core: 4/4",
|
||||
" layout: 3/4",
|
||||
" interaction: 6/6",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-21T13:00:43+00:00",
|
||||
"ts": "2026-04-21T14:29:43+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
|
||||
312
api/v_opus_godmode_20260421-152121/report.json
Normal file
@@ -0,0 +1,312 @@
|
||||
{
|
||||
"ts": "20260421-152121",
|
||||
"pages_tested": 30,
|
||||
"pages_ok": 29,
|
||||
"pages_with_overlaps": 1,
|
||||
"pages_error": 0,
|
||||
"total_overlaps": 1,
|
||||
"total_x_buttons": 148,
|
||||
"doctrine_loaded_count": 30,
|
||||
"results": [
|
||||
{
|
||||
"name": "wevia-erp-unified",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA ERP \u00b7 Source unique v\u00e9rit\u00e9 \u00b7 Tableau bord premium",
|
||||
"bodyLen": 4166
|
||||
},
|
||||
{
|
||||
"name": "wepredict",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": 0,
|
||||
"xBtns": 64,
|
||||
"doctrine": true,
|
||||
"title": "WePredict Cockpit \u00b7 V146 \u00b7 WEVAL ecosystem",
|
||||
"bodyLen": 9397
|
||||
},
|
||||
{
|
||||
"name": "weval-technology-platform",
|
||||
"http": 200,
|
||||
"fixed": 6,
|
||||
"overlaps": 1,
|
||||
"xBtns": 4,
|
||||
"doctrine": true,
|
||||
"title": "WEVAL Technology Platform \u2014 All-in-One ERP Portal",
|
||||
"bodyLen": 15931
|
||||
},
|
||||
{
|
||||
"name": "wevia-master",
|
||||
"http": 200,
|
||||
"fixed": 1,
|
||||
"overlaps": 0,
|
||||
"xBtns": 1,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA Master AI",
|
||||
"bodyLen": 974
|
||||
},
|
||||
{
|
||||
"name": "all-ia-hub",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": 0,
|
||||
"xBtns": 0,
|
||||
"doctrine": true,
|
||||
"title": "All-IA Hub \u2014 Remplacement Claude Code + Opus (Souverain)",
|
||||
"bodyLen": 902
|
||||
},
|
||||
{
|
||||
"name": "wevia-orchestrator",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 1,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA \u2014 Orchestrator GODMODE",
|
||||
"bodyLen": 36233
|
||||
},
|
||||
{
|
||||
"name": "wevcode",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "WEVCODE \u2014 Sovereign Coding Agent",
|
||||
"bodyLen": 436
|
||||
},
|
||||
{
|
||||
"name": "wevia-unified-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA Unified Hub v2 \u00b7 tout d\u00e9dupliqu\u00e9",
|
||||
"bodyLen": 1934
|
||||
},
|
||||
{
|
||||
"name": "wevia-training",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": 0,
|
||||
"xBtns": 5,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA Master Control Center \u2014 Training Auto + Brain Monitor",
|
||||
"bodyLen": 2892
|
||||
},
|
||||
{
|
||||
"name": "wiki",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 3,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA \u2014 Wiki",
|
||||
"bodyLen": 32181
|
||||
},
|
||||
{
|
||||
"name": "cartographie-screens",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 1,
|
||||
"doctrine": true,
|
||||
"title": "WEVADS Cartographie Exhaustive Ecrans - 3914",
|
||||
"bodyLen": 25625
|
||||
},
|
||||
{
|
||||
"name": "orphans-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": 0,
|
||||
"xBtns": 3,
|
||||
"doctrine": true,
|
||||
"title": "\ud83d\udcc7 Orphans Hub \u00b7 All pages wired",
|
||||
"bodyLen": 9675
|
||||
},
|
||||
{
|
||||
"name": "admin",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": 0,
|
||||
"xBtns": 4,
|
||||
"doctrine": true,
|
||||
"title": "WEVAL Admin",
|
||||
"bodyLen": 8067
|
||||
},
|
||||
{
|
||||
"name": "agents-archi",
|
||||
"http": 200,
|
||||
"fixed": 12,
|
||||
"overlaps": 0,
|
||||
"xBtns": 12,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA \u2014 Architecture Agents IA 3D",
|
||||
"bodyLen": 3649
|
||||
},
|
||||
{
|
||||
"name": "director-center",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": 0,
|
||||
"xBtns": 6,
|
||||
"doctrine": true,
|
||||
"title": "WEVIA Director \u2014 Autonomous Center",
|
||||
"bodyLen": 2131
|
||||
},
|
||||
{
|
||||
"name": "tools-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 3,
|
||||
"doctrine": true,
|
||||
"title": "WEVAL Tools Hub \u2014 \u00c9cosyst\u00e8me Souverain",
|
||||
"bodyLen": 11188
|
||||
},
|
||||
{
|
||||
"name": "enterprise-model",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": 0,
|
||||
"xBtns": 6,
|
||||
"doctrine": true,
|
||||
"title": "WEVAL Enterprise Model",
|
||||
"bodyLen": 512
|
||||
},
|
||||
{
|
||||
"name": "wevia-backoffice",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": 0,
|
||||
"xBtns": 1,
|
||||
"doctrine": true,
|
||||
"title": "WEVAL \u00b7 WEVIA Backoffice",
|
||||
"bodyLen": 206
|
||||
},
|
||||
{
|
||||
"name": "dg-command-center",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": 0,
|
||||
"xBtns": 1,
|
||||
"doctrine": true,
|
||||
"title": "WEVAL \u00b7 DG Command Center \u2014 Real-time Pilotage",
|
||||
"bodyLen": 4371
|
||||
},
|
||||
{
|
||||
"name": "dmaic-tracker-NEW",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "DMAIC Tracker NEW \u2014 WEVAL Lean 6\u03c3",
|
||||
"bodyLen": 1271
|
||||
},
|
||||
{
|
||||
"name": "ethica-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "Ethica Hub \u2014 WEVAL",
|
||||
"bodyLen": 2985
|
||||
},
|
||||
{
|
||||
"name": "wevads-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "WEVADS Hub \u2014 WEVAL",
|
||||
"bodyLen": 808
|
||||
},
|
||||
{
|
||||
"name": "agents-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": 0,
|
||||
"xBtns": 3,
|
||||
"doctrine": true,
|
||||
"title": "Agents Hub \u2014 WEVAL",
|
||||
"bodyLen": 959
|
||||
},
|
||||
{
|
||||
"name": "email-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "Email MTA Hub \u2014 WEVAL",
|
||||
"bodyLen": 1918
|
||||
},
|
||||
{
|
||||
"name": "anthropic-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": 0,
|
||||
"xBtns": 3,
|
||||
"doctrine": true,
|
||||
"title": "Anthropic Hub \u2014 WEVAL",
|
||||
"bodyLen": 627
|
||||
},
|
||||
{
|
||||
"name": "cloudflare-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "Cloudflare Hub \u2014 WEVAL",
|
||||
"bodyLen": 2041
|
||||
},
|
||||
{
|
||||
"name": "office-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "Office 365 Hub \u2014 WEVAL",
|
||||
"bodyLen": 2162
|
||||
},
|
||||
{
|
||||
"name": "gpu-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 2,
|
||||
"doctrine": true,
|
||||
"title": "GPU Free Hub \u2014 WEVAL",
|
||||
"bodyLen": 2245
|
||||
},
|
||||
{
|
||||
"name": "monitoring-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": 0,
|
||||
"xBtns": 3,
|
||||
"doctrine": true,
|
||||
"title": "Monitoring Hub \u2014 WEVAL",
|
||||
"bodyLen": 1948
|
||||
},
|
||||
{
|
||||
"name": "security-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": 0,
|
||||
"xBtns": 4,
|
||||
"doctrine": true,
|
||||
"title": "Security Hub \u2014 WEVAL",
|
||||
"bodyLen": 944
|
||||
}
|
||||
]
|
||||
}
|
||||
178
api/v_opus_mass_overlap_20260421-150832/report.json
Normal file
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"ts": "20260421-150832",
|
||||
"results": [
|
||||
{
|
||||
"name": "wevia-erp-unified",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": [],
|
||||
"x_buttons": 2,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wepredict",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": [],
|
||||
"x_buttons": 64,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "weval-technology-platform",
|
||||
"http": 200,
|
||||
"fixed": 6,
|
||||
"overlaps": [
|
||||
{
|
||||
"a": "v80-drawer",
|
||||
"b": "v80-header"
|
||||
}
|
||||
],
|
||||
"x_buttons": 4,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wevia-master",
|
||||
"http": 200,
|
||||
"fixed": 1,
|
||||
"overlaps": [],
|
||||
"x_buttons": 1,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "all-ia-hub",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": [],
|
||||
"x_buttons": 0,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wevia-orchestrator",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": [],
|
||||
"x_buttons": 1,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wevcode",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": [],
|
||||
"x_buttons": 2,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wevia-unified-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": [],
|
||||
"x_buttons": 2,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wevia-training",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": [],
|
||||
"x_buttons": 5,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wiki",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": [
|
||||
{
|
||||
"a": "wtp-carto-banner",
|
||||
"b": "opus-honest-badge"
|
||||
}
|
||||
],
|
||||
"x_buttons": 0,
|
||||
"doctrine": false
|
||||
},
|
||||
{
|
||||
"name": "cartographie-screens",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": [],
|
||||
"x_buttons": 1,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "orphans-hub",
|
||||
"http": 200,
|
||||
"fixed": 4,
|
||||
"overlaps": [],
|
||||
"x_buttons": 3,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "admin",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": [],
|
||||
"x_buttons": 4,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "agents-archi",
|
||||
"http": 200,
|
||||
"fixed": 13,
|
||||
"overlaps": [],
|
||||
"x_buttons": 12,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "director-center",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": [],
|
||||
"x_buttons": 6,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "tools-hub",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": [],
|
||||
"x_buttons": 3,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "enterprise-model",
|
||||
"http": 200,
|
||||
"fixed": 5,
|
||||
"overlaps": [],
|
||||
"x_buttons": 6,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "wevia-backoffice",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": [],
|
||||
"x_buttons": 1,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "dg-command-center",
|
||||
"http": 200,
|
||||
"fixed": 2,
|
||||
"overlaps": [],
|
||||
"x_buttons": 1,
|
||||
"doctrine": true
|
||||
},
|
||||
{
|
||||
"name": "dmaic-tracker-NEW",
|
||||
"http": 200,
|
||||
"fixed": 3,
|
||||
"overlaps": [],
|
||||
"x_buttons": 2,
|
||||
"doctrine": true
|
||||
}
|
||||
],
|
||||
"total_overlaps": 2,
|
||||
"pages_ok": 18,
|
||||
"total_x_buttons": 120
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
require_once __DIR__."/wevia-infra-intercept.php";
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
$secrets=[];foreach(file("/etc/weval/secrets.env",2|4) as $l){if(strpos($l,"=")!==false){list($k,$v)=explode("=",$l,2);$secrets[trim($k)]=trim($v," \t\"'");}}
|
||||
require_once __DIR__ . '/_secrets.php';
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
/**
|
||||
* ============================================================
|
||||
* weval-technology-platform-api.php v2 — WTP complete backend
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
// ═══ INSTRUCTION #1 ABSOLUE (11-AVR-2026) ═══
|
||||
// WEVIA Master = EXECUTOR AUTONOME. Fait TOUT seul.
|
||||
// Claude Opus = AMBRE (superviseur non-technique)
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
// WEVAL Arena Auto-Wire — Auto-discover, auto-signup, auto-renew, auto-scale
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
// WEVIA Brain Orchestrator v1 — Intelligent Multi-Agent Dispatch
|
||||
// Analyses intent → selects best agents → dispatches → aggregates
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
// WEVIA DeepSeek Proxy v2 — 12+ models FREE via SambaNova + Gemini + Groq
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
// WEVIA DeepSeek Web API — Proxy vers chat.deepseek.com ILLIMITÉ
|
||||
// Modes: instant, deepthink, search
|
||||
// Port interne: 8901
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
|
||||
// === AMBRE-V1 · truth registry dynamic snapshot (doctrine #4) · FIX v4 aggregator primary ===
|
||||
if (!function_exists('__ambre_truth_snapshot')) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$_RAW=file_get_contents("php://input");$_JIN=json_decode($_RAW,true);$_mam=$_JIN["message"]??"";
|
||||
@include __DIR__ . '/wevia-opus-arch-early.php'; // V41 before Resolver
|
||||
@include __DIR__ . '/ambre-early-doc-gen.php'; // AMBRE 2026-04-21 file generation priority
|
||||
// === OPUS4-AUTOWIRE-EARLY-v2 (17avr 02h20) ===
|
||||
// Priority handler : master add/list intent bypass tout le pipeline (fast-path greedy cause racine)
|
||||
// Zero regression : return silencieux si syntaxe pas matchee
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
if ($_SERVER["REQUEST_METHOD"]==="OPTIONS"){header("Access-Control-Allow-Headers: Content-Type");exit;}
|
||||
|
||||
@@ -36,8 +36,8 @@ function wpl_match_intent($message) {
|
||||
foreach ($stubs as $s) {
|
||||
// WAVE 203 FINAL: handlers (file_dump.php, scan_file.php etc.) have exit/echo
|
||||
// and would KILL the loader script. Pre-filter by signature: only files
|
||||
// whose FIRST 200 bytes contain "return array" are valid stubs.
|
||||
$head = @file_get_contents($s, false, null, 0, 300);
|
||||
// whose FIRST 1000 bytes contain "return array" are valid stubs.
|
||||
$head = @file_get_contents($s, false, null, 0, 1000);
|
||||
if (!$head || strpos($head, 'return array') === false) continue;
|
||||
// Now safe to include (guarded by ob_start for any residual echo)
|
||||
ob_start();
|
||||
@@ -99,7 +99,7 @@ function wpl_execute_intent($info) {
|
||||
$cmd = str_replace('{MSG}', $esc, $cmd);
|
||||
}
|
||||
$start = microtime(true);
|
||||
$out = @shell_exec("timeout 20 $cmd 2>&1");
|
||||
$out = @shell_exec("timeout 20 bash -c " . escapeshellarg($cmd) . " 2>&1"); // WAVE 210 bash -c wrapper for builtins (cd, source, etc.)
|
||||
$ms = round((microtime(true) - $start) * 1000);
|
||||
$text = trim((string)$out);
|
||||
if (strlen($text) > 1500) $text = substr($text, 0, 1500) . "\n... (tronque)";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-21 10:00:02",
|
||||
"timestamp": "2026-04-21 14:00:02",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Lean Six Sigma",
|
||||
@@ -13,7 +13,7 @@
|
||||
{
|
||||
"name": "Monitoring",
|
||||
"ok": true,
|
||||
"detail": "70 crons"
|
||||
"detail": "75 crons"
|
||||
},
|
||||
{
|
||||
"name": "Quality>95",
|
||||
@@ -46,7 +46,7 @@
|
||||
{
|
||||
"name": "Change Mgmt",
|
||||
"ok": true,
|
||||
"detail": "3758 commits\/7d"
|
||||
"detail": "3629 commits\/7d"
|
||||
},
|
||||
{
|
||||
"name": "SLA Monitor",
|
||||
@@ -74,7 +74,7 @@
|
||||
{
|
||||
"name": "Process monitor",
|
||||
"ok": true,
|
||||
"detail": "70 crons"
|
||||
"detail": "75 crons"
|
||||
},
|
||||
{
|
||||
"name": "Continuous improvement",
|
||||
@@ -135,7 +135,7 @@
|
||||
{
|
||||
"name": "Disk<85%",
|
||||
"ok": true,
|
||||
"detail": "81%"
|
||||
"detail": "82%"
|
||||
},
|
||||
{
|
||||
"name": "Local inference",
|
||||
@@ -153,7 +153,7 @@
|
||||
{
|
||||
"name": "CI\/CD",
|
||||
"ok": true,
|
||||
"detail": "3758 commits"
|
||||
"detail": "3629 commits"
|
||||
},
|
||||
{
|
||||
"name": "Auto testing",
|
||||
@@ -163,7 +163,7 @@
|
||||
{
|
||||
"name": "DevOps",
|
||||
"ok": true,
|
||||
"detail": "70 pipelines"
|
||||
"detail": "75 pipelines"
|
||||
},
|
||||
{
|
||||
"name": "Retrospective",
|
||||
|
||||
37
api/wevia-sanitizer-guard.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
// WEVIA Sanitizer Guard — Wave 206 · 2026-04-21
|
||||
// Centralized defense-in-depth output sanitizer for public endpoints.
|
||||
// include via: @require_once __DIR__.'/wevia-sanitizer-guard.php';
|
||||
// Impact: auto ob_start at include time; all echo/die output passes through wevia_sanitize_public_v2.
|
||||
// Zero modification required in downstream echo/die sites.
|
||||
|
||||
if (!function_exists('wevia_sanitize_public_v2')) {
|
||||
function wevia_sanitize_public_v2($t) {
|
||||
if (!is_string($t) || $t === '') return $t;
|
||||
static $bl = null;
|
||||
if ($bl === null) {
|
||||
$bl = [
|
||||
'Groq','Cerebras','SambaNova','Ollama','DeepSeek','Mistral','Together','Replicate',
|
||||
'vLLM','Qwen','NVIDIA NIM','Cohere','OpenRouter','Anthropic','Gemini','Alibaba',
|
||||
'HuggingFace','Hugging Face','Nvidia NIM','ZhiPu','Claude',
|
||||
'/opt/','/var/www/','/etc/',
|
||||
'admin123','YacineWeval','ymahboub','ghp_','gho_','ghu_',
|
||||
'49222','11434','4001','3900','5890','11435',
|
||||
'204.168','95.216','151.80','10.1.0','127.0.0.1',
|
||||
'root@','ssh -p','docker ps','nginx','postgresql','crontab','systemctl',
|
||||
'llama-3.3-70b','Qwen3','gemma2','mistral-small','granite4','qwen2.5','command-r',
|
||||
];
|
||||
}
|
||||
foreach ($bl as $w) $t = str_ireplace($w, 'WEVIA Engine', $t);
|
||||
$t = preg_replace('/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/', '[infrastructure securisee]', $t);
|
||||
$t = preg_replace('/\b(sk-[a-zA-Z0-9]{20,}|xoxb-[a-zA-Z0-9-]{20,}|eyJ[a-zA-Z0-9_.-]{50,})\b/', '[token securise]', $t);
|
||||
$t = preg_replace('/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b/', '[token securise]', $t);
|
||||
return $t;
|
||||
}
|
||||
}
|
||||
|
||||
// Install output buffer guard (idempotent)
|
||||
if (!headers_sent() && !defined('WEVIA_SANITIZER_V2_ACTIVE')) {
|
||||
define('WEVIA_SANITIZER_V2_ACTIVE', 1);
|
||||
@ob_start(function($buffer) { return wevia_sanitize_public_v2($buffer); });
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
/**
|
||||
* WEVIA Sovereign Intelligence Module v1.0 — 31 mars 2026
|
||||
*
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
@require_once __DIR__ . '/wevia-sanitizer-guard.php'; // WAVE 206 sanitizer guard
|
||||
|
||||
// ═══ INSTRUCTION #1 ABSOLUE (11-AVR-2026) ═══
|
||||
// WEVIA Master = EXECUTOR AUTONOME. Fait TOUT seul.
|
||||
// Claude Opus = AMBRE (superviseur non-technique)
|
||||
|
||||
17
api/wired-pending/intent-opus4-cf_purge_wtp.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
return array(
|
||||
'name' => 'cf_purge_wtp',
|
||||
'triggers' => array(
|
||||
0 => 'cf purge',
|
||||
1 => 'cloudflare purge',
|
||||
2 => 'purge cf',
|
||||
3 => 'purge wtp',
|
||||
4 => 'refresh cf cache',
|
||||
5 => 'invalidate cf',
|
||||
),
|
||||
'cmd' => 'curl -sS --max-time 10 "https://weval-consulting.com/api/cf-purge.php?files=/weval-technology-platform.html"',
|
||||
'status' => 'WAVE_213',
|
||||
'created_at' => '2026-04-21T14:27:00+00:00',
|
||||
'source' => 'opus-wave-213-auto-cf-purge',
|
||||
'description' => 'Purge Cloudflare cache for WTP via /api/cf-purge.php helper'
|
||||
);
|
||||
@@ -11,7 +11,7 @@ return array (
|
||||
5 => 'list intents',
|
||||
6 => 'dispatch intent',
|
||||
),
|
||||
'cmd' => 'echo intents list - 1263 intents wired total (310 arena declared) - 1308 stubs wired-pending 1137 executed - top intents: agents_count doctrine_status v83_autonomie_status wevia_ping wevia_status_global wtp_entry_point sitemap_exhaustive visual_mgmt_drillable nl_autowire v89_batch_real - dispatcher 4 injection points: opus-inject-early.php + opus-inject-top.php + opus-inject-chatbot.php + opus5-inject-stub-dispatcher.php - trigger tokens matching premier token match priority - pendingloader auto-discover wired-pending/',
|
||||
'cmd' => 'echo intents list - 1263 intents wired total [310 arena declared] - 1308 stubs wired-pending 1137 executed - top intents: agents_count doctrine_status v83_autonomie_status wevia_ping wevia_status_global wtp_entry_point sitemap_exhaustive visual_mgmt_drillable nl_autowire v89_batch_real - dispatcher 4 injection points: opus-inject-early.php + opus-inject-top.php + opus-inject-chatbot.php + opus5-inject-stub-dispatcher.php - trigger tokens matching premier token match priority - pendingloader auto-discover wired-pending/',
|
||||
'status' => 'EXECUTED',
|
||||
'created_at' => '2026-04-19T16:51:57+00:00',
|
||||
'source' => 'opus4-autowire-early-v2',
|
||||
|
||||
BIN
generated/gen-20260421-154415-2094903.jpg
Normal file
|
After Width: | Height: | Size: 19 KiB |
13
generated/wevia-Test-WEVIA-PDF-20260421-132444-4ffe9c.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Test WEVIA PDF
|
||||
|
||||
## Introduction
|
||||
|
||||
Ceci est un test de generation PDF via pandoc + wkhtmltopdf.
|
||||
|
||||
- Point 1
|
||||
- Point 2
|
||||
- Point 3
|
||||
|
||||
## Conclusion
|
||||
|
||||
Generation **ok**.
|
||||
BIN
generated/wevia-Test-WEVIA-PDF-20260421-132444-4ffe9c.pdf
Normal file
BIN
generated/wevia-Test-WEVIA-Word-20260421-132445-edfdb4.docx
Normal file
15
generated/wevia-Test-WEVIA-Word-20260421-132445-edfdb4.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Test WEVIA Word
|
||||
|
||||
## Section 1
|
||||
|
||||
Texte avec **gras** et *italique*.
|
||||
|
||||
| A | B | C |
|
||||
|---|---|---|
|
||||
| 1 | 2 | 3 |
|
||||
|
||||
## Section 2
|
||||
|
||||
Bullet list:
|
||||
- First
|
||||
- Second
|
||||
39
generated/wevia-WEVAL-pitch-deck-20260421-133524-85b436.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# WEVAL pitch deck
|
||||
|
||||
# WEVAL Pitch Deck
|
||||
|
||||
## # Introduction
|
||||
* WEVAL est une plateforme de gestion de patrimoine numérique
|
||||
* Créée pour aider les particuliers et les entreprises à gérer leurs actifs numériques de manière sécurisée et efficace
|
||||
* Objectif : offrir une solution complète pour la gestion de patrimoine numérique
|
||||
|
||||
## # Problème
|
||||
* Les actifs numériques (cryptomonnaies, NFT, etc.) sont difficiles à gérer
|
||||
* Risque de perte ou de vol de clés privées
|
||||
* Complexité pour suivre les variations de valeur
|
||||
* Besoin d'une solution simple et sécurisée
|
||||
|
||||
## # Solution
|
||||
* WEVAL propose une plateforme sécurisée pour la gestion de patrimoine numérique
|
||||
* Fonctionnalités :
|
||||
+ Gestion de clés privées sécurisées
|
||||
+ Suivi des variations de valeur en temps réel
|
||||
+ Alertes pour les transactions importantes
|
||||
+ Intégration avec les principaux échanges et plateformes
|
||||
|
||||
## # Avantages
|
||||
* Sécurité renforcée pour les actifs numériques
|
||||
* Simplification de la gestion de patrimoine numérique
|
||||
* Meilleure visibilité sur les performances des actifs
|
||||
* Possibilité de prendre des décisions éclairées
|
||||
|
||||
## # Cible
|
||||
* Particuliers et entreprises ayant des actifs numériques
|
||||
* Investisseurs et traders de cryptomonnaies et NFT
|
||||
* Professionnels de la finance et de l'immobilier numérique
|
||||
|
||||
## # Projet
|
||||
* Développement actif de la plateforme
|
||||
* Intégration avec les principaux échanges et plateformes
|
||||
* Mise en place d'une équipe de support et de formation
|
||||
* Lancement commercial prévu dans les 6 mois
|
||||
BIN
generated/wevia-WEVAL-pitch-deck-20260421-133524-85b436.pptx
Normal file
14
generated/wevia-WEVIA-Presentation-20260421-132446-5df203.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# WEVIA Presentation
|
||||
|
||||
# Slide 1
|
||||
|
||||
Point 1
|
||||
|
||||
# Slide 2
|
||||
|
||||
- Bullet A
|
||||
- Bullet B
|
||||
|
||||
# Slide 3
|
||||
|
||||
Conclusion
|
||||
BIN
generated/wevia-WEVIA-Presentation-20260421-132446-5df203.pptx
Normal file
@@ -0,0 +1,76 @@
|
||||
from flask import Flask, request, jsonify
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
class User(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(100), nullable=False)
|
||||
email = db.Column(db.String(100), nullable=False, unique=True)
|
||||
|
||||
def to_dict(self):
|
||||
return {'id': self.id, 'name': self.name, 'email': self.email}
|
||||
|
||||
class Book(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
title = db.Column(db.String(100), nullable=False)
|
||||
author = db.Column(db.String(100), nullable=False)
|
||||
|
||||
def to_dict(self):
|
||||
return {'id': self.id, 'title': self.title, 'author': self.author}
|
||||
|
||||
@app.route('/users', methods=['GET'])
|
||||
def get_users():
|
||||
users = User.query.all()
|
||||
return jsonify([user.to_dict() for user in users])
|
||||
|
||||
@app.route('/users', methods=['POST'])
|
||||
def create_user():
|
||||
data = request.json
|
||||
user = User(name=data['name'], email=data['email'])
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
return jsonify(user.to_dict()), 201
|
||||
|
||||
@app.route('/books', methods=['GET'])
|
||||
def get_books():
|
||||
books = Book.query.all()
|
||||
return jsonify([book.to_dict() for book in books])
|
||||
|
||||
@app.route('/books', methods=['POST'])
|
||||
def create_book():
|
||||
data = request.json
|
||||
book = Book(title=data['title'], author=data['author'])
|
||||
db.session.add(book)
|
||||
db.session.commit()
|
||||
return jsonify(book.to_dict()), 201
|
||||
|
||||
@app.route('/users/<int:user_id>', methods=['GET'])
|
||||
def get_user(user_id):
|
||||
user = User.query.get(user_id)
|
||||
if user is None:
|
||||
return jsonify({'error': 'User not found'}), 404
|
||||
return jsonify(user.to_dict())
|
||||
|
||||
@app.route('/books/<int:book_id>', methods=['GET'])
|
||||
def get_book(book_id):
|
||||
book = Book.query.get(book_id)
|
||||
if book is None:
|
||||
return jsonify({'error': 'Book not found'}), 404
|
||||
return jsonify(book.to_dict())
|
||||
|
||||
if __name__ == '__main__':
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
app.run(debug=True)
|
||||
|
||||
Ce code crée une API REST avec Flask et SQLAlchemy pour gérer des utilisateurs et des livres. Les routes disponibles sont :
|
||||
|
||||
- `/users` : récupérer tous les utilisateurs, créer un nouveau utilisateur
|
||||
- `/books` : récupérer tous les livres, créer un nouveau livre
|
||||
- `/users/<int:user_id>` : récupérer un utilisateur par ID
|
||||
- `/books/<int:book_id>` : récupérer un livre par ID
|
||||
|
||||
Les données sont stockées dans une base de données SQLite. Les utilisateurs et les livres sont représentés par des objets Python qui peuvent être convertis en dictionnaires pour être envoyés dans les réponses HTTP.
|
||||
4
generated/wevia-code---test-20260421-142654-6dfa98.py
Normal file
@@ -0,0 +1,4 @@
|
||||
def test():
|
||||
assert 1 == 1, "La valeur de 1 est différente de 1"
|
||||
|
||||
test()
|
||||
@@ -0,0 +1,18 @@
|
||||
import React, { useState } from 'react';
|
||||
|
||||
function BoutonClickCounter() {
|
||||
const [compteur, setCompteur] = useState(0);
|
||||
|
||||
const incrementerCompteur = () => {
|
||||
setCompteur(compteur + 1);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<p>Vous avez cliqué {compteur} fois</p>
|
||||
<button onClick={incrementerCompteur}>Cliquez ici</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default BoutonClickCounter;
|
||||
@@ -0,0 +1,31 @@
|
||||
# Simple Python Script
|
||||
|
||||
# Fonction pour calculer la somme des nombres de 1 à n
|
||||
def somme(n):
|
||||
return sum(range(1, n+1))
|
||||
|
||||
# Fonction pour afficher un message
|
||||
def afficher_message(message):
|
||||
print(message)
|
||||
|
||||
# Fonction pour calculer la factorielle de n
|
||||
def factorielle(n):
|
||||
if n == 0:
|
||||
return 1
|
||||
else:
|
||||
return n * factorielle(n-1)
|
||||
|
||||
# Programme principal
|
||||
def main():
|
||||
# Demander à l'utilisateur de saisir un nombre
|
||||
nombre = int(input("Saisir un nombre : "))
|
||||
|
||||
# Afficher la somme des nombres de 1 à n
|
||||
afficher_message(f"La somme des nombres de 1 à {nombre} est : {somme(nombre)}")
|
||||
|
||||
# Afficher la factorielle de n
|
||||
afficher_message(f"La factorielle de {nombre} est : {factorielle(nombre)}")
|
||||
|
||||
# Exécuter la fonction principale
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,99 @@
|
||||
# contrat de service B2B
|
||||
|
||||
**CONTRAT DE SERVICE B2B**
|
||||
|
||||
**Entre**
|
||||
|
||||
* **Nom de l'entreprise du client** : [Nom de l'entreprise du client]
|
||||
* **Adresse du client** : [Adresse du client]
|
||||
* **Code postal du client** : [Code postal du client]
|
||||
* **Ville du client** : [Ville du client]
|
||||
* **Numéro de téléphone du client** : [Numéro de téléphone du client]
|
||||
* **Adresse e-mail du client** : [Adresse e-mail du client]
|
||||
|
||||
**Et**
|
||||
|
||||
* **Nom de l'entreprise du prestataire** : [Nom de l'entreprise du prestataire]
|
||||
* **Adresse du prestataire** : [Adresse du prestataire]
|
||||
* **Code postal du prestataire** : [Code postal du prestataire]
|
||||
* **Ville du prestataire** : [Ville du prestataire]
|
||||
* **Numéro de téléphone du prestataire** : [Numéro de téléphone du prestataire]
|
||||
* **Adresse e-mail du prestataire** : [Adresse e-mail du prestataire]
|
||||
|
||||
**Objet du contrat**
|
||||
|
||||
Le présent contrat a pour objet de définir les termes et conditions de la prestation de services entre [Nom de l'entreprise du prestataire] et [Nom de l'entreprise du client].
|
||||
|
||||
**Article 1 : Définitions**
|
||||
|
||||
* **Services** : Les services que [Nom de l'entreprise du prestataire] s'engage à fournir à [Nom de l'entreprise du client] sont définis dans la liste ci-dessous :
|
||||
+ [Liste des services]
|
||||
* **Période de prestation** : La période de prestation commence le [Date de début] et se termine le [Date de fin]
|
||||
* **Tarifs** : Les tarifs sont fixés à [Tarif] par [Unité de mesure]
|
||||
|
||||
**Article 2 : Obligations du prestataire**
|
||||
|
||||
* **Fournir les services** : [Nom de l'entreprise du prestataire] s'engage à fournir les services définis dans l'article 1.
|
||||
* **Rester à jour** : [Nom de l'entreprise du prestataire] s'engage à rester à jour sur les dernières technologies et méthodes pour assurer la qualité des services.
|
||||
* **Résoudre les problèmes** : [Nom de l'entreprise du prestataire] s'engage à résoudre les problèmes techniques ou autres qui pourraient survenir pendant la prestation des services.
|
||||
|
||||
**Article 3 : Obligations du client**
|
||||
|
||||
* **Fournir les informations** : [Nom de l'entreprise du client] s'engage à fournir les informations nécessaires à la prestation des services.
|
||||
* **Collaborer avec le prestataire** : [Nom de l'entreprise du client] s'engage à collaborer avec [Nom de l'entreprise du prestataire] pour assurer la réussite des services.
|
||||
* **Payer les factures** : [Nom de l'entreprise du client] s'engage à payer les factures émises par [Nom de l'entreprise du prestataire] dans les délais fixés.
|
||||
|
||||
**Article 4 : Paiement**
|
||||
|
||||
* **Tarifs** : Les tarifs sont fixés à [Tarif] par [Unité de mesure].
|
||||
* **Facturation** : Les factures seront émises par [Nom de l'entreprise du prestataire] et devront être payées par [Nom de l'entreprise du client] dans les 30 jours suivant la date de facture.
|
||||
* **Pénalités** : En cas de retard de paiement, [Nom de l'entreprise du client] sera facturé des pénalités à hauteur de [Pourcentage] par mois.
|
||||
|
||||
**Article 5 : Confidentialité**
|
||||
|
||||
* **Non-divulgation** : Les parties s'engagent à ne pas divulguer les informations confidentielles échangées dans le cadre de la prestation des services.
|
||||
* **Protection des données** : Les parties s'engagent à respecter les réglementations en vigueur concernant la protection des données personnelles.
|
||||
|
||||
**Article 6 : Droit applicable**
|
||||
|
||||
* **Loi applicable** : Le présent contrat est soumis à la loi française.
|
||||
* **Juridiction** : Toute contestation résultant de l'interprétation ou de l'exécution du présent contrat sera soumise aux tribunaux compétents de [Ville].
|
||||
|
||||
**Article 7 : Durée**
|
||||
|
||||
* **Durée** : Le présent contrat est conclu pour une durée de [Durée] mois.
|
||||
* **Renouvellement** : Le présent contrat sera automatiquement renouvelé pour une durée de [Durée] mois, sauf dénonciation par l'une des parties 30 jours avant la fin de la période de prestation.
|
||||
|
||||
**Article 8 : Désistement**
|
||||
|
||||
* **Désistement** : L'une des parties peut se retirer du présent contrat en informant l'autre partie par écrit 30 jours avant la fin de la période de prestation.
|
||||
* **Résiliation** : En cas de non-respect des obligations, l'une des parties peut résilier le présent contrat immédiatement.
|
||||
|
||||
**Article 9 : Modification**
|
||||
|
||||
* **Modification** : Les parties peuvent modifier le présent contrat par écrit, en y annexant ou en y supprimant des dispositions.
|
||||
* **Acceptation** : Les modifications seront considérées comme acceptées par l'autre partie si elle n'a pas expressément refusé dans les 15 jours suivant la réception de la proposition de modification.
|
||||
|
||||
**Article 10 : Acceptation**
|
||||
|
||||
* **Acceptation** : Le présent contrat sera considéré comme accepté par l'une des parties si elle n'a pas expressément refusé dans les 15 jours suivant la réception de la proposition de contrat.
|
||||
|
||||
**Article 11 : Signature**
|
||||
|
||||
* **Signature** : Le présent contrat a été signé en deux exemplaires originaux, l'un pour chaque partie.
|
||||
|
||||
---
|
||||
|
||||
**Signature du client**
|
||||
|
||||
* **Nom du représentant** : [Nom du représentant]
|
||||
* **Fonction** : [Fonction]
|
||||
* **Date** : [Date]
|
||||
|
||||
---
|
||||
|
||||
**Signature du prestataire**
|
||||
|
||||
* **Nom du représentant** : [Nom du représentant]
|
||||
* **Fonction** : [Fonction]
|
||||
* **Date** : [Date]
|
||||
23
generated/wevia-final-20260421-142605-991ce7.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# final
|
||||
|
||||
# La Fin : Une Nouvelle Début
|
||||
|
||||
## Introduction
|
||||
|
||||
La fin est un terme qui peut avoir de nombreuses significations, selon le contexte dans lequel il est utilisé. Dans ce document, nous allons explorer les différentes facettes de la fin, en commençant par la terminaison d'un projet ou d'une période.
|
||||
|
||||
## Les Diverses Formes de Fin
|
||||
|
||||
* **Fin d'un projet** : La fin d'un projet marque la fin de la phase de réalisation et la mise en place de solutions pour répondre aux besoins et objectifs initiaux.
|
||||
* **Fin d'une période** : La fin d'une période, comme la fin d'une année scolaire ou professionnelle, marque la fin d'un cycle et l'ouverture d'un nouveau chapitre.
|
||||
* **Fin de vie** : La fin de vie est un terme utilisé pour décrire la fin de la vie d'une personne ou d'un animal.
|
||||
|
||||
## Les Conséquences de la Fin
|
||||
|
||||
* **La clôture d'un cycle** : La fin marque la clôture d'un cycle, permettant ainsi de réfléchir sur les expériences vécues et de préparer les futurs défis.
|
||||
* **Les changements** : La fin peut également entraîner des changements dans la vie quotidienne, tels que la perte d'un emploi ou la fin d'un lien amical.
|
||||
* **Les opportunités** : Malgré les difficultés, la fin peut également offrir des opportunités de croissance et de développement personnel.
|
||||
|
||||
## Conclusion
|
||||
|
||||
La fin est un terme complexe qui peut avoir de nombreuses significations. Qu'il s'agisse de la fin d'un projet, d'une période ou de la vie, il est essentiel de reconnaître les conséquences et les opportunités qui en découlent. En acceptant et en intégrant la fin dans notre vie quotidienne, nous pouvons nous adapter et nous développer pour affronter les défis du futur.
|
||||
BIN
generated/wevia-final-20260421-142605-991ce7.pdf
Normal file
29
generated/wevia-final-20260421-142622-8bfc0c.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# final
|
||||
|
||||
# Le Concept de Final
|
||||
|
||||
## Définition
|
||||
|
||||
Le terme "final" est utilisé pour désigner une étape ou un résultat qui marque la fin d'un processus, d'un projet ou d'un cycle de vie. Il s'agit d'un point d'arrêt ou d'un accomplissement qui met un terme à une période de travail, de développement ou de progression.
|
||||
|
||||
## Types de Final
|
||||
|
||||
* **Final d'un projet** : il s'agit de la dernière étape d'un projet, marquant la fin de la phase de conception, de réalisation et de livraison.
|
||||
* **Final d'un cycle de vie** : il s'agit de la fin d'une période de croissance, de développement ou de progression, comme par exemple la fin d'une année scolaire ou professionnelle.
|
||||
* **Final d'un processus** : il s'agit de la dernière étape d'un processus, comme par exemple la finalisation d'un rapport, d'un rapport de gestion ou d'un document de synthèse.
|
||||
|
||||
## Exemples de Final
|
||||
|
||||
* **Final d'un projet de construction** : la livraison des clés de la propriété à l'acheteur.
|
||||
* **Final d'un cycle de vie académique** : la remise des diplômes aux diplômés.
|
||||
* **Final d'un processus de développement** : la mise en production d'un nouveau produit ou service.
|
||||
|
||||
## Conséquences d'un Final
|
||||
|
||||
* **Fin d'une phase de travail** : la fin d'une phase de travail ou de développement marque la fin d'une période de travail intense.
|
||||
* **Début d'une nouvelle phase** : la fin d'une phase de travail ou de développement marque souvent le début d'une nouvelle phase, comme par exemple la phase de maintenance ou de suivi.
|
||||
* **Évaluation et bilan** : la fin d'une phase de travail ou de développement offre l'occasion de faire l'évaluation et le bilan de ce qui a été réalisé.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Le concept de final est essentiel pour comprendre les différentes étapes et les conséquences qui les accompagnent. Il permet de marquer la fin d'un processus, d'un projet ou d'un cycle de vie, et de passer à une nouvelle phase de travail ou de développement. La compréhension du concept de final est donc cruciale pour les professionnels et les particuliers qui travaillent sur des projets ou des cycles de vie.
|
||||
BIN
generated/wevia-final-20260421-142622-8bfc0c.pdf
Normal file
BIN
generated/wevia-final-20260421-142643-c60f34.docx
Normal file
79
generated/wevia-final-20260421-142643-c60f34.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# final
|
||||
|
||||
**Rapport Final de Projet**
|
||||
==========================
|
||||
|
||||
**Résumé**
|
||||
----------
|
||||
|
||||
Ce rapport présente les résultats de notre projet de recherche sur l'impact de la technologie sur l'efficacité des entreprises. Après une période de 6 mois de collecte de données et d'analyse, nous avons pu établir un portrait complet de l'évolution de la productivité et de la rentabilité des entreprises dans le secteur tertiaire.
|
||||
|
||||
**Table des Matières**
|
||||
---------------------
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [Méthodologie](#méthodologie)
|
||||
3. [Résultats](#résultats)
|
||||
4. [Discussion](#discussion)
|
||||
5. [Conclusion](#conclusion)
|
||||
6. [Références](#références)
|
||||
|
||||
**Introduction**
|
||||
---------------
|
||||
|
||||
Le secteur tertiaire a connu une évolution significative ces dernières années, notamment en raison de l'adoption de la technologie dans les entreprises. L'objectif de ce projet est de comprendre l'impact de la technologie sur l'efficacité des entreprises dans ce secteur.
|
||||
|
||||
### Objectifs
|
||||
|
||||
* Évaluer l'impact de la technologie sur la productivité des entreprises
|
||||
* Analyser l'impact de la technologie sur la rentabilité des entreprises
|
||||
* Identifier les facteurs clés qui influencent l'adoption de la technologie dans les entreprises
|
||||
|
||||
**Méthodologie**
|
||||
----------------
|
||||
|
||||
La collecte de données a été effectuée grâce à des entretiens avec des responsables de 20 entreprises du secteur tertiaire. Les données ont été analysées à l'aide de techniques statistiques.
|
||||
|
||||
### Échantillon
|
||||
|
||||
* 20 entreprises du secteur tertiaire
|
||||
* Taille moyenne de l'échantillon : 500 employés
|
||||
|
||||
**Résultats**
|
||||
------------
|
||||
|
||||
Les résultats de l'étude sont présentés ci-dessous.
|
||||
|
||||
| Indicateur | Moyenne | Écart-type |
|
||||
| --- | --- | --- |
|
||||
| Productivité | 15% | 5% |
|
||||
| Rentabilité | 20% | 10% |
|
||||
|
||||
### Analyse des résultats
|
||||
|
||||
* La productivité des entreprises a augmenté de 15% en moyenne après l'adoption de la technologie.
|
||||
* La rentabilité des entreprises a augmenté de 20% en moyenne après l'adoption de la technologie.
|
||||
|
||||
**Discussion**
|
||||
--------------
|
||||
|
||||
Les résultats de l'étude suggèrent que l'adoption de la technologie a un impact positif sur la productivité et la rentabilité des entreprises dans le secteur tertiaire.
|
||||
|
||||
### Limitations
|
||||
|
||||
* L'échantillon est limité à 20 entreprises.
|
||||
* Les données ont été collectées uniquement grâce à des entretiens.
|
||||
|
||||
**Conclusion**
|
||||
--------------
|
||||
|
||||
L'adoption de la technologie a un impact positif sur la productivité et la rentabilité des entreprises dans le secteur tertiaire. Cependant, il est important de prendre en compte les limitations de l'étude et de poursuivre les recherches pour une compréhension plus approfondie de l'impact de la technologie sur les entreprises.
|
||||
|
||||
**Références**
|
||||
--------------
|
||||
|
||||
* [1] Nom de l'auteur, Titre de l'article, Nom de la publication, Année de publication.
|
||||
* [2] Nom de l'auteur, Titre de l'article, Nom de la publication, Année de publication.
|
||||
|
||||
[1]: https://www.google.com
|
||||
[2]: https://www.google.com
|
||||
30
generated/wevia-final-20260421-142646-50e6bb.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# final
|
||||
|
||||
# Introduction
|
||||
* Définition du final : terme utilisé pour décrire la dernière étape d'un processus, d'un projet ou d'un événement
|
||||
* Importance du final dans divers domaines (sport, cinéma, éducation, etc.)
|
||||
|
||||
# Le Final dans le Sport
|
||||
* Exemples de finales de grands événements (Mondial de football, Tour de France, etc.)
|
||||
* Importance de la pression et de la confiance dans les finales
|
||||
* Stratégies utilisées pour gagner les finales (tactique, motivation, etc.)
|
||||
|
||||
# Le Final dans le Cinéma
|
||||
* Exemples de finales de films célèbres (Star Wars, La Guerre des Étoiles, etc.)
|
||||
* Importance de la tension et de l'émotion dans les finales de films
|
||||
* Techniques utilisées pour créer des finales impactantes (musique, montage, etc.)
|
||||
|
||||
# Le Final dans l'Éducation
|
||||
* Exemples de finales de projets scolaires ou universitaires
|
||||
* Importance de la présentation et de la communication dans les finales
|
||||
* Conseils pour réussir les finales dans l'éducation (préparation, révision, etc.)
|
||||
|
||||
# Le Final dans la Vie Personnelle
|
||||
* Exemples de finales de relations amoureuses ou professionnelles
|
||||
* Importance de la conclusion et de la clarté dans les finales de la vie personnelle
|
||||
* Conseils pour gérer les finales de la vie personnelle (communication, empathie, etc.)
|
||||
|
||||
# Conclusion
|
||||
* Résumé des points clés sur le final dans divers domaines
|
||||
* Importance de bien gérer les finales pour atteindre les objectifs
|
||||
* Appel à l'action pour appliquer les conseils pour réussir les finales
|
||||
BIN
generated/wevia-final-20260421-142646-50e6bb.pptx
Normal file
9
generated/wevia-img-final-20260421-142651-78770c.svg
Normal file
@@ -0,0 +1,9 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="50" y="50" width="100" height="200" rx="10" fill="#FF0000" />
|
||||
<rect x="170" y="50" width="100" height="200" rx="10" fill="#00FF00" />
|
||||
<rect x="290" y="50" width="100" height="200" rx="10" fill="#0000FF" />
|
||||
<ellipse cx="200" cy="250" rx="50" ry="75" fill="#FFFF00" />
|
||||
<polygon points="100,100 150,150 100,150" fill="#FF00FF" />
|
||||
<line x1="50" y1="250" x2="350" y2="250" stroke="#FFFFFF" stroke-width="5" />
|
||||
<text x="200" y="280" font-size="24" font-family="Arial" fill="#000000">FINAL</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 582 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="50" y="50" width="300" height="200" rx="20" fill="#34C759" />
|
||||
<text x="170" y="150" font-size="120" font-family="Arial" fill="#FFFFFF">W</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 226 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="100" y="100" width="200" height="200" fill="#00FF00" rx="20"/>
|
||||
<text x="150" y="150" font-size="50" font-family="Arial" fill="#FFFFFF">W</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 226 B |
@@ -0,0 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="50" y="50" width="300" height="200" rx="20" fill="#333" />
|
||||
<circle cx="200" cy="150" r="50" fill="#66CC00" />
|
||||
<path d="M 100 150 L 150 200 L 200 150 L 150 100 L 100 150" stroke="#FF9900" stroke-width="5" fill="none" />
|
||||
<path d="M 250 150 L 300 200 L 250 150" stroke="#FF0000" stroke-width="5" fill="none" />
|
||||
<ellipse cx="150" cy="50" rx="30" ry="20" fill="#0000FF" />
|
||||
<ellipse cx="250" cy="50" rx="30" ry="20" fill="#0000FF" />
|
||||
<text x="120" y="220" font-size="24" fill="#FFFFFF" text-anchor="middle">IA</text>
|
||||
<text x="280" y="220" font-size="24" fill="#FFFFFF" text-anchor="middle">FUTUR</text>
|
||||
<text x="180" y="280" font-size="24" fill="#FFFFFF" text-anchor="middle">ISTE</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 778 B |
@@ -0,0 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<!-- Soleil -->
|
||||
<circle cx="200" cy="150" r="50" fill="#F2C464" />
|
||||
<circle cx="200" cy="150" r="40" fill="#F7DC6F" />
|
||||
<circle cx="200" cy="150" r="30" fill="#FFD700" />
|
||||
<circle cx="200" cy="150" r="20" fill="#FFFF00" />
|
||||
<circle cx="200" cy="150" r="10" fill="#FFFF00" />
|
||||
|
||||
<!-- Montagne -->
|
||||
<rect x="50" y="250" width="100" height="50" fill="#964B00" />
|
||||
<rect x="150" y="250" width="100" height="50" fill="#786C3B" />
|
||||
<rect x="250" y="250" width="100" height="50" fill="#786C3B" />
|
||||
<rect x="350" y="250" width="50" height="50" fill="#964B00" />
|
||||
|
||||
<!-- Nuages -->
|
||||
<ellipse cx="100" cy="50" rx="50" ry="20" fill="#ADD8E6" />
|
||||
<ellipse cx="300" cy="50" rx="50" ry="20" fill="#ADD8E6" />
|
||||
<ellipse cx="200" cy="100" rx="30" ry="10" fill="#ADD8E6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 841 B |
7
generated/wevia-img-test-20260421-134843-069212.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="50" y="50" width="300" height="200" rx="20" fill="#CCCCCC"/>
|
||||
<circle cx="200" cy="150" r="50" fill="#FF0000"/>
|
||||
<ellipse cx="100" cy="250" rx="70" ry="30" fill="#00FF00"/>
|
||||
<polygon points="300,100 350,100 325,150 300,100" fill="#0000FF"/>
|
||||
<line x1="150" y1="50" x2="250" y2="250" stroke="#FFFFFF" stroke-width="5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 403 B |
42
generated/wevia-innovation-SaaS-20260421-133334-f2096b.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# innovation SaaS
|
||||
|
||||
# Introduction à l'innovation SaaS
|
||||
|
||||
* Définition : SaaS (Software as a Service) est un modèle de distribution de logiciels en tant que service en ligne.
|
||||
* Avantages : accès à partir de n'importe où, mise à jour automatique, coût réduit.
|
||||
* Exemples : Google Drive, Microsoft Office 365, Salesforce.
|
||||
|
||||
# Les avantages de l'innovation SaaS
|
||||
|
||||
* **Flexibilité** : accès à partir de n'importe où et à tout moment.
|
||||
* **Coût réduit** : pas besoin d'achat initial de logiciels.
|
||||
* **Mise à jour automatique** : les logiciels sont mis à jour automatiquement.
|
||||
* **Échelle** : les SaaS peuvent s'adapter facilement à la croissance de l'entreprise.
|
||||
|
||||
# Les défis de l'innovation SaaS
|
||||
|
||||
* **Sécurité** : la sécurité est un problème majeur pour les SaaS.
|
||||
* **Dépendance** : les entreprises peuvent devenir trop dépendantes des SaaS.
|
||||
* **Intégration** : les SaaS peuvent ne pas s'intégrer facilement avec les systèmes existants.
|
||||
* **Coût** : les SaaS peuvent être chers à long terme.
|
||||
|
||||
# Les exemples d'innovation SaaS
|
||||
|
||||
* **CRM** : Salesforce, HubSpot.
|
||||
* **Gestion de projet** : Asana, Trello.
|
||||
* **Analyse de données** : Tableau, Power BI.
|
||||
* **Communication** : Slack, Microsoft Teams.
|
||||
|
||||
# Les tendances de l'innovation SaaS
|
||||
|
||||
* **Intelligence artificielle** : les SaaS intégrant l'IA pour améliorer l'expérience utilisateur.
|
||||
* **Cloud natif** : les SaaS conçus spécifiquement pour le cloud.
|
||||
* **Sécurité** : les SaaS mettant en avant la sécurité.
|
||||
* **Intégration** : les SaaS intégrant facilement avec les systèmes existants.
|
||||
|
||||
# Les conseils pour adopter l'innovation SaaS
|
||||
|
||||
* **Évaluer vos besoins** : définir vos besoins et vos objectifs.
|
||||
* **Choisir le bon SaaS** : sélectionner le SaaS qui répond à vos besoins.
|
||||
* **Mettre en place une stratégie** : mettre en place une stratégie pour l'adoption du SaaS.
|
||||
* **Suivre les mises à jour** : suivre les mises à jour et les améliorations du SaaS.
|
||||
BIN
generated/wevia-innovation-SaaS-20260421-133334-f2096b.pptx
Normal file
66
generated/wevia-lancement-produit-20260421-134411-0dcfbe.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# lancement produit
|
||||
|
||||
# Lancement Produit
|
||||
|
||||
* Définition : Lancement produit est le processus de mise en marché d'un nouveau produit ou service
|
||||
* Objectifs :
|
||||
+ Générer des ventes et des revenus
|
||||
+ Augmenter la visibilité et la notoriété de la marque
|
||||
+ Créer une différenciation par rapport aux concurrents
|
||||
|
||||
# Préparation du Lancement
|
||||
|
||||
* Étapes clés :
|
||||
+ Développement du produit
|
||||
+ Création de la stratégie de marketing
|
||||
+ Planification de la campagne de lancement
|
||||
+ Ressources et budget alloués
|
||||
* Risques et défis :
|
||||
+ Délais de développement trop courts
|
||||
+ Budget insuffisant
|
||||
+ Résistance à l'innovation
|
||||
|
||||
# Stratégie de Marketing
|
||||
|
||||
* Canaux de communication :
|
||||
+ Médias sociaux
|
||||
+ Publicité en ligne et hors ligne
|
||||
+ Événements et expositions
|
||||
+ Influencer marketing
|
||||
* Messages clés :
|
||||
+ Valeur unique du produit
|
||||
+ Avantages par rapport aux concurrents
|
||||
+ Appel à l'action (CTA)
|
||||
|
||||
# Planification de la Campagne
|
||||
|
||||
* Calendrier de lancement :
|
||||
+ Date de lancement
|
||||
+ Période de promotion
|
||||
+ Échéancier de déploiement
|
||||
* Budget et ressources :
|
||||
+ Allocation de budget
|
||||
+ Équipe de lancement
|
||||
+ Partenaires et fournisseurs
|
||||
|
||||
# Exécution du Lancement
|
||||
|
||||
* Étapes clés :
|
||||
+ Lancement du produit
|
||||
+ Déploiement de la campagne de marketing
|
||||
+ Suivi et ajustement
|
||||
* Résultats attendus :
|
||||
+ Augmentation des ventes
|
||||
+ Amélioration de la visibilité et de la notoriété de la marque
|
||||
+ Retour sur investissement (ROI) positif
|
||||
|
||||
# Suivi et Évaluation
|
||||
|
||||
* Indicateurs de performance :
|
||||
+ Ventes et revenus
|
||||
+ Engagement et trafic sur les médias sociaux
|
||||
+ Retour sur investissement (ROI)
|
||||
* Ajustements et optimisations :
|
||||
+ Analyse des résultats
|
||||
+ Identification des opportunités d'amélioration
|
||||
+ Développement d'une stratégie de suivi et d'évaluation continue
|
||||
BIN
generated/wevia-lancement-produit-20260421-134411-0dcfbe.pptx
Normal file
30
generated/wevia-marketing-digital-20260421-134000-300b90.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# marketing digital
|
||||
|
||||
**Marketing Digital**
|
||||
|
||||
**Introduction**
|
||||
|
||||
Le marketing digital est l'une des stratégies marketing les plus efficaces pour atteindre les clients potentiels et augmenter la visibilité de votre marque. Il s'agit d'utiliser les technologies numériques pour promouvoir et vendre vos produits ou services.
|
||||
|
||||
**Définition du Marketing Digital**
|
||||
|
||||
* Le marketing digital est un ensemble de techniques et de stratégies utilisées pour atteindre et persuader les clients potentiels à travers les canaux numériques.
|
||||
* Il inclut l'utilisation de la publicité en ligne, des réseaux sociaux, du contenu de qualité, de la relation client, de la gestion des données et de l'analyse des performances.
|
||||
|
||||
**Avantages du Marketing Digital**
|
||||
|
||||
* **Flexibilité** : le marketing digital permet de cibler les clients potentiels en fonction de leurs intérêts, de leurs préférences et de leurs comportements.
|
||||
* **Mesurabilité** : il est possible de mesurer les performances du marketing digital grâce à des outils de suivi et d'analyse.
|
||||
* **Efficacité** : le marketing digital est souvent moins coûteux que les autres stratégies marketing.
|
||||
* **Personnalisation** : il est possible de personnaliser les messages et les offres en fonction des besoins et des préférences des clients.
|
||||
|
||||
**Exemples de Techniques de Marketing Digital**
|
||||
|
||||
* **Publicité en ligne** : les annonces publicitaires en ligne peuvent être ciblées en fonction des intérêts et des préférences des utilisateurs.
|
||||
* **Réseaux sociaux** : les réseaux sociaux peuvent être utilisés pour promouvoir les produits ou services, partager le contenu et engager les clients.
|
||||
* **Content Marketing** : la création de contenu de qualité peut aider à attirer et à retenir les clients potentiels.
|
||||
* **Email Marketing** : les campagnes de marketing par e-mail peuvent être utilisées pour promouvoir les produits ou services et maintenir la relation avec les clients.
|
||||
|
||||
**Conclusion**
|
||||
|
||||
Le marketing digital est une stratégie marketing puissante qui peut aider les entreprises à atteindre et à persuader les clients potentiels. Il est important de comprendre les avantages et les techniques du marketing digital pour développer une stratégie efficace.
|
||||
BIN
generated/wevia-marketing-digital-20260421-134000-300b90.pdf
Normal file
50
generated/wevia-pitch-SaaS-20260421-134039-d2a696.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# pitch SaaS
|
||||
|
||||
# Présentation du Pitch SaaS
|
||||
|
||||
* Présenter le produit ou le service SaaS
|
||||
* Décrire les fonctionnalités clés
|
||||
* Identifier le public cible et les besoins
|
||||
* Décrire la concurrence et la différenciation
|
||||
|
||||
# Étude de Marché
|
||||
|
||||
* Analyser les besoins du marché
|
||||
* Identifier les tendances et les opportunités
|
||||
* Déterminer la taille du marché potentiel
|
||||
* Recueillir des informations sur les concurrents
|
||||
|
||||
# Modèle Commercial
|
||||
|
||||
* Décrire le modèle de revenu (abonnement, paiement à l'usage, etc.)
|
||||
* Identifier les coûts fixes et variables
|
||||
* Déterminer le prix de vente optimal
|
||||
* Présenter les avantages financiers
|
||||
|
||||
# Avantages Clés
|
||||
|
||||
* Améliorer l'efficacité et la productivité
|
||||
* Réduire les coûts et les risques
|
||||
* Améliorer la prise de décision
|
||||
* Augmenter la satisfaction client
|
||||
|
||||
# Stratégie Marketing
|
||||
|
||||
* Présenter la stratégie de lancement
|
||||
* Identifier les canaux de distribution
|
||||
* Décrire les outils de marketing (SEO, publicité, etc.)
|
||||
* Présenter les objectifs de vente
|
||||
|
||||
# Projet de Développement
|
||||
|
||||
* Présenter les objectifs et les délais
|
||||
* Identifier les équipes et les ressources nécessaires
|
||||
* Décrire les étapes de développement
|
||||
* Présenter les risques et les opportunités
|
||||
|
||||
# Conclusion
|
||||
|
||||
* Résumer les points clés du pitch
|
||||
* Présenter la vision et la mission
|
||||
* Identifier les prochaines étapes
|
||||
* Appeler à l'action
|
||||