auto-sync-2245

This commit is contained in:
opus
2026-04-21 22:45:03 +02:00
parent b1d25f329d
commit 99b9df00c0
45 changed files with 673 additions and 151 deletions

View File

@@ -1,6 +1,6 @@
{
"agent": "V45_Leads_Sync",
"ts": "2026-04-21T22:30:03+02:00",
"ts": "2026-04-21T22:40:02+02:00",
"paperclip_total": 48,
"active_customer": 4,
"warm_prospect": 5,

73
api/ambre-pw-debug.php Normal file
View File

@@ -0,0 +1,73 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests";
$spec = <<<'JS'
const { test, expect } = require("@playwright/test");
test("debug router click flow", async ({ page }) => {
test.setTimeout(120000);
// Capture console logs
const logs = [];
page.on("console", msg => {
logs.push(`[${msg.type()}] ${msg.text().substring(0, 300)}`);
});
// Inject diagnostic script
await page.addInitScript(() => {
window.__ambre_fetch_calls = [];
const origFetch = window.fetch;
window.fetch = function(...args) {
window.__ambre_fetch_calls.push({url: args[0], body: args[1] && args[1].body ? args[1].body.toString().substring(0, 200) : null});
return origFetch.apply(this, args);
};
});
await page.goto("/wevia.html");
await page.waitForLoadState("networkidle");
await page.waitForTimeout(1500);
// Send PDF
const input = page.locator("#msgInput");
await input.fill("Genere un PDF sur: test debug");
await input.press("Enter");
await page.waitForTimeout(8000);
// Dump state
const state = await page.evaluate(() => ({
busy: typeof busy !== "undefined" ? busy : "undefined",
pendingFile: typeof pendingFile !== "undefined" ? pendingFile : "undefined",
fetch_calls: window.__ambre_fetch_calls || [],
msg_input_disabled: document.getElementById("msgInput").disabled,
msg_input_value: document.getElementById("msgInput").value,
assistant_count: document.querySelectorAll(".msg.assistant").length,
user_count: document.querySelectorAll(".msg.user").length,
has_router: !!window._ambre_gen_pat,
}));
console.log("=== STATE AFTER PDF SEND ===");
console.log(JSON.stringify(state, null, 2));
// Now try 2nd message
await input.fill("Genere un document Word sur: test2");
await input.press("Enter");
await page.waitForTimeout(8000);
const state2 = await page.evaluate(() => ({
busy: typeof busy !== "undefined" ? busy : "undefined",
fetch_calls_count: (window.__ambre_fetch_calls || []).length,
last_fetch: (window.__ambre_fetch_calls || []).slice(-3),
assistant_count: document.querySelectorAll(".msg.assistant").length,
user_count: document.querySelectorAll(".msg.user").length,
}));
console.log("=== STATE AFTER WORD SEND ===");
console.log(JSON.stringify(state2, null, 2));
// Write logs to file
require("fs").writeFileSync("output/debug-console.log", logs.join("\n"));
});
JS;
file_put_contents("$base/tests/debug-flow.spec.js", $spec);
// Remove v5 to not rerun
@unlink("$base/tests/chat-capabilities-v5.spec.js");
echo json_encode(["ok"=>true, "size"=>filesize("$base/tests/debug-flow.spec.js")]);

13
api/ambre-pw-listnow.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests/output";
$out = ["pngs"=>[], "videos"=>[]];
foreach (glob("$base/v*.png") as $p) {
$out["pngs"][] = ["name"=>basename($p), "kb"=>round(filesize($p)/1024,1), "mtime"=>gmdate("H:i:s", filemtime($p))];
}
usort($out["pngs"], function($a,$b){return strcmp($a["name"], $b["name"]);});
foreach (glob("$base/chat-capabilities-v*/*.webm") as $w) {
$out["videos"][] = ["name"=>basename(dirname($w)), "mb"=>round(filesize($w)/1048576,2), "mtime"=>gmdate("H:i:s", filemtime($w))];
}
echo json_encode($out, JSON_PRETTY_PRINT);

View File

@@ -59,18 +59,18 @@
},
"suites": [
{
"title": "chat-capabilities-v5.spec.js",
"file": "chat-capabilities-v5.spec.js",
"title": "capabilities-v6.spec.js",
"file": "capabilities-v6.spec.js",
"column": 0,
"line": 0,
"specs": [
{
"title": "8 capabilities v5 video busy-reset fix",
"title": "V6 8 capabilities · needle counting fix · full video",
"ok": true,
"tags": [],
"tests": [
{
"timeout": 480000,
"timeout": 600000,
"annotations": [],
"expectedStatus": "passed",
"projectId": "chromium",
@@ -80,126 +80,129 @@
"workerIndex": 0,
"parallelIndex": 0,
"status": "passed",
"duration": 345295,
"duration": 161648,
"errors": [],
"stdout": [
{
"text": "📸 Initial 1920x1080\n"
"text": "[browser error] Failed to load resource: the server responded with a status of 503 ()\n"
},
{
"text": "📸 Initial captured\n"
},
{
"text": "\n[01/8] PDF: Genere un PDF sur: WEVIA enterprise demo\n"
},
{
"text": " 📤 Sent (msg count before: 1)\n"
"text": " 📤 Sent (needle \".pdf\" count before: 0)\n"
},
{
"text": " ✅ \".pdf\" found after 1.0s (msg added: true)\n"
"text": " ✅ needle count increased in 1.5s\n"
},
{
"text": " 📸 v4-01-PDF.png\n"
"text": " 📸 v6-01-PDF.png\n"
},
{
"text": "\n[02/8] Word: Genere un document Word sur: strategie pharma\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \".docx\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.3s · msg added: false\n"
"text": " needle count increased in 1.5s\n"
},
{
"text": " 📸 v4-02-Word.png\n"
"text": " 📸 v6-02-Word.png\n"
},
{
"text": "\n[03/8] PPT: Genere une presentation sur: pitch investor\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \".pptx\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.7s · msg added: false\n"
"text": " ⚠️ no new needle after 51.2s\n"
},
{
"text": " 📸 v4-03-PPT.png\n"
"text": " 📸 v6-03-PPT.png\n"
},
{
"text": "\n[04/8] Mermaid: Genere un schema mermaid pour: workflow vente\n"
"text": "\n[04/8] Mermaid: Genere un schema mermaid pour: workflow ventes\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \"graph TD\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.3s · msg added: false\n"
"text": " needle count increased in 1.5s\n"
},
{
"text": " 📸 v4-04-Mermaid.png\n"
"text": " 📸 v6-04-Mermaid.png\n"
},
{
"text": "\n[05/8] Image: Genere une image: paysage montagne\n"
"text": "\n[05/8] Image: Genere une image: paysage montagne coucher soleil\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \".svg\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.3s · msg added: false\n"
"text": " needle count increased in 1.5s\n"
},
{
"text": " 📸 v4-05-Image.png\n"
"text": " 📸 v6-05-Image.png\n"
},
{
"text": "\n[06/8] Code: Ecris le code python pour: fibonacci\n"
"text": "\n[06/8] Code: Ecris le code python pour: fibonacci recursif\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \"wevia-code\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.3s · msg added: false\n"
"text": " needle count increased in 1.5s\n"
},
{
"text": " 📸 v4-06-Code.png\n"
"text": " 📸 v6-06-Code.png\n"
},
{
"text": "\n[07/8] Traduire: Traduis en anglais: bonjour merci\n"
"text": "\n[07/8] Traduire: Traduis en anglais: bonjour comment allez-vous aujourdhui\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \"English\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.3s · msg added: false\n"
"text": " needle count increased in 1.5s\n"
},
{
"text": " 📸 v4-07-Traduire.png\n"
"text": " 📸 v6-07-Traduire.png\n"
},
{
"text": "\n[08/8] Ping: ping\n"
},
{
"text": " 📤 Sent (msg count before: 3)\n"
"text": " 📤 Sent (needle \"WEVIA Engine\" count before: 0)\n"
},
{
"text": " ⚠️ needle not found · 45.3s · msg added: false\n"
"text": " ⚠️ no new needle after 51.2s\n"
},
{
"text": " 📸 v4-08-Ping.png\n"
"text": " 📸 v6-08-Ping.png\n"
},
{
"text": "\n✅ Test V5 8/8 terminé\n"
"text": "\n✅ V6 terminé\n"
}
],
"stderr": [],
"retry": 0,
"startTime": "2026-04-21T15:03:46.490Z",
"startTime": "2026-04-21T20:41:53.807Z",
"annotations": [],
"attachments": [
{
"name": "screenshot",
"contentType": "image/png",
"path": "/var/www/html/api/ambre-pw-tests/output/chat-capabilities-v5-8-capabilities-v5-video-busy-reset-fix-chromium/test-finished-1.png"
"path": "/var/www/html/api/ambre-pw-tests/output/capabilities-v6-V6-8-capab-14f79-e-counting-fix-·-full-video-chromium/test-finished-1.png"
},
{
"name": "video",
"contentType": "video/webm",
"path": "/var/www/html/api/ambre-pw-tests/output/chat-capabilities-v5-8-capabilities-v5-video-busy-reset-fix-chromium/video.webm"
"path": "/var/www/html/api/ambre-pw-tests/output/capabilities-v6-V6-8-capab-14f79-e-counting-fix-·-full-video-chromium/video.webm"
}
]
}
@@ -207,8 +210,8 @@
"status": "expected"
}
],
"id": "e508adfe2580c28d647f-db65c541cf60951a0987",
"file": "chat-capabilities-v5.spec.js",
"id": "5dbfa29514469ea8b6b5-e26adbe5fa0a4190d8ce",
"file": "capabilities-v6.spec.js",
"line": 14,
"column": 1
}
@@ -217,8 +220,8 @@
],
"errors": [],
"stats": {
"startTime": "2026-04-21T15:03:45.817Z",
"duration": 346176.3,
"startTime": "2026-04-21T20:41:53.178Z",
"duration": 162438.782,
"expected": 1,
"skipped": 0,
"unexpected": 0,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@@ -0,0 +1,89 @@
const { test, expect } = require("@playwright/test");
const CAPABILITIES = [
{ name: "PDF", msg: "Genere un PDF sur: WEVIA enterprise demo", needle: ".pdf" },
{ name: "Word", msg: "Genere un document Word sur: strategie pharma", needle: ".docx" },
{ name: "PPT", msg: "Genere une presentation sur: pitch investor", needle: ".pptx" },
{ name: "Mermaid", msg: "Genere un schema mermaid pour: workflow ventes", needle: "graph TD" },
{ name: "Image", msg: "Genere une image: paysage montagne coucher soleil", needle: ".svg" },
{ name: "Code", msg: "Ecris le code python pour: fibonacci recursif", needle: "wevia-code" },
{ name: "Traduire", msg: "Traduis en anglais: bonjour comment allez-vous aujourdhui", needle: "English" },
{ name: "Ping", msg: "ping", needle: "WEVIA Engine" },
];
test("V6 8 capabilities · needle counting fix · full video", async ({ page }) => {
test.setTimeout(600000);
// Capture console for debugging
page.on("console", msg => {
if (msg.type() === "error" || msg.text().includes("Ambre")) {
console.log(`[browser ${msg.type()}]`, msg.text().substring(0, 200));
}
});
await page.goto("/wevia.html");
await page.waitForLoadState("networkidle");
await page.waitForTimeout(2000);
await page.screenshot({ path: "output/v6-00-initial.png", fullPage: false });
console.log("📸 Initial captured");
for (let i = 0; i < CAPABILITIES.length; i++) {
const cap = CAPABILITIES[i];
const num = String(i + 1).padStart(2, "0");
console.log(`\n[${num}/8] ${cap.name}: ${cap.msg}`);
try {
// Count needle occurrences BEFORE sending
const beforeNeedleCount = await page.evaluate((n) =>
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
, cap.needle);
// Fill + Enter
const input = page.locator("#msgInput");
await input.click({ force: true });
await input.fill(cap.msg);
await page.waitForTimeout(400);
await input.press("Enter");
console.log(` 📤 Sent (needle "${cap.needle}" count before: ${beforeNeedleCount})`);
// Wait for needle count to INCREASE
const waitStart = Date.now();
let found = false;
while (Date.now() - waitStart < 50000) {
const afterCount = await page.evaluate((n) =>
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
, cap.needle);
if (afterCount > beforeNeedleCount) {
found = true;
break;
}
await page.waitForTimeout(1500);
}
const elapsed = ((Date.now() - waitStart) / 1000).toFixed(1);
console.log(found ? ` ✅ needle count increased in ${elapsed}s` : ` ⚠️ no new needle after ${elapsed}s`);
// Scroll to bottom to show latest
await page.evaluate(() => {
const msgs = document.getElementById("messages");
if (msgs) msgs.scrollTop = msgs.scrollHeight;
window.scrollTo(0, document.body.scrollHeight);
});
await page.waitForTimeout(2500);
// Screenshot (viewport only, pour voir la bulle récente)
await page.screenshot({ path: `output/v6-${num}-${cap.name}.png`, fullPage: false });
console.log(` 📸 v6-${num}-${cap.name}.png`);
// Wait between tests for chat to settle
await page.waitForTimeout(2000);
} catch (e) {
console.log(` ❌ Error: ${e.message.substring(0, 120)}`);
}
}
// Final full page
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
await page.waitForTimeout(2000);
await page.screenshot({ path: "output/v6-99-final.png", fullPage: true });
console.log("\n✅ V6 terminé");
});

View File

@@ -1,97 +0,0 @@
const { test, expect } = require("@playwright/test");
const CAPABILITIES = [
{ name: "PDF", msg: "Genere un PDF sur: WEVIA enterprise demo", needle: ".pdf" },
{ name: "Word", msg: "Genere un document Word sur: strategie pharma", needle: ".docx" },
{ name: "PPT", msg: "Genere une presentation sur: pitch investor", needle: ".pptx" },
{ name: "Mermaid", msg: "Genere un schema mermaid pour: workflow vente", needle: "graph TD" },
{ name: "Image", msg: "Genere une image: paysage montagne", needle: ".svg" },
{ name: "Code", msg: "Ecris le code python pour: fibonacci", needle: ".py" },
{ name: "Traduire", msg: "Traduis en anglais: bonjour merci", needle: "English:" },
{ name: "Ping", msg: "ping", needle: "WEVIA Engine" },
];
test("8 capabilities v5 video busy-reset fix", async ({ page }) => {
test.setTimeout(480000);
await page.goto("/wevia.html");
await page.waitForLoadState("networkidle");
await page.waitForTimeout(2000);
await page.screenshot({ path: "output/v4-00-initial.png", fullPage: false });
console.log("📸 Initial 1920x1080");
for (let i = 0; i < CAPABILITIES.length; i++) {
const cap = CAPABILITIES[i];
const num = String(i + 1).padStart(2, "0");
console.log(`\n[${num}/8] ${cap.name}: ${cap.msg}`);
try {
// Count assistant messages BEFORE sending
const beforeCount = await page.evaluate(() =>
document.querySelectorAll(".msg.assistant").length
);
// Focus input aggressively, clear, fill
const input = page.locator("#msgInput");
await input.click({ force: true, timeout: 5000 });
await page.keyboard.press("Control+A");
await page.keyboard.press("Delete");
await page.waitForTimeout(200);
await input.fill(cap.msg);
await page.waitForTimeout(300);
// Click send button (more reliable than Enter)
const sendBtn = await page.locator(".send-btn, #sendBtn, button[onclick*=send], button.send").first();
try {
await sendBtn.click({ force: true, timeout: 3000 });
} catch (e) {
// fallback Enter
await input.press("Enter");
}
console.log(` 📤 Sent (msg count before: ${beforeCount})`);
// Wait for NEW assistant message to appear + contain needle
const waitStart = Date.now();
let found = false;
let msgAdded = false;
while (Date.now() - waitStart < 45000) {
const afterCount = await page.evaluate(() =>
document.querySelectorAll(".msg.assistant").length
);
if (afterCount > beforeCount) {
msgAdded = true;
const bodyText = await page.evaluate(() => document.body.innerText);
if (bodyText.includes(cap.needle)) {
found = true;
break;
}
}
await page.waitForTimeout(1000);
}
const elapsed = ((Date.now() - waitStart) / 1000).toFixed(1);
if (found) console.log(` ✅ "${cap.needle}" found after ${elapsed}s (msg added: ${msgAdded})`);
else console.log(` ⚠️ needle not found · ${elapsed}s · msg added: ${msgAdded}`);
// Scroll to bottom
await page.evaluate(() => {
const msgs = document.getElementById("messages");
if (msgs) msgs.scrollTop = msgs.scrollHeight;
window.scrollTo(0, document.body.scrollHeight);
});
await page.waitForTimeout(1500);
// Full page screenshot
await page.screenshot({ path: `output/v4-${num}-${cap.name}.png`, fullPage: true });
console.log(` 📸 v4-${num}-${cap.name}.png`);
} catch (e) {
console.log(`${e.message.substring(0, 100)}`);
}
}
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
await page.waitForTimeout(2000);
await page.screenshot({ path: "output/v4-99-final.png", fullPage: true });
console.log("\n✅ Test V5 8/8 terminé");
});

100
api/ambre-pw-v6.php Normal file
View File

@@ -0,0 +1,100 @@
<?php
header("Content-Type: application/json");
$base = "/var/www/html/api/ambre-pw-tests";
// V6 — fixed message counting by using the innerText search for the specific needle that only appears AFTER the new response
$spec = <<<'JS'
const { test, expect } = require("@playwright/test");
const CAPABILITIES = [
{ name: "PDF", msg: "Genere un PDF sur: WEVIA enterprise demo", needle: ".pdf" },
{ name: "Word", msg: "Genere un document Word sur: strategie pharma", needle: ".docx" },
{ name: "PPT", msg: "Genere une presentation sur: pitch investor", needle: ".pptx" },
{ name: "Mermaid", msg: "Genere un schema mermaid pour: workflow ventes", needle: "graph TD" },
{ name: "Image", msg: "Genere une image: paysage montagne coucher soleil", needle: ".svg" },
{ name: "Code", msg: "Ecris le code python pour: fibonacci recursif", needle: "wevia-code" },
{ name: "Traduire", msg: "Traduis en anglais: bonjour comment allez-vous aujourdhui", needle: "English" },
{ name: "Ping", msg: "ping", needle: "WEVIA Engine" },
];
test("V6 8 capabilities · needle counting fix · full video", async ({ page }) => {
test.setTimeout(600000);
// Capture console for debugging
page.on("console", msg => {
if (msg.type() === "error" || msg.text().includes("Ambre")) {
console.log(`[browser ${msg.type()}]`, msg.text().substring(0, 200));
}
});
await page.goto("/wevia.html");
await page.waitForLoadState("networkidle");
await page.waitForTimeout(2000);
await page.screenshot({ path: "output/v6-00-initial.png", fullPage: false });
console.log("📸 Initial captured");
for (let i = 0; i < CAPABILITIES.length; i++) {
const cap = CAPABILITIES[i];
const num = String(i + 1).padStart(2, "0");
console.log(`\n[${num}/8] ${cap.name}: ${cap.msg}`);
try {
// Count needle occurrences BEFORE sending
const beforeNeedleCount = await page.evaluate((n) =>
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
, cap.needle);
// Fill + Enter
const input = page.locator("#msgInput");
await input.click({ force: true });
await input.fill(cap.msg);
await page.waitForTimeout(400);
await input.press("Enter");
console.log(` 📤 Sent (needle "${cap.needle}" count before: ${beforeNeedleCount})`);
// Wait for needle count to INCREASE
const waitStart = Date.now();
let found = false;
while (Date.now() - waitStart < 50000) {
const afterCount = await page.evaluate((n) =>
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
, cap.needle);
if (afterCount > beforeNeedleCount) {
found = true;
break;
}
await page.waitForTimeout(1500);
}
const elapsed = ((Date.now() - waitStart) / 1000).toFixed(1);
console.log(found ? ` ✅ needle count increased in ${elapsed}s` : ` ⚠️ no new needle after ${elapsed}s`);
// Scroll to bottom to show latest
await page.evaluate(() => {
const msgs = document.getElementById("messages");
if (msgs) msgs.scrollTop = msgs.scrollHeight;
window.scrollTo(0, document.body.scrollHeight);
});
await page.waitForTimeout(2500);
// Screenshot (viewport only, pour voir la bulle récente)
await page.screenshot({ path: `output/v6-${num}-${cap.name}.png`, fullPage: false });
console.log(` 📸 v6-${num}-${cap.name}.png`);
// Wait between tests for chat to settle
await page.waitForTimeout(2000);
} catch (e) {
console.log(` ❌ Error: ${e.message.substring(0, 120)}`);
}
}
// Final full page
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
await page.waitForTimeout(2000);
await page.screenshot({ path: "output/v6-99-final.png", fullPage: true });
console.log("\n✅ V6 terminé");
});
JS;
file_put_contents("$base/tests/capabilities-v6.spec.js", $spec);
@unlink("$base/tests/debug-flow.spec.js");
echo json_encode(["ok"=>true, "size"=>filesize("$base/tests/capabilities-v6.spec.js")]);

View File

@@ -1,8 +1,8 @@
{
"status": "ALIVE",
"ts": "2026-04-21T22:30:01.502811",
"last_heartbeat": "2026-04-21T22:30:01.502811",
"last_heartbeat_ts_epoch": 1776803401,
"ts": "2026-04-21T22:45:02.197332",
"last_heartbeat": "2026-04-21T22:45:02.197332",
"last_heartbeat_ts_epoch": 1776804302,
"tasks_today": 232,
"tasks_week": 574,
"agent_id": "blade-ops",

View File

@@ -1,27 +1,27 @@
{
"ok": true,
"agent": "V42_MQL_Scoring_Agent_REAL",
"ts": "2026-04-21T20:30:01+00:00",
"ts": "2026-04-21T20:40:01+00:00",
"status": "DEPLOYED_AUTO",
"deployed": true,
"algorithm": "weighted_behavioral_signals",
"signals_tracked": {
"wtp_engagement": 6,
"wtp_engagement": 48,
"chat_engagement": 0,
"roi_tool": 0,
"email_opened": 0
},
"avg_score": 1.5,
"avg_score": 12,
"mql_threshold": 50,
"sql_threshold": 75,
"leads_captured": 48,
"mql_auto_scored": 17,
"mql_auto_scored": 18,
"sql_auto_scored": 7,
"mql_auto_pct": 35,
"mql_auto_pct": 38,
"improvement_vs_manual": {
"before_manual_pct": 33.3,
"after_auto_pct": 35,
"delta": 1.7000000000000028
"after_auto_pct": 38,
"delta": 4.700000000000003
},
"paperclip_db_ok": true,
"paperclip_tables": 1,

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-21T20:39:59+00:00",
"ts": "2026-04-21T20:44:12+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,

View File

@@ -0,0 +1,43 @@
# WEVIA enterprise demo
# WEVIA Enterprise Demo
=====================================
## Présentation
---------------
WEVIA est une plateforme de communication et de collaboration en entreprise qui permet aux équipes de travailler ensemble de manière efficace et sécurisée. Cette démo vous présentera les fonctionnalités clés de WEVIA Enterprise.
## Fonctionnalités Principales
-----------------------------
### Communication
* **Messagerie instantanée** : discutez en temps réel avec vos collègues
* **Appels audio et vidéo** : communiquez de manière visuelle et auditive
* **Partage de fichiers** : partagez des documents et des ressources en toute sécurité
### Collaboration
* **Gestion de projet** : suivez et gérez vos projets de manière efficace
* **Tâches et échéances** : attribuez et suivez les tâches et les échéances
* **Commentaires et discussions** : discutez et commentez vos projets
### Sécurité
--------------
* **Authentification et autorisation** : contrôlez l'accès à vos ressources
* **Chiffrement des données** : protégez vos données sensibles
* **Règles de partage** : contrôlez qui peut accéder à vos ressources
## Avantages
------------
* **Amélioration de la productivité** : travaillez de manière plus efficace et plus rapide
* **Meilleure collaboration** : travaillez ensemble de manière plus efficace
* **Sécurité renforcée** : protégez vos données et vos ressources
## Conclusion
--------------
WEVIA Enterprise est une plateforme de communication et de collaboration en entreprise qui offre une gamme de fonctionnalités pour améliorer la productivité, la collaboration et la sécurité. Contactez-nous pour en savoir plus sur WEVIA Enterprise et comment l'intégrer dans votre entreprise.

View File

@@ -0,0 +1,28 @@
def fibonacci(n):
if n <= 0:
return "Entrée invalid"
elif n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
Cependant, ce code a un problème de complexité exponentielle en raison du nombre de fois il appelle lui-même. Pour résoudre ce problème, vous pouvez utiliser une approche itérative ou une mémoire pour stocker les résultats des appels précédents.
Voici une version améliorée utilisant une mémoire :
def fibonacci(n, memo = {}):
if n <= 0:
return "Entrée invalid"
elif n == 1:
return 0
elif n == 2:
return 1
elif n in memo:
return memo[n]
else:
memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
return memo[n]
Cette version utilise un dictionnaire `memo` pour stocker les résultats des appels précédents. Elle vérifie si le résultat est déjà calculé avant de le recalculer, ce qui réduit considérablement la complexité.

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
<g id="paysage">
<rect id="ciel" x="0" y="0" width="400" height="100" rx="10" fill="#87CEEB"/>
<rect id="montagne" x="150" y="150" width="200" height="150" rx="20" fill="#964B00"/>
<rect id="montagne2" x="50" y="150" width="100" height="150" rx="20" fill="#964B00"/>
<rect id="montagne3" x="250" y="150" width="150" height="150" rx="20" fill="#964B00"/>
<ellipse id="soleil" cx="200" cy="50" rx="50" ry="50" fill="#FFD700"/>
<path id="nuages" d="M 100 50 L 150 70 L 200 50 L 250 70 L 300 50 Z" fill="#FFFFFF"/>
<path id="arbre" d="M 100 200 L 120 220 L 140 200 L 160 220 L 180 200 L 200 220 L 220 200 Z" fill="#228B22"/>
<path id="fond" d="M 0 0 L 400 0 L 400 300 L 0 300 Z" fill="#964B00"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -0,0 +1,38 @@
# pitch investor
# Présentation d'Entreprise pour les Investisseurs
## Qu'est-ce qu'un Pitch Investor ?
* Présentation concise d'une entreprise ou d'un projet
* Objectif : obtenir des fonds d'investissement
* 3-5 minutes maximum
## Éléments Clés d'un Pitch Investor
* *Problématique* : décrire le problème que votre entreprise résout
* *Solution* : présenter votre solution innovante
* *Marché* : décrire votre marché cible et votre position
* *Équipe* : présenter votre équipe de direction
* *Financements* : expliquer comment les fonds seront utilisés
## Comment Structurer un Pitch Investor ?
* Introduction (30 secondes) : présentation de l'entreprise et de l'objectif
* Présentation de la solution (1 minute) : détailler votre produit ou service
* Marché et concurrence (1 minute) : décrire votre marché et vos concurrents
* Équipe et financements (1 minute) : présenter votre équipe et expliquer comment les fonds seront utilisés
* Conclusion (30 secondes) : rappeler l'objectif et les avantages
## Exemples de Pitch Investor Succès
* Airbnb : 3 minutes pour présenter une plateforme de location de vacances
* Uber : 5 minutes pour présenter une application de taxis partagés
* Tesla : 10 minutes pour présenter une voiture électrique innovante
## Conseils pour un Pitch Investor Efficace
* *Préparation* : répéter votre pitch plusieurs fois avant la présentation
* *Confiance* : parler avec assurance et conviction
* *Visuals* : utiliser des diapositives ou un pitchdeck pour illustrer votre présentation
* *Réponse aux questions* : être prêt à répondre aux questions des investisseurs

View File

@@ -0,0 +1,101 @@
# strategie pharma
# Stratégie Pharma : Améliorer l'Efficacité et la Rentabilité
## Introduction
La stratégie pharma est un élément crucial pour les entreprises pharmaceutiques qui souhaitent rester compétitives dans un marché en constante évolution. Cette stratégie doit prendre en compte les besoins des patients, les attentes des professionnels de santé et les exigences des régulateurs. Dans ce document, nous présenterons une approche globale de la stratégie pharma, en mettant l'accent sur les aspects clés pour améliorer l'efficacité et la rentabilité.
## Diagnostic Stratégique
Avant de mettre en place une stratégie pharma, il est essentiel de réaliser un diagnostic stratégique pour identifier les forces, les faiblesses, les opportunités et les menaces (SWOT) de l'entreprise.
### Forces
* Expérience et expertise dans le domaine pharmaceutique
* Recherche et développement (R&D) innovante
* Réseau de partenariats solide
* Capacité à innover et à adapter les produits et services
### Faiblesses
* Dépendance à certains marchés ou clients
* Coûts de R&D élevés
* Risques liés à la réglementation
* Manque de diversification des produits et services
### Opportunités
* Croissance du marché des médicaments génériques
* Développement de nouveaux marchés émergents
* Possibilités de partenariats avec des entreprises de santé
* Amélioration de la qualité et de la sécurité des produits
### Menaces
* Changements réglementaires et législatifs
* Concurrence accrue des entreprises de santé
* Risques liés à la sécurité des produits
* Changements dans les préférences des patients et des professionnels de santé
## Objectifs Stratégiques
Sur la base du diagnostic stratégique, voici les objectifs stratégiques de l'entreprise :
### Objectif 1 : Améliorer l'efficacité des opérations
* Réduire les coûts de production et de distribution
* Améliorer la qualité et la sécurité des produits
* Renforcer la chaîne d'approvisionnement
### Objectif 2 : Diversifier les produits et services
* Développer de nouveaux produits et services innovants
* Renforcer la présence sur les marchés émergents
* Améliorer la valeur ajoutée pour les patients et les professionnels de santé
### Objectif 3 : Renforcer la position concurrentielle
* Améliorer la compétitivité des prix
* Développer des partenariats stratégiques
* Renforcer la marque et la réputation de l'entreprise
## Plan d'Action
Pour atteindre les objectifs stratégiques, voici le plan d'action :
### Étape 1 : Analyse détaillée des forces, faiblesses, opportunités et menaces (SWOT)
* Identifier les forces et les faiblesses de l'entreprise
* Analyser les opportunités et les menaces du marché
### Étape 2 : Développement de la stratégie
* Élaborer une stratégie globale pour atteindre les objectifs
* Définir les indicateurs de performance clés (KPI)
### Étape 3 : Mise en œuvre de la stratégie
* Allouer les ressources nécessaires
* Développer un plan de communication pour les parties prenantes
## Suivi et Évaluation
Le suivi et l'évaluation de la stratégie pharma sont essentiels pour s'assurer que les objectifs sont atteints. Voici les étapes à suivre :
### Étape 1 : Suivi régulier des KPI
* Suivre les indicateurs de performance clés (KPI)
* Identifier les écarts et les opportunités d'amélioration
### Étape 2 : Réévaluation de la stratégie
* Réévaluer la stratégie en fonction des résultats
* Adapter la stratégie en fonction des besoins
### Étape 3 : Communication avec les parties prenantes
* Communiquer régulièrement avec les parties prenantes
* Informer les parties prenantes des progrès et des résultats.
Ce document présente une approche globale de la stratégie pharma, en mettant l'accent sur les aspects clés pour améliorer l'efficacité et la rentabilité. La mise en œuvre de cette stratégie nécessite une approche méthodique et un engagement de l'ensemble de l'entreprise.

View File

@@ -0,0 +1,56 @@
# test debug
# Test de Débogage
=====================
## Introduction
------------
Le test de débogage est un processus essentiel dans le développement logiciel qui consiste à identifier et à corriger les erreurs ou les bugs présents dans un logiciel ou un système. Ce processus est crucial pour garantir la qualité et la fiabilité d'un produit.
## Objectifs du Test de Débogage
-----------------------------
* Identifier les erreurs ou les bugs présents dans le logiciel ou le système
* Corriger les erreurs ou les bugs identifiés
* Vérifier que les corrections apportées n'ont pas créé de nouveaux bugs
* Garantir que le logiciel ou le système fonctionne correctement et est stable
## Étapes du Test de Débogage
---------------------------
### 1. Préparation
* Définir les objectifs et les critères de test
* Préparer les outils et les ressources nécessaires (ordinateurs, logiciels, matériel, etc.)
* Former les équipes de test et les développeurs
### 2. Exécution du Test
* Exécuter les tests unitaires et les tests de fonctionnalité
* Utiliser les outils de test (logiciels, scripts, etc.) pour automatiser les tests
* Collecter et analyser les données de test
### 3. Analyse et Correction
* Analyser les résultats de test pour identifier les erreurs ou les bugs
* Corriger les erreurs ou les bugs identifiés
* Vérifier que les corrections apportées n'ont pas créé de nouveaux bugs
### 4. Vérification et Validation
* Vérifier que les corrections apportées ont résolu les problèmes identifiés
* Valider que le logiciel ou le système fonctionne correctement et est stable
## Outils et Techniques de Test de Débogage
-----------------------------------------
* Outils de test logiciels (JIRA, TestRail, etc.)
* Outils de test automatique (Selenium, Appium, etc.)
* Techniques de test (test unitaire, test de fonctionnalité, test d'intégration, etc.)
* Méthodologies de test (agile, Waterfall, etc.)
## Conclusion
----------
Le test de débogage est un processus essentiel dans le développement logiciel qui consiste à identifier et à corriger les erreurs ou les bugs présents dans un logiciel ou un système. En suivant les étapes et les objectifs du test de débogage, les développeurs et les équipes de test peuvent garantir la qualité et la fiabilité d'un produit.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,63 @@
# test2
**Rapport de Test2**
=====================
**Résumé**
------------
Le présent document présente les résultats du test2, réalisé pour évaluer la performance et la fiabilité du système. Le test a été effectué en [date] et a duré [durée] heures.
**Introduction**
---------------
Le test2 a été conçu pour évaluer les capacités du système à gérer [nombre] d'utilisateurs simultanément. Le but de ce test est de vérifier la performance et la fiabilité du système dans des conditions réelles.
**Méthodologie**
--------------
Le test2 a été réalisé selon les étapes suivantes :
1. **Préparation** : Le système a été configuré pour accueillir [nombre] d'utilisateurs.
2. **Exécution** : Les utilisateurs ont été invités à utiliser le système pendant [durée] heures.
3. **Analyse** : Les données collectées ont été analysées pour évaluer la performance et la fiabilité du système.
**Résultats**
-------------
### Tableau 1 : Résultats du test2
| Indicateur | Valeur |
| --- | --- |
| Temps de réponse moyen | 2,5 secondes |
| Taux de réponse correct | 95% |
| Taux de panne | 1% |
| Capacité de traitement | 500 transactions/heure |
### Figure 1 : Graphique de la performance du système
[Insérer graphique]
**Discussion**
--------------
Les résultats du test2 montrent que le système est capable de gérer [nombre] d'utilisateurs simultanément sans problème majeur. Le temps de réponse moyen est de 2,5 secondes, ce qui est inférieur à la limite de 5 secondes fixée. Le taux de réponse correct est de 95%, ce qui est satisfaisant. Enfin, le taux de panne est de 1%, ce qui est acceptable.
**Conclusion**
--------------
Le test2 a été un succès, car le système a réussi à gérer [nombre] d'utilisateurs simultanément sans problème majeur. Les résultats montrent que le système est capable de fonctionner correctement dans des conditions réelles. Cependant, il est important de continuer à monitorer la performance du système pour s'assurer qu'il continue à fonctionner correctement.
**Recommendations**
-------------------
* Continuer à monitorer la performance du système.
* Effectuer des tests réguliers pour s'assurer que le système continue à fonctionner correctement.
* Améliorer la capacité de traitement du système pour gérer un plus grand nombre d'utilisateurs.
**Annexe**
----------
* Liste des utilisateurs participant au test2.
* Liste des étapes de préparation et d'exécution du test2.
* Liste des données collectées pendant le test2.