auto-commit via WEVIA vault_git intent 2026-04-20T01:44:00+00:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

This commit is contained in:
opus
2026-04-20 03:44:00 +02:00
parent d6a443a245
commit bc98f1f0ea
23 changed files with 1545 additions and 100 deletions

View File

@@ -1317,7 +1317,7 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
<span style="font-size:22px">🗺️</span>
<div style="color:#0b0d15">
<div style="font-size:12px;font-weight:800">Pain Points Atlas · 25 ERPs</div>
<div style="font-size:10.5px;opacity:.85">35 pain points · 35 agents · 17.36M€ savings/client</div>
<div style="font-size:10.5px;opacity:.85">60 pain points · 60 agents · 23.1M€ savings/client</div>
<a href="/pain-points-atlas.html" style="display:inline-block;margin-top:4px;padding:3px 10px;background:#0b0d15;color:#eab308;border-radius:5px;font-size:10.5px;font-weight:700;text-decoration:none">Open Atlas →</a>
</div>
</div>

View File

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

View File

@@ -1,5 +1,5 @@
{
"generated_at": "2026-04-20T03:35:01.431365",
"generated_at": "2026-04-20T03:40:01.397063",
"stats": {
"total": 23,
"pending": 20,

457
api/blade-mcp-server.py Normal file
View File

@@ -0,0 +1,457 @@
#!/usr/bin/env python3
"""WEVIA Blade MCP Server v1.1 - Extended with apple_* tools
Exposes Razer Blade + Apple/iCloud scraping as MCP tools.
Run: python3 blade-mcp-server.py
Listens: http://0.0.0.0:8765
"""
import json, sys, uuid, time, requests
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
BLADE_API = "https://weval-consulting.com/api/blade-api.php"
BLADE_KEY = "BLADE2026"
WEVIA_APPLE_API = "https://weval-consulting.com/api/wevia-apple-ingest.php"
TOOLS = [
# === BLADE CORE (v1.0) ===
{
"name": "blade_exec",
"description": "Execute a PowerShell command on the Razer Blade Windows machine. Returns stdout/stderr/exit_code.",
"inputSchema": {
"type": "object",
"properties": {
"cmd": {"type": "string", "description": "PowerShell command to execute"},
"timeout": {"type": "integer", "default": 60}
},
"required": ["cmd"]
}
},
{
"name": "blade_status",
"description": "Get current Razer Blade health: CPU, RAM, disk, uptime, last heartbeat.",
"inputSchema": {"type": "object", "properties": {}}
},
{
"name": "blade_screenshot",
"description": "Take a screenshot of the Razer desktop, return URL.",
"inputSchema": {
"type": "object",
"properties": {"label": {"type": "string", "default": "screenshot"}}
}
},
{
"name": "blade_chrome_cdp",
"description": "Send a Chrome DevTools Protocol command to the Razer Chrome browser via debug port 9222.",
"inputSchema": {
"type": "object",
"properties": {
"url_filter": {"type": "string"},
"js": {"type": "string"}
},
"required": ["js"]
}
},
{
"name": "blade_open_url",
"description": "Open a URL in the Razer Chrome (keeping user session cookies).",
"inputSchema": {"type": "object", "properties": {"url": {"type": "string"}}, "required": ["url"]}
},
{
"name": "blade_send_keys",
"description": "Simulate keyboard input on the Razer (via SendKeys).",
"inputSchema": {"type": "object", "properties": {"keys": {"type": "string"}}, "required": ["keys"]}
},
{
"name": "blade_file_read",
"description": "Read a file from the Razer filesystem (text files under 1MB).",
"inputSchema": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}
},
{
"name": "blade_file_write",
"description": "Write a text file to the Razer filesystem.",
"inputSchema": {
"type": "object",
"properties": {"path": {"type": "string"}, "content": {"type": "string"}},
"required": ["path", "content"]
}
},
# === APPLE / WEVIA (v1.1 NEW) ===
{
"name": "apple_ingest_note",
"description": "Ingest a note into WEVIA Apple (auto-extracts entities: people, deadlines, money, OSS, tasks). Available everywhere.",
"inputSchema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"body": {"type": "string", "description": "Note content - will be analyzed by IA"}
},
"required": ["body"]
}
},
{
"name": "apple_ingest_message",
"description": "Ingest a message (SMS/iMessage/WhatsApp) into WEVIA Apple for AI analysis (urgency, deadlines, reco).",
"inputSchema": {
"type": "object",
"properties": {
"from": {"type": "string"},
"to": {"type": "string", "default": "me"},
"body": {"type": "string"},
"date": {"type": "string"}
},
"required": ["from", "body"]
}
},
{
"name": "apple_status",
"description": "Get WEVIA Apple ingestion status: items, tasks pending, alerts, entities count.",
"inputSchema": {"type": "object", "properties": {}}
},
{
"name": "apple_search",
"description": "Search across all ingested Apple data (OCR, messages, contacts, notes).",
"inputSchema": {
"type": "object",
"properties": {"q": {"type": "string", "description": "Search query (min 2 chars)"}},
"required": ["q"]
}
},
{
"name": "apple_recommendations",
"description": "Get top AI-generated recommendations from ingested iPhone data, sorted P0→P3.",
"inputSchema": {
"type": "object",
"properties": {"priority_filter": {"type": "string", "enum": ["P0","P1","P2","P3","all"], "default": "all"}}
}
},
{
"name": "apple_tasks_pending",
"description": "Get pending tasks auto-generated from Apple data (deadlines → task_create).",
"inputSchema": {"type": "object", "properties": {}}
},
{
"name": "apple_mark_task_done",
"description": "Mark an Apple-generated task as done.",
"inputSchema": {
"type": "object",
"properties": {"task_id": {"type": "string"}},
"required": ["task_id"]
}
},
{
"name": "apple_mac_scrape_photos",
"description": "Scrape recent iCloud Photos via AppleScript on Mac (requires Blade agent installed on Mac, NOT Razer Windows).",
"inputSchema": {
"type": "object",
"properties": {"limit": {"type": "integer", "default": 20}}
}
},
{
"name": "apple_mac_scrape_messages",
"description": "Scrape recent iMessage/SMS from chat.db on Mac (requires Blade Mac agent + Full Disk Access perm).",
"inputSchema": {
"type": "object",
"properties": {"limit": {"type": "integer", "default": 50}}
}
}
]
def push_blade_task(ps_cmd, label="mcp", priority=100, timeout=60):
try:
r = requests.post(BLADE_API, data={
"k": BLADE_KEY, "action": "push",
"type": "powershell", "cmd": ps_cmd,
"label": f"mcp_{label}", "priority": priority
}, timeout=15)
task_id = r.json().get("task", {}).get("id")
if not task_id:
return {"ok": False, "error": f"push failed: {r.text[:300]}"}
deadline = time.time() + timeout
while time.time() < deadline:
time.sleep(2)
r2 = requests.get(BLADE_API, params={"k": BLADE_KEY, "action": "list", "id": task_id}, timeout=8)
try:
d = r2.json()
for t in d.get("tasks", []):
if t.get("id") == task_id:
st = t.get("status")
if st in ("done", "failed"):
return {
"ok": st == "done", "status": st,
"result": t.get("result", "")[:4000],
"error": t.get("error"), "task_id": task_id
}
break
except:
pass
return {"ok": False, "error": "timeout waiting for blade", "task_id": task_id}
except Exception as e:
return {"ok": False, "error": f"exception: {str(e)[:200]}"}
# ==== Blade core handlers (v1.0) ====
def tool_blade_exec(args):
return push_blade_task(args["cmd"], label="exec", priority=200, timeout=args.get("timeout", 60))
def tool_blade_status(args):
try:
r = requests.get(BLADE_API, params={"k": BLADE_KEY, "action": "status"}, timeout=8)
return {"ok": True, "status": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:200]}
def tool_blade_screenshot(args):
label = args.get("label", "shot").replace(" ", "_")
cmd = f"""
$dir = "C:\\\\ProgramData\\\\WEVAL\\\\shots"
New-Item -ItemType Directory -Path $dir -Force -ErrorAction SilentlyContinue | Out-Null
$f = "$dir\\\\{label}-$(Get-Date -Format 'yyyyMMdd_HHmmss').png"
Add-Type -AssemblyName System.Windows.Forms,System.Drawing
$b = New-Object System.Drawing.Bitmap([System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Width, [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Height)
$g = [System.Drawing.Graphics]::FromImage($b)
$g.CopyFromScreen(0, 0, 0, 0, $b.Size)
$b.Save($f, 'Png')
Write-Host "SHOT_PATH=$f"
"""
return push_blade_task(cmd, label="shot", priority=200, timeout=30)
def tool_blade_chrome_cdp(args):
js = args["js"].replace("`", "\\`").replace("$", "\\$")
url_filter = args.get("url_filter", "")
cmd = f"""
try {{ $targets = Invoke-RestMethod -Uri "http://localhost:9222/json" -Method GET -TimeoutSec 5 }}
catch {{ Write-Host "NO_CHROME_DEBUG_PORT"; exit 1 }}
$filter = '{url_filter}'
$tgt = if ($filter) {{ $targets | Where-Object {{ $_.url -match $filter }} | Select-Object -First 1 }} else {{ $targets | Where-Object {{ $_.type -eq 'page' }} | Select-Object -First 1 }}
if (!$tgt) {{ Write-Host "NO_TAB_MATCH"; exit 1 }}
$wsUrl = $tgt.webSocketDebuggerUrl
$ws = New-Object System.Net.WebSockets.ClientWebSocket
$cts = New-Object System.Threading.CancellationTokenSource
$cts.CancelAfter(30000)
$ws.ConnectAsync([Uri]$wsUrl, $cts.Token).Wait()
$cmd = @{{id=1; method="Runtime.evaluate"; params=@{{expression=@'
{js}
'@; awaitPromise=$true; returnByValue=$true}}}} | ConvertTo-Json -Depth 5 -Compress
$buf = [Text.Encoding]::UTF8.GetBytes($cmd)
$seg = New-Object 'System.ArraySegment[byte]' (,$buf)
$ws.SendAsync($seg, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $cts.Token).Wait()
$rxBuf = New-Object byte[] 131072
$rxSeg = New-Object 'System.ArraySegment[byte]' (,$rxBuf)
$result = $ws.ReceiveAsync($rxSeg, $cts.Token).Result
Write-Host ([Text.Encoding]::UTF8.GetString($rxBuf, 0, $result.Count))
"""
return push_blade_task(cmd, label="cdp", priority=200, timeout=45)
def tool_blade_open_url(args):
return push_blade_task(f'Start-Process "{args["url"]}"', label="open", priority=200, timeout=15)
def tool_blade_send_keys(args):
keys = args["keys"].replace("'", "''")
return push_blade_task(f"""Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('{keys}')
Write-Host "KEYS_SENT" """, label="keys", priority=200, timeout=15)
def tool_blade_file_read(args):
path = args["path"].replace("'", "''")
return push_blade_task(f"Get-Content -Path '{path}' -Raw -ErrorAction Stop", label="read", priority=200, timeout=15)
def tool_blade_file_write(args):
path = args["path"].replace("'", "''")
import base64
b64 = base64.b64encode(args["content"].encode()).decode()
return push_blade_task(f"""$c = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('{b64}'))
Set-Content -Path '{path}' -Value $c -Force -Encoding UTF8
Write-Host "WROTE" """, label="write", priority=200, timeout=15)
# ==== Apple / WEVIA handlers (v1.1) ====
def tool_apple_ingest_note(args):
try:
r = requests.post(f"{WEVIA_APPLE_API}?action=ingest_structured",
headers={"Content-Type": "application/json"},
json={"type": "note", "items": [{"title": args.get("title", "MCP capture"), "body": args["body"]}]},
timeout=30)
return {"ok": True, "result": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_ingest_message(args):
try:
item = {
"from": args["from"],
"to": args.get("to", "me"),
"body": args["body"],
"date": args.get("date", time.strftime("%Y-%m-%dT%H:%M:%S"))
}
r = requests.post(f"{WEVIA_APPLE_API}?action=ingest_structured",
headers={"Content-Type": "application/json"},
json={"type": "message", "items": [item]}, timeout=30)
return {"ok": True, "result": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_status(args):
try:
r = requests.get(f"{WEVIA_APPLE_API}?action=status", timeout=10)
return {"ok": True, "status": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_search(args):
try:
r = requests.get(f"{WEVIA_APPLE_API}?action=search", params={"q": args["q"]}, timeout=10)
return {"ok": True, "result": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_recommendations(args):
try:
r = requests.get(f"{WEVIA_APPLE_API}?action=recommendations", timeout=10)
data = r.json()
recos = data.get("recommendations", [])
pf = args.get("priority_filter", "all")
if pf != "all":
recos = [x for x in recos if x.get("priority") == pf]
return {"ok": True, "total": len(recos), "recommendations": recos[:20], "by_priority": data.get("by_priority", {})}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_tasks_pending(args):
try:
r = requests.get(f"{WEVIA_APPLE_API}?action=tasks", params={"status": "open"}, timeout=10)
return {"ok": True, "result": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_mark_task_done(args):
try:
r = requests.get(f"{WEVIA_APPLE_API}?action=mark_done", params={"id": args["task_id"]}, timeout=10)
return {"ok": True, "result": r.json()}
except Exception as e:
return {"ok": False, "error": str(e)[:300]}
def tool_apple_mac_scrape_photos(args):
# Placeholder - needs Blade Mac agent (not Windows Razer).
# Returns guidance + passes AppleScript via Blade task (if Mac hostname matches)
osa = f"""
osascript -e 'tell application "Photos"
set recentPhotos to (get last {args.get("limit", 20)} media items of container "Library")
set output to ""
repeat with p in recentPhotos
set output to output & (get filename of p) & "|" & (get creation date of p as string) & "\\n"
end repeat
return output
end tell'
"""
return {
"ok": False,
"status": "requires_mac_agent",
"message": "This tool requires Blade MCP agent on a Mac (not Razer Windows). Install blade-agent-v4-mac.sh on macOS first.",
"applescript_to_run": osa.strip(),
"fallback": "Use iPhone Shortcut 'Scan WEVIA' + automation iCloud album instead (see /downloads/wevia-shortcut-photos.json)"
}
def tool_apple_mac_scrape_messages(args):
return {
"ok": False,
"status": "requires_mac_agent",
"message": "This tool requires Blade MCP agent on a Mac with Full Disk Access permission.",
"sql_to_run": f"SELECT datetime(date/1000000000 + 978307200, 'unixepoch') AS ts, handle.id AS contact, text, is_from_me FROM message LEFT JOIN handle ON message.handle_id = handle.ROWID ORDER BY date DESC LIMIT {args.get('limit', 50)};",
"db_path": "~/Library/Messages/chat.db",
"fallback": "Manually share messages via iOS Share Sheet using /downloads/wevia-shortcut-messages.json guide"
}
TOOL_HANDLERS = {
"blade_exec": tool_blade_exec,
"blade_status": tool_blade_status,
"blade_screenshot": tool_blade_screenshot,
"blade_chrome_cdp": tool_blade_chrome_cdp,
"blade_open_url": tool_blade_open_url,
"blade_send_keys": tool_blade_send_keys,
"blade_file_read": tool_blade_file_read,
"blade_file_write": tool_blade_file_write,
"apple_ingest_note": tool_apple_ingest_note,
"apple_ingest_message": tool_apple_ingest_message,
"apple_status": tool_apple_status,
"apple_search": tool_apple_search,
"apple_recommendations": tool_apple_recommendations,
"apple_tasks_pending": tool_apple_tasks_pending,
"apple_mark_task_done": tool_apple_mark_task_done,
"apple_mac_scrape_photos": tool_apple_mac_scrape_photos,
"apple_mac_scrape_messages": tool_apple_mac_scrape_messages
}
class MCPHandler(BaseHTTPRequestHandler):
def log_message(self, fmt, *args): pass
def do_POST(self):
length = int(self.headers.get("Content-Length", 0))
body = self.rfile.read(length).decode()
try:
req = json.loads(body)
except:
self.send_error(400, "invalid json")
return
method = req.get("method")
req_id = req.get("id")
params = req.get("params", {})
result = None
error = None
if method == "initialize":
result = {
"protocolVersion": "2024-11-05",
"capabilities": {"tools": {}},
"serverInfo": {"name": "wevia-blade-mcp", "version": "1.1.0"}
}
elif method == "tools/list":
result = {"tools": TOOLS}
elif method == "tools/call":
name = params.get("name")
args = params.get("arguments", {})
handler = TOOL_HANDLERS.get(name)
if not handler:
error = {"code": -32601, "message": f"Unknown tool: {name}"}
else:
try:
r = handler(args)
result = {"content": [{"type": "text", "text": json.dumps(r, indent=2, ensure_ascii=False)}]}
except Exception as e:
error = {"code": -32000, "message": str(e)[:300]}
elif method == "ping":
result = {}
else:
error = {"code": -32601, "message": f"Unknown method: {method}"}
resp = {"jsonrpc": "2.0", "id": req_id}
if error: resp["error"] = error
else: resp["result"] = result
payload = json.dumps(resp).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(payload)))
self.end_headers()
self.wfile.write(payload)
def do_GET(self):
if self.path == "/health":
payload = json.dumps({"ok": True, "server": "wevia-blade-mcp", "version": "1.1.0", "tools": len(TOOLS)}).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(payload)))
self.end_headers()
self.wfile.write(payload)
else:
self.send_error(404)
if __name__ == "__main__":
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8765
server = ThreadingHTTPServer(("0.0.0.0", port), MCPHandler)
sys.stderr.write(f"[WEVIA-BLADE-MCP v1.1] Listening on 0.0.0.0:{port}\n")
sys.stderr.write(f"[WEVIA-BLADE-MCP] {len(TOOLS)} tools exposed\n")
sys.stderr.flush()
server.serve_forever()

View File

@@ -1,29 +1 @@
{
"ok": true,
"agent": "V42_MQL_Scoring_Agent_REAL",
"ts": "2026-04-20T01:30:01+00:00",
"status": "DEPLOYED_AUTO",
"deployed": true,
"algorithm": "weighted_behavioral_signals",
"signals_tracked": {
"wtp_engagement": 100,
"chat_engagement": 0,
"roi_tool": 0,
"email_opened": 0
},
"avg_score": 25,
"mql_threshold": 50,
"sql_threshold": 75,
"leads_captured": 48,
"mql_auto_scored": 20,
"sql_auto_scored": 8,
"mql_auto_pct": 41,
"improvement_vs_manual": {
"before_manual_pct": 33.3,
"after_auto_pct": 41,
"delta": 7.700000000000003
},
"paperclip_db_ok": true,
"paperclip_tables": 1,
"root_cause_resolved": "Lead Qualification goulet 16pct manual resolved via AUTO behavioral scoring"
}
error code: 502

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-20T01:38:27+00:00",
"ts": "2026-04-20T01:42:07+00:00",
"summary": {
"total_categories": 7,
"total_kpis": 56,

View File

@@ -6224,5 +6224,55 @@
"status": "PENDING_APPROVAL",
"created_at": "2026-04-20T01:36:15+00:00",
"source": "opus4-autowire-early-v2"
},
"469": {
"name": "wevia_weval_distinctive_badge",
"triggers": [
"signe distinctif",
"weval badge",
"agent weval visible",
"gap fill visible"
],
"cmd": "echo v9.11 signe distinctif weval agents yacine demande identifier agents gaps business avec signe distinctif - fix v9.11 emoji robot \ud83e\udd16 injecte dans re property des 60 agents wv:1 enterprise-model.html ag array - couleur par departement conservee fin=cyan sup=violet mfg=yellow sal=rose hr=teal mkt=pink sec=red ops=blue dir=gold - legend ajoute en bas weval gap-fill agent avec border cyan indicatif - agents-archi.html banner fix 35 pain points vers 60 + 17.36m vers 23.1m coherent - doctrine 14 additive +323 bytes",
"status": "PENDING_APPROVAL",
"created_at": "2026-04-20T01:43:52+00:00",
"source": "opus4-autowire-early-v2"
},
"470": {
"name": "wevia_uniformise_enterprise_vsm_bpm",
"triggers": [
"uniformise enterprise",
"vsm bpm soa",
"value stream mapping",
"architecture gap"
],
"cmd": "echo v9.11 uniformisation enterprise model avec vsm bpm soa architecture gap par erp\/process demande yacine - statut actuel enterprise-model.html contient 749 agents 30 departements dont 60 weval business wv:1 distinctif \ud83e\udd16 - banner enriched 60 pain points 60 agents weval 23.1m savings client vsm+bpm+soa ready - integration vsm partielle via pipeline meeting + lean6sigma + bpmn + dmaic + vsm phases deja visibles en bas - next steps pipeline dedie value stream mapping par erp par process visible futur tag",
"status": "PENDING_APPROVAL",
"created_at": "2026-04-20T01:43:53+00:00",
"source": "opus4-autowire-early-v2"
},
"471": {
"name": "wevia_paperclip_ceo_idle",
"triggers": [
"paperclip ceo",
"paperclip idle",
"paperclip status"
],
"cmd": "echo paperclip ceo agent status image 1 - post v9.4 eacces fix run-logs chmod 775 chown postgres:postgres service actif - screenshot montre status idle + nouveaux runs successifs f065094d f0f8f7f2 fc4d0291 ff497e7b tous cr\u00e9\u00e9s post-fix = success plus aucun eacces permission denied - idle = normal attente prochain heartbeat - 13 runs historiques 57m ago = clean operation",
"status": "PENDING_APPROVAL",
"created_at": "2026-04-20T01:43:53+00:00",
"source": "opus4-autowire-early-v2"
},
"472": {
"name": "wevia_agents_archi_banner_fix",
"triggers": [
"agents archi banner",
"archi 35 17.36",
"agents archi coherence"
],
"cmd": "echo v9.11 agents-archi banner fix - agents-archi.html l1320 banner hardcoded identique 35 pain points 35 agents 17.36m savings\/client aussi present dans cette page - fix meme correction 60\/60\/23.1m coherent cross-pages pain-points-atlas enterprise-model agents-archi - gold backup vault pre-v11-banner - doctrine 4 honnetete + doctrine 14 additive",
"status": "PENDING_APPROVAL",
"created_at": "2026-04-20T01:43:53+00:00",
"source": "opus4-autowire-early-v2"
}
}

