auto-commit via WEVIA vault_git intent 2026-04-20T01:44:00+00:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
457
api/blade-mcp-server.py
Normal 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()
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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',
|
||||
);
|
||||
14
api/wired-pending/intent-opus4-wevia_paperclip_ceo_idle.php
Normal file
14
api/wired-pending/intent-opus4-wevia_paperclip_ceo_idle.php
Normal 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',
|
||||
);
|
||||
@@ -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',
|
||||
);
|
||||
@@ -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
556
cartographie-screens.html.pre-autodisc-20260420_034004
Normal file
556
cartographie-screens.html.pre-autodisc-20260420_034004
Normal file
File diff suppressed because one or more lines are too long
@@ -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"}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
33
downloads/wevia-shortcut-calendar.json
Normal file
33
downloads/wevia-shortcut-calendar.json
Normal 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"
|
||||
}
|
||||
34
downloads/wevia-shortcut-calls.json
Normal file
34
downloads/wevia-shortcut-calls.json
Normal 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]"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
39
downloads/wevia-shortcut-contacts.json
Normal file
39
downloads/wevia-shortcut-contacts.json
Normal 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"]
|
||||
}
|
||||
30
downloads/wevia-shortcut-health.json
Normal file
30
downloads/wevia-shortcut-health.json
Normal 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"]
|
||||
}
|
||||
31
downloads/wevia-shortcut-messages.json
Normal file
31
downloads/wevia-shortcut-messages.json
Normal 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"
|
||||
}
|
||||
30
downloads/wevia-shortcut-notes.json
Normal file
30
downloads/wevia-shortcut-notes.json
Normal 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
|
||||
}
|
||||
32
downloads/wevia-shortcut-photos.json
Normal file
32
downloads/wevia-shortcut-photos.json
Normal 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"
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user