NAiOSOmni Email
omnichat-emailv0.6.0Fügen Sie einen E-Mail-Kanal (IMAP/SMTP) zu NAiOSOmni hinzu. Ihr Posteingang erscheint als ein weiterer Kanal im einheitlichen Posteingang, mit KI-Autoantwort, vertikalen Agenten und allen Funktionen von NAiOSOmni.
Beschreibung
Plugin, das an NAiOSOmni angeschlossen ist: registriert einen neuen Treiber 'email-imap' im ChannelRegistry von NAiOSOmni, damit jedes IMAP/SMTP-Konto (Gmail mit App-Passwort, IONOS, Outlook privat, geschäftlich) als Kanal angeschlossen werden kann. Eingehende E-Mails erscheinen im einheitlichen Posteingang, gruppiert nach Absender (peer = E-Mail-Adresse). Die spezifischen E-Mail-Daten (Betreff, message-id, Threading, cc/bcc, HTML-Inhalt, Anhänge) werden in media_meta JSON serialisiert, ohne das Schema von NAiOSOmni zu ändern. Die Antworten werden über SMTP mit korrektem Threading (In-Reply-To + Betreff: Re:) gesendet. Der HTML-Inhalt wird über 'Original anzeigen' vom publicRouter des Plugins bereitgestellt (auth-überprüft).
Funktionen (3)
Ihr IMAP-Posteingang erscheint neben WhatsApp und Telegram im einheitlichen Posteingang.
Kompatibel mit Gmail (App-Passwort), IONOS, Outlook privat, geschäftlich. OAuth Google/Microsoft in Phase 2.
Die Antworten behalten In-Reply-To + Betreff: Re:, damit der Client des Empfängers sie korrekt verknüpfen kann.
Changelog
- PHASE 10 · MENSCH IM PROZESS + Tool-Integration RAG
- ENTWURFSMODUS — pro Kanal umschaltbar im Tab Allgemein (nur email-imap). Wenn AKTIV, werden die KI-Autoantworten NICHT gesendet: sie werden mit status='draft' zur Überprüfung gespeichert. Besonderer Bubble mit gestricheltem orangefarbenem Rand + 3 Aktionen: Senden (echtes SMTP jetzt) / Bearbeiten (lädt Text in den Composer + verwirft) / Verwerfen (bereinigt DB + Dateien). PATCH /channels/:id/draft-mode zum Aktivieren/Deaktivieren
- Entwurf-Endpunkte: GET /api/drafts/:msgId (Abruf für Composer), POST /api/drafts/:msgId/send (fördert zu echtem Versand), DELETE /api/drafts/:msgId (bereinigt mit Löschung von Anhängen auf der Festplatte)
- Renderer des Posteingangs: erkennt status='draft', zeigt Header 🤖 Ausstehender KI-Entwurf + anders gestalteten Bubble + Aktionsreihe mit 3 Schaltflächen. Keine Änderungen an Chat-Treibern (WA/TG geben keinen status='draft' aus)
- TOOL search_inbox für Agenten — registriert in TOOLS von OmniChat durch Mutation des exportierten Objekts (keine Änderungen im Kern). Schema OpenAI-Tool mit Parametern {query, top_k}. ctx.invokePlugin delegiert an die searchInbox() des Plugins, die den EmbeddingsStore aufruft. Die Agenten können jetzt semantisch im Posteingang fragen, wenn ein Kunde es verlangt
- Öffentliche Methode searchInbox(args) im Plugin: generiert Embedding der Abfrage, führt Kosinus-Suche aus, gibt top-K formatiert für LLM zurück (ohne Puffer, Scores mit 2 Dezimalstellen, Snippet gekürzt)
- PHASE 9 · E-MAIL-AI-FUNKTIONEN — 4 spezifische KI-Funktionen für E-Mail
- F-1 · AUTOMATISCHE TRIAGE — jede eingehende E-Mail wird von LLM in {dringend, Aktion, zur Kenntnisnahme, Newsletter, Spam} mit Grund in ≤12 Wörtern klassifiziert. Farbige Badge im Bubble des Posteingangs (rot/orange/grau/blau/schwarz). In media_meta.triage gespeichert
- F-4 · ANTI-PHISHING KI — Score 0-1, der im selben LLM-Aufruf wie die Triage berechnet wird (token-effizient). Banner mit Schweregrad über der Nachricht, wenn Score ≥ 0.5 (mittel/hoch/kritisch mit Pulsanimation). Risikofaktoren auf Deutsch. In media_meta.phishing gespeichert
- F-5 · RAG ÜBER DEM POSTEINGANG — eigene SQLite mit Float32-Vektoren (1536-dim, ~6KB/E-Mail). Auto-Indexierung jeder eingehenden Nicht-Spam-E-Mail nach der Analyse. Endpoint POST /api/search mit Embedding der Abfrage + Kosinus in JS. Top-K Ergebnisse mit peer/subject/snippet/score. Integrierte Bereinigung: löscht Embeddings von gelöschten Kanälen
- F-6 · DREI AUTOMATISCH ERSTELLTE ENTWÜRFE — beim Öffnen eines E-Mail-Threads wird eine Reihe von 3 Chips über dem Composer mit Entwürfen in formellem/nähe/kurz gehalten. Klick → lädt den Text in das Textfeld. Cache 5 Minuten pro (Kanal+peer+last_inbound_id), um Tokens beim Navigieren zwischen Tabs nicht erneut zu verbrauchen. Schaltfläche Aktualisieren, um manuell neu zu generieren
- ENDPOINTS — POST /plugins/omnichat-email/api/search, POST /plugins/omnichat-email/api/drafts. Beide auth-überprüft, auf den Benutzer beschränkt
- UI/CSS — Triage-Badges (5 Farben), Phishing-Banner (3 Schweregrade mit Puls), Entwurf-Chips mit Hover-Lift-Effekt. Alles treiberabhängig (nur email-imap, WA/TG intakt)
- Kombination LLM — Triage + Phishing in einem einzigen Aufruf mit einheitlichem Prompt → ~50% Token-Einsparung im Vergleich zu separaten Aufrufen. Modell: gpt-4o-mini für Klassifizierung/Entwürfe, text-embedding-3-small für Vektoren
- PHASE 8 · POLISH & ROBUSTHEIT — die 7 vollständigen Punkte
- B-7 · HTML-E-Mail-Inhalt bereinigen — erlaubte Tags erweitert (style, font, center, table-layout, etc.), um das tatsächliche Format von E-Mails zu bewahren. CSS inline wird nicht gefiltert (parseStyleAttributes=false). meta charset utf-8 über HTTP-Header + meta inline garantiert
- B-2 · IMAP \Seen-Flag — driver.markAsRead(peerId) führt jetzt IMAP-Suche nach-From + STORE +FLAGS \Seen für alle UIDs, die vom Peer ungesehen sind, durch. Endpoint /api/channels/:id/messages löst markAsRead fire-and-forget aus, wenn der Thread bereitgestellt wird (treiberunabhängig, WA/TG sind no-op)
- B-6 · Angereicherter Healthcheck — Tracking der Latenz NOOP (rollendes Fenster 10 Proben), Erkennung von Verschlechterungen (3 NOOPs >5s hintereinander → präventives Reconnect), Hinweis auf Inaktivität (>6h ohne eingehende Nachrichten während der Arbeitszeit → log info)
- B-1 · UI für Quoten im Tab Anti-Spam — neue Karte NUR für Kanäle email-imap mit 3 Eingaben (pro Minute/Stunde/Tag), vorab ausgefüllt aus driver_config.quotas, PATCH /plugins/omnichat-email/channels/:cid/quotas mit angemessenen Grenzen
- B-5 · Cool-down Outbound Dedup — verweigert das erneute Senden derselben (peerId + body) innerhalb von 60s. Hash SHA-1 in einem im Speicher gehaltenen Map, das auf das Fenster beschränkt ist. err.code DEDUP mit Zeit seit dem vorherigen Senden
- B-3 · Bereinigungsjobs für Waisen — täglicher Cron (anfängliche Verzögerung 60s), der data/bodies/<uid>/<cid>/ und uploads/users/<uid>/email-<cid>/ scannt und Verzeichnisse löscht, deren Kanal email-imap nicht mehr in der DB existiert. Kanalbezogener Umfang (pro Nachricht Waisen zurückgestellt)
- B-4 · Dedizierte Metriken — Endpoint /plugins/omnichat-email/api/metrics (nur für Admin/Superadmin) mit insgesamt verbundenen Kanälen, Volumen 24h/7d in/out, Filtereinsparungen, SMTP-Fehler, Quotenhits, durchschnittliche Anhangsgröße, Top-Absender 7d, NOOP-Latenz p50/p95 + langsame Strecken + letzte eingehende Nachricht pro aktivem Kanal
- PHASE 7 · HÄRTERUNG — Härtung des Treibers für den realen Einsatz
- AUSGANGSQUOTEN — Standardwerte 30/min · 200/Stunde · 1000/Tag pro Kanal, Zähler im Speicher mit Zeitstempeln auf 24h begrenzt. Überschreitung → throw mit err.code QUOTA_MINUTE/HOUR/DAY. Überschreibung pro Kanal über driver_config.quotas. _recordSend() zählt nur nach erfolgreichem SMTP (Fehler werden nicht bestraft)
- HEALTHCHECK IMAP NOOP alle 5 Minuten — erkennt stillgelegte IDLE (NAT-Timeout, LB-Reset, serverseitiger Abbruch). NOOP schlägt fehl → schließen → wieder verbinden über bestehendes Backoff. Gestartet nach connect, gestoppt bei disconnect
- STRUKTURIERTE LOG BRIDGE — Treiber gibt 'omnichat-email.log' im Event-Bus aus, das Plugin leitet es an OmniChat.logService.log() weiter. Kategorien: email-rx, email-tx, email-filter, email-quota, email-health. Detaillierte Ereignisse (Betreff, Peer, uid, Anhänge, smtp_code) in Echtzeit im Log-Tab des Kanals sichtbar
- SANITISIERUNG from_name — Hilfsfunktion sanitizeFromName() entfernt CR/LF/Winkelklammern + begrenzt auf 80 Zeichen. Wird bei der anfänglichen Zuordnung und der Bearbeitungsseite der Verbindung angewendet. Blockiert die Injektion von SMTP-Headern
- MAXIMALER ANHANGSGRÖSSE — insgesamt rohe Bytes ≤ 24MB (typisches SMTP-Maximum 25MB mit Overhead base64 +33%). fs.statSync-Summe vor dem Senden, schlägt sauber mit err.code=ATTACHMENT_TOO_LARGE fehl
- STRUKTURIERTE LOGS in allen Fehlpfaden — SMTP lehnt ab (mit smtp_code, falls vorhanden), Quote überschritten (Code), Anhänge zu groß (Bytes), automatischer Mailfilter (Grund), erfolgreicher Empfang/Versand (vollständige Metadaten)
- Umbenennung — 'OmniChat Email' → 'NAiOSOmni Email' im Manifest (id bleibt omnichat-email aus Kompatibilitätsgründen)
- PAIRING (Phase 2) — echte IMAP+SMTP-Validierung mit imapflow + nodemailer.verify(), AES-256-GCM-Verschlüsselung der Anmeldeinformationen mit secret-vault, Sanitär (Passwörter aus driver_config entfernt)
- EMPFANG (Phase 3) — persistentes IMAP IDLE, anfängliches Backfill von 30 E-Mails, Tracking UIDVALIDITY + UIDNEXT, mailparser + sanitize-html, Anhänge auf Festplatte, Sanitär HTML-Inhalt. Wiederverbinden mit Backoff 5/10/30/60/120/300s
- VERSAND (Phase 4) — SMTP mit Pool, korrektes Threading (In-Reply-To + References), 3 Modi für den Betreff (Betreff: explizit / Re: automatisch / synthetisch 60 Zeichen), Header Auto-Submitted: auto-replied (aktives Anti-Loop)
- VER ORIGINAL (Phase 5) — Route /plugins/omnichat-email/body/:cid/:mid liefert sanitisiertes HTML mit striktem CSP + iframe-freundlichen Headern, Besitzprüfung. Anhänge verwenden /uploads/users/ bestehend von NAiOSOmni (kein neuer Authentifizierungscode)
- HERVORHEBUNG VON ANHÄNGEN (Phase 6) — 1 E-Mail = N Anhänge in einem einzigen SMTP-Envelope (anstatt N E-Mails wie bei WA/TG). Treiber akzeptiert content.attachments[] vom Composer und mappt sie auf nodemailer
- EMAIL TACTICAL MODE — Automatischer eingehender E-Mail-Filter (Auto-Submitted, Precedence bulk/list/junk, List-* Header, X-Autoresponse, maschinelle Sender); Unterdrückung von Fortschrittsbenachrichtigungen von Tools (isProgress-Flag, keine weiteren '📚 Abfrage KB…' per E-Mail); Suffix zum system_prompt, wenn driver=email-imap für einen E-Mail-bewussten Ton (eine Antwort, formell, ohne dekorative Emojis)
- EDIT CONNECTION — Seite /plugins/omnichat-email/channels/:cid/edit mit vorab ausgefülltem Formular (Passwörter leer aus Sicherheitsgründen), Validierung vor dem Speichern, Entladen+Laden+Live-Verbindung. 'Neu verknüpfen' im Menü ⋮ leitet automatisch für Kanäle email-imap um
- INBOX UI — Renderer zeichnet jetzt media_meta.attachments[] als Karten (Thumbnails für Bilder, Inline-Player für Video/Audio, Icon+Name+Größe für PDF/Word/Excel/ZIP). Treiberunabhängig, jeder zukünftige Treiber mit derselben Struktur profitiert davon
- Modal 'Kontakt hinzufügen' treiberbewusst — Kopie + Validierung ändern sich je nach Treiber (E-Mail vs Telefon vs Telegram chat_id)
- Tab 'Simulation' für email-imap ausgeblendet (kompatibel aus Designgründen: zustandsabhängige Maschine nur für Chat)
- FEHLER — BigInt-Zwang für uidValidity/uidNext/uid (imapflow >=1.3 gibt sie als BigInt zurück → brach JSON.stringify); _restoreOwnChannels zur Vermeidung von 'Treiber nicht registriert' im Boot-Rennen; Polling von pluginLoader (nicht nur setImmediate, es gibt awaits zwischen loadAll und app.set); CSS-Padding des Modals 'Kanal hinzufügen' (vorhandener Fehler)
- TLS — Flag tls_insecure pro Kanal optional für Server mit Zertifikatsinterzeption (Norton AV / Unternehmensproxies / abgelaufene Zertifikate). Striktes TLS standardmäßig
- Abhängigkeiten — imapflow ^1.3.3, mailparser ^3.9.8, sanitize-html ^2.17.3 (nodemailer war bereits vorhanden)
- Initiales Gerüst — Registrierung des Treibers 'email-imap' im OmniChat ChannelRegistry
- Formularbasiertes Pairing mit IMAP/SMTP-Feldern (Platzhalter — Phase 2 implementiert die echte Validierung)
- Treiber-Stubs: connect/startPairing/sendMessage geben 'noch nicht implementiert' mit der ausstehenden Phase aus