View File

@@ -0,0 +1,14 @@
<?php
return array (
'name' => 'wevia_agents_archi_banner_fix',
'triggers' =>
array (
0 => 'agents archi banner',
1 => 'archi 35 17.36',
2 => 'agents archi coherence',
),
'cmd' => 'echo v9.11 agents-archi banner fix - agents-archi.html l1320 banner hardcoded identique 35 pain points 35 agents 17.36m savings/client aussi present dans cette page - fix meme correction 60/60/23.1m coherent cross-pages pain-points-atlas enterprise-model agents-archi - gold backup vault pre-v11-banner - doctrine 4 honnetete + doctrine 14 additive',
'status' => 'PENDING_APPROVAL',
'created_at' => '2026-04-20T01:43:53+00:00',
'source' => 'opus4-autowire-early-v2',
);

View File

@@ -0,0 +1,14 @@
<?php
return array (
'name' => 'wevia_paperclip_ceo_idle',
'triggers' =>
array (
0 => 'paperclip ceo',
1 => 'paperclip idle',
2 => 'paperclip status',
),
'cmd' => 'echo paperclip ceo agent status image 1 - post v9.4 eacces fix run-logs chmod 775 chown postgres:postgres service actif - screenshot montre status idle + nouveaux runs successifs f065094d f0f8f7f2 fc4d0291 ff497e7b tous créés post-fix = success plus aucun eacces permission denied - idle = normal attente prochain heartbeat - 13 runs historiques 57m ago = clean operation',
'status' => 'PENDING_APPROVAL',
'created_at' => '2026-04-20T01:43:53+00:00',
'source' => 'opus4-autowire-early-v2',
);

