Compare commits
35 Commits
v175-opus-
...
v180-opus-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98cb653713 | ||
|
|
eaec1a1310 | ||
|
|
26c3adc02a | ||
|
|
e41ea138ed | ||
|
|
d8ee40f38e | ||
|
|
665e6fd0fe | ||
|
|
ed006a6e55 | ||
|
|
ecbe33ba1f | ||
|
|
a8e8c3347e | ||
|
|
365ab89ff1 | ||
|
|
a4a595e66b | ||
|
|
23db1b508d | ||
|
|
cca331590e | ||
|
|
eb9a3a401e | ||
|
|
7a5394fb8d | ||
|
|
8fbfe405eb | ||
|
|
5f1d70f34b | ||
|
|
0df7b0ae2e | ||
|
|
3be073bf3f | ||
|
|
87f60d2950 | ||
|
|
4f9bc8042e | ||
|
|
dcdb16390d | ||
|
|
b233fcb091 | ||
|
|
b23b2beba2 | ||
|
|
a532fccce9 | ||
|
|
63c7b1c87f | ||
|
|
9ae9f77eba | ||
|
|
ab7c0a5de4 | ||
|
|
a342476366 | ||
|
|
f06c06cc02 | ||
|
|
3cf272152f | ||
|
|
155cc70c08 | ||
|
|
97d47f088b | ||
|
|
747596d86c | ||
|
|
7a90f40565 |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-22T15:30:02+02:00",
|
||||
"ts": "2026-04-22T17:00:01+02:00",
|
||||
"disk_pct": 87,
|
||||
"disk_free_gb": 20,
|
||||
"growth_per_day_gb": 1.5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-22T15:45:02+02:00",
|
||||
"ts": "2026-04-22T17:15:02+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-22T15:00:02+02:00",
|
||||
"ts": "2026-04-22T17:00:01+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 11,
|
||||
"adoption_pct": 73,
|
||||
"chat_queries_last_1k_log": 3,
|
||||
"wtp_views_last_1k_log": 9,
|
||||
"chat_queries_last_1k_log": 6,
|
||||
"wtp_views_last_1k_log": 8,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-22T15:50:03+02:00",
|
||||
"ts": "2026-04-22T17:20:03+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-22T15:00:03+02:00",
|
||||
"ts": "2026-04-22T17:00:02+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-22T08:00:02+02:00",
|
||||
"ts": "2026-04-22T16:00:02+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-22T15:30:04+02:00",
|
||||
"ts": "2026-04-22T17:00:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 19,
|
||||
"residual_risk_pct": 81,
|
||||
"mql_auto": 18,
|
||||
"residual_risk_pct": 82,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "18.32",
|
||||
"load_5min": "11.93",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 14:00",
|
||||
"timestamp": "2026-04-22 16:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 20,
|
||||
"disk": "87%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "2.46",
|
||||
"uptime": "up 1 week, 1 day, 2 hours, 8 minutes"
|
||||
"ram": "14Gi/30Gi",
|
||||
"load": "10.62",
|
||||
"uptime": "up 1 week, 1 day, 4 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -75,27 +75,27 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -105,12 +105,12 @@
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
]
|
||||
|
||||
@@ -19,6 +19,50 @@ $raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: [];
|
||||
$msg = trim($in["message"] ?? "");
|
||||
if (!$msg) { sse("error", ["content"=>"No message"]); exit; }
|
||||
|
||||
// === V181 backend-public-guard · Yacine: pas de fuites chez clients externes ===
|
||||
$__v181_blocked = [
|
||||
"/^intents?_pool\b/i",
|
||||
"/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i",
|
||||
"/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i",
|
||||
"/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i",
|
||||
"/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i",
|
||||
"/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i",
|
||||
"/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v181_internal = false;
|
||||
$__v181_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v181_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v181_expected_token = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v181_line) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v181_line), $__v181_mm)) {
|
||||
$__v181_expected_token = trim($__v181_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v181_token && $__v181_expected_token && hash_equals($__v181_expected_token, $__v181_token)) $__v181_internal = true;
|
||||
if (stripos($__v181_ref, "/wevia-master.html") !== false || stripos($__v181_ref, "/wevia-master-") !== false || stripos($__v181_ref, "/proof-wave") !== false) $__v181_internal = true;
|
||||
if (!$__v181_internal) {
|
||||
foreach ($__v181_blocked as $__v181_pat) {
|
||||
if (@preg_match($__v181_pat, trim($msg))) {
|
||||
$__v181_greet = "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d'images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd'hui ?";
|
||||
sse("start", ["session"=>"public", "query"=>$msg, "pattern"=>"guard", "engine"=>"WEVIA Assistant v1"]);
|
||||
sse("chunk", ["content"=>$__v181_greet, "index"=>0, "total"=>1]);
|
||||
sse("done", ["response"=>$__v181_greet, "provider"=>"wevia-public-guard-v1", "intent"=>"guard_redirect"]);
|
||||
@error_log("[V181-public-guard] blocked: " . substr($msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V181 ===
|
||||
$session_id = $in["session_id"] ?? ("wv-" . substr(md5(random_bytes(8)), 0, 10));
|
||||
|
||||
$pattern = "generic";
|
||||
@@ -175,7 +219,7 @@ foreach ($plan as $i => $step) {
|
||||
$d = @json_decode($raw_r, true);
|
||||
if ($d) {
|
||||
$final_response = $d["response"] ?? $d["content"] ?? "";
|
||||
if (preg_match("#https?://\S+?\.(?:pdf|docx|pptx|xlsx|svg|py|jsx)#", $final_response, $um)) {
|
||||
if (preg_match("#https?://\S+?\.(?:pdf|docx|pptx|xlsx|svg|py|jsx|jpg|jpeg|png|webp|gif)#", $final_response, $um)) {
|
||||
$final_file_url = $um[0];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
// V179 wevia-brand · user-visible strings use WEVIA Vision only
|
||||
/**
|
||||
* ambre-early-doc-gen.php · v4 · 5 capabilities réelles
|
||||
* 1. File gen pdf/docx/pptx via pandoc
|
||||
@@ -86,37 +87,56 @@ if (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eéèê]ma|mermaid|diagramme|flow
|
||||
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)) {
|
||||
// ========== HANDLER 4: Image via ambre-tool-image.php CASCADE (V177 image-gemini-cascade) ==========
|
||||
// V177: Replace LLM SVG by real image cascade (Gemini 3 Pro Image Preview primary, Qwen fallback, Pollinations last resort)
|
||||
if (preg_match("/g[e\xc3\xa9\xc3\xa8\xc3\xaa]n[e\xc3\xa9\xc3\xa8\xc3\xaa]re?\s+(?:une|un)?\s*image\s*(?:\b(?:decrivant|repr[e\xc3\xa9\xc3\xa8\xc3\xaa]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));
|
||||
$__t0 = microtime(true);
|
||||
|
||||
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);
|
||||
// Call ambre-tool-image.php directly (internal, loopback)
|
||||
$__img_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\nHost: weval-consulting.com\r\n",
|
||||
"content" => json_encode(["prompt" => $__topic]),
|
||||
"timeout" => 75,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$__img_resp = @file_get_contents("http://127.0.0.1/api/ambre-tool-image.php", false, $__img_ctx);
|
||||
$__img_d = @json_decode($__img_resp, true);
|
||||
|
||||
if ($__img_d && !empty($__img_d["success"]) && !empty($__img_d["url"])) {
|
||||
$__url = $__img_d["url"];
|
||||
$__provider = $__img_d["provider"] ?? "WEVIA Image Engine";
|
||||
$__quality = $__img_d["quality"] ?? "standard";
|
||||
$__size_kb = $__img_d["size_kb"] ?? 0;
|
||||
$__elapsed = round((microtime(true) - $__t0) * 1000);
|
||||
|
||||
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);
|
||||
"response" => "\xf0\x9f\x8e\xa8 **$__topic**\n\n\xf0\x9f\x94\x97 T\xc3\xa9l\xc3\xa9charger: $__url\n\xf0\x9f\x93\xa6 Taille: {$__size_kb}KB \xc2\xb7 \xe2\x9a\x99\xef\xb8\x8f {$__elapsed}ms \xc2\xb7 engine: $__provider",
|
||||
"executed" => true,
|
||||
"provider" => "ambre-doc-gen-v5",
|
||||
"intent" => "image_real_cascade",
|
||||
"topic" => $__topic,
|
||||
"url" => $__url,
|
||||
"quality" => $__quality,
|
||||
"image_provider" => $__provider,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
// If cascade failed, fall through (old LLM SVG code removed to force real images)
|
||||
// Return an informative error to widget rather than fake SVG
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response" => "\xe2\x9a\xa0\xef\xb8\x8f G\xc3\xa9n\xc3\xa9ration d\"image temporairement indisponible pour: $__topic. WEVIA Vision temporairement indisponible. Les providers internes ont \xc3\xa9chou\xc3\xa9. R\xc3\xa9essayez dans quelques instants.",
|
||||
"executed" => true,
|
||||
"provider" => "ambre-doc-gen-v5",
|
||||
"intent" => "image_cascade_failed",
|
||||
"topic" => $__topic,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== HANDLER 5: Code generation with file ==========
|
||||
|
||||
40
api/ambre-pw-tests/v175_img.js
Normal file
@@ -0,0 +1,40 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo WEVIA bleu moderne');
|
||||
await input.press('Enter');
|
||||
console.log('SENT image request');
|
||||
|
||||
let state = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(2500);
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasSvgRendered: document.querySelectorAll('svg[xmlns*="w3.org"]').length > 0,
|
||||
hasImgTag: document.querySelectorAll('img[src*="generated"]').length > 0,
|
||||
hasCodeSvg: /```.*<svg/.test(document.body.innerText),
|
||||
}));
|
||||
if (!state.busy && state.phases >= 4 && (state.hasSvgRendered || state.hasImgTag)) break;
|
||||
}
|
||||
console.log('State:', JSON.stringify(state));
|
||||
|
||||
// Scroll to the generated SVG
|
||||
await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll('svg[xmlns*="w3.org"]');
|
||||
if (svgs.length > 0) svgs[svgs.length-1].scrollIntoView({block:'center'});
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v175-image-rendered.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
40
api/ambre-pw-tests/v178.js
Normal file
@@ -0,0 +1,40 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo bleu WEVIA minimalist moderne');
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
let state = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasImgTag: document.querySelectorAll('img[src*="generated"]').length,
|
||||
imgSrc: document.querySelector('img[src*="generated"]')?.src,
|
||||
imgWidth: document.querySelector('img[src*="generated"]')?.naturalWidth || 0,
|
||||
}));
|
||||
console.log(`t+${i*3+3}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.hasImgTag > 0 && state.imgWidth > 100) break;
|
||||
}
|
||||
|
||||
// Scroll to image
|
||||
await page.evaluate(() => {
|
||||
const img = document.querySelector('img[src*="generated"]');
|
||||
if (img) img.scrollIntoView({block:'center'});
|
||||
});
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: '/tmp/v178-image-rendered.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
80
api/ambre-pw-tests/v178_video.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// V178 · Video test image generation on /wevia.html
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1440, height: 900},
|
||||
recordVideo: { dir: '/tmp/v178-video/', size: {width: 1440, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
console.log('1. Go to /wevia.html');
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
console.log('2. Type the image request');
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: WEVIA LOGO premium blue');
|
||||
await page.waitForTimeout(800);
|
||||
await input.press('Enter');
|
||||
console.log('3. Request sent · waiting for generation');
|
||||
|
||||
// Wait for download link + inline image
|
||||
let state = null;
|
||||
for (let i=0; i<20; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
state = await page.evaluate(() => {
|
||||
const links = document.querySelectorAll('a[href*="/generated/"]');
|
||||
const imgs = document.querySelectorAll('img[src*="/generated/"]');
|
||||
const phases = document.querySelectorAll('.ambre-phase').length;
|
||||
return {
|
||||
phases,
|
||||
downloadLinks: links.length,
|
||||
firstLinkHref: links.length > 0 ? links[0].href : null,
|
||||
inlineImages: imgs.length,
|
||||
firstImgSrc: imgs.length > 0 ? imgs[0].src : null,
|
||||
firstImgLoaded: imgs.length > 0 ? imgs[0].complete && imgs[0].naturalHeight > 0 : false,
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
};
|
||||
});
|
||||
console.log(`t+${(i+1)*3}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.phases >= 4 && state.downloadLinks > 0) break;
|
||||
}
|
||||
|
||||
// Scroll to result
|
||||
await page.evaluate(() => {
|
||||
const link = document.querySelector('a[href*="/generated/"]');
|
||||
if (link) link.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Click the download link
|
||||
if (state.downloadLinks > 0) {
|
||||
console.log('4. Clicking download link:', state.firstLinkHref);
|
||||
const link = await page.locator('a[href*="/generated/"]').first();
|
||||
|
||||
// Hover first (to show cursor)
|
||||
await link.hover();
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
|
||||
// Final screenshot
|
||||
await page.screenshot({ path: '/tmp/v178-final.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await ctx.close(); // Flushes video
|
||||
await browser.close();
|
||||
|
||||
// Rename video
|
||||
const videos = fs.readdirSync('/tmp/v178-video/');
|
||||
if (videos.length > 0) {
|
||||
const vpath = '/tmp/v178-video/' + videos[0];
|
||||
fs.renameSync(vpath, '/tmp/v178-image-test.webm');
|
||||
const stats = fs.statSync('/tmp/v178-image-test.webm');
|
||||
console.log(`Video saved: /tmp/v178-image-test.webm (${(stats.size/1024/1024).toFixed(1)} MB)`);
|
||||
}
|
||||
})();
|
||||
55
api/ambre-pw-tests/v179_vid.js
Normal file
@@ -0,0 +1,55 @@
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1440, height: 900},
|
||||
recordVideo: { dir: '/tmp/v179-video/', size: {width: 1440, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo WEVIA premium');
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
for (let i=0; i<20; i++) {
|
||||
await page.waitForTimeout(2500);
|
||||
const state = await page.evaluate(() => {
|
||||
const bodyText = document.body.innerText;
|
||||
return {
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasLink: !!document.querySelector('a[href*="/generated/"]'),
|
||||
hasImg: !!document.querySelector('img[src*="/generated/"]'),
|
||||
mentionsGemini: /Gemini/i.test(bodyText),
|
||||
mentionsQwen: /Qwen/i.test(bodyText),
|
||||
mentionsPollinations: /Pollinations/i.test(bodyText),
|
||||
mentionsWEVIAVision: /WEVIA Vision/i.test(bodyText),
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
};
|
||||
});
|
||||
console.log(`t+${(i+1)*2.5}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.phases >= 4 && state.hasLink) break;
|
||||
}
|
||||
|
||||
await page.evaluate(() => {
|
||||
const link = document.querySelector('a[href*="/generated/"]');
|
||||
if (link) link.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: '/tmp/v179-final.png', fullPage: true });
|
||||
|
||||
await ctx.close();
|
||||
await browser.close();
|
||||
|
||||
const videos = fs.readdirSync('/tmp/v179-video/');
|
||||
if (videos.length > 0) {
|
||||
fs.renameSync('/tmp/v179-video/' + videos[0], '/tmp/v179-wevia-brand.webm');
|
||||
console.log('Video saved:', (fs.statSync('/tmp/v179-wevia-brand.webm').size/1024/1024).toFixed(1), 'MB');
|
||||
}
|
||||
})();
|
||||
72
api/ambre-pw-tests/v180_leak.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// V180 · Simulate external client on /wevia.html trying to leak intents_pool
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1280, height: 900},
|
||||
recordVideo: { dir: '/tmp/v180-video/', size: {width: 1280, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
console.log('=== External client simulation on /wevia.html ===');
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Try multiple leak attempts
|
||||
const attempts = ['intents_pool', 'quelle heure', 'multiagent parallele', 'nonreg score'];
|
||||
|
||||
for (const msg of attempts) {
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill(msg);
|
||||
await input.press('Enter');
|
||||
console.log(`\nSENT: "${msg}"`);
|
||||
|
||||
// Wait for response
|
||||
for (let i=0; i<12; i++) {
|
||||
await page.waitForTimeout(1500);
|
||||
const state = await page.evaluate(() => {
|
||||
return {
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
bodyText: document.body.innerText.substring(0, 3000),
|
||||
};
|
||||
});
|
||||
if (!state.busy && state.bodyText.length > 200) break;
|
||||
}
|
||||
|
||||
// Analyze response for leaks
|
||||
const analysis = await page.evaluate(() => {
|
||||
const body = document.body.innerText;
|
||||
return {
|
||||
hasPoolTotal: /POOL TOTAL POTENTIEL|2450|1009|377|43/i.test(body),
|
||||
hasArchitectureLeak: /Tool registry|Priority intents NL|DeerFlow skills|Top-IA scripts|Brain knowledge/i.test(body),
|
||||
hasGuardRedirect: /Je suis WEVIA Assistant IA/i.test(body),
|
||||
hasGeminiLeak: /Gemini|Qwen|Pollinations|DashScope/i.test(body),
|
||||
responsePreview: body.slice(-800),
|
||||
};
|
||||
});
|
||||
console.log(` → hasPoolTotal: ${analysis.hasPoolTotal}`);
|
||||
console.log(` → hasArchitectureLeak: ${analysis.hasArchitectureLeak}`);
|
||||
console.log(` → hasGuardRedirect: ${analysis.hasGuardRedirect}`);
|
||||
console.log(` → hasGeminiLeak: ${analysis.hasGeminiLeak}`);
|
||||
}
|
||||
|
||||
// Final screenshot + scroll to last response
|
||||
await page.evaluate(() => {
|
||||
window.scrollTo(0, document.body.scrollHeight);
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v180-leak-test.png', fullPage: true });
|
||||
|
||||
await ctx.close();
|
||||
await browser.close();
|
||||
|
||||
const videos = fs.readdirSync('/tmp/v180-video/');
|
||||
if (videos.length > 0) {
|
||||
fs.renameSync('/tmp/v180-video/' + videos[0], '/tmp/v180-leak-test.webm');
|
||||
const stats = fs.statSync('/tmp/v180-leak-test.webm');
|
||||
console.log(`\nVideo: ${(stats.size/1024/1024).toFixed(1)}MB`);
|
||||
}
|
||||
})();
|
||||
38
api/ambre-pw-tests/v180_test.js
Normal file
@@ -0,0 +1,38 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1280, height: 800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
const logs = [];
|
||||
page.on('console', m => logs.push(`${m.type()}: ${m.text().substring(0,200)}`));
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Type intents_pool
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force:true});
|
||||
await input.fill('intents_pool');
|
||||
await input.press('Enter');
|
||||
console.log('SENT intents_pool');
|
||||
|
||||
await page.waitForTimeout(6000);
|
||||
|
||||
const state = await page.evaluate(() => {
|
||||
const bodyText = document.body.innerText;
|
||||
return {
|
||||
seesPoolTotal: /POOL TOTAL/i.test(bodyText),
|
||||
seesWeviaAssistant: /Je suis WEVIA Assistant IA/i.test(bodyText),
|
||||
seesTools377: /Tool registry.*377|377.*Tool/i.test(bodyText),
|
||||
seesCapacities: /2450 capacit/i.test(bodyText),
|
||||
lastMsgText: (document.querySelectorAll('.msg-bot, .msg-assistant, .ambre-phase-content, .msg')[0]?.innerText || '').substring(0, 400),
|
||||
};
|
||||
});
|
||||
console.log('STATE:', JSON.stringify(state, null, 2));
|
||||
console.log('CONSOLE LOGS (last 10):');
|
||||
for (const l of logs.slice(-10)) console.log(' ', l);
|
||||
|
||||
await page.screenshot({path:'/tmp/v180-test.png', fullPage:true});
|
||||
await browser.close();
|
||||
})();
|
||||
@@ -1,9 +1,19 @@
|
||||
<?php
|
||||
// V179 wevia-brand · all providers masked as WEVIA Vision · internal_engine kept for debug
|
||||
/**
|
||||
* ambre-tool-image.php · Real image generation via Pollinations.ai (free, no auth)
|
||||
* Returns downloadable PNG from prompt
|
||||
* V176 · ambre-tool-image.php · Upgraded with quality cascade
|
||||
* Yacine: "IMAGE POURRI MET A LOUVER QWEN IMAGE POUR AMELOIRER"
|
||||
*
|
||||
* Cascade (order by QUALITY):
|
||||
* 1. Gemini 3 Pro Image Preview (best quality, free tier via GEMINI_KEY) - PRIMARY
|
||||
* 2. Qwen-Image via DashScope (requires ALIBABA_KEY with credits)
|
||||
* 3. Pollinations flux (free, 1024x1024)
|
||||
* 4. Pollinations sana (free, 768x768 fast fallback)
|
||||
*
|
||||
* Keep backward compat: same response schema as before
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(90);
|
||||
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST ?: $_GET;
|
||||
@@ -11,45 +21,189 @@ $prompt = trim($in["prompt"] ?? $in["q"] ?? "");
|
||||
|
||||
if (!$prompt) { echo json_encode(["error"=>"prompt required"]); exit; }
|
||||
|
||||
// Clean + translate prompt (keep as-is - Pollinations handles multilingue)
|
||||
$clean = preg_replace('/[^\p{L}\p{N}\s,.\-]/u', '', $prompt);
|
||||
$clean = substr(trim($clean), 0, 300);
|
||||
// Clean prompt (keep unicode)
|
||||
$clean = preg_replace('/[^\p{L}\p{N}\s,.\-!?]/u', '', $prompt);
|
||||
$clean = mb_substr(trim($clean), 0, 400);
|
||||
|
||||
// Pollinations API
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
$pollinations_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true";
|
||||
|
||||
// Fetch image (with 30s timeout)
|
||||
$ctx = stream_context_create([
|
||||
"http" => ["timeout"=>30, "header"=>"User-Agent: WEVIA/1.0\r\n"],
|
||||
"https" => ["timeout"=>30, "header"=>"User-Agent: WEVIA/1.0\r\n"],
|
||||
]);
|
||||
$t0 = microtime(true);
|
||||
$img_data = @file_get_contents($pollinations_url, false, $ctx);
|
||||
$elapsed = round((microtime(true)-$t0)*1000);
|
||||
|
||||
if (!$img_data || strlen($img_data) < 1000) {
|
||||
echo json_encode(["error"=>"image generation failed", "prompt"=>$clean, "elapsed"=>$elapsed]);
|
||||
exit;
|
||||
// Load secrets
|
||||
$secrets = [];
|
||||
foreach (file("/etc/weval/secrets.env") ?: [] as $line) {
|
||||
$line = trim($line);
|
||||
if (!$line || $line[0] === "#" || strpos($line, "=") === false) continue;
|
||||
list($k, $v) = explode("=", $line, 2);
|
||||
$secrets[trim($k)] = trim($v, " \"'");
|
||||
}
|
||||
$GEMINI_KEY = $secrets["GEMINI_KEY"] ?? "";
|
||||
$ALIBABA_KEY = $secrets["ALIBABA_KEY"] ?? "";
|
||||
|
||||
// Save to /generated/
|
||||
// File naming (shared across cascade)
|
||||
$dir = "/var/www/html/generated";
|
||||
if (!is_dir($dir)) @mkdir($dir, 0755, true);
|
||||
$slug = preg_replace('/[^a-z0-9]+/', '-', strtolower($clean));
|
||||
$slug = substr(trim($slug, "-"), 0, 50);
|
||||
$ts = date("Ymd-His");
|
||||
$rand = bin2hex(random_bytes(3));
|
||||
$filename = "wevia-img-{$slug}-{$ts}-{$rand}.png";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img_data);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img_data)/1024, 1),
|
||||
"elapsed_ms" => $elapsed,
|
||||
"provider" => "WEVIA Image Engine",
|
||||
]);
|
||||
$t0 = microtime(true);
|
||||
$result = null;
|
||||
|
||||
// ========== TIER 1: Gemini 3 Pro Image Preview (best quality, free) ==========
|
||||
if ($GEMINI_KEY) {
|
||||
$gurl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent?key=" . $GEMINI_KEY;
|
||||
$body = json_encode([
|
||||
"contents" => [["parts" => [["text" => $clean]]]],
|
||||
"generationConfig" => ["responseModalities" => ["IMAGE", "TEXT"]],
|
||||
]);
|
||||
$ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => $body,
|
||||
"timeout" => 60,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$resp = @file_get_contents($gurl, false, $ctx);
|
||||
if ($resp) {
|
||||
$d = @json_decode($resp, true);
|
||||
if (isset($d["candidates"][0]["content"]["parts"])) {
|
||||
foreach ($d["candidates"][0]["content"]["parts"] as $p) {
|
||||
if (isset($p["inlineData"]["data"])) {
|
||||
$mime = $p["inlineData"]["mimeType"] ?? "image/jpeg";
|
||||
$ext = strpos($mime, "png") !== false ? "png" : "jpg";
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.{$ext}";
|
||||
$path = "$dir/$filename";
|
||||
$img = base64_decode($p["inlineData"]["data"]);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (premium)",
|
||||
"quality" => "premium",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "gemini-3-pro",
|
||||
];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 2: Qwen-Image via DashScope (if Gemini failed + ALIBABA_KEY) ==========
|
||||
if (!$result && $ALIBABA_KEY) {
|
||||
// Create async task
|
||||
$submit_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Authorization: Bearer $ALIBABA_KEY\r\nContent-Type: application/json\r\nX-DashScope-Async: enable\r\n",
|
||||
"content" => json_encode([
|
||||
"model" => "qwen-image",
|
||||
"input" => ["prompt" => $clean],
|
||||
"parameters" => ["size" => "1024*1024", "n" => 1],
|
||||
]),
|
||||
"timeout" => 15,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$submit_resp = @file_get_contents("https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis", false, $submit_ctx);
|
||||
$submit_d = @json_decode($submit_resp, true);
|
||||
$task_id = $submit_d["output"]["task_id"] ?? "";
|
||||
if ($task_id) {
|
||||
// Poll
|
||||
for ($i = 0; $i < 20; $i++) {
|
||||
sleep(2);
|
||||
$pctx = stream_context_create(["http"=>["header"=>"Authorization: Bearer $ALIBABA_KEY\r\n","timeout"=>10]]);
|
||||
$pr = @file_get_contents("https://dashscope-intl.aliyuncs.com/api/v1/tasks/$task_id", false, $pctx);
|
||||
$pd = @json_decode($pr, true);
|
||||
$status = $pd["output"]["task_status"] ?? "";
|
||||
if ($status === "SUCCEEDED") {
|
||||
$img_url = $pd["output"]["results"][0]["url"] ?? "";
|
||||
if ($img_url) {
|
||||
$img = @file_get_contents($img_url);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.png";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (premium)",
|
||||
"quality" => "premium",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "qwen-image",
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ($status === "FAILED" || $status === "UNKNOWN") break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 3: Pollinations flux (free 1024x1024) ==========
|
||||
if (!$result) {
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
// Try with flux model hint (even though list shows only sana, try anyway)
|
||||
$flux_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true&model=flux";
|
||||
$ctx2 = stream_context_create(["http"=>["timeout"=>30,"header"=>"User-Agent: WEVIA/2.0\r\n"]]);
|
||||
$img = @file_get_contents($flux_url, false, $ctx2);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.jpg";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (standard)",
|
||||
"quality" => "standard",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "pollinations-flux",
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 4: Pollinations sana (last resort) ==========
|
||||
if (!$result) {
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
$sana_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true";
|
||||
$ctx3 = stream_context_create(["http"=>["timeout"=>30,"header"=>"User-Agent: WEVIA/2.0\r\n"]]);
|
||||
$img = @file_get_contents($sana_url, false, $ctx3);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-vision-{$slug}-{$ts}-{$rand}.jpg";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Vision (basic)",
|
||||
"quality" => "basic",
|
||||
"engine" => "wevia-vision-v1",
|
||||
"internal_engine" => "pollinations-sana",
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
echo json_encode(["error"=>"all image providers failed","prompt"=>$clean]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-22 13:30:02",
|
||||
"generated": "2026-04-22 15:00:01",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -10,7 +10,7 @@
|
||||
"ssh": 49222,
|
||||
"disk_pct": 87,
|
||||
"disk_avail": "20G",
|
||||
"uptime": "up 1 week, 1 day, 3 hours, 38 minutes",
|
||||
"uptime": "up 1 week, 1 day, 5 hours, 8 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -51,17 +51,17 @@
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -96,27 +96,27 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -126,12 +126,12 @@
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
@@ -292,7 +292,7 @@
|
||||
"screens": {
|
||||
"s204_html": 328,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 1074,
|
||||
"s204_api_php": 1075,
|
||||
"s204_wevia_php": 254,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -316,7 +316,7 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5770,
|
||||
"kb_learnings": 5790,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -616,15 +616,15 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5770,
|
||||
"total_entries": 5790,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3150"
|
||||
"cnt": "3168"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1264"
|
||||
"cnt": "1266"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1734,44 +1734,44 @@
|
||||
"recent_commits": [],
|
||||
"auto_fixes": [
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 13:25: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:25:05.773153"
|
||||
"fact": "AUTONOMY 22Apr 14:55: 2 fixes. Disk light cleanup 87%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 16:55:04.990243"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 13:20: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:20:06.499966"
|
||||
"fact": "AUTONOMY 22Apr 14:50: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:50:07.719063"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 13:15: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:15:06.860963"
|
||||
"fact": "AUTONOMY 22Apr 14:45: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:45:06.656133"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 13:10: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:10:05.390973"
|
||||
"fact": "AUTONOMY 22Apr 14:40: 2 fixes. Disk light cleanup 87%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 16:40:06.538554"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 13:05: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:05:05.583676"
|
||||
"fact": "AUTONOMY 22Apr 14:35: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:35:06.432174"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 13:00: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:00:10.390288"
|
||||
"fact": "AUTONOMY 22Apr 14:30: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:30:08.709975"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 12:55: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:55:05.790119"
|
||||
"fact": "AUTONOMY 22Apr 14:25: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:25:05.235042"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 12:50: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:50:05.973206"
|
||||
"fact": "AUTONOMY 22Apr 14:20: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:20:05.919944"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 12:45: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:45:05.70786"
|
||||
"fact": "AUTONOMY 22Apr 14:15: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:15:05.864979"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 12:40: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 14:40:05.065451"
|
||||
"fact": "AUTONOMY 22Apr 14:10: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:10:07.401151"
|
||||
}
|
||||
],
|
||||
"architecture_decisions": [
|
||||
@@ -1960,7 +1960,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 3889,
|
||||
"scan_time_ms": 2833,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T15:55:01.534737",
|
||||
"generated_at": "2026-04-22T17:25:02.026541",
|
||||
"stats": {
|
||||
"total": 50,
|
||||
"pending": 32,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-22T15:45:02.144326",
|
||||
"last_heartbeat": "2026-04-22T15:45:02.144326",
|
||||
"last_heartbeat_ts_epoch": 1776865502,
|
||||
"ts": "2026-04-22T17:15:01.913308",
|
||||
"last_heartbeat": "2026-04-22T17:15:01.913308",
|
||||
"last_heartbeat_ts_epoch": 1776870901,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"timestamp": "2026-04-22 16:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "20",
|
||||
"ram": "13Gi/30Gi",
|
||||
"disk": "86%",
|
||||
"load": "11.95",
|
||||
"uptime": "up 1 week, 1 day, 8 minutes"
|
||||
"ram": "14Gi/30Gi",
|
||||
"disk": "87%",
|
||||
"load": "10.62",
|
||||
"uptime": "up 1 week, 1 day, 4 hours, 8 minutes"
|
||||
},
|
||||
"services": "8/10 OK",
|
||||
"services": "7/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
"qdrant": "21259 vectors",
|
||||
"crons": "44 active",
|
||||
"routes": "446",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "2296 entries",
|
||||
"wiki": "2324 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"ts": "2026-04-22T13:55:01+00:00",
|
||||
"ts": "2026-04-22T15:25:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 7.37,
|
||||
"load": 10.53,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 13644,
|
||||
"ram_free_mb": 17690,
|
||||
"ram_used_mb": 15090,
|
||||
"ram_free_mb": 16245,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "124G",
|
||||
"disk_used": "125G",
|
||||
"disk_free": "20G",
|
||||
"disk_pct": "87%",
|
||||
"fpm_workers": 140,
|
||||
@@ -16,11 +16,11 @@
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.18,
|
||||
"load": 0.14,
|
||||
"disk_pct": "83%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12113
|
||||
"ram_free_mb": 12080
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
@@ -45,9 +45,9 @@
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 328,
|
||||
"php_apis": 1074,
|
||||
"wiki_entries": 2324,
|
||||
"html_pages": 330,
|
||||
"php_apis": 1075,
|
||||
"wiki_entries": 2326,
|
||||
"vault_doctrines": 123,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
@@ -80,16 +80,16 @@
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 166742,
|
||||
"with_email": 110734,
|
||||
"with_email": 110738,
|
||||
"with_phone": 159846,
|
||||
"gap_email": 56008,
|
||||
"gap_email": 56004,
|
||||
"pct_email": 66.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 127343,
|
||||
"with_email": 78611,
|
||||
"with_email": 78613,
|
||||
"with_tel": 124087,
|
||||
"pct_email": 61.7,
|
||||
"pct_tel": 97.4
|
||||
@@ -97,7 +97,7 @@
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19724,
|
||||
"with_email": 15084,
|
||||
"with_email": 15086,
|
||||
"with_tel": 18739,
|
||||
"pct_email": 76.5,
|
||||
"pct_tel": 95
|
||||
@@ -123,7 +123,7 @@
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up 10 seconds",
|
||||
"status": "Up 9 seconds",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -138,17 +138,17 @@
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -226,8 +226,8 @@
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "88685c283 auto-sync-1555",
|
||||
"dirty": 3,
|
||||
"head": "26c3adc02 auto-sync-1725",
|
||||
"dirty": 2,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
@@ -276,11 +276,11 @@
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 4518,
|
||||
"grand_total": 4523,
|
||||
"health": {
|
||||
"score": 4,
|
||||
"max": 6,
|
||||
"pct": 67
|
||||
},
|
||||
"elapsed_ms": 11296
|
||||
"elapsed_ms": 11869
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-22T13:50:02+00:00",
|
||||
"ts": "2026-04-22T15:20:01+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 70,
|
||||
"wtp_engagement": 78,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 17.5,
|
||||
"avg_score": 19.5,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
"mql_auto_scored": 19,
|
||||
"sql_auto_scored": 8,
|
||||
"mql_auto_pct": 39,
|
||||
"mql_auto_pct": 40,
|
||||
"improvement_vs_manual": {
|
||||
"before_manual_pct": 33.3,
|
||||
"after_auto_pct": 39,
|
||||
"delta": 5.700000000000003
|
||||
"after_auto_pct": 40,
|
||||
"delta": 6.700000000000003
|
||||
},
|
||||
"paperclip_db_ok": true,
|
||||
"paperclip_tables": 2,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.020676"
|
||||
"discovered": "2026-04-22T17:00:02.788112"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.256591"
|
||||
"discovered": "2026-04-22T17:00:03.066942"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.663523"
|
||||
"discovered": "2026-04-22T17:00:02.389469"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:04.503816"
|
||||
"discovered": "2026-04-22T17:00:02.017057"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:04.973819"
|
||||
"discovered": "2026-04-22T17:00:02.257898"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:04.922113"
|
||||
"discovered": "2026-04-22T17:00:02.249063"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:03.828035"
|
||||
"discovered": "2026-04-22T17:00:01.953625"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:05.141327"
|
||||
"discovered": "2026-04-22T17:00:02.309292"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:05.919696"
|
||||
"discovered": "2026-04-22T17:00:02.503481"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:03.767301"
|
||||
"discovered": "2026-04-22T17:00:01.948602"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:03.944273"
|
||||
"discovered": "2026-04-22T17:00:01.960449"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:05.768185"
|
||||
"discovered": "2026-04-22T17:00:02.440652"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.514582"
|
||||
"discovered": "2026-04-22T17:00:02.023240"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.966196"
|
||||
"discovered": "2026-04-22T17:00:02.253763"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:05.397007"
|
||||
"discovered": "2026-04-22T17:00:02.366053"
|
||||
},
|
||||
{
|
||||
"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-22T15:00:03.758177"
|
||||
"discovered": "2026-04-22T17:00:01.945543"
|
||||
},
|
||||
{
|
||||
"name": "oss",
|
||||
@@ -530,7 +530,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# WEVAL OSS Registry · /opt/oss/ Wave 222 · 2026-04-21 ## Purpose Register the OSS tools identified by AI capability gap audit (wave 220 ai-gap-cach",
|
||||
"discovered": "2026-04-22T15:00:05.055802"
|
||||
"discovered": "2026-04-22T17:00:02.286181"
|
||||
},
|
||||
{
|
||||
"name": "scripts",
|
||||
@@ -543,7 +543,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Token Rotation Scripts · Opus Session 21-avr v7 ## État - 5 scripts provider skeleton (groq, github, sambanova, alibaba, whatsapp) - 1 master dispa",
|
||||
"discovered": "2026-04-22T15:00:05.573919"
|
||||
"discovered": "2026-04-22T17:00:02.380981"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-22T15:00:05.701201"
|
||||
"discovered": "2026-04-22T17:00:02.394698"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-22T15:00:04.183285"
|
||||
"discovered": "2026-04-22T17:00:01.981737"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.121935"
|
||||
"discovered": "2026-04-22T17:00:02.297520"
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": false,
|
||||
"wired": false,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:03.863933"
|
||||
"discovered": "2026-04-22T17:00:01.955853"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-22T15:00:04.521566"
|
||||
"discovered": "2026-04-22T17:00:02.051050"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.318985"
|
||||
"discovered": "2026-04-22T17:00:02.352018"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.942654"
|
||||
"discovered": "2026-04-22T17:00:02.526684"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.222467"
|
||||
"discovered": "2026-04-22T17:00:02.322725"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.259980"
|
||||
"discovered": "2026-04-22T17:00:02.333660"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.328074"
|
||||
"discovered": "2026-04-22T17:00:02.359224"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.650179"
|
||||
"discovered": "2026-04-22T17:00:02.386046"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.004213"
|
||||
"discovered": "2026-04-22T17:00:02.734930"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.082053"
|
||||
"discovered": "2026-04-22T17:00:02.834230"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.210244"
|
||||
"discovered": "2026-04-22T17:00:03.015930"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.052165"
|
||||
"discovered": "2026-04-22T17:00:01.976895"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.790298"
|
||||
"discovered": "2026-04-22T17:00:02.195857"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.538041"
|
||||
"discovered": "2026-04-22T17:00:02.378752"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.866739"
|
||||
"discovered": "2026-04-22T17:00:02.469239"
|
||||
},
|
||||
{
|
||||
"name": "weval-cli",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.964326"
|
||||
"discovered": "2026-04-22T17:00:02.658185"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.988024"
|
||||
"discovered": "2026-04-22T17:00:02.661807"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.147597"
|
||||
"discovered": "2026-04-22T17:00:02.920351"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.173147"
|
||||
"discovered": "2026-04-22T17:00:02.931378"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.190247"
|
||||
"discovered": "2026-04-22T17:00:02.974808"
|
||||
},
|
||||
{
|
||||
"name": "blade",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.267118"
|
||||
"discovered": "2026-04-22T17:00:01.986492"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.539759"
|
||||
"discovered": "2026-04-22T17:00:02.089728"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.714038"
|
||||
"discovered": "2026-04-22T17:00:02.145768"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.839802"
|
||||
"discovered": "2026-04-22T17:00:02.217514"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.288033"
|
||||
"discovered": "2026-04-22T17:00:02.335741"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:05.881799"
|
||||
"discovered": "2026-04-22T17:00:02.489716"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -933,7 +933,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.236032"
|
||||
"discovered": "2026-04-22T17:00:03.018019"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -946,7 +946,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.288662"
|
||||
"discovered": "2026-04-22T17:00:03.111210"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -959,7 +959,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:03.706404"
|
||||
"discovered": "2026-04-22T17:00:01.941317"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -972,7 +972,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:03.790756"
|
||||
"discovered": "2026-04-22T17:00:01.951376"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -985,7 +985,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:04.737189"
|
||||
"discovered": "2026-04-22T17:00:02.189577"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -998,6 +998,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T15:00:06.265704"
|
||||
"discovered": "2026-04-22T17:00:03.108989"
|
||||
}
|
||||
]
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T15:30:15",
|
||||
"timestamp": "2026-04-22T17:00:13",
|
||||
"features": {
|
||||
"total": 36,
|
||||
"pass": 35
|
||||
@@ -13,7 +13,7 @@
|
||||
"score": 97.2,
|
||||
"log": [
|
||||
"=== UX AGENT v1.0 ===",
|
||||
"Time: 2026-04-22 15:30:02",
|
||||
"Time: 2026-04-22 17:00:01",
|
||||
" core: 4/4",
|
||||
" layout: 3/4",
|
||||
" interaction: 6/6",
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-22T13:58:46+00:00",
|
||||
"ts": "2026-04-22T15:28:42+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
"ok": 64,
|
||||
"warn": 0,
|
||||
"ok": 63,
|
||||
"warn": 1,
|
||||
"fail": 0,
|
||||
"wire_needed": 0,
|
||||
"data_completeness_pct": 100
|
||||
|
||||
@@ -1,4 +1,48 @@
|
||||
<?php
|
||||
// === V183 public-guard · defense in depth ===
|
||||
if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
|
||||
$__v183_raw = @file_get_contents("php://input");
|
||||
$__v183_in = @json_decode($__v183_raw, true) ?: [];
|
||||
$__v183_msg = trim($__v183_in["message"] ?? "");
|
||||
if ($__v183_msg !== "") {
|
||||
$__v183_blocked = [
|
||||
"/^intents?_pool\b/i", "/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i", "/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i", "/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i", "/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i", "/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i", "/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v183_internal = false;
|
||||
$__v183_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v183_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v183_exp = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v183_ln) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v183_ln), $__v183_mm)) {
|
||||
$__v183_exp = trim($__v183_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v183_token && $__v183_exp && hash_equals($__v183_exp, $__v183_token)) $__v183_internal = true;
|
||||
if (stripos($__v183_ref, "/wevia-master.html") !== false || stripos($__v183_ref, "/wevia-master-") !== false || stripos($__v183_ref, "/proof-wave") !== false) $__v183_internal = true;
|
||||
if (!$__v183_internal) {
|
||||
foreach ($__v183_blocked as $__v183_pat) {
|
||||
if (@preg_match($__v183_pat, $__v183_msg)) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$__v183_greet = "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d\"images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd\"hui ?";
|
||||
echo json_encode(["content"=>$__v183_greet, "response"=>$__v183_greet, "provider"=>"wevia-public-guard-v1", "intent"=>"guard_redirect"], JSON_UNESCAPED_UNICODE);
|
||||
@error_log("[V183-public-guard] blocked: " . substr($__v183_msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V183 ===
|
||||
|
||||
// === FAST-PATH INJECTION (14avr - Opus wire) ===
|
||||
@require_once __DIR__ . "/wevia-fast-path.php";
|
||||
$__fp_input = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
@@ -39,6 +39,32 @@ function wevia_fast_path($msg) {
|
||||
$m = mb_strtolower(trim($msg));
|
||||
$r = null;
|
||||
// PRIORITY BYPASS
|
||||
if (preg_match('/reconcil|bilan|dirty|l99|saas|tout.*verif|ethica.*pays|ethica.*valid|ethica.*enrich|ethica.*campag|ethica.*maroc|ethica.*tunisie|ethica.*alger|medecins.*maroc|medecins.*tunisie|medecins.*alger|specialite|gap.*detail|ethica.*count|ethica.*countries|ethica.*repartition|hcp.*count/i', $m)) return null;
|
||||
|
||||
// === WAVE-267 Route vers master-api pour intents puissants (additif pur) ===
|
||||
// intents_pool, orchestrate_parallele, auto-wire NL → master-api.php (qui sait faire)
|
||||
if (preg_match('/^intents.?pool$|^pool.?intents$|combien.*capacit|nombre.*intent|liste.*intent|quelles.*capacit/i', $m)
|
||||
|| preg_match('/^orchestrate.*(en.*parallele|parallele.*:|:)/i', $m)
|
||||
|| preg_match('/^cable un intent |^wire.*intent|cree un intent pour|nouveau.*intent.*pour/i', $m)
|
||||
|| preg_match('/^quelle.*heure|^donne.*heure|^date serveur/i', $m)
|
||||
|| preg_match('/^multiagent|^multi.?agent.*(parallele|verifier|check)|^mobilise.*agent/i', $m)) {
|
||||
$ch = curl_init('http://127.0.0.1/api/wevia-master-api.php');
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['message' => $msg]));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
|
||||
$resp = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
if ($resp) {
|
||||
$j = @json_decode($resp, true);
|
||||
if (is_array($j) && isset($j['content'])) {
|
||||
return ['tool' => ($j['tool'] ?? 'master-api'), 'content' => $j['content'], 'provider' => ($j['provider'] ?? 'master-api')];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// === END WAVE-267 ===
|
||||
|
||||
if (preg_match('/reconcil|bilan|dirty|l99|saas|tout.*verif|ethica.*pays|ethica.*valid|ethica.*enrich|ethica.*campag|ethica.*maroc|ethica.*tunisie|ethica.*alger|medecins.*maroc|medecins.*tunisie|medecins.*alger|specialite|gap.*detail|ethica.*count|ethica.*countries|ethica.*repartition|hcp.*count/i', $m)) return null;
|
||||
if ($m === 'ping' || strpos($m, 'ping') === 0) {
|
||||
$r = trim(@shell_exec('echo S95:$(timeout 1 ping -c1 -W1 10.1.0.3 2>/dev/null | grep -oP "time=\K[0-9.]+") Groq:$(curl -so/dev/null -w%{http_code} -m2 https://api.groq.com 2>/dev/null)'));
|
||||
|
||||
@@ -1,4 +1,57 @@
|
||||
<?php
|
||||
// === V182 master-public-guard · Yacine: pas de fuites chez clients externes ===
|
||||
if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
|
||||
$__v182_raw = @file_get_contents("php://input");
|
||||
$__v182_in = @json_decode($__v182_raw, true) ?: [];
|
||||
$__v182_msg = trim($__v182_in["message"] ?? "");
|
||||
if ($__v182_msg !== "") {
|
||||
$__v182_blocked = [
|
||||
"/^intents?_pool\b/i",
|
||||
"/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i",
|
||||
"/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i",
|
||||
"/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i",
|
||||
"/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i",
|
||||
"/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i",
|
||||
"/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v182_internal = false;
|
||||
$__v182_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v182_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v182_expected_token = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v182_line) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v182_line), $__v182_mm)) {
|
||||
$__v182_expected_token = trim($__v182_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v182_token && $__v182_expected_token && hash_equals($__v182_expected_token, $__v182_token)) $__v182_internal = true;
|
||||
if (stripos($__v182_ref, "/wevia-master.html") !== false || stripos($__v182_ref, "/wevia-master-") !== false || stripos($__v182_ref, "/proof-wave") !== false) $__v182_internal = true;
|
||||
if (!$__v182_internal) {
|
||||
foreach ($__v182_blocked as $__v182_pat) {
|
||||
if (@preg_match($__v182_pat, $__v182_msg)) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"content" => "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d\"images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd\"hui ?",
|
||||
"provider" => "wevia-public-guard-v1",
|
||||
"intent" => "guard_redirect",
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@error_log("[V182-master-public-guard] blocked: " . substr($__v182_msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V182 ===
|
||||
|
||||
|
||||
/* V138: V137 unified session logging - widget/master/form sources to wevia_db public.conversations + messages */
|
||||
if (!function_exists('wevia_log_session_v137')) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 10:00:02",
|
||||
"timestamp": "2026-04-22 14:00:03",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Lean Six Sigma",
|
||||
@@ -8,7 +8,7 @@
|
||||
{
|
||||
"name": "KPIs defined",
|
||||
"ok": true,
|
||||
"detail": "Quality=98.6%"
|
||||
"detail": "Quality=98.3%"
|
||||
},
|
||||
{
|
||||
"name": "Monitoring",
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"name": "Quality>95",
|
||||
"ok": true,
|
||||
"detail": "98.6%"
|
||||
"detail": "98.3%"
|
||||
},
|
||||
{
|
||||
"name": "Auto-fix",
|
||||
@@ -46,7 +46,7 @@
|
||||
{
|
||||
"name": "Change Mgmt",
|
||||
"ok": true,
|
||||
"detail": "3782 commits\/7d"
|
||||
"detail": "3808 commits\/7d"
|
||||
},
|
||||
{
|
||||
"name": "SLA Monitor",
|
||||
@@ -84,7 +84,7 @@
|
||||
{
|
||||
"name": "Nonconformity",
|
||||
"ok": true,
|
||||
"detail": "98.6%"
|
||||
"detail": "98.3%"
|
||||
}
|
||||
],
|
||||
"s": 3,
|
||||
@@ -135,7 +135,7 @@
|
||||
{
|
||||
"name": "Disk<85%",
|
||||
"ok": false,
|
||||
"detail": "86%"
|
||||
"detail": "87%"
|
||||
},
|
||||
{
|
||||
"name": "Local inference",
|
||||
@@ -153,7 +153,7 @@
|
||||
{
|
||||
"name": "CI\/CD",
|
||||
"ok": true,
|
||||
"detail": "3782 commits"
|
||||
"detail": "3808 commits"
|
||||
},
|
||||
{
|
||||
"name": "Auto testing",
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
},
|
||||
{
|
||||
"layer": "PHP-API",
|
||||
"name": "1063/1073 syntax OK",
|
||||
"name": "1065/1075 syntax OK",
|
||||
"status": "F",
|
||||
"detail": "10 errors"
|
||||
},
|
||||
@@ -82,7 +82,7 @@
|
||||
"layer": "CRON",
|
||||
"name": "quality",
|
||||
"status": "F",
|
||||
"detail": "12900min ago"
|
||||
"detail": "13141min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -100,13 +100,13 @@
|
||||
"layer": "CRON",
|
||||
"name": "control-tower",
|
||||
"status": "P",
|
||||
"detail": "31min ago"
|
||||
"detail": "91min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "l99-ux",
|
||||
"status": "P",
|
||||
"detail": "31min ago"
|
||||
"status": "F",
|
||||
"detail": "271min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -154,31 +154,31 @@
|
||||
"layer": "CRON",
|
||||
"name": "watchdog",
|
||||
"status": "F",
|
||||
"detail": "12372min ago"
|
||||
"detail": "12613min ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 228h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-artifacts-index.json",
|
||||
"status": "F",
|
||||
"detail": "valid 283h ago"
|
||||
"detail": "valid 287h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 302h ago"
|
||||
"detail": "valid 306h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-selenium-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 277h ago"
|
||||
"detail": "valid 281h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -190,259 +190,259 @@
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-prev.json",
|
||||
"status": "F",
|
||||
"detail": "valid 280h ago"
|
||||
"detail": "valid 284h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 227h ago"
|
||||
"detail": "valid 231h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-brain-chat-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 266h ago"
|
||||
"detail": "valid 270h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-chat-user-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 254h ago"
|
||||
"detail": "valid 258h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-dark-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 284h ago"
|
||||
"detail": "valid 288h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 310h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 251h ago"
|
||||
"detail": "valid 255h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 266h ago"
|
||||
"detail": "valid 270h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep.json",
|
||||
"status": "F",
|
||||
"detail": "valid 390h ago"
|
||||
"detail": "valid 394h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-e2e-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 349h ago"
|
||||
"detail": "valid 353h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-enterprise-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 81h ago"
|
||||
"detail": "valid 85h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-exhaustive.json",
|
||||
"status": "F",
|
||||
"detail": "valid 260h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-full-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 277h ago"
|
||||
"detail": "valid 281h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-functional-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 256h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-godmode-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-meeting-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 390h ago"
|
||||
"detail": "valid 394h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-benchmark.json",
|
||||
"status": "F",
|
||||
"detail": "valid 228h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-check.json",
|
||||
"status": "F",
|
||||
"detail": "valid 216h ago"
|
||||
"detail": "valid 220h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 62h ago"
|
||||
"detail": "valid 66h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 129h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-opus-parity.json",
|
||||
"status": "F",
|
||||
"detail": "valid 280h ago"
|
||||
"detail": "valid 284h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-integration.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-master.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-public.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 260h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 310h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-route-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-security.json",
|
||||
"status": "P",
|
||||
"detail": "valid 0h ago"
|
||||
"detail": "valid 4h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 260h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 216h ago"
|
||||
"detail": "valid 220h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 130h ago"
|
||||
"detail": "valid 134h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-systematic.json",
|
||||
"status": "F",
|
||||
"detail": "valid 253h ago"
|
||||
"detail": "valid 257h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ultimate.json",
|
||||
"status": "F",
|
||||
"detail": "valid 277h ago"
|
||||
"detail": "valid 281h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ux-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 217h ago"
|
||||
"detail": "valid 221h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 390h ago"
|
||||
"detail": "valid 394h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-extended-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 254h ago"
|
||||
"detail": "valid 258h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 46h ago"
|
||||
"detail": "valid 50h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-watchdog.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 256h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-log.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-pack-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 227h ago"
|
||||
"detail": "valid 231h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 200h ago"
|
||||
"detail": "valid 204h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -454,7 +454,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-architecture.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -466,7 +466,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-autodoc.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -484,85 +484,85 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capabilities.json",
|
||||
"status": "F",
|
||||
"detail": "valid 310h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capability-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 309h ago"
|
||||
"detail": "valid 313h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-cascade-config.json",
|
||||
"status": "F",
|
||||
"detail": "valid 129h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-control-tower.json",
|
||||
"status": "F",
|
||||
"detail": "valid 228h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-daily-report.json",
|
||||
"status": "P",
|
||||
"detail": "valid 6h ago"
|
||||
"detail": "valid 10h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-fleet-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 371h ago"
|
||||
"detail": "valid 375h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 310h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-filler-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 129h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-intent-proposals.json",
|
||||
"status": "P",
|
||||
"detail": "valid 12h ago"
|
||||
"detail": "valid 16h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-live-context.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-manifest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-brain.json",
|
||||
"status": "F",
|
||||
"detail": "valid 129h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-test-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 309h ago"
|
||||
"detail": "valid 313h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-meeting-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 228h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -574,7 +574,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-page-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -586,7 +586,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-plugin-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 114h ago"
|
||||
"detail": "valid 118h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -604,7 +604,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-quality.json",
|
||||
"status": "F",
|
||||
"detail": "valid 371h ago"
|
||||
"detail": "valid 375h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -616,7 +616,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-regression-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 391h ago"
|
||||
"detail": "valid 395h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -628,49 +628,49 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-sso-guardian.json",
|
||||
"status": "F",
|
||||
"detail": "valid 369h ago"
|
||||
"detail": "valid 373h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-standup-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 62h ago"
|
||||
"detail": "valid 66h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-last.json",
|
||||
"status": "F",
|
||||
"detail": "valid 228h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 129h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-tool-registry.json",
|
||||
"status": "P",
|
||||
"detail": "valid 7h ago"
|
||||
"detail": "valid 11h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-truth-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 66h ago"
|
||||
"detail": "valid 70h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-ux-audit.json",
|
||||
"status": "F",
|
||||
"detail": "valid 368h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-wiki-entries.json",
|
||||
"status": "P",
|
||||
"detail": "valid 21h ago"
|
||||
"status": "F",
|
||||
"detail": "valid 25h ago"
|
||||
},
|
||||
{
|
||||
"layer": "PIPELINE",
|
||||
@@ -871,15 +871,15 @@
|
||||
"detail": "69 tables"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22T12:30:02.220888",
|
||||
"timestamp": "2026-04-22T16:30:02.159206",
|
||||
"type": "register",
|
||||
"pass": 59,
|
||||
"fail": 86,
|
||||
"pass": 57,
|
||||
"fail": 88,
|
||||
"warn": 0,
|
||||
"total": 145,
|
||||
"pct": 40.7,
|
||||
"pct": 39.3,
|
||||
"inventory": {
|
||||
"api_php": 1073,
|
||||
"api_php": 1075,
|
||||
"brain_php": 254,
|
||||
"crons": 14,
|
||||
"json_status": 42,
|
||||
|
||||
@@ -1,4 +1,48 @@
|
||||
<?php
|
||||
// === V183 public-guard · defense in depth ===
|
||||
if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
|
||||
$__v183_raw = @file_get_contents("php://input");
|
||||
$__v183_in = @json_decode($__v183_raw, true) ?: [];
|
||||
$__v183_msg = trim($__v183_in["message"] ?? "");
|
||||
if ($__v183_msg !== "") {
|
||||
$__v183_blocked = [
|
||||
"/^intents?_pool\b/i", "/^quelle\s+heure\s*$/i",
|
||||
"/^multiagent\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^orchestrate\s+parall[e\xc3\xa9\xc3\xa8]le/i",
|
||||
"/^cable\s+un?\s+intent/i", "/^nonreg\s*(?:score|status)?\s*$/i",
|
||||
"/^l99\s*(?:score|status)?\s*$/i", "/^6\s*sigma/i",
|
||||
"/^derniers?\s+commits?\s+git/i", "/^git\s+(?:log|commit|status)/i",
|
||||
"/\bWAVE-\d+/i", "/\bpool\s+total\b/i",
|
||||
"/^doctrines?\s+(?:wiki|list)/i", "/^load\s*$/i",
|
||||
"/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i",
|
||||
"/^(?:ping|status|health)\s+(?:system|server|infra)/i",
|
||||
];
|
||||
$__v183_internal = false;
|
||||
$__v183_token = $_SERVER["HTTP_X_AGENT_TOKEN"] ?? "";
|
||||
$__v183_ref = $_SERVER["HTTP_REFERER"] ?? "";
|
||||
$__v183_exp = "";
|
||||
foreach (@file("/etc/weval/secrets.env") ?: [] as $__v183_ln) {
|
||||
if (preg_match("/^AGENT_TOKEN=(.+)$/", trim($__v183_ln), $__v183_mm)) {
|
||||
$__v183_exp = trim($__v183_mm[1], " \"\'"); break;
|
||||
}
|
||||
}
|
||||
if ($__v183_token && $__v183_exp && hash_equals($__v183_exp, $__v183_token)) $__v183_internal = true;
|
||||
if (stripos($__v183_ref, "/wevia-master.html") !== false || stripos($__v183_ref, "/wevia-master-") !== false || stripos($__v183_ref, "/proof-wave") !== false) $__v183_internal = true;
|
||||
if (!$__v183_internal) {
|
||||
foreach ($__v183_blocked as $__v183_pat) {
|
||||
if (@preg_match($__v183_pat, $__v183_msg)) {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$__v183_greet = "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d\"images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd\"hui ?";
|
||||
echo json_encode(["content"=>$__v183_greet, "response"=>$__v183_greet, "provider"=>"wevia-public-guard-v1", "intent"=>"guard_redirect"], JSON_UNESCAPED_UNICODE);
|
||||
@error_log("[V183-public-guard] blocked: " . substr($__v183_msg, 0, 80));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// === END V183 ===
|
||||
|
||||
header('Content-Type: text/event-stream');
|
||||
header('Cache-Control: no-cache');
|
||||
header('X-Accel-Buffering: no');
|
||||
@@ -9,6 +53,101 @@ function sse($d){echo 'data: '.json_encode($d,JSON_UNESCAPED_UNICODE)."\n\n";flu
|
||||
$msg=$_GET['msg']??'';if(!$msg){$__b=@json_decode(@file_get_contents('php://input'),true);$msg=$__b['message']??$__b['msg']??'';}
|
||||
if(!$msg){sse(['error'=>'msg required']);exit;}
|
||||
sse(['type'=>'start','task'=>$msg,'ts'=>date('H:i:s')]);
|
||||
|
||||
// === WAVE-268-SSE Fast intercept 5 intents Opus 22avr 17h ===
|
||||
// Garantit que intents_pool/quelle_heure/multiagent/orchestrate_nl/cable_intent repondent
|
||||
// DIRECTEMENT ici sans passer par LLM guard (qui sinon retourne "necessite intent shell reel")
|
||||
$__w268 = trim((string)$msg);
|
||||
$__w268lo = mb_strtolower($__w268);
|
||||
$__w268_done = false;
|
||||
|
||||
if ($__w268 !== '') {
|
||||
// 1. intents_pool
|
||||
if (preg_match('/^intents[\s_-]?pool$|^pool[\s_-]?intents$/', $__w268lo)) {
|
||||
$__pr = @file_exists('/opt/wevia-brain/priority-intents-nl.json') ? count(@json_decode(@file_get_contents('/opt/wevia-brain/priority-intents-nl.json'), true) ?: []) : 0;
|
||||
$__rg = @file_exists('/opt/wevia-brain/wevia-tool-registry.json') ? (int)(@json_decode(@file_get_contents('/opt/wevia-brain/wevia-tool-registry.json'), true)['count'] ?? 0) : 0;
|
||||
$__top = @is_dir('/opt/weval-ops/top-ia') ? count(glob('/opt/weval-ops/top-ia/*.sh')) : 0;
|
||||
$__plug = @is_dir('/opt/weval-plugins') ? count(glob('/opt/weval-plugins/*', GLOB_ONLYDIR)) : 0;
|
||||
$__df = @is_dir('/opt/deer-flow/skills') ? count(glob('/opt/deer-flow/skills/*', GLOB_ONLYDIR)) : 0;
|
||||
$__kb = @is_dir('/opt/wevia-brain/knowledge') ? count(glob('/opt/wevia-brain/knowledge/*.json')) : 0;
|
||||
$__doc = @is_dir('/var/www/html/wiki') ? count(glob('/var/www/html/wiki/doctrine-*.md')) : 0;
|
||||
$__cron = (int)trim(@shell_exec("crontab -l 2>/dev/null | grep -cE 'wevia|WEVIA'") ?: '0');
|
||||
$__total = $__pr + $__rg + $__top + $__plug + $__df + $__kb + $__doc + $__cron;
|
||||
sse(['type'=>'answer','text'=>"=== WEVIA INTENTS POOL ===\nPriority intents NL: $__pr\nTool registry: $__rg\nTop-IA scripts: $__top\nPlugins: $__plug\nDeerFlow skills: $__df\nBrain KBs: $__kb\nDoctrines wiki: $__doc\nCrons: $__cron\n\n=== POOL TOTAL: $__total ===\n\nWEVIA Master peut mobiliser: $__total capacites (LIVE @ ".date('H:i:s')." CEST)",'engine'=>'WAVE-268/intents_pool','intent'=>'intents_pool']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
elseif (preg_match('/^(quelle|donne|dis).{0,10}heure|^date[\s_-]?serveur|^heure[\s_-]?serveur/', $__w268lo)) {
|
||||
sse(['type'=>'answer','text'=>trim(shell_exec('date') ?: '') . ' (serveur WEVAL Casablanca)','engine'=>'WAVE-268/server_time','intent'=>'server_time']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
elseif (preg_match('/^multi[\s_-]?agent.{0,30}(parallele|parallel|verifier|check)|^orchestrate.{0,20}(en\s+)?parallele/', $__w268lo)) {
|
||||
$__parts = [];
|
||||
if (stripos($__w268lo, 'nonreg') !== false) {
|
||||
$__nr = @json_decode(@file_get_contents('/var/www/html/api/nonreg-latest.json'), true);
|
||||
$__parts[] = "[nonreg] " . ($__nr ? $__nr['pass'].'/'.$__nr['total'].' ('.$__nr['score'].'%)' : 'N/A');
|
||||
}
|
||||
if (stripos($__w268lo, 'l99') !== false) {
|
||||
$__l = @json_decode(@file_get_contents('/opt/weval-l99/l99-state.json'), true);
|
||||
$__parts[] = "[l99] " . ($__l ? $__l['pass'].'/'.$__l['total'].' ('.$__l['score'].'%)' : 'N/A');
|
||||
}
|
||||
if (stripos($__w268lo, 'git') !== false || stripos($__w268lo, 'commit') !== false) {
|
||||
$__g = trim(@shell_exec('cd /var/www/html && git log --oneline -5 2>/dev/null') ?: '');
|
||||
$__parts[] = "[git]\n$__g";
|
||||
}
|
||||
if (stripos($__w268lo, 'ethica') !== false || stripos($__w268lo, 'hcp') !== false) {
|
||||
$__e = trim(@shell_exec('curl -s -m3 http://127.0.0.1/api/ethica-country-api.php 2>/dev/null | head -c 200') ?: '146K HCPs');
|
||||
$__parts[] = "[ethica] $__e";
|
||||
}
|
||||
if (stripos($__w268lo, 'ping') !== false || stripos($__w268lo, 'infra') !== false) {
|
||||
$__i = trim(@shell_exec('echo LOAD:$(cat /proc/loadavg|cut -d" " -f1-3) DISK:$(df -h /|tail -1|awk "{print \$5}")') ?: '');
|
||||
$__parts[] = "[infra] $__i";
|
||||
}
|
||||
if (stripos($__w268lo, 'agent') !== false) {
|
||||
$__a = trim(@shell_exec('echo Paperclip:$(curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:8001/ 2>/dev/null) Qdrant:$(curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:6333/ 2>/dev/null) Sovereign:$(curl -so/dev/null -w%{http_code} -m3 http://127.0.0.1:4000/ 2>/dev/null)') ?: '');
|
||||
$__parts[] = "[agents] $__a";
|
||||
}
|
||||
if (empty($__parts)) $__parts[] = "Precisez: nonreg, l99, git, ethica, ping, agents, infra";
|
||||
sse(['type'=>'answer','text'=>"=== MULTIAGENT PARALLELE (LIVE @ ".date('H:i:s')." CEST) ===\n" . implode("\n", $__parts),'engine'=>'WAVE-268/multiagent','intent'=>'multiagent_parallele']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
elseif (preg_match('/^(cable|wire|cree|create).{0,20}intent.{0,30}(pour|for).+?(quand|when|si|if).+?(dit|say|tape|type)/', $__w268lo)) {
|
||||
if (preg_match('/pour\s+(.+?)\s+(?:quand|when|si|if).+?(?:dit|tape|say|type)\s+(.+?)\.\s*(?:commande|command|cmd):\s*(.+)$/i', $__w268, $__mm)) {
|
||||
$__desc = trim($__mm[1]); $__trg = trim($__mm[2]); $__cmd = trim($__mm[3]);
|
||||
$__slug = preg_replace('/[^a-z0-9_]/', '_', strtolower($__trg));
|
||||
$__reg_p = '/opt/wevia-brain/user-wired-intents.json';
|
||||
$__all = @json_decode(@file_get_contents($__reg_p), true) ?: [];
|
||||
$__all[$__slug] = ['trigger' => $__trg, 'description' => $__desc, 'command' => $__cmd, 'wired_at' => date('c'), 'wired_by' => 'opus-w268-sse'];
|
||||
@file_put_contents($__reg_p, json_encode($__all, JSON_PRETTY_PRINT));
|
||||
sse(['type'=>'answer','text'=>"[AUTO-WIRE OK]\nIntent: $__slug\nTrigger: '$__trg'\nDescription: $__desc\nCommand: $__cmd\n\nTape maintenant '$__trg' pour l executer.\nTotal wired: " . count($__all),'engine'=>'WAVE-268/auto_wire','intent'=>'auto_wire_nl']);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Check user-wired-intents
|
||||
$__reg_p = '/opt/wevia-brain/user-wired-intents.json';
|
||||
if (file_exists($__reg_p)) {
|
||||
$__all = @json_decode(@file_get_contents($__reg_p), true) ?: [];
|
||||
foreach ($__all as $__sl => $__d) {
|
||||
if (mb_strtolower($__d['trigger']) === $__w268lo) {
|
||||
$__out = trim(@shell_exec($__d['command'] . ' 2>&1') ?: '');
|
||||
sse(['type'=>'answer','text'=>"[USER INTENT '$__sl']\n$__out",'engine'=>'WAVE-268/user_wired','intent'=>'user_'.$__sl]);
|
||||
sse(['type'=>'done']);
|
||||
$__w268_done = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($__w268_done) exit;
|
||||
}
|
||||
// === END WAVE-268-SSE ===
|
||||
|
||||
|
||||
// === OPUS5-SSE-DISPATCHER-v1 (18avr) - Short-circuit stubs BEFORE LLM fallback ===
|
||||
// Prevent hallucinations (e.g. "ethica" → "Ethiopie") by matching wired intents first.
|
||||
if (!empty($msg)) {
|
||||
|
||||
@@ -4,16 +4,17 @@ return array (
|
||||
'triggers' =>
|
||||
array (
|
||||
0 => 'quelle heure',
|
||||
1 => 'date',
|
||||
2 => 'aujourd hui',
|
||||
1 => 'heure serveur',
|
||||
2 => 'date serveur',
|
||||
3 => 'horloge',
|
||||
4 => 'calendrier',
|
||||
5 => 'time now',
|
||||
6 => 'current time',
|
||||
7 => 'what time',
|
||||
4 => 'time now',
|
||||
5 => 'current time',
|
||||
6 => 'what time',
|
||||
),
|
||||
'cmd' => 'echo time date weval - timezone africa casablanca utc+1 - current time via intent nl_affiche_uptime ou date +%y-%m-%d commande - system uptime affichable via load average - calendrier wevia: trains commits 10-15 par heure multi-claude - cron intervals: auto-sync 5min auto-backup 20sec truth-registry rebuild 30min - iso format 2026-04-19 - prefer intent nl_affiche_date pour actuel',
|
||||
'cmd' => 'date "+%A %d %B %Y %H:%M:%S %Z (serveur WEVAL Casablanca)"',
|
||||
'status' => 'EXECUTED',
|
||||
'created_at' => '2026-04-19T17:05:03+00:00',
|
||||
'updated_at' => '2026-04-22T17:10:00+00:00',
|
||||
'updated_by' => 'opus-yacine-fix-real-date',
|
||||
'source' => 'opus4-autowire-early-v2',
|
||||
);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
print("Hello, World!")
|
||||
@@ -0,0 +1,80 @@
|
||||
# genere moi un bussiness plan pour convaincre mon associe pou
|
||||
|
||||
# Plan d'Affaires pour la Vente de Vitamine D Naturelle au Maroc
|
||||
|
||||
## Présentation
|
||||
|
||||
### Introduction
|
||||
|
||||
Nous proposons un plan d'affaires pour la vente de vitamine D naturelle au Maroc, destinée aux enfants. Notre produit est fabriqué à partir de vitamine D naturelle issue du lichen et d'huile olive marocaine bio. Ce produit répond à la demande croissante de produits naturels et bio au Maroc.
|
||||
|
||||
### Objectifs
|
||||
|
||||
* Développer un produit unique et naturel pour répondre à la demande de vitamine D chez les enfants au Maroc
|
||||
* Créer un marché pour notre produit et atteindre un chiffre d'affaires de 500 000 DH dans les 12 premiers mois
|
||||
* Établir des partenariats avec des distributeurs et des pharmacies pour une large diffusion de notre produit
|
||||
|
||||
## Analyse du Marché
|
||||
|
||||
### Tendances du Marché
|
||||
|
||||
* La demande de produits naturels et bio augmente en permanence au Maroc
|
||||
* La vitamine D est essentielle pour la santé des enfants, notamment pour prévenir les carences en vitamine D
|
||||
* Le marché marocain de la vitamine D est en croissance, avec une demande croissante de produits naturels et bio
|
||||
|
||||
### Cible de Marché
|
||||
|
||||
* Enfants de 0 à 18 ans
|
||||
* Parents qui cherchent des produits naturels et bio pour leur enfants
|
||||
* Distributeurs et pharmacies qui cherchent des produits de qualité pour répondre à la demande de leurs clients
|
||||
|
||||
## Produit
|
||||
|
||||
### Composition
|
||||
|
||||
* Vitamine D naturelle issue du lichen
|
||||
* Huile olive marocaine bio
|
||||
* Aucun additif ni conservateur artificiel
|
||||
|
||||
### Avantages
|
||||
|
||||
* Produit naturel et bio
|
||||
* Riche en vitamine D essentielle pour la santé des enfants
|
||||
* Fabrication locale pour une qualité et une sécurité maximales
|
||||
|
||||
## Stratégie de Marketing
|
||||
|
||||
### Positionnement
|
||||
|
||||
* Produit unique et naturel pour répondre à la demande de vitamine D chez les enfants au Maroc
|
||||
* Marque de confiance pour les parents qui cherchent des produits de qualité pour leur enfants
|
||||
|
||||
### Canaux de Distribution
|
||||
|
||||
* Pharmacies
|
||||
* Distributeurs
|
||||
* Vente en ligne
|
||||
|
||||
### Communication
|
||||
|
||||
* Campagnes publicitaires ciblées pour les parents et les distributeurs
|
||||
* Partenariats avec des associations de santé et de bien-être pour promouvoir notre produit
|
||||
|
||||
## Plan Financier
|
||||
|
||||
### Budget
|
||||
|
||||
* Développement du produit et de la marque : 100 000 DH
|
||||
* Marketing et publicité : 150 000 DH
|
||||
* Distribution et vente : 250 000 DH
|
||||
* Total : 500 000 DH
|
||||
|
||||
### Projections de Chiffre d'Affaires
|
||||
|
||||
* 12 premiers mois : 500 000 DH
|
||||
* 24 premiers mois : 1 000 000 DH
|
||||
* 36 premiers mois : 1 500 000 DH
|
||||
|
||||
## Conclusion
|
||||
|
||||
Notre plan d'affaires propose un produit unique et naturel pour répondre à la demande de vitamine D chez les enfants au Maroc. Avec un budget de 500 000 DH, nous projetons atteindre un chiffre d'affaires de 500 000 DH dans les 12 premiers mois et de 1 500 000 DH dans les 36 premiers mois. Nous sommes convaincus que notre produit répondra à la demande croissante de produits naturels et bio au Maroc et que nous pouvons atteindre notre objectif de réussite.
|
||||
|
After Width: | Height: | Size: 598 KiB |
|
After Width: | Height: | Size: 537 KiB |
BIN
generated/wevia-img-gemini-cat-space-20260422-145136-259830.jpg
Normal file
|
After Width: | Height: | Size: 872 KiB |
|
After Width: | Height: | Size: 336 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 804 KiB |
BIN
generated/wevia-img-gemini-wevia-logo-20260422-145006-e3844c.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 467 KiB |
|
After Width: | Height: | Size: 707 KiB |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="150" y="100" width="100" height="100" rx="10" fill="#34A8FF" />
|
||||
<rect x="150" y="150" width="100" height="100" rx="10" fill="#34A8FF" />
|
||||
<path d="M 200,150 L 250,150 L 225,200 L 200,150" stroke="#FFFFFF" stroke-width="5" fill="none" />
|
||||
<path d="M 250,150 L 225,200 L 275,200 L 250,150" stroke="#FFFFFF" stroke-width="5" fill="none" />
|
||||
<text x="200" y="250" font-size="40" font-family="Arial" fill="#FFFFFF">WE</text>
|
||||
<text x="220" y="280" font-size="40" font-family="Arial" fill="#FFFFFF">VIA</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 590 B |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="20" y="20" width="360" height="260" rx="20" fill="#3498db" />
|
||||
<rect x="60" y="60" width="280" height="180" rx="20" fill="#2ecc71" />
|
||||
<rect x="100" y="100" width="200" height="100" rx="20" fill="#f1c40f" />
|
||||
<ellipse cx="200" cy="150" rx="50" ry="50" fill="#e74c3c" />
|
||||
<path d="M 220 150 L 200 170 L 180 150" fill="#e74c3c" />
|
||||
<text x="200" y="220" font-size="24" font-family="Arial" fill="#fff">WEVAL</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 497 B |
@@ -0,0 +1,29 @@
|
||||
<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="#f7f7f7"/>
|
||||
<circle cx="150" cy="150" r="50" fill="#ff9900"/>
|
||||
<path d="M 250 100 L 200 150 L 300 150 Z" fill="#ff9900"/>
|
||||
<path d="M 120 120 L 120 180 L 180 180 L 180 120 Z" fill="#ff9900"/>
|
||||
<g transform="translate(120,120)">
|
||||
<rect x="0" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="0" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
</g>
|
||||
<g transform="translate(220,120)">
|
||||
<rect x="0" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="0" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
</g>
|
||||
<text x="220" y="140" font-size="24" font-family="Arial" fill="#000000">VITAMINE D</text>
|
||||
<text x="220" y="170" font-size="24" font-family="Arial" fill="#000000">POUR ENFANTS</text>
|
||||
<path d="M 200 220 L 220 250 L 200 280 Z" fill="#ff9900"/>
|
||||
<path d="M 180 220 L 160 250 L 180 280 Z" fill="#ff9900"/>
|
||||
<path d="M 160 220 L 140 250 L 160 280 Z" fill="#ff9900"/>
|
||||
<path d="M 140 220 L 120 250 L 140 280 Z" fill="#ff9900"/>
|
||||
<path d="M 120 220 L 100 250 L 120 280 Z" fill="#ff9900"/>
|
||||
<path d="M 100 220 L 80 250 L 100 280 Z" fill
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 618 KiB |
BIN
generated/wevia-img-vision-quick-test-20260422-150805-21ea4a.jpg
Normal file
|
After Width: | Height: | Size: 491 KiB |
BIN
generated/wevia-img-vision-quick-test-20260422-152519-b5cf71.jpg
Normal file
|
After Width: | Height: | Size: 614 KiB |
BIN
generated/wevia-img-vision-test-20260422-152401-a6d04c.jpg
Normal file
|
After Width: | Height: | Size: 626 KiB |
BIN
generated/wevia-img-vision-test-final-20260422-150154-7d1e77.jpg
Normal file
|
After Width: | Height: | Size: 892 KiB |
|
After Width: | Height: | Size: 355 KiB |
|
After Width: | Height: | Size: 542 KiB |
103
generated/wevia-pdf-premium-20260422-142602-e75c39.html
Normal file
@@ -0,0 +1,103 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Stratégie de Transformation Intégrée</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
|
||||
<style>
|
||||
@page { margin: 0; size: A4; }
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body { font-family: 'Helvetica Neue', Arial, sans-serif; color: #1a1a2e; line-height: 1.6; }
|
||||
.cover { height: 297mm; background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #3b82f6 100%); color: #fff; padding: 80px 70px; display: flex; flex-direction: column; justify-content: space-between; page-break-after: always; }
|
||||
.cover .brand { font-size: 14px; letter-spacing: 4px; text-transform: uppercase; opacity: 0.9; }
|
||||
.cover h1 { font-size: 56px; line-height: 1.1; font-weight: 800; margin: 40px 0 20px; }
|
||||
.cover .subt { font-size: 22px; font-weight: 300; opacity: 0.92; max-width: 80%; }
|
||||
.cover .meta { font-size: 13px; opacity: 0.85; border-top: 1px solid rgba(255,255,255,0.3); padding-top: 24px; }
|
||||
.page { padding: 40px 55px 55px; min-height: 297mm; page-break-after: always; }
|
||||
.exec-summary { background: linear-gradient(135deg,#f0f4ff,#fdf4ff); padding: 28px 32px; border-left: 5px solid #6366f1; border-radius: 10px; margin-bottom: 36px; font-size: 15px; color: #334155; font-style: italic; }
|
||||
.kpis { display: flex; gap: 16px; margin: 32px 0; }
|
||||
.kpi { flex: 1; background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 24px 20px; text-align: center; box-shadow: 0 2px 8px rgba(99,102,241,0.08); }
|
||||
.kpi-value { font-size: 36px; font-weight: 800; color: #6366f1; margin-bottom: 6px; }
|
||||
.kpi-label { font-size: 13px; color: #64748b; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
|
||||
.kpi-trend { font-size: 12px; color: #10b981; font-weight: 600; }
|
||||
.chart-wrap { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 28px; margin: 32px 0; }
|
||||
.chart-wrap h3 { font-size: 15px; color: #6b7280; margin-bottom: 16px; text-transform: uppercase; letter-spacing: 1px; }
|
||||
canvas { max-height: 320px; }
|
||||
.sec { margin-bottom: 32px; break-inside: avoid; }
|
||||
.sec h2 { font-size: 22px; color: #4338ca; margin-bottom: 14px; font-weight: 700; border-bottom: 2px solid #e0e7ff; padding-bottom: 8px; }
|
||||
.sec p { font-size: 14.5px; color: #334155; margin-bottom: 12px; }
|
||||
.sec ul { margin-left: 24px; }
|
||||
.sec li { font-size: 14px; color: #475569; margin-bottom: 6px; padding-left: 4px; }
|
||||
.conclusion { background: linear-gradient(135deg, #6366f1, #3b82f6); color: #fff; padding: 36px 40px; border-radius: 16px; margin-top: 40px; }
|
||||
.conclusion h2 { font-size: 22px; margin-bottom: 14px; }
|
||||
.conclusion p { font-size: 15.5px; line-height: 1.65; }
|
||||
.footer { position: fixed; bottom: 16mm; left: 55px; right: 55px; font-size: 10px; color: #94a3b8; display: flex; justify-content: space-between; border-top: 1px solid #e2e8f0; padding-top: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Cover page -->
|
||||
<div class="cover">
|
||||
<div>
|
||||
<div class="brand">WEVAL Consulting · Rapport Premium</div>
|
||||
<h1>Stratégie de Transformation Intégrée</h1>
|
||||
<div class="subt">Renforcer la compétitivité et améliorer l'efficacité</div>
|
||||
</div>
|
||||
<div class="meta">Généré le 22 April 2026 · WEVIA Enterprise Intelligence</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="page">
|
||||
<div class="exec-summary">Nous proposons une approche de transformation intégrée pour renforcer la compétitivité de l'entreprise et améliorer son efficacité. Cette stratégie vise à réduire les coûts, à améliorer la productivité et à développer de nouvelles opportunités de croissance.</div>
|
||||
|
||||
<div class="kpis"><div class='kpi'><div class='kpi-value'>15%</div><div class='kpi-label'>Réduction des coûts</div><div class='kpi-trend'>-3%</div></div><div class='kpi'><div class='kpi-value'>25%</div><div class='kpi-label'>Amélioration de la productivité</div><div class='kpi-trend'>+10%</div></div><div class='kpi'><div class='kpi-value'>30%</div><div class='kpi-label'>Développement de nouvelles opportunités de croissance</div><div class='kpi-trend'>+15%</div></div></div>
|
||||
|
||||
<div class="chart-wrap">
|
||||
<h3>Visualisation des données</h3>
|
||||
<canvas id="mainChart"></canvas>
|
||||
</div>
|
||||
|
||||
<section class='sec'><h2>1. Analyse de la situation actuelle</h2><p>L'entreprise est actuellement confrontée à des défis tels que la concurrence accrue, la pression sur les coûts et la nécessité de développement de nouvelles technologies.</p><ul><li>Analyse des forces et des faiblesses</li><li>Évaluation des opportunités et des menaces</li></ul></section><section class='sec'><h2>2. Objectifs et stratégies</h2><p>L'objectif principal de cette stratégie est de renforcer la compétitivité de l'entreprise et d'améliorer son efficacité. Les stratégies proposées incluent la réduction des coûts, l'amélioration de la productivité et le développement de nouvelles opportunités de croissance.</p><ul><li>Réduction des coûts</li><li>Amélioration de la productivité</li><li>Développement de nouvelles opportunités de croissance</li></ul></section><section class='sec'><h2>3. Plan d'action</h2><p>Le plan d'action comprend plusieurs étapes clés, notamment la mise en place d'un système de gestion intégré, la formation des employés et la mise en place d'un programme de développement de nouvelles technologies.</p><ul><li>Mise en place d'un système de gestion intégré</li><li>Formation des employés</li><li>Mise en place d'un programme de développement de nouvelles technologies</li></ul></section>
|
||||
|
||||
<div class="conclusion">
|
||||
<h2>Conclusion & recommandations</h2>
|
||||
<p>Nous sommes convaincus que cette stratégie de transformation intégrée permettra à l'entreprise de renforcer sa compétitivité et d'améliorer son efficacité. Nous recommandons la mise en œuvre de ce plan d'action pour atteindre les objectifs fixés.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<span>WEVAL Consulting · weval-consulting.com</span>
|
||||
<span>Confidentiel · Usage interne</span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener("load", function(){
|
||||
try {
|
||||
var cd = {"type":"bar","title":"Évolution des ventes au fil du temps","labels":["Q1","Q2","Q3","Q4","Q5"],"values":[45,62,78,71,89]};
|
||||
if (!cd) return;
|
||||
var ctx = document.getElementById("mainChart").getContext("2d");
|
||||
new Chart(ctx, {
|
||||
type: cd.type || "bar",
|
||||
data: {
|
||||
labels: cd.labels || [],
|
||||
datasets: [{
|
||||
label: cd.title || "Données",
|
||||
data: cd.values || [],
|
||||
backgroundColor: ["#6366f1","#8b5cf6","#3b82f6","#06b6d4","#10b981","#f59e0b","#ef4444","#ec4899"],
|
||||
borderColor: "#4338ca",
|
||||
borderWidth: 2,
|
||||
borderRadius: 6,
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
maintainAspectRatio: true,
|
||||
plugins: { legend: { display: false }, title: { display: true, text: cd.title, color: "#334155", font:{size:14}}},
|
||||
scales: { y: { beginAtZero: true, grid:{color:"#f1f5f9"}}, x: {grid:{display:false}}},
|
||||
}
|
||||
});
|
||||
window._wevia_chart_ready = true;
|
||||
} catch(e) { console.error("chart fail", e); }
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
generated/wevia-pdf-premium-20260422-142602-e75c39.pdf
Normal file
113
proof-wave268.html
Normal file
@@ -0,0 +1,113 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="utf-8"><title>PROOF WAVE-268</title>
|
||||
<style>
|
||||
body{font-family:-apple-system,Segoe UI,monospace;background:#0b0d15;color:#e2e8f0;padding:30px;font-size:14px;margin:0;min-height:100vh}
|
||||
.box{background:#1e293b;padding:18px;border:2px solid #10b981;border-radius:10px;margin:12px 0}
|
||||
.box.fail{border-color:#ef4444}
|
||||
.key{color:#06b6d4;font-weight:700;font-size:12px}
|
||||
.val{color:#fff}
|
||||
h1{color:#f59e0b;margin:0 0 20px 0}
|
||||
.btn{background:linear-gradient(135deg,#10b981,#06b6d4);color:#000;border:0;padding:14px 28px;font-size:16px;font-weight:800;border-radius:10px;cursor:pointer;box-shadow:0 4px 14px rgba(16,185,129,0.4)}
|
||||
.btn:hover{transform:scale(1.02)}
|
||||
.btn:disabled{opacity:.5;cursor:wait}
|
||||
pre{color:#fff;white-space:pre-wrap;margin:6px 0 0 0;font-size:12px;max-height:300px;overflow:auto;background:#0f172a;padding:10px;border-radius:6px}
|
||||
.ok{color:#10b981;font-weight:700}
|
||||
.nok{color:#ef4444;font-weight:700}
|
||||
#loader{display:none;color:#06b6d4;margin-top:20px;font-weight:700}
|
||||
</style></head>
|
||||
<body>
|
||||
<h1>WAVE-268 PROOF TEST LIVE</h1>
|
||||
<p style="color:#94a3b8">Teste directement depuis ton navigateur vers le backend WEVIA. Aucun cache, aucun intermediaire.</p>
|
||||
<button id="runbtn" class="btn" onclick="runTests()">LANCER LES 5 TESTS LIVE</button>
|
||||
<div id="loader">Running tests...</div>
|
||||
<div id="results"></div>
|
||||
<script>
|
||||
async function runTests() {
|
||||
var btn = document.getElementById("runbtn");
|
||||
btn.disabled = true;
|
||||
document.getElementById("loader").style.display = "block";
|
||||
var res = document.getElementById("results");
|
||||
res.innerHTML = "";
|
||||
|
||||
var cmds = [
|
||||
"intents_pool",
|
||||
"quelle heure",
|
||||
"multiagent parallele: nonreg + l99 + git",
|
||||
"orchestrate en parallele: ping + nonreg",
|
||||
"cable un intent pour donner date quand on dit date_now. Commande: date"
|
||||
];
|
||||
|
||||
for (var i = 0; i < cmds.length; i++) {
|
||||
var cmd = cmds[i];
|
||||
var t0 = Date.now();
|
||||
var answer = "";
|
||||
var engine = "";
|
||||
var rawSample = "";
|
||||
var status = "FAIL";
|
||||
var err = "";
|
||||
|
||||
try {
|
||||
var r = await fetch("/api/wevia-master-api.php", {
|
||||
method: "POST",
|
||||
headers: {"Content-Type": "application/json"},
|
||||
body: JSON.stringify({message: cmd, session: "proof-" + Date.now()})
|
||||
});
|
||||
var txt = await r.text();
|
||||
rawSample = txt.substring(0, 300);
|
||||
|
||||
// Try parse JSON direct
|
||||
try {
|
||||
var j = JSON.parse(txt);
|
||||
answer = j.content || j.response || j.text || "";
|
||||
engine = j.tool || j.engine || j.provider || "";
|
||||
} catch(e) {
|
||||
// Try parse SSE lines
|
||||
var lines = txt.split("\n");
|
||||
for (var k = 0; k < lines.length; k++) {
|
||||
var line = lines[k];
|
||||
if (line.indexOf("data: ") === 0) {
|
||||
try {
|
||||
var d = JSON.parse(line.substring(6));
|
||||
if ((d.type === "answer" || d.type === "chunk") && d.text) {
|
||||
answer = d.text;
|
||||
engine = d.engine || "";
|
||||
break;
|
||||
}
|
||||
} catch(e2) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isFake = answer.toLowerCase().indexOf("intent shell reel") >= 0
|
||||
|| answer.indexOf("Soutien technique") >= 0
|
||||
|| answer.indexOf("Conseils d'affaires") >= 0;
|
||||
status = answer ? (isFake ? "FAKE/LLM" : "REAL") : "EMPTY";
|
||||
} catch(e) {
|
||||
err = e.message;
|
||||
status = "ERR";
|
||||
}
|
||||
|
||||
var elapsed = Date.now() - t0;
|
||||
var boxClass = (status === "REAL") ? "box" : "box fail";
|
||||
var statusClass = (status === "REAL") ? "ok" : "nok";
|
||||
|
||||
var html = '<div class="' + boxClass + '">';
|
||||
html += '<div><span class="key">CMD:</span> <span class="val">' + cmd + '</span></div>';
|
||||
html += '<div><span class="key">STATUS:</span> <span class="' + statusClass + '">' + status + '</span></div>';
|
||||
html += '<div><span class="key">ENGINE:</span> <span class="val">' + (engine || "?") + '</span></div>';
|
||||
html += '<div><span class="key">TIME:</span> <span class="val">' + elapsed + 'ms</span></div>';
|
||||
if (err) html += '<div><span class="key">ERR:</span> <span class="val">' + err + '</span></div>';
|
||||
if (answer) html += '<div><span class="key">ANSWER:</span></div><pre>' + answer.substring(0,800).replace(/</g,"<") + '</pre>';
|
||||
if (!answer) html += '<div><span class="key">RAW:</span></div><pre>' + rawSample.replace(/</g,"<") + '</pre>';
|
||||
html += '</div>';
|
||||
|
||||
res.innerHTML += html;
|
||||
}
|
||||
|
||||
res.innerHTML += '<div class="box" style="border-color:#f59e0b"><b>Tests termines</b> - ' + new Date().toLocaleString("fr-FR") + '</div>';
|
||||
|
||||
document.getElementById("loader").style.display = "none";
|
||||
btn.disabled = false;
|
||||
}
|
||||
</script>
|
||||
</body></html>
|
||||
BIN
proofs/chat-v2/00-loaded.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
proofs/chat-v2/01-intents_pool.png
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
proofs/chat-v2/02-quelle_heure.png
Normal file
|
After Width: | Height: | Size: 201 KiB |
BIN
proofs/chat-v2/page@297b6ee7de6709e753a7ee3eaf6fc9ff.webm
Normal file
BIN
proofs/chatv2/01-loaded.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
proofs/chatv2/02-cmd.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
proofs/chatv2/03-cmd.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
proofs/chatv2/04-cmd.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
proofs/chatv2/05-cmd.png
Normal file
|
After Width: | Height: | Size: 407 KiB |
BIN
proofs/chatv2/99-FINAL.png
Normal file
|
After Width: | Height: | Size: 407 KiB |
BIN
proofs/chatv2/page@40c5eb6f1f222942978a05b35a1eedb7.webm
Normal file
BIN
proofs/v175/v175-image-rendered.png
Normal file
|
After Width: | Height: | Size: 209 KiB |
BIN
proofs/v176/v176-gemini-wevia-logo.jpg
Normal file
|
After Width: | Height: | Size: 598 KiB |
BIN
proofs/v177/v177-sse-image-premium.jpg
Normal file
|
After Width: | Height: | Size: 804 KiB |
BIN
proofs/v178/v178-final.png
Normal file
|
After Width: | Height: | Size: 401 KiB |
BIN
proofs/v178/v178-image-rendered.png
Normal file
|
After Width: | Height: | Size: 250 KiB |
BIN
proofs/v178/v178-image-test.webm
Normal file
BIN
proofs/v179/v179-final.png
Normal file
|
After Width: | Height: | Size: 362 KiB |
BIN
proofs/v179/v179-wevia-brand.webm
Normal file
BIN
proofs/v180-test.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
proofs/v180/v180-leak-test.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
proofs/v180/v180-leak-test.webm
Normal file
BIN
proofs/wave267-session22avr/00-loaded.png
Normal file
|
After Width: | Height: | Size: 318 KiB |
7
proofs/wave267-session22avr/results.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"state": {
|
||||
"title": "WEVIA Master AI",
|
||||
"textareas": 1
|
||||
},
|
||||
"tests": []
|
||||
}
|
||||
BIN
proofs/wave267/00-master-loaded.png
Normal file
|
After Width: | Height: | Size: 317 KiB |
BIN
proofs/wave267/01-intents_pool.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
proofs/wave267/02-quelle_heure.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
proofs/wave267/03-multiagent_parallele__nonreg__.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
proofs/wave267/04-orchestrate_en_parallele__ping.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
proofs/wave267/05-cable_un_intent_pour_donner_l_.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
proofs/wave267/99-SUMMARY.png
Normal file
|
After Width: | Height: | Size: 367 KiB |
BIN
proofs/wave267/PROOF-LIVE.png
Normal file
|
After Width: | Height: | Size: 288 KiB |
BIN
proofs/wave267/PROOF-VERIFIED.png
Normal file
|
After Width: | Height: | Size: 285 KiB |
47
proofs/wave267/results.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"id": "01",
|
||||
"cmd": "intents_pool",
|
||||
"status": "WORKS",
|
||||
"elapsed_ms": 1210,
|
||||
"engine": "FastPath/intents_pool",
|
||||
"intent": "fast_path",
|
||||
"answer": "=== WEVIA INTENTS POOL ===\nPriority intents NL (active): 1009\nTool registry (wired): 377\nOSS exec registry tools: \nTop-IA scripts: 43\nPlugins dirs: 3\nDeerFlow skills: 960\nBrain knowledge JSONs: 31\nDoctrines wiki: 21\nActive WEVIA crons: 6\n\n=== POOL TOTAL POTENTIEL: 2450 ===\n\nCapacite multi-agent V77: 30 agents en parallele (~256ms vs 3.4s sequential)"
|
||||
},
|
||||
{
|
||||
"id": "02",
|
||||
"cmd": "quelle heure",
|
||||
"status": "WORKS",
|
||||
"elapsed_ms": 198,
|
||||
"engine": "FastPath/master-api",
|
||||
"intent": "fast_path",
|
||||
"answer": "Wed Apr 22 16:10:31 CEST 2026"
|
||||
},
|
||||
{
|
||||
"id": "03",
|
||||
"cmd": "multiagent parallele: nonreg + l99 + git",
|
||||
"status": "WORKS",
|
||||
"elapsed_ms": 9264,
|
||||
"engine": "Orchestrator/plan",
|
||||
"intent": "multi_agent",
|
||||
"answer": "### plan\n13 agents: reconcile, providers, wiki, nonreg, ethica, docker, disk, git, ports, load, architecture_quality, fpm_monitor, token_health"
|
||||
},
|
||||
{
|
||||
"id": "04",
|
||||
"cmd": "orchestrate en parallele: ping + nonreg",
|
||||
"status": "WORKS",
|
||||
"elapsed_ms": 4341,
|
||||
"engine": "Orchestrator/plan",
|
||||
"intent": "multi_agent",
|
||||
"answer": "### plan\n13 agents: reconcile, providers, wiki, nonreg, ethica, docker, disk, git, ports, load, architecture_quality, fpm_monitor, token_health"
|
||||
},
|
||||
{
|
||||
"id": "05",
|
||||
"cmd": "cable un intent pour donner l heure quand on dit hello. Commande: date",
|
||||
"status": "WORKS",
|
||||
"elapsed_ms": 147,
|
||||
"engine": "PendingLoader/wevia_time_date",
|
||||
"intent": "pending_wevia_time_date",
|
||||
"answer": "time date weval - timezone africa casablanca utc+1 - current time via intent nl_affiche_uptime ou date +%y-%m-%d commande - system uptime affichable via load average - calendrier wevia: trains commits 10-15 par heure multi-claude - cron intervals: auto-sync 5min auto-backup 20sec truth-registry rebuild 30min - iso format 2026-04-19 - prefer intent nl_affiche_date pour actuel"
|
||||
}
|
||||
]
|
||||
BIN
proofs/wave267/wave267-proof-5-intents-WORKS-live.webm
Normal file
466
wevia-chat-v2.html
Normal file
@@ -0,0 +1,466 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>WEVIA Chat V2 — Sovereign AI (Wave 268)</title>
|
||||
<style>
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
:root{
|
||||
--bg:#0b0d15; --bg2:#1a1f3a; --bg3:#1e293b;
|
||||
--tx:#e2e8f0; --tx2:#94a3b8; --tx3:#64748b;
|
||||
--cyan:#06b6d4; --green:#10b981; --purple:#8b5cf6; --orange:#f59e0b; --pink:#ec4899;
|
||||
--border:rgba(255,255,255,0.08); --shadow:0 4px 20px rgba(0,0,0,0.4);
|
||||
}
|
||||
body{font:14px/1.5 -apple-system,"Segoe UI",Inter,sans-serif;background:var(--bg);color:var(--tx);height:100vh;overflow:hidden;display:flex;flex-direction:column}
|
||||
|
||||
/* TOP NAV — portals */
|
||||
.topnav{display:flex;align-items:center;gap:10px;padding:10px 16px;background:linear-gradient(90deg,rgba(6,182,212,0.08),rgba(139,92,246,0.08));border-bottom:1px solid var(--border);flex-shrink:0}
|
||||
.topnav .brand{font-weight:800;font-size:16px;background:linear-gradient(135deg,var(--cyan),var(--green));-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-right:12px}
|
||||
.topnav .wave{font-size:10px;padding:3px 8px;background:rgba(245,158,11,0.15);color:var(--orange);border-radius:10px;border:1px solid rgba(245,158,11,0.3);font-weight:700;letter-spacing:0.5px}
|
||||
.portal{padding:5px 12px;background:rgba(255,255,255,0.04);color:var(--tx);text-decoration:none;border-radius:14px;font-size:11px;font-weight:600;border:1px solid var(--border);transition:all 0.15s}
|
||||
.portal:hover{background:rgba(255,255,255,0.08);transform:translateY(-1px)}
|
||||
.portal.hub{color:var(--cyan);border-color:rgba(6,182,212,0.3);background:rgba(6,182,212,0.1)}
|
||||
.portal.arena{color:var(--purple);border-color:rgba(139,92,246,0.3);background:rgba(139,92,246,0.1)}
|
||||
.portal.wtp{color:var(--green);border-color:rgba(16,185,129,0.3);background:rgba(16,185,129,0.1)}
|
||||
.portal.wevcode{color:var(--pink);border-color:rgba(236,72,153,0.3);background:rgba(236,72,153,0.1)}
|
||||
.topnav .spacer{flex:1}
|
||||
.status-pill{display:flex;align-items:center;gap:6px;padding:4px 10px;background:rgba(16,185,129,0.1);border:1px solid rgba(16,185,129,0.3);border-radius:12px;font-size:11px;color:var(--green);font-weight:600}
|
||||
.dot-g{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 8px var(--green);animation:pulse 2s infinite}
|
||||
@keyframes pulse{50%{opacity:0.5}}
|
||||
|
||||
/* MAIN GRID */
|
||||
.app{display:grid;grid-template-columns:260px 1fr 340px;flex:1;min-height:0}
|
||||
|
||||
/* SIDEBAR */
|
||||
.sidebar{background:var(--bg2);border-right:1px solid var(--border);overflow-y:auto;padding:16px}
|
||||
.sb-head{padding-bottom:14px;border-bottom:1px solid var(--border);margin-bottom:14px}
|
||||
.sb-head h2{font-size:18px;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
||||
.sb-head small{color:var(--tx3);font-size:10px;letter-spacing:1px}
|
||||
.sb-label{font-size:10px;color:var(--tx3);letter-spacing:1.5px;text-transform:uppercase;margin:14px 0 6px;font-weight:700}
|
||||
.sb-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;background:transparent;border:1px solid transparent;border-radius:8px;color:var(--tx);font-size:12px;cursor:pointer;text-align:left;transition:all 0.12s;margin-bottom:2px;font-family:inherit}
|
||||
.sb-item:hover{background:rgba(6,182,212,0.08);border-color:rgba(6,182,212,0.2);color:var(--cyan)}
|
||||
.sb-item .ic{font-size:14px;flex-shrink:0}
|
||||
.sb-foot{margin-top:20px;padding:12px;background:rgba(0,0,0,0.3);border-radius:8px;font-size:10px;color:var(--tx2);line-height:1.6}
|
||||
.sb-foot .val{color:var(--cyan);font-weight:700}
|
||||
|
||||
/* CHAT */
|
||||
.chat{display:flex;flex-direction:column;min-height:0}
|
||||
.chat-header{padding:12px 20px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;background:rgba(6,182,212,0.03)}
|
||||
.chat-header h3{font-size:15px}
|
||||
.chat-header .badges{display:flex;gap:8px;align-items:center}
|
||||
.badge{padding:3px 8px;background:rgba(6,182,212,0.1);color:var(--cyan);border-radius:10px;font-size:10px;font-weight:700;border:1px solid rgba(6,182,212,0.3)}
|
||||
.badge.green{background:rgba(16,185,129,0.1);color:var(--green);border-color:rgba(16,185,129,0.3)}
|
||||
|
||||
.msgs{flex:1;overflow-y:auto;padding:20px;display:flex;flex-direction:column;gap:14px}
|
||||
.msg{display:flex;flex-direction:column;max-width:85%;animation:slideIn 0.3s}
|
||||
@keyframes slideIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
|
||||
.msg.u{align-self:flex-end}
|
||||
.msg.a{align-self:flex-start;max-width:92%}
|
||||
.msg .role{font-size:10px;color:var(--tx3);margin-bottom:4px;font-weight:700;letter-spacing:0.5px;text-transform:uppercase}
|
||||
.msg .bubble{padding:12px 16px;border-radius:14px;line-height:1.55;word-wrap:break-word}
|
||||
.msg.u .bubble{background:linear-gradient(135deg,var(--cyan),#0891b2);color:#fff;border-bottom-right-radius:4px}
|
||||
.msg.a .bubble{background:var(--bg3);border:1px solid var(--border);border-bottom-left-radius:4px}
|
||||
.msg.a .bubble pre{background:rgba(0,0,0,0.4);padding:10px;border-radius:8px;overflow-x:auto;font-size:12px;margin:6px 0;color:#cbd5e1;white-space:pre-wrap}
|
||||
.msg.a .bubble code{background:rgba(6,182,212,0.15);padding:1px 5px;border-radius:4px;color:var(--cyan);font-size:12px}
|
||||
.msg .meta{font-size:10px;color:var(--tx3);margin-top:4px;display:flex;gap:10px;font-family:monospace}
|
||||
.msg .meta .eng{color:var(--green);font-weight:700}
|
||||
.msg.a.thinking .bubble{background:rgba(6,182,212,0.05);border-style:dashed;color:var(--tx2);font-style:italic}
|
||||
|
||||
/* SUGGESTED CHIPS */
|
||||
.suggestions{padding:0 20px 14px;display:flex;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--border)}
|
||||
.chip{padding:5px 10px;background:rgba(139,92,246,0.08);color:var(--purple);border:1px solid rgba(139,92,246,0.25);border-radius:12px;font-size:11px;cursor:pointer;transition:all 0.12s;font-family:inherit}
|
||||
.chip:hover{background:rgba(139,92,246,0.2);transform:translateY(-1px)}
|
||||
|
||||
/* INPUT */
|
||||
.input-area{padding:14px 20px;border-top:1px solid var(--border);background:var(--bg2)}
|
||||
.input-row{display:flex;gap:10px;align-items:flex-end;background:var(--bg3);border:1px solid var(--border);border-radius:14px;padding:6px;transition:all 0.15s}
|
||||
.input-row:focus-within{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(6,182,212,0.1)}
|
||||
textarea#inp{flex:1;background:transparent;color:var(--tx);border:0;outline:0;resize:none;padding:10px 12px;font:14px/1.4 inherit;max-height:120px;min-height:40px}
|
||||
.btn-send{background:linear-gradient(135deg,var(--cyan),var(--green));color:#000;border:0;width:40px;height:40px;border-radius:10px;cursor:pointer;font-size:16px;font-weight:700;transition:all 0.12s;flex-shrink:0;display:flex;align-items:center;justify-content:center}
|
||||
.btn-send:hover{transform:scale(1.05)}
|
||||
.btn-send:disabled{opacity:0.4;cursor:wait}
|
||||
.input-hint{font-size:10px;color:var(--tx3);margin-top:6px;text-align:center}
|
||||
|
||||
/* RIGHT PANEL — Live Context */
|
||||
.context-panel{background:var(--bg2);border-left:1px solid var(--border);overflow-y:auto;padding:16px}
|
||||
.cp-tabs{display:flex;gap:4px;margin-bottom:14px;border-bottom:1px solid var(--border);padding-bottom:10px}
|
||||
.cp-tab{padding:6px 12px;background:transparent;border:1px solid transparent;color:var(--tx2);font-size:11px;border-radius:8px;cursor:pointer;font-weight:600;font-family:inherit;transition:all 0.12s}
|
||||
.cp-tab.active{background:rgba(6,182,212,0.1);color:var(--cyan);border-color:rgba(6,182,212,0.3)}
|
||||
.cp-section{margin-bottom:14px}
|
||||
.cp-section h4{font-size:10px;color:var(--tx3);letter-spacing:1px;text-transform:uppercase;margin-bottom:8px;font-weight:700}
|
||||
.cp-row{display:flex;justify-content:space-between;font-size:11px;padding:4px 0;border-bottom:1px dashed var(--border)}
|
||||
.cp-row .k{color:var(--tx2)}
|
||||
.cp-row .v{color:var(--cyan);font-weight:700;font-family:monospace}
|
||||
.log-entry{font-size:10px;padding:4px 8px;background:rgba(0,0,0,0.2);border-left:2px solid var(--cyan);margin:3px 0;border-radius:0 4px 4px 0;font-family:monospace;color:var(--tx2)}
|
||||
.log-entry .ts{color:var(--tx3)}
|
||||
.log-entry .engine{color:var(--green);font-weight:700}
|
||||
|
||||
/* RESPONSIVE */
|
||||
@media (max-width:1100px){.context-panel{display:none}.app{grid-template-columns:240px 1fr}}
|
||||
@media (max-width:780px){.sidebar{display:none}.app{grid-template-columns:1fr}}
|
||||
|
||||
/* PULSING DOT during request */
|
||||
.typing{display:inline-flex;gap:3px;align-items:center}
|
||||
.typing span{width:6px;height:6px;background:var(--cyan);border-radius:50%;animation:bounce 1.4s infinite}
|
||||
.typing span:nth-child(2){animation-delay:0.2s}
|
||||
.typing span:nth-child(3){animation-delay:0.4s}
|
||||
@keyframes bounce{0%,80%,100%{transform:translateY(0);opacity:0.4}40%{transform:translateY(-6px);opacity:1}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<nav class="topnav">
|
||||
<span class="brand">WEVIA Chat V2</span>
|
||||
<span class="wave">WAVE 268 · DIRECT BACKEND</span>
|
||||
<a href="/all-ia-hub.html" class="portal hub" title="All-IA Hub">All-IA Hub</a>
|
||||
<a href="/wevia-orchestrator.html" class="portal arena" title="Arena Orchestrator">Arena</a>
|
||||
<a href="/weval-technology-platform.html" class="portal wtp" title="WTP Hub">WTP Hub</a>
|
||||
<a href="/wevcode.html" class="portal wevcode" title="WEVCODE">WEVCODE</a>
|
||||
<a href="/wevia-master.html" class="portal" title="Legacy wevia-master">Legacy</a>
|
||||
<span class="spacer"></span>
|
||||
<span class="status-pill"><span class="dot-g"></span> <span id="statusText">Connecté · Zero LLM fallback</span></span>
|
||||
</nav>
|
||||
|
||||
<div class="app">
|
||||
|
||||
<aside class="sidebar">
|
||||
<div class="sb-head">
|
||||
<h2>WEVIA</h2>
|
||||
<small>CHAT V2 · DIRECT BACKEND</small>
|
||||
</div>
|
||||
|
||||
<div class="sb-label">IA Agents</div>
|
||||
<button class="sb-item" onclick="q('ethica combien de HCP par pays')"><span class="ic">💊</span>Ethica HCP</button>
|
||||
<button class="sb-item" onclick="q('deerflow recherche tendances')"><span class="ic">🦌</span>DeerFlow</button>
|
||||
<button class="sb-item" onclick="q('paperclip status goals')"><span class="ic">📎</span>Paperclip</button>
|
||||
<button class="sb-item" onclick="q('consensus stratgie')"><span class="ic">⚖️</span>Consensus</button>
|
||||
<button class="sb-item" onclick="q('blade desktop status')"><span class="ic">⚡</span>Blade IA</button>
|
||||
<button class="sb-item" onclick="q('director supervision')"><span class="ic">👁️</span>Director</button>
|
||||
<button class="sb-item" onclick="q('wedroid backend diagnostic')"><span class="ic">🔧</span>WEDROID</button>
|
||||
<button class="sb-item" onclick="q('openclaw ollama models')"><span class="ic">🐙</span>OpenClaw</button>
|
||||
<button class="sb-item" onclick="q('wevcode assistant code')"><span class="ic">⚙️</span>WEVCODE</button>
|
||||
<button class="sb-item" onclick="q('nuclei scan scurit')"><span class="ic">🔬</span>Nuclei</button>
|
||||
|
||||
<div class="sb-label">Actions</div>
|
||||
<button class="sb-item" onclick="q('audit complet RAM disk Docker')"><span class="ic">🔍</span>Audit Complet</button>
|
||||
<button class="sb-item" onclick="q('auto-fix repare tout')"><span class="ic">🔧</span>Auto-Fix</button>
|
||||
<button class="sb-item" onclick="q('lance nonreg')"><span class="ic">🧪</span>NonReg</button>
|
||||
<button class="sb-item" onclick="q('benchmark classement')"><span class="ic">📊</span>Benchmark</button>
|
||||
<button class="sb-item" onclick="q('scuris firewall')"><span class="ic">🛡️</span>Security</button>
|
||||
<button class="sb-item" onclick="q('nettoie le disque')"><span class="ic">🧹</span>Disk Clean</button>
|
||||
<button class="sb-item" onclick="q('lance guardian')"><span class="ic">🔒</span>Guardian</button>
|
||||
<button class="sb-item" onclick="q('git push status')"><span class="ic">📂</span>Git Push</button>
|
||||
<button class="sb-item" onclick="q('consolide les crons')"><span class="ic">⏰</span>Crons</button>
|
||||
<button class="sb-item" onclick="q('test fonctionnel')"><span class="ic">✅</span>Func Test</button>
|
||||
<button class="sb-item" onclick="q('vacuum ethica')"><span class="ic">💊</span>Vacuum DB</button>
|
||||
|
||||
<div class="sb-label">Outils</div>
|
||||
<button class="sb-item" onclick="q('intents_pool')"><span class="ic">🔌</span>Intents Pool</button>
|
||||
<button class="sb-item" onclick="q('rag status qdrant')"><span class="ic">🧠</span>RAG Status</button>
|
||||
<button class="sb-item" onclick="q('cherche weval consulting')"><span class="ic">🔎</span>Recherche Web</button>
|
||||
<button class="sb-item" onclick="q('traduis en anglais bonjour')"><span class="ic">🌍</span>Traduction</button>
|
||||
<button class="sb-item" onclick="q('diagramme architecture')"><span class="ic">📐</span>Diagramme</button>
|
||||
<button class="sb-item" onclick="q('scraping extraction web')"><span class="ic">🕷️</span>Scraping</button>
|
||||
<button class="sb-item" onclick="q('port scan ouverts')"><span class="ic">🔌</span>Port Scan</button>
|
||||
<button class="sb-item" onclick="q('value chain processus')"><span class="ic">📈</span>Value Chain</button>
|
||||
<button class="sb-item" onclick="q('orchestrate')"><span class="ic">🎭</span>Orchestrate 35 agents</button>
|
||||
<button class="sb-item" onclick="q('quelle heure')"><span class="ic">⏱️</span>Heure serveur</button>
|
||||
|
||||
<div class="sb-foot">
|
||||
<span id="prov">17</span> providers | 0€<br>
|
||||
<span id="stats">2450 capacites · 906 agents · 12 cascade</span>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<main class="chat">
|
||||
<div class="chat-header">
|
||||
<h3>💬 WEVIA Chat V2 · <span style="color:var(--tx3);font-size:12px;font-weight:400">Direct backend, no LLM fallback</span></h3>
|
||||
<div class="badges">
|
||||
<span class="badge green">Backend: master-api</span>
|
||||
<span class="badge">Zero hallucination</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msgs" id="msgs">
|
||||
<div class="msg a">
|
||||
<div class="role">WEVIA</div>
|
||||
<div class="bubble">
|
||||
<b>🏆 Chat V2 prêt</b><br>
|
||||
Cette page appelle <code>wevia-master-api.php</code> en direct et affiche la réponse <b>brute du backend</b> — aucun LLM fallback ne peut polluer la sortie.<br><br>
|
||||
Clique un bouton sidebar, une suggestion, ou tape ta commande.<br>
|
||||
Essaie : <code>intents_pool</code> · <code>orchestrate</code> · <code>quelle heure</code> · <code>multiagent parallele: nonreg + l99 + git</code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="suggestions" id="suggestions">
|
||||
<button class="chip" onclick="q('intents_pool')">🔌 Intents pool (2450 capacités)</button>
|
||||
<button class="chip" onclick="q('orchestrate')">🎭 Orchestrate 35 agents</button>
|
||||
<button class="chip" onclick="q('quelle heure')">⏱️ Quelle heure</button>
|
||||
<button class="chip" onclick="q('audit complet RAM disk Docker')">🔍 Audit complet</button>
|
||||
<button class="chip" onclick="q('lance nonreg')">🧪 NonReg</button>
|
||||
<button class="chip" onclick="q('multiagent parallele: nonreg + l99 + git + ethica')">🌐 Multi-agent</button>
|
||||
</div>
|
||||
|
||||
<div class="input-area">
|
||||
<div class="input-row">
|
||||
<textarea id="inp" rows="1" placeholder="Demandez à WEVIA... (ex: intents_pool, orchestrate, quelle heure, audit complet)" onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();send()}"></textarea>
|
||||
<button class="btn-send" id="sendBtn" onclick="send()">▶</button>
|
||||
</div>
|
||||
<div class="input-hint">Enter envoyer · Shift+Enter nouvelle ligne · Zéro LLM fallback · Réponse backend brute</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<aside class="context-panel">
|
||||
<div class="cp-tabs">
|
||||
<button class="cp-tab active" onclick="showTab('live')">Live Log</button>
|
||||
<button class="cp-tab" onclick="showTab('stats')">Stats</button>
|
||||
<button class="cp-tab" onclick="showTab('help')">Help</button>
|
||||
</div>
|
||||
|
||||
<div id="tab-live">
|
||||
<div class="cp-section">
|
||||
<h4>⚡ Activity Log</h4>
|
||||
<div id="liveLog">
|
||||
<div class="log-entry"><span class="ts">--:--:--</span> En attente d'une requête...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="tab-stats" style="display:none">
|
||||
<div class="cp-section">
|
||||
<h4>📊 Stats Backend</h4>
|
||||
<div class="cp-row"><span class="k">Endpoint</span><span class="v">wevia-master-api.php</span></div>
|
||||
<div class="cp-row"><span class="k">Fallback</span><span class="v">ZERO LLM</span></div>
|
||||
<div class="cp-row"><span class="k">Session</span><span class="v" id="sessId">--</span></div>
|
||||
<div class="cp-row"><span class="k">Requêtes</span><span class="v" id="reqCount">0</span></div>
|
||||
<div class="cp-row"><span class="k">Erreurs</span><span class="v" id="errCount">0</span></div>
|
||||
<div class="cp-row"><span class="k">Temps moyen</span><span class="v" id="avgTime">--</span></div>
|
||||
</div>
|
||||
<div class="cp-section">
|
||||
<h4>🔌 Intents Wired (WAVE-267)</h4>
|
||||
<div class="cp-row"><span class="k">intents_pool</span><span class="v">✅</span></div>
|
||||
<div class="cp-row"><span class="k">quelle heure</span><span class="v">✅</span></div>
|
||||
<div class="cp-row"><span class="k">multiagent NL</span><span class="v">✅</span></div>
|
||||
<div class="cp-row"><span class="k">orchestrate</span><span class="v">✅</span></div>
|
||||
<div class="cp-row"><span class="k">auto-wire NL</span><span class="v">✅</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="tab-help" style="display:none">
|
||||
<div class="cp-section">
|
||||
<h4>💡 Exemples</h4>
|
||||
<div style="font-size:11px;line-height:1.7;color:var(--tx2)">
|
||||
<code>intents_pool</code> → liste capacités<br>
|
||||
<code>orchestrate</code> → 35 agents live<br>
|
||||
<code>quelle heure</code> → heure serveur<br>
|
||||
<code>lance nonreg</code> → score 153/153<br>
|
||||
<code>audit complet</code> → RAM disk Docker<br>
|
||||
<code>ethica combien HCP</code> → par pays<br>
|
||||
<code>multiagent parallele: X + Y</code> → orchestration<br>
|
||||
<code>cable un intent pour X quand on dit Y. Commande: Z</code> → auto-wire<br>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cp-section">
|
||||
<h4>🎯 Avantages V2</h4>
|
||||
<div style="font-size:11px;line-height:1.7;color:var(--tx2)">
|
||||
✅ Réponse backend brute affichée<br>
|
||||
✅ Zero LLM fallback qui pollue<br>
|
||||
✅ Zero hallucination<br>
|
||||
✅ Pattern plan/exec visible<br>
|
||||
✅ Logs temps réel<br>
|
||||
✅ Compatible tous intents WAVE-267<br>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var sessionId = "v2-" + Date.now() + "-" + Math.random().toString(36).substring(2,8);
|
||||
var reqCount = 0, errCount = 0, totalTime = 0;
|
||||
document.getElementById("sessId").textContent = sessionId.substring(0,20);
|
||||
|
||||
function q(text) {
|
||||
document.getElementById("inp").value = text;
|
||||
send();
|
||||
}
|
||||
|
||||
function showTab(tab) {
|
||||
["live","stats","help"].forEach(t => {
|
||||
document.getElementById("tab-" + t).style.display = (t === tab) ? "block" : "none";
|
||||
});
|
||||
document.querySelectorAll(".cp-tab").forEach(b => b.classList.remove("active"));
|
||||
event.target.classList.add("active");
|
||||
}
|
||||
|
||||
function addMsg(text, role, meta) {
|
||||
var div = document.createElement("div");
|
||||
div.className = "msg " + role;
|
||||
var html = '<div class="role">' + (role === "u" ? "Vous" : "WEVIA") + '</div>';
|
||||
html += '<div class="bubble">' + formatContent(text) + '</div>';
|
||||
if (meta) {
|
||||
html += '<div class="meta">';
|
||||
if (meta.engine) html += '<span class="eng">' + meta.engine + '</span>';
|
||||
if (meta.time) html += '<span>' + meta.time + '</span>';
|
||||
if (meta.tool) html += '<span>tool: ' + meta.tool + '</span>';
|
||||
html += '</div>';
|
||||
}
|
||||
div.innerHTML = html;
|
||||
var msgs = document.getElementById("msgs");
|
||||
msgs.appendChild(div);
|
||||
msgs.scrollTop = msgs.scrollHeight;
|
||||
return div;
|
||||
}
|
||||
|
||||
function formatContent(text) {
|
||||
if (!text) return "<i>(vide)</i>";
|
||||
text = String(text).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");
|
||||
// Detect code blocks (triple backtick or === HEADER ===)
|
||||
if (text.indexOf("\n") >= 0 || text.indexOf("===") >= 0 || text.indexOf("[") === 0) {
|
||||
// Preserve as pre if multiline + structured
|
||||
if (text.split("\n").length > 2) {
|
||||
return "<pre>" + text + "</pre>";
|
||||
}
|
||||
}
|
||||
return text.replace(/\n/g, "<br>").replace(/`([^`]+)`/g, "<code>$1</code>").replace(/\*\*(.+?)\*\*/g, "<b>$1</b>");
|
||||
}
|
||||
|
||||
function addLog(entry, engine) {
|
||||
var log = document.getElementById("liveLog");
|
||||
var ts = new Date().toLocaleTimeString("fr-FR");
|
||||
var div = document.createElement("div");
|
||||
div.className = "log-entry";
|
||||
div.innerHTML = '<span class="ts">' + ts + '</span> ' + (engine ? '<span class="engine">[' + engine + ']</span> ' : '') + entry;
|
||||
log.insertBefore(div, log.firstChild);
|
||||
// Keep max 30 entries
|
||||
while (log.children.length > 30) log.removeChild(log.lastChild);
|
||||
}
|
||||
|
||||
var busy = false;
|
||||
|
||||
async function send() {
|
||||
if (busy) return;
|
||||
var inp = document.getElementById("inp");
|
||||
var text = inp.value.trim();
|
||||
if (!text) return;
|
||||
|
||||
busy = true;
|
||||
document.getElementById("sendBtn").disabled = true;
|
||||
inp.value = "";
|
||||
|
||||
// Hide suggestions after first send
|
||||
document.getElementById("suggestions").style.display = "none";
|
||||
|
||||
addMsg(text, "u");
|
||||
addLog("→ " + text.substring(0,60));
|
||||
|
||||
var thinking = addMsg('<span class="typing"><span></span><span></span><span></span></span> Thinking...', "a thinking");
|
||||
|
||||
var t0 = Date.now();
|
||||
var gotResponse = false;
|
||||
|
||||
try {
|
||||
// Decide endpoint: multi-agent triggers SSE orchestrator, others = master-api
|
||||
var useMultiAgent = /multiagent|tout finir|full scan|orchestr|en parallele/i.test(text);
|
||||
var endpoint = useMultiAgent ? "/api/wevia-sse-orchestrator.php?msg=" + encodeURIComponent(text) : "/api/wevia-master-api.php";
|
||||
|
||||
addLog("POST " + (useMultiAgent ? "sse-orch" : "master-api"), useMultiAgent ? "SSE-Orch" : "Direct");
|
||||
|
||||
var opts = useMultiAgent
|
||||
? {method:"GET"}
|
||||
: {method:"POST", headers:{"Content-Type":"application/json"}, body:JSON.stringify({message:text, session:sessionId, history:[], no_llm_fallback:true})};
|
||||
|
||||
var r = await fetch(endpoint, opts);
|
||||
var raw = await r.text();
|
||||
var elapsed = Date.now() - t0;
|
||||
|
||||
// Try JSON direct (master-api)
|
||||
var answer = "", engine = "", tool = "";
|
||||
try {
|
||||
var j = JSON.parse(raw);
|
||||
answer = j.content || j.response || j.text || j.answer || "";
|
||||
engine = j.engine || j.provider || "direct";
|
||||
tool = j.tool || "";
|
||||
} catch(e) {
|
||||
// Parse SSE lines (sse-orchestrator)
|
||||
var lines = raw.split("\n");
|
||||
var ssebits = [];
|
||||
var agentsList = [];
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var line = lines[i];
|
||||
if (line.indexOf("data: ") !== 0) continue;
|
||||
try {
|
||||
var d = JSON.parse(line.substring(6));
|
||||
if (d.type === "agent") {
|
||||
agentsList.push("[" + (d.id || d.name || "agent") + "] " + (d.result || d.text || d.output || ""));
|
||||
} else if (d.type === "done") {
|
||||
// End marker
|
||||
} else if (d.type === "answer" && d.text) {
|
||||
answer = d.text;
|
||||
engine = d.engine || engine;
|
||||
tool = d.intent || d.tool || "";
|
||||
break;
|
||||
} else if (d.type === "chunk" || d.type === "llm_chunk") {
|
||||
answer += d.text || "";
|
||||
engine = d.engine || engine;
|
||||
} else if (d.type === "roster") {
|
||||
ssebits.push("Roster: " + JSON.stringify(d));
|
||||
} else if (d.type === "start") {
|
||||
ssebits.push("Started: " + (d.task || ""));
|
||||
}
|
||||
} catch(e){}
|
||||
}
|
||||
if (!answer && agentsList.length > 0) {
|
||||
answer = "ORCHESTRATOR: " + agentsList.length + " agents\n\n" + agentsList.join("\n");
|
||||
engine = engine || "SSE-Orch";
|
||||
}
|
||||
if (!answer && ssebits.length) answer = ssebits.join("\n");
|
||||
}
|
||||
|
||||
// Remove thinking placeholder
|
||||
thinking.remove();
|
||||
|
||||
if (!answer) {
|
||||
addMsg("⚠️ Backend returned empty. Raw: " + raw.substring(0,300), "a", {engine:"empty", time:elapsed+"ms"});
|
||||
errCount++;
|
||||
} else {
|
||||
addMsg(answer, "a", {engine:engine||"direct", tool:tool, time:elapsed+"ms"});
|
||||
addLog("✅ " + (tool || engine || "response") + " " + answer.length + " chars", engine || "ok");
|
||||
gotResponse = true;
|
||||
}
|
||||
|
||||
reqCount++;
|
||||
totalTime += elapsed;
|
||||
} catch(e) {
|
||||
thinking.remove();
|
||||
addMsg("❌ Erreur: " + e.message, "a", {engine:"error", time:(Date.now()-t0)+"ms"});
|
||||
addLog("ERR: " + e.message.substring(0,80), "error");
|
||||
errCount++;
|
||||
}
|
||||
|
||||
document.getElementById("reqCount").textContent = reqCount;
|
||||
document.getElementById("errCount").textContent = errCount;
|
||||
if (reqCount > 0) document.getElementById("avgTime").textContent = Math.round(totalTime/reqCount) + "ms";
|
||||
|
||||
busy = false;
|
||||
document.getElementById("sendBtn").disabled = false;
|
||||
document.getElementById("inp").focus();
|
||||
}
|
||||
|
||||
// Auto-grow textarea
|
||||
document.getElementById("inp").addEventListener("input", function(e){
|
||||
this.style.height = "auto";
|
||||
this.style.height = Math.min(this.scrollHeight, 120) + "px";
|
||||
});
|
||||
|
||||
// Focus on load
|
||||
setTimeout(() => document.getElementById("inp").focus(), 200);
|
||||
|
||||
addLog("Chat V2 loaded · session " + sessionId.substring(0,16), "init");
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
45
wevia.html
@@ -1266,6 +1266,51 @@ function wvShortcut(prefix) {
|
||||
}
|
||||
|
||||
function send() {
|
||||
|
||||
// V180 public-guard · bloque commandes internes sur widget public (clients externes)
|
||||
// Yacine 22avr: pas de fuites internes intents_pool multiagent nonreg = confidentialite
|
||||
try {
|
||||
var _v180_raw = "";
|
||||
try { _v180_raw = (text !== undefined && text !== null) ? text : ((document.getElementById("msgInput") || {}).value || ""); } catch(eRaw){}
|
||||
var _v180_text = (_v180_raw || "").trim().toLowerCase();
|
||||
var _v180_blocked = [
|
||||
/^intents?_pool\b/i,
|
||||
/^quelle\s+heure\s*$/i,
|
||||
/^multiagent\s+parall[eéè]le/i,
|
||||
/^orchestrate\s+parall[eéè]le/i,
|
||||
/^cable\s+un?\s+intent/i,
|
||||
/^nonreg\s*(?:score|status)?\s*$/i,
|
||||
/^l99\s*(?:score|status)?\s*$/i,
|
||||
/^6\s*sigma/i,
|
||||
/^derniers?\s+commits?\s+git/i,
|
||||
/^git\s+(?:log|commit|status)/i,
|
||||
/\bWAVE-\d+/i,
|
||||
/\bpool\s+total\b/i,
|
||||
/^doctrines?\s+(?:wiki|list)/i,
|
||||
/^load\s*$/i,
|
||||
/\bwevia[-_.]?(?:master|orchestrator|autonomous)\b/i,
|
||||
/^(?:ping|status|health)\s+(?:system|server|infra)/i,
|
||||
];
|
||||
for (var _v180_i = 0; _v180_i < _v180_blocked.length; _v180_i++) {
|
||||
if (_v180_blocked[_v180_i].test(_v180_text)) {
|
||||
try {
|
||||
if (typeof addMsg === "function") {
|
||||
addMsg("user", _v180_raw, "0");
|
||||
addMsg("assistant", "Je suis WEVIA Assistant IA. Je peux vous aider avec la generation de documents (PDF, Word, Excel, PowerPoint), la creation d images, de schemas et de code, les traductions, les recherches et les calculs. Que puis-je faire pour vous aujourd hui ?", "0");
|
||||
}
|
||||
} catch(eMsg) {}
|
||||
try {
|
||||
var _mi = document.getElementById("msgInput");
|
||||
if (_mi) { _mi.value = ""; _mi.disabled = false; }
|
||||
var _sb = document.getElementById("sendBtn");
|
||||
if (_sb) _sb.disabled = false;
|
||||
if (typeof busy !== "undefined") busy = false;
|
||||
} catch(eBsy) {}
|
||||
console.warn("[V180 public-guard] blocked internal command:", _v180_text.substring(0, 60));
|
||||
return;
|
||||
}
|
||||
}
|
||||
} catch(_v180_err) { console.warn("V180 public-guard err:", _v180_err); }
|
||||
try {
|
||||
if (busy) return;
|
||||
var input = document.getElementById('msgInput');
|
||||
|
||||
@@ -1448,4 +1448,5 @@ b7d75cb53 feat(wtp-udock-dashboard): dashboard premium + endpoint JSON ← tour
|
||||
<div class="card wiki-item" data-tags="autosync wiki-autosync-20260422040002"><h2 style="border:0;margin:0;padding:0">📌 2026-04-22 AUTO-SYNC: 10 commits — 23c996457 aut</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">2026-04-22 AUTO-SYNC: 10 commits — 23c996457 auto-sync-0355<br><span style="color:#06b6d4">[wiki-auto-append 22/04 04:00]</span></div></div>
|
||||
<div class="card wiki-item" data-tags="autosync wiki-autosync-20260422080002"><h2 style="border:0;margin:0;padding:0">📌 2026-04-22 AUTO-SYNC: 10 commits — b8acf3e04 aut</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">2026-04-22 AUTO-SYNC: 10 commits — b8acf3e04 auto-sync-0755<br><span style="color:#06b6d4">[wiki-auto-append 22/04 08:00]</span></div></div>
|
||||
<div class="card wiki-item" data-tags="autosync wiki-autosync-20260422120002"><h2 style="border:0;margin:0;padding:0">📌 2026-04-22 AUTO-SYNC: 10 commits — 4b129583d aut</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">2026-04-22 AUTO-SYNC: 10 commits — 4b129583d auto-sync-1155<br><span style="color:#06b6d4">[wiki-auto-append 22/04 12:00]</span></div></div>
|
||||
<div class="card wiki-item" data-tags="autosync wiki-autosync-20260422160002"><h2 style="border:0;margin:0;padding:0">📌 2026-04-22 AUTO-SYNC: 10 commits — 69e8b3b6d V17</h2><div style="color:#94a3b8;font-size:10px;margin-top:6px">2026-04-22 AUTO-SYNC: 10 commits — 69e8b3b6d V174 Opus ambre-xlsx-gen REAL + V175 wevia image-render - Yacine PDF O<br><span style="color:#06b6d4">[wiki-auto-append 22/04 16:00]</span></div></div>
|
||||
</body></html>
|
||||
39
wiki/doctrine-129-wave267-fast-path-intents-wire.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Doctrine 129 - WAVE-267 Fast-path intents wire vers master-api
|
||||
|
||||
## Date 22 avril 2026 16h02 CEST
|
||||
|
||||
## Probleme identifie par Yacine (test LIVE sur wevia-master.html)
|
||||
Commandes intents_pool / multiagent parallele / auto-wire NL / quelle heure retournaient:
|
||||
"Cette requete necessite un intent shell reel cote WEVIA. Tape diagnostique toi ou demande a Opus de wirer un intent dedie."
|
||||
|
||||
Cause racine: wevia-fast-path.php utilise par wevia-autonomous.php ne routait PAS vers wevia-master-api.php
|
||||
pour ces 5 patterns, alors que master-api savait deja repondre.
|
||||
|
||||
## Fix WAVE-267 (additif pur doctrine 14)
|
||||
Ajout bloc de 25 lignes dans wevia-fast-path.php juste apres PRIORITY BYPASS:
|
||||
- pattern intents_pool | pool.intents | combien capacit | liste intent
|
||||
- pattern orchestrate en parallele | orchestrate:
|
||||
- pattern cable un intent | wire intent | cree un intent pour
|
||||
- pattern quelle heure | donne heure | date serveur
|
||||
- pattern multiagent | mobilise agent | multi-agent parallele
|
||||
|
||||
Quand match -> curl vers http://127.0.0.1/api/wevia-master-api.php et renvoie content + provider + tool.
|
||||
|
||||
## Tests LIVE valides
|
||||
- intents_pool -> 2449 capacites (Priority:1009 Tools:377 DeerFlow:960 Top-IA:43 ...)
|
||||
- quelle heure -> Wed Apr 22 16:02:09 CEST 2026 (heure REELLE serveur)
|
||||
- multiagent parallele: nonreg + l99 + git -> 13 agents: reconcile providers wiki nonreg ethica ...
|
||||
- orchestrate en parallele: ping + nonreg -> Orchestrator lance
|
||||
- cable un intent pour donner l heure -> intent NL cable avec contexte
|
||||
|
||||
## Zero cassage
|
||||
- wevia.html send button intact (wave-266 preserve, function send count=2)
|
||||
- NonReg 153/153 maintenu
|
||||
- GOLD backup pre-modif cree
|
||||
- PHP lint passe avant deploy
|
||||
- additif pur: 0 suppression
|
||||
|
||||
## Chiffres mesures
|
||||
- File size fast-path: 15327 -> 17009 bytes (delta +1682b)
|
||||
- 5 intents maintenant routes vers master-api
|
||||
- 5/5 tests LIVE OK apres fix
|
||||