{% extends "base.html" %} {% from "macros.html" import pill %} {% block title %}Integrations — Agent Wasp{% endblock %} {% block page_css %} {% endblock %} {% block content %} {# ── Brand logos served locally — no external CDN dependency ────────────── #} {% set LOGOS = { "slack": {"url":"/static/logos/slack.svg", "bg":"#4A154B18"}, "discord": {"url":"/static/logos/discord.svg", "bg":"#5865F218"}, "github": {"url":"/static/logos/github.svg", "bg":"rgba(255,255,255,0.07)"}, "gmail-connector": {"url":"/static/logos/gmail.svg", "bg":"#EA433518"}, "google-calendar": {"url":"/static/logos/googlecalendar.svg", "bg":"#4285F418"}, "telegram": {"url":"/static/logos/telegram.svg", "bg":"#26A5E418"}, "whatsapp": {"url":"/static/logos/whatsapp.svg", "bg":"#25D36618"}, "whatsapp-baileys": {"url":"/static/logos/whatsapp-baileys.svg", "bg":"#128C7E18"}, "spotify": {"url":"/static/logos/spotify.svg", "bg":"#1ED76018"}, "twitter": {"url":"/static/logos/x.svg", "bg":"rgba(255,255,255,0.07)"}, "teams": {"url":"/static/logos/microsoftteams.svg", "bg":"#6264A718"}, "notion": {"url":"/static/logos/notion.svg", "bg":"rgba(255,255,255,0.07)"}, "trello": {"url":"/static/logos/trello.svg", "bg":"#0052CC18"}, "signal": {"url":"/static/logos/signal.svg", "bg":"#3B45FD18"}, "zapier": {"url":"/static/logos/zapier.svg", "bg":"#FF4F0018"}, "home-assistant": {"url":"/static/logos/homeassistant.svg", "bg":"#18BCF218"}, "webhook": {"url":"/static/logos/webhook.svg", "bg":"#6366F118"}, "weather": {"url":"/static/logos/openweathermap.svg", "bg":"#EB6E4B18"}, "matrix": {"url":"/static/logos/matrix.svg", "bg":"rgba(255,255,255,0.07)"}, "obsidian": {"url":"/static/logos/obsidian.svg", "bg":"#7C3AED18"}, "1password": {"url":"/static/logos/1password.svg", "bg":"#3B66BC18"}, "sonos": {"url":"/static/logos/sonos.svg", "bg":"rgba(255,255,255,0.07)"}, "shazam": {"url":"/static/logos/shazam.svg", "bg":"#0088FF18"}, "philips-hue": {"url":"/static/logos/philipshue.svg", "bg":"#0065D318"}, "eight-sleep": {"url":"/static/logos/eightsleep.svg", "bg":"rgba(255,255,255,0.07)"}, "nostr": {"url":"/static/logos/nostr.svg", "bg":"#8B5CF618"}, "zalo": {"url":"/static/logos/zalo.svg", "bg":"#0068FF18"}, "nextcloud-talk": {"url":"/static/logos/nextcloud.svg", "bg":"#0082C918"}, "mcp": {"url":"/static/logos/anthropic.svg", "bg":"rgba(255,255,255,0.07)"}, "browser-controlled": {"url":"/static/logos/googlechrome.svg", "bg":"#4285F418"}, "gif-search": {"url":"/static/logos/giphy.svg", "bg":"#FF666618"}, "image-gen": {"url":"/static/logos/openai.svg", "bg":"rgba(255,255,255,0.07)"}, "email-generic": {"url":"/static/logos/email.svg", "bg":"#64748B18"}, "platform-android": {"url":"/static/logos/android.svg", "bg":"#3DDC8418"}, "platform-windows": {"url":"/static/logos/windows.svg", "bg":"#0078D418"}, "platform-macos": {"url":"/static/logos/macos.svg", "bg":"rgba(255,255,255,0.07)"}, "platform-linux": {"url":"/static/logos/linux.svg", "bg":"#FCC62418"}, "platform-ios": {"url":"/static/logos/ios.svg", "bg":"rgba(255,255,255,0.07)"}, "bluebubbles": {"url":"/static/logos/imessage.svg", "bg":"#34DA5018"}, "cron": {"url":"/static/logos/clockify.svg", "bg":"#03A9F418"}, "webchat": {"url":"/static/logos/googlechat.svg", "bg":"#34A85318"}, } %} {% set CAT_META = { "chat": {"color":"#38BDF8","icon":"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"}, "productivity": {"color":"#4ADE80","icon":"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"}, "media": {"color":"#F472B6","icon":"M9 19V6l12-3v13M9 19c0 1.105-.895 2-2 2s-2-.895-2-2 .895-2 2-2 2 .895 2 2zm12-3c0 1.105-.895 2-2 2s-2-.895-2-2 .895-2 2-2 2 .895 2 2z"}, "social": {"color":"#A78BFA","icon":"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"}, "smart_home": {"color":"#FB923C","icon":"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"}, "tools": {"color":"#FBBF24","icon":"M14.7 6.3a1 1 0 000 1.4l1.6 1.6a1 1 0 001.4 0l3.77-3.77a6 6 0 01-7.94 7.94l-6.91 6.91a2.12 2.12 0 01-3-3l6.91-6.91a6 6 0 017.94-7.94l-3.76 3.76z"}, "security": {"color":"#EF4444","icon":"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"}, "platform": {"color":"#64748B","icon":"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"}, } %} {% set DEF_CAT = {"color":"#6366F1","icon":"M13 10V3L4 14h7v7l9-11h-7z"} %} {% set RISK_COLOR = {"low":"#10B981","medium":"#F59E0B","high":"#EF4444","critical":"#EF4444"} %} {% set enabled_count = integrations | selectattr('enabled') | list | length %} {% set total_count = integrations | length %} {% set cb_open_count = integrations | selectattr('circuit_breaker') | selectattr('circuit_breaker.state', 'equalto', 'open') | list | length %}
{% if enabled_count > 0 %} {% else %} {% endif %}

Integrations

{% if registry_available %} {{ enabled_count }} active · {{ total_count - enabled_count }} idle · {{ total_count }} total {% if cb_open_count %} · {{ cb_open_count }} CB open{% endif %} {% else %} registry unavailable {% endif %}

{% if registry_available and integrations %}
{% set cats = integrations | map(attribute='category') | unique | list | sort %} {% for cat in cats %} {% set cm = CAT_META.get(cat, DEF_CAT) %} {% endfor %}
{% endif %}
{% if not registry_available %}
Integration registry not initialized. Check main.py.
{% elif not integrations %}
No integrations registered.
{% else %} {% set categories = integrations | map(attribute='category') | unique | list | sort %} {% for cat in categories %} {% set cat_integrations = integrations | selectattr('category', 'equalto', cat) | list %} {% set cm = CAT_META.get(cat, DEF_CAT) %}

{{ cat | replace('_', ' ') | title }}

{{ cat_integrations | length }}
{% for intg in cat_integrations %} {% set logo = LOGOS.get(intg.id, None) %} {% set logo_color = logo.bg if logo else cm.color + '22' %} {% set logo_svg = logo_svgs.get(intg.id, '') %} {% set risk_color = RISK_COLOR.get(intg.risk_level, '#64748B') %} {% set cb_state = intg.circuit_breaker.state if intg.circuit_breaker else 'closed' %} {% set is_open = cb_state == 'open' %} {% set is_half = cb_state == 'half_open' %}
{% if logo_svg %}
{{ logo_svg | safe }}
{% else %} {{ intg.name[0] | upper }} {% endif %}
{% if intg.enabled %}{% endif %}
{{ intg.name }} {{ intg.risk_level }} {% if is_open %} CB OPEN {% elif is_half %} CB HALF {% endif %}

{{ intg.description[:60] }}{% if intg.description|length > 60 %}…{% endif %}

{{ intg.metrics.total_calls }} calls {% if intg.metrics.error_rate is not none and intg.metrics.error_rate > 0 %} {{ (intg.metrics.error_rate * 100) | round(1) }}% err {% endif %} {% if intg.metrics.latency_p50_ms %} p50 {{ intg.metrics.latency_p50_ms | int }}ms {% endif %}
{{ intg.actions|length }} action{{ 's' if intg.actions|length != 1 }} {% if is_open %} {% endif %}
{% endfor %}
{% endfor %} {% endif %} {% endblock %}