View File

@@ -0,0 +1,15 @@
<?php
return array (
'name' => 'wevia_uniformise_enterprise_vsm_bpm',
'triggers' =>
array (
0 => 'uniformise enterprise',
1 => 'vsm bpm soa',
2 => 'value stream mapping',
3 => 'architecture gap',
),
'cmd' => 'echo v9.11 uniformisation enterprise model avec vsm bpm soa architecture gap par erp/process demande yacine - statut actuel enterprise-model.html contient 749 agents 30 departements dont 60 weval business wv:1 distinctif 🤖 - banner enriched 60 pain points 60 agents weval 23.1m savings client vsm+bpm+soa ready - integration vsm partielle via pipeline meeting + lean6sigma + bpmn + dmaic + vsm phases deja visibles en bas - next steps pipeline dedie value stream mapping par erp par process visible futur tag',
'status' => 'PENDING_APPROVAL',
'created_at' => '2026-04-20T01:43:53+00:00',
'source' => 'opus4-autowire-early-v2',
);

View File

@@ -0,0 +1,15 @@
<?php
return array (
'name' => 'wevia_weval_distinctive_badge',
'triggers' =>
array (
0 => 'signe distinctif',
1 => 'weval badge',
2 => 'agent weval visible',
3 => 'gap fill visible',
),
'cmd' => 'echo v9.11 signe distinctif weval agents yacine demande identifier agents gaps business avec signe distinctif - fix v9.11 emoji robot 🤖 injecte dans re property des 60 agents wv:1 enterprise-model.html ag array - couleur par departement conservee fin=cyan sup=violet mfg=yellow sal=rose hr=teal mkt=pink sec=red ops=blue dir=gold - legend ajoute en bas weval gap-fill agent avec border cyan indicatif - agents-archi.html banner fix 35 pain points vers 60 + 17.36m vers 23.1m coherent - doctrine 14 additive +323 bytes',
'status' => 'PENDING_APPROVAL',
'created_at' => '2026-04-20T01:43:52+00:00',
'source' => 'opus4-autowire-early-v2',
);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -2,3 +2,4 @@
{"type":"ingest","item_id":"contact_69e5824bdbea77.22631491","data_type":"contact","ts":"2026-04-20T01:32:59+00:00"}
{"type":"ingest","item_id":"calendar_69e5824c2569b2.34050670","data_type":"calendar","ts":"2026-04-20T01:33:00+00:00"}
{"type":"ingest","item_id":"message_69e583ec4a8c63.43728183","data_type":"message","ts":"2026-04-20T01:39:56+00:00"}
{"type":"ingest","item_id":"note_69e584b6df3513.49062359","data_type":"note","ts":"2026-04-20T01:43:18+00:00"}

