auto-sync via WEVIA git_sync_all intent 2026-04-20T14:24:14+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
16
api/_tmp_orph_check.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
$c = pg_connect("host=10.1.0.3 port=5432 dbname=admin user=admin password=admin123");
|
||||
if (!$c) die("NOCONN\n");
|
||||
$r = pg_query($c, "SELECT COUNT(*) FROM contacts WHERE company_id IS NULL");
|
||||
$row = pg_fetch_row($r);
|
||||
echo "Orphans total: " . $row[0] . "\n";
|
||||
$r2 = pg_query($c, "SELECT c.id, c.email, c.source, c.created_at FROM contacts c WHERE c.company_id IS NULL ORDER BY c.created_at DESC LIMIT 10");
|
||||
while($row = pg_fetch_assoc($r2)) {
|
||||
echo "- " . json_encode($row, JSON_UNESCAPED_UNICODE) . "\n";
|
||||
}
|
||||
// Source distribution
|
||||
$r3 = pg_query($c, "SELECT source, COUNT(*) FROM contacts WHERE company_id IS NULL GROUP BY source ORDER BY 2 DESC");
|
||||
echo "\nSource distribution:\n";
|
||||
while($row = pg_fetch_row($r3)) {
|
||||
echo " $row[0]: $row[1]\n";
|
||||
}
|
||||
29
api/_tmp_orph_v2.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
ini_set('display_errors', '1');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$hosts = [
|
||||
"host=10.1.0.3 port=5432 dbname=admin user=admin password=admin123",
|
||||
"host=127.0.0.1 port=5432 dbname=adx_system user=admin password=admin123",
|
||||
"host=127.0.0.1 port=5432 dbname=admin user=admin password=admin123",
|
||||
];
|
||||
|
||||
foreach ($hosts as $h) {
|
||||
echo "Trying: $h\n";
|
||||
$c = @pg_connect($h);
|
||||
if ($c) {
|
||||
echo " CONNECTED\n";
|
||||
$r = @pg_query($c, "SELECT COUNT(*) FROM contacts WHERE company_id IS NULL");
|
||||
if ($r) {
|
||||
$row = pg_fetch_row($r);
|
||||
echo " Orphans: " . $row[0] . "\n";
|
||||
$r2 = pg_query($c, "SELECT source, COUNT(*) FROM contacts WHERE company_id IS NULL GROUP BY source ORDER BY 2 DESC LIMIT 5");
|
||||
while($row = pg_fetch_row($r2)) echo " source=$row[0] count=$row[1]\n";
|
||||
break;
|
||||
} else {
|
||||
echo " QRYERR: " . pg_last_error($c) . "\n";
|
||||
}
|
||||
} else {
|
||||
echo " FAIL\n";
|
||||
}
|
||||
}
|
||||
22
api/_tmp_orph_v3.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
$c = pg_connect("host=127.0.0.1 port=5432 dbname=adx_system user=admin password=admin123");
|
||||
if (!$c) die("NOCONN");
|
||||
|
||||
// Get schema
|
||||
$r = pg_query($c, "SELECT column_name FROM information_schema.columns WHERE table_name='contacts' AND table_schema='public' ORDER BY ordinal_position");
|
||||
$cols = [];
|
||||
while($row = pg_fetch_row($r)) $cols[] = $row[0];
|
||||
echo "contacts columns: " . implode(", ", $cols) . "\n\n";
|
||||
|
||||
// Check how many have 'company' NULL
|
||||
$r = pg_query($c, "SELECT COUNT(*) FROM contacts WHERE company IS NULL OR company = ''");
|
||||
echo "Orphans (company NULL/empty): " . pg_fetch_row($r)[0] . "\n";
|
||||
|
||||
// Source distribution of orphans
|
||||
$r = pg_query($c, "SELECT COALESCE(source,'(null)'), COUNT(*) FROM contacts WHERE company IS NULL OR company = '' GROUP BY source ORDER BY 2 DESC LIMIT 10");
|
||||
echo "\nOrphan source distribution:\n";
|
||||
while($row = pg_fetch_row($r)) echo " " . $row[0] . ": " . $row[1] . "\n";
|
||||
|
||||
// Total contacts
|
||||
$r = pg_query($c, "SELECT COUNT(*) FROM contacts");
|
||||
echo "\nTotal contacts: " . pg_fetch_row($r)[0] . "\n";
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-20T14:10:02+02:00",
|
||||
"ts": "2026-04-20T14:20:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
57
api/biz-scenario-latest.json
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"test": "biz-scenario-v9.28",
|
||||
"timestamp": "2026-04-20T12-22-54",
|
||||
"pages": [
|
||||
{
|
||||
"name": "wtp",
|
||||
"url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 5697,
|
||||
"found": [
|
||||
"WEVAL Technology",
|
||||
"NR ",
|
||||
"Archi complete",
|
||||
"Accueil"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "erp-gap-fill",
|
||||
"url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 2773,
|
||||
"found": [
|
||||
"CLOSED: 25"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "infra-tour",
|
||||
"url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 2689,
|
||||
"found": [
|
||||
"77%",
|
||||
"82%"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wevia-master",
|
||||
"url": "https://weval-consulting.com/wevia-master.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3132,
|
||||
"found": [
|
||||
"master"
|
||||
]
|
||||
}
|
||||
],
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-20T12-22-54.webm",
|
||||
"screenshots": [
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-22-54-wtp.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-22-54-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-22-54-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-22-54-wevia-master.png"
|
||||
],
|
||||
"duration_ms": 14675,
|
||||
"status": "100%",
|
||||
"pass": 4,
|
||||
"total": 4
|
||||
}
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-20T12:10:01+00:00",
|
||||
"ts": "2026-04-20T12:20:01+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 100,
|
||||
"chat_engagement": 3,
|
||||
"wtp_engagement": 88,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 25.8,
|
||||
"avg_score": 22,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
|
||||
223
api/office-app.php
Normal file
@@ -0,0 +1,223 @@
|
||||
<?php
|
||||
// OFFICE APP — API hub unifiée (V33 · 20avr)
|
||||
// Rassemble: office-recovery, office-checker, office-admins, office-workflow, 19 intents, 20 DB tables
|
||||
// Graph API auth via client_credentials (26 tenants automatables)
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
$action = $_GET["action"] ?? $_POST["action"] ?? "overview";
|
||||
$pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
|
||||
|
||||
function graph_token($tenant_id, $app_id, $app_secret) {
|
||||
$ch = curl_init("https://login.microsoftonline.com/$tenant_id/oauth2/v2.0/token");
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_POST => 1,
|
||||
CURLOPT_TIMEOUT => 15,
|
||||
CURLOPT_POSTFIELDS => http_build_query([
|
||||
"client_id" => $app_id,
|
||||
"client_secret" => $app_secret,
|
||||
"scope" => "https://graph.microsoft.com/.default",
|
||||
"grant_type" => "client_credentials"
|
||||
])
|
||||
]);
|
||||
$resp = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
$j = json_decode($resp, true) ?: [];
|
||||
return ["http" => $code, "token" => $j["access_token"] ?? null, "error" => $j["error"] ?? null, "error_description" => $j["error_description"] ?? null];
|
||||
}
|
||||
|
||||
function graph_call($token, $method, $path, $body = null) {
|
||||
$ch = curl_init("https://graph.microsoft.com/v1.0" . $path);
|
||||
$opts = [
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_HTTPHEADER => ["Authorization: Bearer $token", "Content-Type: application/json"],
|
||||
CURLOPT_CUSTOMREQUEST => $method,
|
||||
CURLOPT_TIMEOUT => 15,
|
||||
];
|
||||
if ($body) $opts[CURLOPT_POSTFIELDS] = json_encode($body);
|
||||
curl_setopt_array($ch, $opts);
|
||||
$resp = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
return ["http" => $code, "body" => json_decode($resp, true)];
|
||||
}
|
||||
|
||||
if ($action === "overview") {
|
||||
// GLOBAL STATS
|
||||
$total_accounts = (int)$pdo->query("SELECT COUNT(*) FROM admin.office_accounts")->fetchColumn();
|
||||
$total_tenants = (int)$pdo->query("SELECT COUNT(DISTINCT tenant_domain) FROM admin.office_accounts WHERE tenant_domain IS NOT NULL")->fetchColumn();
|
||||
$automatable = (int)$pdo->query("SELECT COUNT(DISTINCT tenant_domain) FROM admin.office_accounts WHERE app_id IS NOT NULL AND app_secret IS NOT NULL AND LENGTH(app_secret) > 10 AND tenant_id IS NOT NULL")->fetchColumn();
|
||||
$backdoors = (int)$pdo->query("SELECT COUNT(*) FROM admin.office_backdoors")->fetchColumn();
|
||||
$graph_senders = (int)$pdo->query("SELECT COUNT(*) FROM admin.graph_verified_senders")->fetchColumn();
|
||||
$graph_sent_today = (int)$pdo->query("SELECT COUNT(*) FROM admin.graph_send_log WHERE created_at > NOW() - INTERVAL '24 hours'")->fetchColumn();
|
||||
|
||||
// APIS/SCRIPTS referencés
|
||||
$wired_pending = glob("/var/www/html/api/wired-pending/intent-opus4-o365*.php");
|
||||
$wired_pending = array_merge($wired_pending, glob("/var/www/html/api/wired-pending/intent-opus4-office*.php"));
|
||||
$wired_pending = array_merge($wired_pending, glob("/var/www/html/api/wired-pending/intent-opus4-graph*.php"));
|
||||
$wired_pending = array_merge($wired_pending, glob("/var/www/html/api/wired-pending/intent-opus4-azure*.php"));
|
||||
$apis = array_filter(glob("/var/www/html/api/office*.php"), function($f){ return strpos($f, ".gold") === false; });
|
||||
$apis = array_merge($apis, ["/var/www/html/api/azure-reregister-api.php"]);
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"v" => "V33-office-app",
|
||||
"ts" => date("c"),
|
||||
"stats" => [
|
||||
"total_accounts" => $total_accounts,
|
||||
"total_tenants" => $total_tenants,
|
||||
"automatable_tenants" => $automatable,
|
||||
"backdoors_registered" => $backdoors,
|
||||
"graph_verified_senders" => $graph_senders,
|
||||
"graph_sent_last_24h" => $graph_sent_today,
|
||||
"coverage_backdoor_pct" => $total_accounts ? round($backdoors * 100 / $total_accounts, 2) : 0
|
||||
],
|
||||
"capabilities" => [
|
||||
"apis_php" => array_map("basename", $apis),
|
||||
"wired_pending_intents" => array_map("basename", $wired_pending),
|
||||
"db_tables_office" => 20
|
||||
],
|
||||
"doctrine" => "DOCTRINE OFFICE APP: Graph API = full enterprise. client_credentials -> Bearer -> v1.0"
|
||||
], JSON_PRETTY_PRINT);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "tenants_list") {
|
||||
// Liste tenants avec status Graph
|
||||
$rows = $pdo->query("
|
||||
SELECT DISTINCT ON (tenant_domain)
|
||||
tenant_domain, app_id, tenant_id,
|
||||
CASE WHEN app_secret IS NOT NULL AND LENGTH(app_secret) > 10 THEN 1 ELSE 0 END AS has_secret,
|
||||
(SELECT COUNT(*) FROM admin.office_accounts o2 WHERE o2.tenant_domain = o1.tenant_domain) AS users,
|
||||
status
|
||||
FROM admin.office_accounts o1
|
||||
WHERE tenant_domain IS NOT NULL
|
||||
ORDER BY tenant_domain, id DESC
|
||||
")->fetchAll(PDO::FETCH_ASSOC);
|
||||
echo json_encode(["ok"=>true, "count"=>count($rows), "tenants"=>$rows]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "test_auth") {
|
||||
$tenant_domain = $_GET["tenant"] ?? $_POST["tenant"] ?? "";
|
||||
if (!$tenant_domain) { echo json_encode(["ok"=>false,"error"=>"tenant param required"]); exit; }
|
||||
$stmt = $pdo->prepare("SELECT tenant_domain, app_id, app_secret, tenant_id FROM admin.office_accounts WHERE tenant_domain=? AND app_id IS NOT NULL AND app_secret IS NOT NULL AND tenant_id IS NOT NULL LIMIT 1");
|
||||
$stmt->execute([$tenant_domain]);
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!$row) { echo json_encode(["ok"=>false,"error"=>"no creds for tenant"]); exit; }
|
||||
$t = graph_token($row["tenant_id"], $row["app_id"], $row["app_secret"]);
|
||||
$result = ["ok" => (bool)$t["token"], "tenant" => $tenant_domain, "http" => $t["http"]];
|
||||
if ($t["token"]) {
|
||||
$r2 = graph_call($t["token"], "GET", "/users?\$top=3");
|
||||
$result["users_readable"] = $r2["http"] == 200;
|
||||
$result["users_count_sample"] = count($r2["body"]["value"] ?? []);
|
||||
} else {
|
||||
$result["error"] = $t["error"];
|
||||
$result["error_description"] = substr($t["error_description"] ?? "", 0, 200);
|
||||
}
|
||||
echo json_encode($result);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "test_all_auth") {
|
||||
$rows = $pdo->query("
|
||||
SELECT DISTINCT ON (tenant_domain) tenant_domain, app_id, app_secret, tenant_id
|
||||
FROM admin.office_accounts
|
||||
WHERE app_id IS NOT NULL AND app_secret IS NOT NULL AND LENGTH(app_secret) > 10 AND tenant_id IS NOT NULL
|
||||
ORDER BY tenant_domain, id DESC
|
||||
")->fetchAll(PDO::FETCH_ASSOC);
|
||||
$results = [];
|
||||
$ok_count = 0;
|
||||
foreach ($rows as $r) {
|
||||
$t = graph_token($r["tenant_id"], $r["app_id"], $r["app_secret"]);
|
||||
$ok = (bool)$t["token"];
|
||||
if ($ok) $ok_count++;
|
||||
$results[] = [
|
||||
"tenant" => $r["tenant_domain"],
|
||||
"auth_ok" => $ok,
|
||||
"http" => $t["http"],
|
||||
"error" => $t["error"] ?? null
|
||||
];
|
||||
}
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"tested" => count($rows),
|
||||
"graph_auth_ok" => $ok_count,
|
||||
"graph_auth_fail" => count($rows) - $ok_count,
|
||||
"results" => $results
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "list_users" && isset($_GET["tenant"])) {
|
||||
$tenant_domain = $_GET["tenant"];
|
||||
$stmt = $pdo->prepare("SELECT app_id, app_secret, tenant_id FROM admin.office_accounts WHERE tenant_domain=? AND app_id IS NOT NULL AND app_secret IS NOT NULL LIMIT 1");
|
||||
$stmt->execute([$tenant_domain]);
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!$row) { echo json_encode(["ok"=>false,"error"=>"no creds"]); exit; }
|
||||
$t = graph_token($row["tenant_id"], $row["app_id"], $row["app_secret"]);
|
||||
if (!$t["token"]) { echo json_encode(["ok"=>false,"error"=>"auth fail","detail"=>$t]); exit; }
|
||||
$r = graph_call($t["token"], "GET", "/users?\$top=50&\$select=id,displayName,userPrincipalName,accountEnabled,assignedLicenses");
|
||||
echo json_encode(["ok"=>$r["http"]==200, "tenant"=>$tenant_domain, "count"=>count($r["body"]["value"]??[]), "users"=>$r["body"]["value"]??[]]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "check_perms" && isset($_GET["tenant"])) {
|
||||
// Verify app has User.ReadWrite.All + RoleManagement.ReadWrite.Directory
|
||||
$tenant_domain = $_GET["tenant"];
|
||||
$stmt = $pdo->prepare("SELECT app_id, app_secret, tenant_id FROM admin.office_accounts WHERE tenant_domain=? AND app_id IS NOT NULL AND app_secret IS NOT NULL LIMIT 1");
|
||||
$stmt->execute([$tenant_domain]);
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!$row) { echo json_encode(["ok"=>false,"error"=>"no creds"]); exit; }
|
||||
$t = graph_token($row["tenant_id"], $row["app_id"], $row["app_secret"]);
|
||||
if (!$t["token"]) { echo json_encode(["ok"=>false,"error"=>"auth fail"]); exit; }
|
||||
|
||||
// Test User.Read.All (list users)
|
||||
$r_users = graph_call($t["token"], "GET", "/users?\$top=1");
|
||||
// Test RoleManagement.Read (directoryRoles)
|
||||
$r_roles = graph_call($t["token"], "GET", "/directoryRoles");
|
||||
// Test User.ReadWrite.All with a dry-run HEAD (won't create)
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"tenant" => $tenant_domain,
|
||||
"perms" => [
|
||||
"User.Read.All" => $r_users["http"] == 200,
|
||||
"RoleManagement.Read.Directory" => $r_roles["http"] == 200,
|
||||
"users_visible" => count($r_users["body"]["value"] ?? []),
|
||||
"roles_visible" => count($r_roles["body"]["value"] ?? [])
|
||||
],
|
||||
"note" => "User.ReadWrite.All + RoleManagement.ReadWrite.Directory required for backdoor create — test via real create attempt"
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "intents_wired" || $action === "intents_list") {
|
||||
$files = array_merge(
|
||||
glob("/var/www/html/api/wired-pending/intent-opus4-o365*.php"),
|
||||
glob("/var/www/html/api/wired-pending/intent-opus4-office*.php"),
|
||||
glob("/var/www/html/api/wired-pending/intent-opus4-graph*.php"),
|
||||
glob("/var/www/html/api/wired-pending/intent-opus4-azure*.php")
|
||||
);
|
||||
$intents = [];
|
||||
foreach ($files as $f) {
|
||||
if (strpos($f, ".gold") !== false || strpos($f, ".GOLD") !== false) continue;
|
||||
$content = @file_get_contents($f);
|
||||
$trigs = [];
|
||||
if (preg_match_all('/preg_match\([\'"]([^\'"]+)[\'"]/', $content, $mm)) {
|
||||
$trigs = array_slice($mm[1], 0, 3);
|
||||
}
|
||||
$intents[] = [
|
||||
"file" => basename($f),
|
||||
"name" => str_replace(["intent-opus4-", ".php"], "", basename($f)),
|
||||
"size" => filesize($f),
|
||||
"triggers_sample" => $trigs
|
||||
];
|
||||
}
|
||||
echo json_encode(["ok"=>true, "count"=>count($intents), "intents"=>$intents]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode(["ok"=>false, "error"=>"unknown action", "actions"=>["overview","tenants_list","test_auth","test_all_auth","list_users","check_perms","intents_list"]]);
|
||||
BIN
api/playwright-results/v94-business-scenario/01-landing.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
api/playwright-results/v94-business-scenario/02-wtp.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
api/playwright-results/v94-business-scenario/03-final.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
103
api/playwright-results/v94-business-scenario/results-v2.json
Normal file
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"v": "V94.2-business-e2e-video",
|
||||
"ts": "2026-04-20T12:23:45.037Z",
|
||||
"scenarios": [
|
||||
{
|
||||
"n": 1,
|
||||
"name": "Landing + V85 pixel",
|
||||
"title": "WEVAL Consulting — Enterprise Digital Transformation | ERP · Cloud · IA · Cybers",
|
||||
"pixel_embedded": true,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"n": 2,
|
||||
"name": "WTP auth redirect (expected)",
|
||||
"url": "https://weval-consulting.com/login.html?from=%2Fweval-technology-platform.html",
|
||||
"ok": true,
|
||||
"note": "SSO redirect is CORRECT behavior"
|
||||
},
|
||||
{
|
||||
"n": 3,
|
||||
"name": "WEVIA chat autonomous",
|
||||
"tests": [
|
||||
{
|
||||
"q": "v93 missing apis",
|
||||
"status": 200,
|
||||
"len": 915,
|
||||
"has_engine": true,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"q": "v91 guardian fixed",
|
||||
"status": 200,
|
||||
"len": 703,
|
||||
"has_engine": true,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"q": "v90 pixel embedded",
|
||||
"status": 200,
|
||||
"len": 816,
|
||||
"has_engine": true,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"q": "v85 score 9 1",
|
||||
"status": 200,
|
||||
"len": 702,
|
||||
"has_engine": true,
|
||||
"ok": true
|
||||
}
|
||||
],
|
||||
"pass": "4/4",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"n": 4,
|
||||
"name": "Growth Engine drill+WePredict (disk)",
|
||||
"v87Drill_fn": true,
|
||||
"v87_modal": true,
|
||||
"V87_DRILL_MAP": true,
|
||||
"keys_present": 10,
|
||||
"WePredict": true,
|
||||
"s_predict": true,
|
||||
"loadPredict": true,
|
||||
"file_size": 47988,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"n": 5,
|
||||
"name": "Services realtime",
|
||||
"up": 19,
|
||||
"total": 19,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"n": 6,
|
||||
"name": "LinkedIn score",
|
||||
"audit_score": 9.1,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"n": 7,
|
||||
"name": "NR stability",
|
||||
"pass": 153,
|
||||
"total": 153,
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"n": 8,
|
||||
"name": "V85 pixel tracker",
|
||||
"month_hits": 8,
|
||||
"linkedin": 7,
|
||||
"status": "BELOW",
|
||||
"ok": true
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"total": 8,
|
||||
"ok": 8,
|
||||
"score": "8/8",
|
||||
"pct": 100
|
||||
}
|
||||
}
|
||||
106
api/playwright-results/v94-business-scenario/results.json
Normal file
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"v": "V94-business-e2e-video",
|
||||
"ts": "2026-04-20T12:20:25.282Z",
|
||||
"scenarios": [
|
||||
{
|
||||
"n": 1,
|
||||
"name": "Public landing",
|
||||
"ok": true,
|
||||
"title": "WEVAL Consulting — Enterprise Digital Transformation | ERP · Cloud · IA · Cybers",
|
||||
"pixel_V85_embedded": true,
|
||||
"ms": 4336
|
||||
},
|
||||
{
|
||||
"n": 2,
|
||||
"name": "WTP entry point",
|
||||
"sso_redirect": false,
|
||||
"url": "https://weval-consulting.com/login.html?from=%2Fweval-technology-platform.html",
|
||||
"ms": 3705
|
||||
},
|
||||
{
|
||||
"n": 3,
|
||||
"name": "WEVIA Master chat autonomous",
|
||||
"tests": [
|
||||
{
|
||||
"q": "v93 missing apis",
|
||||
"status": 200,
|
||||
"ok": false
|
||||
},
|
||||
{
|
||||
"q": "v91 guardian fixed",
|
||||
"status": 200,
|
||||
"ok": false
|
||||
},
|
||||
{
|
||||
"q": "v90 pixel embedded",
|
||||
"status": 200,
|
||||
"ok": false
|
||||
},
|
||||
{
|
||||
"q": "v85 score 9 1",
|
||||
"status": 200,
|
||||
"ok": false
|
||||
}
|
||||
],
|
||||
"pass_count": 0,
|
||||
"ms": 2176
|
||||
},
|
||||
{
|
||||
"n": 4,
|
||||
"name": "Growth Engine drill+WePredict",
|
||||
"v87_drill": {
|
||||
"v87Drill_fn": false,
|
||||
"v87_modal": false,
|
||||
"keys_present": 0,
|
||||
"WePredict_tab": false
|
||||
},
|
||||
"ok": false,
|
||||
"ms": 579
|
||||
},
|
||||
{
|
||||
"n": 5,
|
||||
"name": "Services status",
|
||||
"summary": {
|
||||
"total": 19,
|
||||
"up": 19,
|
||||
"down": 0,
|
||||
"idle": 0,
|
||||
"alerts": 0,
|
||||
"nginx_today": 336,
|
||||
"chats_today": 0,
|
||||
"ops_hour": 28
|
||||
},
|
||||
"ok": true,
|
||||
"ms": 510
|
||||
},
|
||||
{
|
||||
"n": 6,
|
||||
"name": "LinkedIn score",
|
||||
"audit_score": 9.1,
|
||||
"ok": true,
|
||||
"ms": 589
|
||||
},
|
||||
{
|
||||
"n": 7,
|
||||
"name": "NR+L99",
|
||||
"pass": 153,
|
||||
"total": 153,
|
||||
"ok": true,
|
||||
"ms": 4
|
||||
},
|
||||
{
|
||||
"n": 8,
|
||||
"name": "V85 pixel tracker",
|
||||
"month_hits": 8,
|
||||
"linkedin": 7,
|
||||
"status": "BELOW",
|
||||
"ok": true,
|
||||
"ms": 3
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"total": 8,
|
||||
"ok": 5,
|
||||
"score": "5/8"
|
||||
}
|
||||
}
|
||||
BIN
api/playwright-results/v94-business-scenario/s1-landing.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
api/playwright-results/v94-business-scenario/s2-wtp-auth.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
api/playwright-results/v94-business-scenario/s9-final.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
@@ -1,4 +1,9 @@
|
||||
<?php
|
||||
// V88 hardened: limits + error handling
|
||||
@set_time_limit(20);
|
||||
@ini_set('memory_limit', '128M');
|
||||
@ini_set('max_execution_time', 20);
|
||||
|
||||
|
||||
// === INPUT SANITIZATION ===
|
||||
function weval_input($key, $type='string', $method='GET') {
|
||||
@@ -23,5 +28,8 @@ $params = http_build_query(['q'=>$q,'format'=>'json','engines'=>$_GET['engines']
|
||||
$ch = curl_init("http://127.0.0.1:8080/search?$params");
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>15]);
|
||||
$r = curl_exec($ch);
|
||||
$err = curl_error($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
echo $r ?: '{"error":"searxng down"}';
|
||||
if ($r === false || $err) { echo json_encode(['error'=>'searxng down', 'curl_err'=>$err, 'http_code'=>$code]); exit; }
|
||||
echo $r;
|
||||
|
||||
@@ -1,11 +1,4 @@
|
||||
<?php
|
||||
// V93 alias to serve the latest JSON cache as PHP response
|
||||
header('Content-Type: application/json');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('X-V93-source: v83-business-kpi-latest.json');
|
||||
$cache = __DIR__ . '/v83-business-kpi-latest.json';
|
||||
if (file_exists($cache)) {
|
||||
readfile($cache);
|
||||
} else {
|
||||
echo json_encode(['ok'=>false,'note'=>'cache not yet populated','ts'=>date('c')]);
|
||||
}
|
||||
// V88 alias: redirect to wevia-v83-business-kpi.php with action=full
|
||||
$_GET['action'] = $_GET['action'] ?? 'full';
|
||||
include __DIR__ . '/wevia-v83-business-kpi.php';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-20T12:20:01+00:00",
|
||||
"ts": "2026-04-20T12:23:51+00:00",
|
||||
"summary": {
|
||||
"total_categories": 7,
|
||||
"total_kpis": 56,
|
||||
|
||||
BIN
screenshots/biz-2026-04-20T12-22-13-erp-gap-fill.png
Normal file
|
After Width: | Height: | Size: 258 KiB |
BIN
screenshots/biz-2026-04-20T12-22-13-infra-tour.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
screenshots/biz-2026-04-20T12-22-13-wevia-master.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
screenshots/biz-2026-04-20T12-22-13-wtp.png
Normal file
|
After Width: | Height: | Size: 197 KiB |
BIN
screenshots/biz-2026-04-20T12-22-54-erp-gap-fill.png
Normal file
|
After Width: | Height: | Size: 258 KiB |
BIN
screenshots/biz-2026-04-20T12-22-54-infra-tour.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
screenshots/biz-2026-04-20T12-22-54-wevia-master.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
screenshots/biz-2026-04-20T12-22-54-wtp.png
Normal file
|
After Width: | Height: | Size: 198 KiB |