← Bibliothèque / Intelligence
Messagerie omnicanale (boîte unifiée DM + email)
La boîte 2 volets unissant WhatsApp/Messenger/Instagram/web/formulaire/email : temps réel, verdicts d'envoi honnêtes, workers IMAP/SMTP/broker séparés à privilèges minimaux.
Construit à partir de :
Studio BellezaRDC backoffice
Dans le back office
Écran principal Messages en 2 volets (~22 rem liste / lecture droite, 1 seul volet mobile) ; écran Canaux pour connexions ; file É À vérifier pour les inconnus.
Pages & écrans
| Page / zone | Rôle |
|---|---|
/admin/conversations | Onglets À traiter/Toutes/Favoris/Archivées, recherche différée 300 ms, filtres chips canaux, realtime Supabase + refetch 30 s, badges canal colorés + Cliente vs Question + pastille non-lu |
fil de conversation | TOUTES les actions sans quitter : fiche liée, création RDV préremplie, favori/archivage, contrôle segmenté « Qui répond ? » bot/moi, bannière rouge needs_human + raison + « C'est traité », blocage do_not_contact, pièces jointes servies via URL signée stockage privé |
/a-verifier | Messages non reconnus : expéditeur + objet + date et RIEN d'autre ; 2 gestes : promouvoir (relecture source jeton 15 min) ou effacer cascade |
/canaux | OAuth Zernio state HMAC 10 min, callback RE-VÉRIFIE comptes réels avant écriture ; états Déclaré/Configuré/Autorisé/Actif/Santé — erreur = « Inconnu », jamais faux « Non » ; WhatsApp 1 clic façon pahono (GET /api/v1/connect) |
Patterns UI/UX
- Conversation ouverte vit dans l'ADRESSE (?ouverte=…) : survit au reload, partageable par lien
- Vocabulaire effet pas mécanisme (« Marquer hors sujet », « Courriels à classer »)
Composants clés
- workers/{reception,sortie,broker}.mjs
- imapflow enveloppe+texte bornés (PAS mailparser)
- resolveDelivery honnête (web=enregistré seul, channel_not_connected, envoi_refuse…)
Automatisations
- Workers pm2 SÉPARÉS : reception IMAP EXAMINE lecture-seule absolu, curseur compte+boîte+UIDVALIDITY+UID, dedup fail-closed → À vérifier, classement règles par signes (pas de liste blanche)
- sortie SMTP file transactionnelle instance unique : envoyé écrit UNIQUEMENT au transport CONSTATÉ ; echec/inconnu → retourne en file, JAMAIS de date fictive
- broker Zernio isolé (clé globale agence nulle part ailleurs) : liaison provider_account AVANT persistance, destination = dernier entrant, humain a validé EXACTEMENT ce texte sinon 403, HMAC interne fenêtre 120 s
Intelligence artificielle
- Rôle IA
- Drafts IA proposés (jamais auto-envoyés), interrupteur d'assistance à portées (conversation/canal/global) vérifié à création-prise-pré-appel-écriture (epoch → résultat périmé jeté).
- Modèles
- classification locale VPS sans modèle tiers possible (RDC) ou brouillons LLM
- Garde-fous
- verrou santé : aptitude/décision personnalisée → N'ÉCRIT RIEN transmet motivé ; contre-indications → jamais au modèle
Données
- conversations (nouvelle→en_cours→en_attente_client, échéance reponse_due_le posée à l'entrant effacée au transport constaté)
- drafts propose→validé(nommé)→en_cours→envoye|echec|inconnu(+perime epoch)
- regles tri versionnées jeux validés en bloc
- journal_des_envois art.9 texte+version corpus figée
Invariants & pièges
- canal_direct couvre formulaire ET WhatsApp : libellés d'origine = fonction du canal
- Whitelist inter-projets : événement d'un autre projet refusé si canal local disconnected
- Le proxy Next intercepte /mcp/* et les routes token — router avant middleware session