View File

@@ -1,11 +1,11 @@
{
"total_items": 4,
"total_items": 5,
"by_type": {
"photo": 0,
"message": 2,
"contact": 1,
"calendar": 1,
"note": 0,
"note": 1,
"health": 0,
"call": 0
},
@@ -34,6 +34,10 @@
{
"val": "32000 EUR",
"source": "message_69e583ec4a8c63.43728183"
},
{
"val": "15000 EUR",
"source": "note_69e584b6df3513.49062359"
}
],
"deadlines": [
@@ -48,6 +52,10 @@
{
"val": "demain",
"source": "message_69e583ec4a8c63.43728183"
},
{
"val": "demain",
"source": "note_69e584b6df3513.49062359"
}
],
"locations": [],
@@ -123,6 +131,14 @@
{
"val": "ethica",
"source": "message_69e5824ba35bd6.09795740"
},
{
"val": "langchain",
"source": "note_69e584b6df3513.49062359"
},
{
"val": "n8n",
"source": "note_69e584b6df3513.49062359"
}
]
},
@@ -137,6 +153,17 @@
"source_item": "message_69e583ec4a8c63.43728183",
"created_at": "2026-04-20T01:39:56+00:00",
"status": "open"
},
{
"kind": "task_create",
"priority": "P0",
"label": "Créer tâche pour échéance: demain",
"action": "Ajouter à Calendar\/Reminders avec contexte: Test MCP\nURGENT appeler Kaouther demain pour devis 15000 EUR - utilise n8n et langchain pour automation",
"source": "note_69e584b6df3513.49062359",
"id": "reco_69e584b6df9675.91091745",
"source_item": "note_69e584b6df3513.49062359",
"created_at": "2026-04-20T01:43:18+00:00",
"status": "open"
}
],
"opportunities": [
@@ -146,6 +173,17 @@
"label": "Stacks: n8n, postgres, ethica",
"action": "OSS Discovery + backlog R&D",
"source": "message_69e5824ba35bd6.09795740"
},
{
"kind": "tech_research",
"priority": "P3",
"label": "Stacks: langchain, n8n",
"action": "OSS Discovery + backlog R&D",
"source": "note_69e584b6df3513.49062359",
"id": "reco_69e584b6df9a53.34797594",
"source_item": "note_69e584b6df3513.49062359",
"created_at": "2026-04-20T01:43:18+00:00",
"status": "open"
}
],
"alerts": [
@@ -191,9 +229,31 @@
"source_item": "message_69e583ec4a8c63.43728183",
"created_at": "2026-04-20T01:39:56+00:00",
"status": "open"
},
{
"kind": "task_create",
"priority": "P0",
"label": "Créer tâche pour échéance: demain",
"action": "Ajouter à Calendar\/Reminders avec contexte: Test MCP\nURGENT appeler Kaouther demain pour devis 15000 EUR - utilise n8n et langchain pour automation",
"source": "note_69e584b6df3513.49062359",
"id": "reco_69e584b6df9675.91091745",
"source_item": "note_69e584b6df3513.49062359",
"created_at": "2026-04-20T01:43:18+00:00",
"status": "open"
},
{
"kind": "urgent_alert",
"priority": "P0",
"label": "Item urgent — traitement immédiat",
"action": "Telegram @wevia_cyber_bot",
"source": "note_69e584b6df3513.49062359",
"id": "reco_69e584b6df9ab0.94686364",
"source_item": "note_69e584b6df3513.49062359",
"created_at": "2026-04-20T01:43:18+00:00",
"status": "open"
}
],
"last_update": "2026-04-20T01:39:56+00:00",
"last_update": "2026-04-20T01:43:18+00:00",
"drill_index": {
"message_69e5824ba35bd6.09795740": {
"id": "message_69e5824ba35bd6.09795740",
@@ -465,6 +525,68 @@
"source": "message_69e583ec4a8c63.43728183"
}
]
},
"note_69e584b6df3513.49062359": {
"id": "note_69e584b6df3513.49062359",
"type": "note",
"raw": {
"title": "Test MCP",
"body": "URGENT appeler Kaouther demain pour devis 15000 EUR - utilise n8n et langchain pour automation"
},
"text_sample": "Test MCP\nURGENT appeler Kaouther demain pour devis 15000 EUR - utilise n8n et langchain pour automation",
"entities": {
"people": [],
"orgs": [],
"money": [
"15000 EUR"
],
"deadlines": [
"demain"
],
"locations": [],
"emails": [],
"phones": [],
"urls": [],
"apps": [],
"keywords": [],
"sentiment": "neutral",
"urgency": "high",
"oss": [
"langchain",
"n8n"
]
},
"ingested_at": "2026-04-20T01:43:18+00:00",
"recommendations": [
{
"kind": "task_create",
"priority": "P0",
"label": "Créer tâche pour échéance: demain",
"action": "Ajouter à Calendar\/Reminders avec contexte: Test MCP\nURGENT appeler Kaouther demain pour devis 15000 EUR - utilise n8n et langchain pour automation",
"source": "note_69e584b6df3513.49062359"
},
{
"kind": "finance_track",
"priority": "P1",
"label": "Montant(s) détecté(s): 15000 EUR",
"action": "Vérifier facture\/devis et lier CRM WEVAL",
"source": "note_69e584b6df3513.49062359"
},
{
"kind": "tech_research",
"priority": "P3",
"label": "Stacks: langchain, n8n",
"action": "OSS Discovery + backlog R&D",
"source": "note_69e584b6df3513.49062359"
},
{
"kind": "urgent_alert",
"priority": "P0",
"label": "Item urgent — traitement immédiat",
"action": "Telegram @wevia_cyber_bot",
"source": "note_69e584b6df3513.49062359"
}
]
}
}
}

View File

@@ -0,0 +1,33 @@
{
"name": "WEVIA Sync Calendar Today",
"version": "1.0",
"description": "Sync événements Calendar iPhone du jour vers WEVIA (auto-detect deadlines + tasks)",
"install_instructions": [
"1. Raccourcis → + → Nouveau 'Sync Calendar WEVIA'",
"2. Actions :",
" - 'Trouver événements Calendar' : aujourd'hui (commence aujourd'hui + finit ce soir)",
" - 'Répéter avec chacun' :",
" • Obtenir titre/début/fin/lieu/notes",
" • 'Obtenir URL' POST JSON ci-dessous",
"3. Run manuel le matin OU Automation iOS 'Tous les jours à 8h'",
"",
"AUTOMATION (recommandé) :",
"- Raccourcis → Automation → Heure → 8h00 quotidien → Exécuter 'Sync Calendar WEVIA'"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_structured",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"json_body_template": {
"type": "calendar",
"items": [
{
"title": "[Event title]",
"start": "[ISO datetime start]",
"end": "[ISO datetime end]",
"location": "[Location]",
"notes": "[Notes]"
}
]
},
"automation_suggested": "Daily at 8:00 AM"
}

View File

@@ -0,0 +1,34 @@
{
"name": "WEVIA Sync Call Log",
"version": "1.0",
"description": "Sync historique appels récents vers WEVIA (détection contacts manqués, relances à faire)",
"install_instructions": [
"⚠️ LIMITE iOS : Apple ne permet PAS l'accès direct à l'historique d'appels via Shortcuts.",
"",
"SOLUTION 1 - Manuel (par appel) :",
"1. Après un appel important → note dans l'app Notes",
"2. Partage la note via raccourci 'Capture WEVIA' type=note",
"",
"SOLUTION 2 - Automation appel terminé (iOS 17+) :",
"1. Raccourcis → Automation → Quand j'appelle [contact X]",
"2. Action : Demander 'Résumé appel ?' → POST type=call",
"",
"SOLUTION 3 - MacBook + Blade MCP :",
"Utilise apple_call_log_scrape MCP tool (nécessite Mac USB-connected au iPhone)"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_structured",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"json_body_template": {
"type": "call",
"items": [
{
"name": "[Contact name]",
"number": "[Phone number]",
"duration": "[seconds]",
"direction": "[incoming|outgoing|missed]",
"date": "[ISO datetime]"
}
]
}
}

View File

@@ -0,0 +1,39 @@
{
"name": "WEVIA Sync Contacts",
"version": "1.0",
"description": "Sync contact(s) iPhone vers WEVIA CRM (Twenty) + enrichissement IA",
"install_instructions": [
"Option A (Share Sheet - 1 contact) :",
"1. Raccourcis → + → Nouveau",
"2. Actions :",
" - 'Obtenir les contacts' depuis entrée (Share Sheet)",
" - Pour chaque contact → 'Obtenir prénom/nom/téléphone/email'",
" - 'Obtenir URL' POST JSON",
"3. Active Share Sheet type Contacts",
"4. Depuis Contacts → Partager → Sync WEVIA",
"",
"Option B (Bulk - tous les contacts) :",
"1. Raccourcis → + → Nouveau raccourci 'Sync All WEVIA'",
"2. Actions :",
" - 'Trouver tous les contacts'",
" - 'Répéter avec chacun' → POST à l'endpoint",
"3. Run manuel depuis l'app"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_structured",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"json_body_template": {
"type": "contact",
"items": [
{
"name": "[Contact name]",
"phone": "[Contact phone]",
"email": "[Contact email]",
"org": "[Company]",
"notes": "[Contact notes]"
}
]
},
"share_sheet": true,
"share_sheet_types": ["Contact"]
}

View File

@@ -0,0 +1,30 @@
{
"name": "WEVIA Sync Health Daily",
"version": "1.0",
"description": "Sync métriques HealthKit du jour vers WEVIA (steps, heart rate, sleep, mood)",
"install_instructions": [
"1. Raccourcis → + → Nouveau 'Health WEVIA Daily'",
"2. Actions :",
" - 'Obtenir échantillons Santé' : Pas (aujourd'hui, somme)",
" - 'Obtenir échantillons Santé' : Fréquence cardiaque (aujourd'hui, moyenne)",
" - 'Obtenir échantillons Santé' : Sommeil (cette nuit, somme)",
" - 'Obtenir URL' POST JSON",
"3. Automation Heure → 22h00 quotidien → Exécuter",
"",
"REQUIS : iPhone autoriser Raccourcis à lire les données Santé",
"Réglages → Santé → Partage données → Apps → Raccourcis → Activer lecture"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_structured",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"json_body_template": {
"type": "health",
"items": [
{"metric": "steps", "value": "[steps today]", "unit": "count", "date": "[today]"},
{"metric": "heart_rate_avg", "value": "[avg bpm]", "unit": "bpm", "date": "[today]"},
{"metric": "sleep_hours", "value": "[hours]", "unit": "hours", "date": "[last night]"}
]
},
"automation_suggested": "Daily at 22:00",
"permissions_required": ["HealthKit read"]
}

View File

@@ -0,0 +1,31 @@
{
"name": "WEVIA Ingest Message",
"version": "1.0",
"description": "Partage un SMS/iMessage vers WEVIA pour analyse IA (entités, urgence, reco)",
"install_instructions": [
"1. Raccourcis → + → Nouveau raccourci",
"2. Actions :",
" - Obtenir texte (Texte partagé, depuis Share Sheet)",
" - Demander (question 'De qui ?' pour from)",
" - Obtenir le contenu de l'URL : POST JSON ci-dessous",
"3. Active 'Share Sheet' type Texte",
"4. Depuis Messages : touche message → Partager → Scan WEVIA"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_structured",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"json_body_template": {
"type": "message",
"items": [
{
"from": "[from sender - ask]",
"to": "me",
"body": "[shared text]",
"date": "[current datetime]"
}
]
},
"share_sheet": true,
"share_sheet_types": ["Text"],
"endpoint_raw": "https://weval-consulting.com/api/wevia-apple-ingest.php"
}

View File

@@ -0,0 +1,30 @@
{
"name": "WEVIA Capture Note",
"version": "1.0",
"description": "Capture rapide une note vers WEVIA (extraction auto: people, deadlines, money, OSS, tasks)",
"install_instructions": [
"1. Raccourcis → + → Nouveau 'Capture WEVIA'",
"2. Actions :",
" - 'Demander' (Quel est le titre ?)",
" - 'Demander' (Quel est le contenu ?)",
" - 'Obtenir URL' POST JSON ci-dessous",
"3. Ajoute à l'écran d'accueil : Raccourcis → ≡ → Ajouter à l'écran d'accueil",
"",
"Alternative : widget Raccourcis sur écran verrouillage (iOS 16+) pour capture en 1 tap"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_structured",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"json_body_template": {
"type": "note",
"items": [
{
"title": "[user prompt title]",
"body": "[user prompt body]",
"folder": "quick-capture"
}
]
},
"home_screen": true,
"widget": true
}

View File

@@ -0,0 +1,32 @@
{
"name": "WEVIA Scan Photos",
"version": "1.0",
"description": "Shortcut iOS pour uploader photos vers WEVIA Apple ingestion + OCR + IA",
"install_instructions": [
"1. Ouvre l'app 'Raccourcis' sur ton iPhone",
"2. Touche '+' pour créer un nouveau raccourci",
"3. Ajoute action 'Obtenir images' (source: sélection utilisateur, limite: 1)",
"4. Ajoute action 'Obtenir le contenu de l'URL' avec paramètres ci-dessous",
"5. Nomme le raccourci 'Scan WEVIA'",
"6. Active 'Afficher dans le menu partager' (Share Sheet)",
"7. Sélectionne type 'Images' uniquement"
],
"url": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_photo",
"method": "POST",
"form_fields": {
"file": "[Image from shortcut input]"
},
"automation_setup": {
"title": "Automation iCloud (ZÉRO ACTION)",
"steps": [
"1. App Photos → crée album 'WEVIA Scan'",
"2. App Raccourcis → onglet Automation → + → Création perso",
"3. Déclencheur : 'Photo ajoutée à album' → WEVIA Scan",
"4. Action : Exécuter raccourci 'Scan WEVIA'",
"5. Désactive 'Demander avant d'exécuter'",
"✓ Terminé ! Chaque photo ajoutée au album est scannée auto"
]
},
"share_sheet": true,
"endpoint_raw": "https://weval-consulting.com/api/wevia-apple-ingest.php?action=ingest_photo"
}

View File

@@ -336,66 +336,66 @@ let AG=[{n:'WEVIA Master',rm:'ceo',d:'Head of AI',p:'Orchestrator',sk:'#ffd700',
{n:'ProfitOrch',rm:'ops',d:'dorm',p:'Paperclip',sk:'#b0b0b0',hc:'#666',F:0,re:'🤖',act:['Sync','Execute','Report','Monitor'],si:'sit'},
{n:'NeuralDOM',rm:'ops',d:'dorm',p:'Paperclip',sk:'#b0b0b0',hc:'#666',F:0,re:'🤖',act:['Sync','Execute','Report','Monitor'],si:'sit'}
,
{n:'Fraud Detection ML',rm:'sec',d:'Security',p:'Fraude ML',sk:'#ef4444',hc:'#b91c1c',F:1,wv:1,re:'',savings:'1.40M/an',pp:'PP030',act:['WEVAL','Agent','Autonome','Savings']},
{n:'GDPR Auditor AI',rm:'sec',d:'Security',p:'GDPR',sk:'#ef4444',hc:'#b91c1c',F:1,wv:1,re:'',savings:'560k/an',pp:'PP029',act:['WEVAL','Agent','Autonome','Savings']},
{n:'SoD Continuous Agent',rm:'sec',d:'Security',p:'SoD',sk:'#ef4444',hc:'#b91c1c',F:1,wv:1,re:'',savings:'220k/an',pp:'PP028',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Predictive Maintenance AI',rm:'mfg',d:'Manufacturing',p:'Predictive',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'1.20M/an',pp:'PP013',act:['WEVAL','Agent','Autonome','Savings']},
{n:'OEE Live Agent',rm:'mfg',d:'Manufacturing',p:'OEE',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'940k/an',pp:'PP012',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Quality SPC AI Real-time',rm:'mfg',d:'Manufacturing',p:'SPC',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'780k/an',pp:'PP014',act:['WEVAL','Agent','Autonome','Savings']},
{n:'TOC Bottleneck Optimizer',rm:'mfg',d:'Manufacturing',p:'TOC',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'650k/an',pp:'PP015',act:['WEVAL','Agent','Autonome','Savings']},
{n:'21CFR Audit Trail Agent',rm:'mfg',d:'Manufacturing',p:'21CFR',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'280k/an',pp:'PP051',act:['WEVAL','Agent','Autonome','Savings']},
{n:'ABL Migration Agent',rm:'mfg',d:'Manufacturing',p:'ABL',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'450k/an',pp:'PP056',act:['WEVAL','Agent','Autonome','Savings']},
{n:'EDI Onboarding Agent',rm:'mfg',d:'Manufacturing',p:'EDI',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'210k/an',pp:'PP059',act:['WEVAL','Agent','Autonome','Savings']},
{n:'UX Wrapper Agent',rm:'mfg',d:'Manufacturing',p:'UX',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'110k/an',pp:'PP045',act:['WEVAL','Agent','Autonome','Savings']},
{n:'QAD Extension Governance',rm:'mfg',d:'Manufacturing',p:'QAD',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'',savings:'95k/an',pp:'PP057',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Stockout Predictor ML',rm:'sup',d:'Supply',p:'Stockout',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'850k/an',pp:'PP007',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Inventory Optimizer AI',rm:'sup',d:'Supply',p:'Inventory',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'620k/an',pp:'PP008',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Vendor Fraud Detective',rm:'sup',d:'Supply',p:'Vendor',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'560k/an',pp:'PP010',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Tail Spend Analyzer',rm:'sup',d:'Supply',p:'TailSpend',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'420k/an',pp:'PP011',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Supplier Risk Monitor',rm:'sup',d:'Supply',p:'Supplier',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'380k/an',pp:'PP009',act:['WEVAL','Agent','Autonome','Savings']},
{n:'IC Elimination Agent',rm:'sup',d:'Supply',p:'IC',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'165k/an',pp:'PP039',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Odoo Upgrade Shield',rm:'sup',d:'Supply',p:'Odoo',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'75k/an',pp:'PP058',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Acumatica Live BI Agent',rm:'sup',d:'Supply',p:'BI',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'',savings:'70k/an',pp:'PP044',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Churn Prediction Agent',rm:'sal',d:'Sales',p:'Churn',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'890k/an',pp:'PP018',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Next Best Action Agent',rm:'sal',d:'Sales',p:'NBA',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'680k/an',pp:'PP020',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Veeva NBA Accelerator',rm:'sal',d:'Sales',p:'Veeva',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'380k/an',pp:'PP049',act:['WEVAL','Agent','Autonome','Savings']},
{n:'MQL Scoring AI',rm:'sal',d:'Sales',p:'MQL',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'520k/an',pp:'PP017',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Pipeline Reality Agent',rm:'sal',d:'Sales',p:'Pipeline',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'450k/an',pp:'PP016',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Quote AI Generator',rm:'sal',d:'Sales',p:'Quote',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'340k/an',pp:'PP019',act:['WEVAL','Agent','Autonome','Savings']},
{n:'AL Extension Regression Agent',rm:'sal',d:'Sales',p:'AL',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'',savings:'120k/an',pp:'PP042',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Utilization Optimizer',rm:'hr',d:'HR',p:'Utilization',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'',savings:'740k/an',pp:'PP023',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Attrition Predictor',rm:'hr',d:'HR',p:'Attrition',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'',savings:'480k/an',pp:'PP021',act:['WEVAL','Agent','Autonome','Savings']},
{n:'CV Matcher Pro',rm:'hr',d:'HR',p:'CV',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'',savings:'320k/an',pp:'PP022',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Payroll Verifier AI',rm:'hr',d:'HR',p:'Payroll',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'',savings:'180k/an',pp:'PP024',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Catalog Builder Agent',rm:'hr',d:'HR',p:'Catalog',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'',savings:'130k/an',pp:'PP048',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Multi-Touch Attribution',rm:'mkt',d:'Marketing',p:'Attribution',sk:'#ec4899',hc:'#be185d',F:1,wv:1,re:'',savings:'380k/an',pp:'PP025',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Content AI Personalized',rm:'mkt',d:'Marketing',p:'Content',sk:'#ec4899',hc:'#be185d',F:1,wv:1,re:'',savings:'240k/an',pp:'PP026',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Deliverability WEVADS',rm:'mkt',d:'Marketing',p:'Email',sk:'#ec4899',hc:'#be185d',F:1,wv:1,re:'',savings:'290k/an',pp:'PP027',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Incident AI Responder',rm:'ops',d:'IT Ops',p:'MTTR',sk:'#3b82f6',hc:'#1d4ed8',F:1,wv:1,re:'',savings:'620k/an',pp:'PP031',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Integration Health Agent',rm:'ops',d:'IT Ops',p:'Integration',sk:'#3b82f6',hc:'#1d4ed8',F:1,wv:1,re:'',savings:'280k/an',pp:'PP032',act:['WEVAL','Agent','Autonome','Savings']},
{n:'AML Smart Filter',rm:'dir',d:'Direction',p:'AML',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'',savings:'900k/an',pp:'PP053',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Vault Quality AI',rm:'dir',d:'Direction',p:'Quality',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'',savings:'520k/an',pp:'PP050',act:['WEVAL','Agent','Autonome','Savings']},
{n:'MDM Continuous Quality',rm:'dir',d:'Direction',p:'MDM',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'',savings:'480k/an',pp:'PP060',act:['WEVAL','Agent','Autonome','Savings']},
{n:'DD M&A Analyst',rm:'dir',d:'Direction',p:'DD',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'',savings:'450k/an',pp:'PP035',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Board Report Generator',rm:'dir',d:'Direction',p:'Board',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'',savings:'240k/an',pp:'PP034',act:['WEVAL','Agent','Autonome','Savings']},
{n:'OKR Tracker Agent',rm:'dir',d:'Direction',p:'OKR',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'',savings:'180k/an',pp:'PP033',act:['WEVAL','Agent','Autonome','Savings']},
{n:'T24 Batch Orchestrator',rm:'fin',d:'Finance',p:'T24',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'350k/an',pp:'PP052',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Collection AI Agent',rm:'fin',d:'Finance',p:'DSO',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'320k/an',pp:'PP003',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Cash Flow Predictor AI',rm:'fin',d:'Finance',p:'CashFlow',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'240k/an',pp:'PP002',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Fraud Detection Finance',rm:'fin',d:'Finance',p:'Fraud',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'400k/an',pp:'PP004',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Budget Variance Watchdog',rm:'fin',d:'Finance',p:'Budget',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'150k/an',pp:'PP005',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Multi-Entity Consolidator',rm:'fin',d:'Finance',p:'Consol',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'210k/an',pp:'PP006',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Fast Close Orchestrator',rm:'fin',d:'Finance',p:'Close',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'180k/an',pp:'PP001',act:['WEVAL','Agent','Autonome','Savings']},
{n:'DCAA Compliance Agent',rm:'fin',d:'Finance',p:'DCAA',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'220k/an',pp:'PP046',act:['WEVAL','Agent','Autonome','Savings']},
{n:'OIC Accelerator',rm:'fin',d:'Finance',p:'OIC',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'220k/an',pp:'PP054',act:['WEVAL','Agent','Autonome','Savings']},
{n:'NetSuite Customization',rm:'fin',d:'Finance',p:'NetSuite',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'180k/an',pp:'PP038',act:['WEVAL','Agent','Autonome','Savings']},
{n:'CMDB Enrichment Agent',rm:'fin',d:'Finance',p:'CMDB',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'160k/an',pp:'PP047',act:['WEVAL','Agent','Autonome','Savings']},
{n:'ASC606 Automation',rm:'fin',d:'Finance',p:'ASC606',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'130k/an',pp:'PP055',act:['WEVAL','Agent','Autonome','Savings']},
{n:'BC Performance Accelerator',rm:'fin',d:'Finance',p:'BCPerf',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'85k/an',pp:'PP041',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Cloture FR Agent',rm:'fin',d:'Finance',p:'FR',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'75k/an',pp:'PP040',act:['WEVAL','Agent','Autonome','Savings']},
{n:'SMB Analytics Modernizer',rm:'fin',d:'Finance',p:'SMBBI',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'95k/an',pp:'PP036',act:['WEVAL','Agent','Autonome','Savings']},
{n:'ISV Resilience Agent',rm:'fin',d:'Finance',p:'ISV',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'95k/an',pp:'PP043',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Multi-Entity Consolidator SMB',rm:'fin',d:'Finance',p:'SMBConsol',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'',savings:'140k/an',pp:'PP037',act:['WEVAL','Agent','Autonome','Savings']}];
{n:'Fraud Detection ML',rm:'sec',d:'Security',p:'Fraude ML',sk:'#ef4444',hc:'#b91c1c',F:1,wv:1,re:'🤖',savings:'1.40M/an',pp:'PP030',act:['WEVAL','Agent','Autonome','Savings']},
{n:'GDPR Auditor AI',rm:'sec',d:'Security',p:'GDPR',sk:'#ef4444',hc:'#b91c1c',F:1,wv:1,re:'🤖',savings:'560k/an',pp:'PP029',act:['WEVAL','Agent','Autonome','Savings']},
{n:'SoD Continuous Agent',rm:'sec',d:'Security',p:'SoD',sk:'#ef4444',hc:'#b91c1c',F:1,wv:1,re:'🤖',savings:'220k/an',pp:'PP028',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Predictive Maintenance AI',rm:'mfg',d:'Manufacturing',p:'Predictive',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'1.20M/an',pp:'PP013',act:['WEVAL','Agent','Autonome','Savings']},
{n:'OEE Live Agent',rm:'mfg',d:'Manufacturing',p:'OEE',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'940k/an',pp:'PP012',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Quality SPC AI Real-time',rm:'mfg',d:'Manufacturing',p:'SPC',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'780k/an',pp:'PP014',act:['WEVAL','Agent','Autonome','Savings']},
{n:'TOC Bottleneck Optimizer',rm:'mfg',d:'Manufacturing',p:'TOC',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'650k/an',pp:'PP015',act:['WEVAL','Agent','Autonome','Savings']},
{n:'21CFR Audit Trail Agent',rm:'mfg',d:'Manufacturing',p:'21CFR',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'280k/an',pp:'PP051',act:['WEVAL','Agent','Autonome','Savings']},
{n:'ABL Migration Agent',rm:'mfg',d:'Manufacturing',p:'ABL',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'450k/an',pp:'PP056',act:['WEVAL','Agent','Autonome','Savings']},
{n:'EDI Onboarding Agent',rm:'mfg',d:'Manufacturing',p:'EDI',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'210k/an',pp:'PP059',act:['WEVAL','Agent','Autonome','Savings']},
{n:'UX Wrapper Agent',rm:'mfg',d:'Manufacturing',p:'UX',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'110k/an',pp:'PP045',act:['WEVAL','Agent','Autonome','Savings']},
{n:'QAD Extension Governance',rm:'mfg',d:'Manufacturing',p:'QAD',sk:'#eab308',hc:'#ca8a04',F:1,wv:1,re:'🤖',savings:'95k/an',pp:'PP057',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Stockout Predictor ML',rm:'sup',d:'Supply',p:'Stockout',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'850k/an',pp:'PP007',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Inventory Optimizer AI',rm:'sup',d:'Supply',p:'Inventory',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'620k/an',pp:'PP008',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Vendor Fraud Detective',rm:'sup',d:'Supply',p:'Vendor',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'560k/an',pp:'PP010',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Tail Spend Analyzer',rm:'sup',d:'Supply',p:'TailSpend',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'420k/an',pp:'PP011',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Supplier Risk Monitor',rm:'sup',d:'Supply',p:'Supplier',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'380k/an',pp:'PP009',act:['WEVAL','Agent','Autonome','Savings']},
{n:'IC Elimination Agent',rm:'sup',d:'Supply',p:'IC',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'165k/an',pp:'PP039',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Odoo Upgrade Shield',rm:'sup',d:'Supply',p:'Odoo',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'75k/an',pp:'PP058',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Acumatica Live BI Agent',rm:'sup',d:'Supply',p:'BI',sk:'#a855f7',hc:'#7e22ce',F:1,wv:1,re:'🤖',savings:'70k/an',pp:'PP044',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Churn Prediction Agent',rm:'sal',d:'Sales',p:'Churn',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'890k/an',pp:'PP018',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Next Best Action Agent',rm:'sal',d:'Sales',p:'NBA',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'680k/an',pp:'PP020',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Veeva NBA Accelerator',rm:'sal',d:'Sales',p:'Veeva',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'380k/an',pp:'PP049',act:['WEVAL','Agent','Autonome','Savings']},
{n:'MQL Scoring AI',rm:'sal',d:'Sales',p:'MQL',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'520k/an',pp:'PP017',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Pipeline Reality Agent',rm:'sal',d:'Sales',p:'Pipeline',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'450k/an',pp:'PP016',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Quote AI Generator',rm:'sal',d:'Sales',p:'Quote',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'340k/an',pp:'PP019',act:['WEVAL','Agent','Autonome','Savings']},
{n:'AL Extension Regression Agent',rm:'sal',d:'Sales',p:'AL',sk:'#f43f5e',hc:'#be123c',F:1,wv:1,re:'🤖',savings:'120k/an',pp:'PP042',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Utilization Optimizer',rm:'hr',d:'HR',p:'Utilization',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'🤖',savings:'740k/an',pp:'PP023',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Attrition Predictor',rm:'hr',d:'HR',p:'Attrition',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'🤖',savings:'480k/an',pp:'PP021',act:['WEVAL','Agent','Autonome','Savings']},
{n:'CV Matcher Pro',rm:'hr',d:'HR',p:'CV',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'🤖',savings:'320k/an',pp:'PP022',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Payroll Verifier AI',rm:'hr',d:'HR',p:'Payroll',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'🤖',savings:'180k/an',pp:'PP024',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Catalog Builder Agent',rm:'hr',d:'HR',p:'Catalog',sk:'#14b8a6',hc:'#0f766e',F:1,wv:1,re:'🤖',savings:'130k/an',pp:'PP048',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Multi-Touch Attribution',rm:'mkt',d:'Marketing',p:'Attribution',sk:'#ec4899',hc:'#be185d',F:1,wv:1,re:'🤖',savings:'380k/an',pp:'PP025',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Content AI Personalized',rm:'mkt',d:'Marketing',p:'Content',sk:'#ec4899',hc:'#be185d',F:1,wv:1,re:'🤖',savings:'240k/an',pp:'PP026',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Deliverability WEVADS',rm:'mkt',d:'Marketing',p:'Email',sk:'#ec4899',hc:'#be185d',F:1,wv:1,re:'🤖',savings:'290k/an',pp:'PP027',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Incident AI Responder',rm:'ops',d:'IT Ops',p:'MTTR',sk:'#3b82f6',hc:'#1d4ed8',F:1,wv:1,re:'🤖',savings:'620k/an',pp:'PP031',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Integration Health Agent',rm:'ops',d:'IT Ops',p:'Integration',sk:'#3b82f6',hc:'#1d4ed8',F:1,wv:1,re:'🤖',savings:'280k/an',pp:'PP032',act:['WEVAL','Agent','Autonome','Savings']},
{n:'AML Smart Filter',rm:'dir',d:'Direction',p:'AML',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'🤖',savings:'900k/an',pp:'PP053',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Vault Quality AI',rm:'dir',d:'Direction',p:'Quality',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'🤖',savings:'520k/an',pp:'PP050',act:['WEVAL','Agent','Autonome','Savings']},
{n:'MDM Continuous Quality',rm:'dir',d:'Direction',p:'MDM',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'🤖',savings:'480k/an',pp:'PP060',act:['WEVAL','Agent','Autonome','Savings']},
{n:'DD M&A Analyst',rm:'dir',d:'Direction',p:'DD',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'🤖',savings:'450k/an',pp:'PP035',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Board Report Generator',rm:'dir',d:'Direction',p:'Board',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'🤖',savings:'240k/an',pp:'PP034',act:['WEVAL','Agent','Autonome','Savings']},
{n:'OKR Tracker Agent',rm:'dir',d:'Direction',p:'OKR',sk:'#fbbf24',hc:'#d97706',F:1,wv:1,re:'🤖',savings:'180k/an',pp:'PP033',act:['WEVAL','Agent','Autonome','Savings']},
{n:'T24 Batch Orchestrator',rm:'fin',d:'Finance',p:'T24',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'350k/an',pp:'PP052',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Collection AI Agent',rm:'fin',d:'Finance',p:'DSO',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'320k/an',pp:'PP003',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Cash Flow Predictor AI',rm:'fin',d:'Finance',p:'CashFlow',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'240k/an',pp:'PP002',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Fraud Detection Finance',rm:'fin',d:'Finance',p:'Fraud',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'400k/an',pp:'PP004',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Budget Variance Watchdog',rm:'fin',d:'Finance',p:'Budget',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'150k/an',pp:'PP005',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Multi-Entity Consolidator',rm:'fin',d:'Finance',p:'Consol',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'210k/an',pp:'PP006',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Fast Close Orchestrator',rm:'fin',d:'Finance',p:'Close',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'180k/an',pp:'PP001',act:['WEVAL','Agent','Autonome','Savings']},
{n:'DCAA Compliance Agent',rm:'fin',d:'Finance',p:'DCAA',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'220k/an',pp:'PP046',act:['WEVAL','Agent','Autonome','Savings']},
{n:'OIC Accelerator',rm:'fin',d:'Finance',p:'OIC',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'220k/an',pp:'PP054',act:['WEVAL','Agent','Autonome','Savings']},
{n:'NetSuite Customization',rm:'fin',d:'Finance',p:'NetSuite',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'180k/an',pp:'PP038',act:['WEVAL','Agent','Autonome','Savings']},
{n:'CMDB Enrichment Agent',rm:'fin',d:'Finance',p:'CMDB',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'160k/an',pp:'PP047',act:['WEVAL','Agent','Autonome','Savings']},
{n:'ASC606 Automation',rm:'fin',d:'Finance',p:'ASC606',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'130k/an',pp:'PP055',act:['WEVAL','Agent','Autonome','Savings']},
{n:'BC Performance Accelerator',rm:'fin',d:'Finance',p:'BCPerf',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'85k/an',pp:'PP041',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Cloture FR Agent',rm:'fin',d:'Finance',p:'FR',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'75k/an',pp:'PP040',act:['WEVAL','Agent','Autonome','Savings']},
{n:'SMB Analytics Modernizer',rm:'fin',d:'Finance',p:'SMBBI',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'95k/an',pp:'PP036',act:['WEVAL','Agent','Autonome','Savings']},
{n:'ISV Resilience Agent',rm:'fin',d:'Finance',p:'ISV',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'95k/an',pp:'PP043',act:['WEVAL','Agent','Autonome','Savings']},
{n:'Multi-Entity Consolidator SMB',rm:'fin',d:'Finance',p:'SMBConsol',sk:'#22d3ee',hc:'#0891b2',F:1,wv:1,re:'🤖',savings:'140k/an',pp:'PP037',act:['WEVAL','Agent','Autonome','Savings']}];
AG=AG.filter(function(a){return a&&a.n;});
// Tasks are now per-agent in act[]
@@ -1417,7 +1417,7 @@ function drawLinkLabels(){
var _isDark=false;function toggleDark(){_isDark=!_isDark;document.body.style.background=_isDark?"#0f172a":"#eaeff7";}
var _entLastState='';function checkEntNotif(){var s=DP.map(function(d){return d.id}).join(',');if(s!==_entLastState&&_entLastState!==''){try{var ac=new AudioContext();var o=ac.createOscillator();var g=ac.createGain();o.connect(g);g.connect(ac.destination);o.frequency.value=600;g.gain.value=0.03;o.start();o.stop(ac.currentTime+0.08);}catch(e){}}_entLastState=s;}
</script><div id="wLeg" style="position:fixed;bottom:8px;left:50%;transform:translateX(-50%);display:flex;gap:16px;padding:4px 16px;background:#ffffffdd;backdrop-filter:blur(6px);border-radius:8px;border:1px solid #e2e8f0;font:500 10px Nunito,sans-serif;color:#64748b;z-index:90"><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#22c55e;margin-right:3px"></span>Actif</span><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#f97316;margin-right:3px"></span>Warning</span><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#ef4444;margin-right:3px"></span>Critical</span><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#94a3b8;margin-right:3px"></span>Archive</span></div>
</script><div id="wLeg" style="position:fixed;bottom:8px;left:50%;transform:translateX(-50%);display:flex;gap:16px;padding:4px 16px;background:#ffffffdd;backdrop-filter:blur(6px);border-radius:8px;border:1px solid #e2e8f0;font:500 10px Nunito,sans-serif;color:#64748b;z-index:90"><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#22c55e;margin-right:3px"></span>Actif</span></span><span style="display:inline-flex;gap:4px;align-items:center;margin-left:10px;color:#22d3ee;font-size:10px;font-weight:700"><span style="width:8px;height:8px;border:2px solid #22d3ee;border-radius:50%;display:inline-block"></span>WEVAL Gap-Fill Agent</span><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#f97316;margin-right:3px"></span>Warning</span><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#ef4444;margin-right:3px"></span>Critical</span><span><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#94a3b8;margin-right:3px"></span>Archive</span></div>
<div id="agSearch" style="position:fixed;top:38px;right:12px;z-index:95"><input id="agQ" type="text" placeholder="Search agent..." style="width:160px;padding:4px 8px;border:1px solid #d1d5db;border-radius:6px;font:500 11px Nunito,sans-serif;background:#ffffffee;backdrop-filter:blur(6px);outline:none" oninput="window._agQ=this.value.toLowerCase()"></div>
<script>
// UX Fix: fallback for missing agent icons