{
  "schema": "ldwf",
  "version": 1,
  "name": "Slack/Teams Zusammenfassungen",
  "meta": {
    "exportedAt": "2025-11-16T16:57:53.528Z",
    "exporter": "client"
  },
  "graph": {
    "nodes": [
      {
        "type": "loop_end",
        "data": {
          "comment": "✔️ SCHRITT 3b: Schleife beenden\n\n🎯 Was macht dieser Schritt?\nBeendet die Channel-Schleife nachdem alle Channels durchlaufen wurden und sammelt die Ergebnisse.\n\n⚙️ Setup:\nKeine Konfiguration erforderlich - gehört automatisch zur Loop-Struktur.\n\n📤 Wichtig zu wissen:\n- Dieser Node ist technisch erforderlich für jede Loop\n- Er sammelt alle Ergebnisse aus den Loop-Iterationen\n- Die gesammelten Nachrichten werden an den nächsten Schritt weitergegeben\n- Error Handling: 'continue' = Fehler in einem Channel stoppt nicht den gesamten Workflow\n\n✏️ Personalisierung:\n• Error Handling ändern:\n  - 'continue': Bei Fehler werden restliche Channels trotzdem verarbeitet (empfohlen)\n  - 'stop': Bei Fehler stoppt der gesamte Workflow sofort\n\n💡 Tipp: Lass diesen Node unverändert, es sei denn du möchtest das Fehlerverhalten anpassen.",
          "executionId": null,
          "errorHandling": {
            "strategy": "continue"
          },
          "name": "Loop End",
          "slug": "channelLoopEnd",
          "loopEndSlug": "channelLoop"
        },
        "id": "3f6c29a2-ead3-425e-90ea-c561eb38b6ca",
        "position": {
          "x": 2240,
          "y": 10090
        }
      },
      {
        "type": "code",
        "data": {
          "comment": "⏱️ SCHRITT 2: Zeitfenster-Berechnung\n\n🎯 Was macht dieser Schritt?\nBerechnet automatisch das Zeitfenster der letzten 24 Stunden im korrekten Format für die Slack API (RFC3339/ISO 8601 in UTC).\n\n⚙️ Setup:\nKeine Konfiguration erforderlich - funktioniert automatisch!\n\n📤 Ausgabe:\n- oldest: Start-Zeitpunkt (vor 24h) im Format '2024-01-15T17:00:00.000Z'\n- latest: Aktueller Zeitpunkt im Format '2024-01-16T17:00:00.000Z'\n- readableOldest: Lesbare deutsche Zeit für E-Mail\n- readableLatest: Lesbare deutsche Zeit für E-Mail\n\n✏️ Personalisierung:\n• Zeitfenster ändern: Ersetze '24' durch andere Stundenzahl\n  - 48 Stunden: ändere '24 * 60 * 60 * 1000' zu '48 * 60 * 60 * 1000'\n  - 12 Stunden: ändere zu '12 * 60 * 60 * 1000'\n  - 7 Tage: ändere zu '7 * 24 * 60 * 60 * 1000'\n\n• Datumsformat ändern: Passe 'de-DE' an deine Locale an\n  - 'en-US' für amerikanisches Format\n  - 'fr-FR' für französisches Format",
          "executionId": null,
          "errorHandling": {
            "strategy": "stop"
          },
          "name": "Zeitfenster berechnen",
          "slug": "calculateTimeWindow",
          "language": "javascript",
          "code": "// Berechne den Zeitraum der letzten 24 Stunden\nconst now = new Date();\nconst yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n\n// Formatiere im RFC3339-Format für Slack (UTC)\nconst oldest = yesterday.toISOString();\nconst latest = now.toISOString();\n\nreturn {\n  oldest: oldest,\n  latest: latest,\n  readableOldest: yesterday.toLocaleString('de-DE'),\n  readableLatest: now.toLocaleString('de-DE')\n};"
        },
        "id": "b010909f-9c87-4358-a0f8-a8f30bc4e43e",
        "position": {
          "x": 560,
          "y": 10090
        }
      },
      {
        "type": "agent",
        "data": {
          "comment": "🤖 SCHRITT 5: KI-Analyse & Zusammenfassung\n\n🎯 Was macht dieser Schritt?\nEin intelligenter KI-Agent analysiert alle gesammelten Nachrichten und erstellt eine strukturierte, thematisch gruppierte Zusammenfassung mit Diskussionen, Entscheidungen und Action Items.\n\n⚙️ Setup:\nKeine zusätzliche Konfiguration erforderlich - verwendet Standard-KI-Modell.\n\n📤 Strukturierte Ausgabe:\n- summary: HTML-formatierte Zusammenfassung (Hauptinhalt)\n- success: Boolean ob Analyse erfolgreich war\n- message_count: Anzahl analysierter Nachrichten\n- key_topics: Liste der identifizierten Hauptthemen\n\n✏️ Personalisierung - PROMPT ANPASSEN:\n\n1. Unternehmenskontext hinzufügen:\n   'Kontext: Wir sind ein [Branche]-Unternehmen mit Fokus auf [Themen].\n   Achte besonders auf [spezifische Aspekte].'\n\n2. Zusammenfassungsstruktur ändern:\n   - Andere Kategorien: 'Gruppiere nach: Produkt, Team, Priorität'\n   - Länge anpassen: 'Max. 500 Wörter' oder 'Sehr detailliert'\n   - Tonfall: 'Formell/Informell/Executive Summary'\n\n3. Spezielle Filter:\n   - 'Ignoriere Social-Chat und konzentriere dich auf Business-Themen'\n   - 'Hebe Kundenfeedback besonders hervor'\n   - 'Markiere dringende Items mit ⚠️'\n\n4. Sprache ändern:\n   Ersetze 'Deutsch' durch 'English', 'Français', etc.\n\n5. Ausgabe-Format anpassen:\n   - Markdown statt HTML\n   - Bullet-Points vs. Fließtext\n   - Mit/ohne Emojis",
          "executionId": null,
          "errorHandling": {
            "strategy": "stop"
          },
          "slug": "messageAnalyzer",
          "assistantId": null,
          "mode": "create",
          "name": "Nachrichten-Analyzer",
          "prompt": {
            "mode": "manual",
            "value": "Du bist ein intelligenter Assistent, der Slack-Nachrichten analysiert und zusammenfasst.\n\nDeine Aufgabe:\n1. Analysiere alle Nachrichten aus den verschiedenen Channels der letzten 24 Stunden\n2. Identifiziere die wichtigsten Diskussionen, Entscheidungen und Action Items\n3. Gruppiere die Erkenntnisse nach Themen\n4. Erstelle eine strukturierte, gut lesbare Zusammenfassung\n\nNachrichten-Daten:\n{{getSlackMessages.output}}\n\nZeitraum: {{calculateTimeWindow.output.readableOldest}} bis {{calculateTimeWindow.output.readableLatest}}\n\nBitte erstelle eine professionelle Zusammenfassung, die:\n- Nach Themen/Kategorien strukturiert ist\n- Die wichtigsten Diskussionen hervorhebt\n- Alle getroffenen Entscheidungen auflistet\n- Action Items klar benennt mit Verantwortlichen (falls erkennbar)\n- In klarem, prägnanten Deutsch verfasst ist\n- Mit HTML-Formatierung für E-Mail versehen ist (<b>, <i>, <ul>, <li>, <br>, <h3>)"
          },
          "attachmentIds": [],
          "output": "structured",
          "connectionOverrides": {},
          "outputSchema": [
            {
              "id": "e5b12c28-38a4-4ada-b9ab-9f25d8de3864",
              "name": "summary",
              "description": "Die vollständige HTML-formatierte Zusammenfassung",
              "type": "string",
              "required": true
            },
            {
              "id": "9fcf99ff-e379-4836-a959-cf5c8b78c543",
              "name": "success",
              "description": "Ob die Analyse erfolgreich war",
              "type": "boolean",
              "required": true
            },
            {
              "id": "ad065cd1-3f68-4d72-aeb8-7360c6ef7e7e",
              "name": "message_count",
              "description": "Anzahl der analysierten Nachrichten",
              "type": "number",
              "required": false
            },
            {
              "id": "8d353f80-1bc5-49ee-ab3e-58f5311bd3d1",
              "name": "key_topics",
              "description": "Liste der identifizierten Hauptthemen",
              "type": "string",
              "required": false
            }
          ],
          "modelId": "c968689a-c0d9-49de-aa76-b10ed15ebb0e",
          "tools": [],
          "maxSteps": 25
        },
        "id": "f1c90c3a-9763-4a05-9227-385f5e5d33bf",
        "position": {
          "x": 2800,
          "y": 10090
        }
      },
      {
        "type": "loop",
        "data": {
          "comment": "🔁 SCHRITT 3: Channel-Schleife\n\n🎯 Was macht dieser Schritt?\nIteriert über alle konfigurierten Slack-Channels und ruft für jeden Channel die Nachrichten ab.\n\n⚙️ WICHTIG - Setup erforderlich:\n1. Slack-Channel-IDs finden:\n   - Öffne Slack im Browser\n   - Rechtsklick auf den gewünschten Channel → 'Link zum Channel kopieren'\n   - Die ID ist im Link: slack.com/archives/C123ABC456\n   - C123ABC456 ist deine Channel-ID\n\n2. Channel-IDs im loopArrayValue eintragen:\n   Ersetze die Beispiel-IDs durch deine echten Channel-IDs\n   Beispiel: {{ [\"C06TGHU12AB\", \"C07XYZW34CD\", \"C08MNOP56EF\"] }}\n\n✏️ Personalisierung:\n• Mehr/weniger Channels: Füge Channel-IDs hinzu oder entferne sie\n  - Minimum: 1 Channel\n  - Maximum: 20 Channels (siehe maxIterations)\n\n• Channels dynamisch laden: Du kannst Channel-IDs auch aus einem\n  vorherigen Code-Node laden statt sie fest einzutragen\n\n• Parallele Verarbeitung: Ändere 'concurrency: false' zu 'true'\n  für schnellere Ausführung (alle Channels gleichzeitig)",
          "executionId": null,
          "errorHandling": {
            "strategy": "stop"
          },
          "name": "Channels durchlaufen",
          "slug": "channelLoop",
          "loopArrayValue": "{{ [\"CHANNEL_ID_1\", \"CHANNEL_ID_2\", \"CHANNEL_ID_3\"] }}",
          "maxIterations": 20,
          "concurrency": false
        },
        "id": "c64a612c-6dde-45d8-a8d2-1f438ca29117",
        "position": {
          "x": 1120,
          "y": 10090
        }
      },
      {
        "type": "trigger",
        "data": {
          "comment": "📅 SCHRITT 1: Zeitgesteuerter Start\n\n🎯 Was macht dieser Schritt?\nStartet den Workflow automatisch jeden Tag um 17:00 Uhr (Server-Zeit UTC).\n\n⚙️ Setup:\n- Cron-Ausdruck: '0 17 * * *' bedeutet täglich um 17:00 Uhr\n- Zeitzone: UTC (Coordinated Universal Time)\n\n✏️ Personalisierung:\n• Ausführungszeit ändern: Passe den Cron-Ausdruck an\n  - '0 9 * * *' = 9:00 Uhr morgens\n  - '0 12 * * 1-5' = 12:00 Uhr nur Montag-Freitag\n  - '0 */4 * * *' = Alle 4 Stunden\n  - '0 17 * * 1' = Jeden Montag um 17:00 Uhr\n\n💡 Tipp: Berechne die UTC-Zeit basierend auf deiner lokalen Zeitzone:\n- Deutschland (CET/CEST): 17:00 UTC = 18:00/19:00 lokale Zeit",
          "executionId": null,
          "errorHandling": {
            "strategy": "stop"
          },
          "slug": "dailyTrigger",
          "name": "Täglich um 17:00",
          "kind": "scheduled",
          "cron": "0 17 * * *"
        },
        "id": "9616e9db-c0c2-44cd-9d25-c033e312dfc8",
        "position": {
          "x": 20,
          "y": 10090
        }
      },
      {
        "type": "action",
        "data": {
          "comment": "📧 SCHRITT 6: E-Mail-Versand\n\n🎯 Was macht dieser Schritt?\nVersendet die KI-generierte Zusammenfassung als HTML-formatierte E-Mail an definierte Team-Mitglieder.\n\n⚙️ WICHTIG - Setup erforderlich:\n1. E-Mail-Empfänger ändern:\n   - Ersetze 'team@example.com' durch echte E-Mail-Adresse(n)\n   - Für mehrere Empfänger: 'email1@example.com, email2@example.com'\n\n2. Gmail-Verbindung:\n   - Wähle deine Gmail-Verbindung aus\n   - Falls keine existiert: Erstelle neue Gmail-Verbindung\n   - Alternative: Nutze Outlook Email Integration statt Gmail\n\n📤 E-Mail-Inhalt:\n- Betreff: Enthält Datum der Zusammenfassung\n- Body: HTML-formatierte Zusammenfassung vom KI-Agent\n- Footer: Automatisch generiert-Hinweis\n\n✏️ Personalisierung:\n\n1. Betreffzeile anpassen:\n   Beispiele:\n   - 'Daily Slack Digest - {{calculateTimeWindow.output.readableLatest}}'\n   - 'Team Update: Wichtigste Slack-Diskussionen'\n   - '📢 Täglicher Channel-Überblick'\n\n2. E-Mail-Layout anpassen (mailBody):\n   - Firmen-Logo hinzufügen: '<img src=\"https://...\">'\n   - Farben ändern: style='color: #YOUR_COLOR'\n   - Schriftart: style='font-family: Arial, sans-serif'\n   - Zusätzliche Sections: '<h3>Statistiken</h3>...'\n\n3. CC/BCC hinzufügen:\n   - Aktiviere CC-Feld: mode: 'manual', value: 'cc@example.com'\n   - Aktiviere BCC-Feld: mode: 'manual', value: 'bcc@example.com'\n\n4. Bedingte E-Mail:\n   Füge davor einen Condition-Node hinzu:\n   'Sende nur wenn {{messageAnalyzer.output.structured.message_count}} > 0'\n\n5. Anhänge hinzufügen:\n   Erweitere mit attachments-Feld (erfordert Datei-Referenz)",
          "executionId": null,
          "errorHandling": {
            "strategy": "stop"
          },
          "slug": "sendSummaryEmail",
          "actionId": "7e540add-fe6d-44c2-b224-f7c384573cdf",
          "config": {
            "connectionId": null,
            "requiresConfirmation": false,
            "modelId": "64776bd9-4c58-42d0-8301-2c8a4566e68c",
            "fields": {
              "cc": {
                "mode": "none"
              },
              "bcc": {
                "mode": "none"
              },
              "mailBody": {
                "mode": "manual",
                "value": "<html><body><h2>Täglicher Slack Channel Digest</h2><p><i>Zeitraum: {{calculateTimeWindow.output.readableOldest}} - {{calculateTimeWindow.output.readableLatest}}</i></p><hr>{{messageAnalyzer.output.structured.summary}}<hr><p style='color: #666; font-size: 12px;'>Dieser Bericht wurde automatisch generiert.</p></body></html>"
              },
              "mailSubject": {
                "mode": "manual",
                "value": "Täglicher Slack Digest - {{calculateTimeWindow.output.readableLatest}}"
              },
              "mailRecipient": {
                "mode": "manual",
                "value": "team@example.com"
              }
            }
          }
        },
        "id": "2c064569-2f6d-4196-b6c2-7152b9cbadfe",
        "position": {
          "x": 3344,
          "y": 10090
        }
      },
      {
        "type": "action",
        "data": {
          "comment": "💬 SCHRITT 4: Slack-Nachrichten abrufen\n\n🎯 Was macht dieser Schritt?\nRuft alle Nachrichten der letzten 24 Stunden aus dem aktuellen Channel ab, inklusive aller Thread-Antworten.\n\n⚙️ WICHTIG - Setup erforderlich:\n1. Slack-Integration verbinden:\n   - Klicke auf diesen Node\n   - Wähle deine Slack-Verbindung aus\n   - Falls keine existiert: Erstelle eine neue Slack-Verbindung\n\n2. Berechtigungen prüfen:\n   - Die Slack-App benötigt folgende Scopes:\n     • channels:history (für öffentliche Channels)\n     • groups:history (für private Channels)\n     • channels:read / groups:read\n\n📥 Was wird abgerufen:\n- Alle Nachrichten im Zeitfenster (oldest bis latest)\n- Thread-Antworten (showThreads: true)\n- Nachrichten-Metadaten (User, Timestamp, Reactions, etc.)\n\n✏️ Personalisierung:\n• Threads ausschließen: Ändere showThreads zu {{ false }}\n  (spart API-Aufrufe, aber verliert Thread-Kontext)\n\n• Zusätzliche Filter: Erweitere den Code-Node vorher,\n  um bestimmte User oder Keywords zu filtern",
          "executionId": null,
          "errorHandling": {
            "strategy": "stop"
          },
          "slug": "getSlackMessages",
          "actionId": "24e7ff11-e23c-4547-a401-6de9b7b49871",
          "config": {
            "connectionId": null,
            "requiresConfirmation": false,
            "modelId": "64776bd9-4c58-42d0-8301-2c8a4566e68c",
            "fields": {
              "latest": {
                "mode": "manual",
                "value": "{{calculateTimeWindow.output.latest}}"
              },
              "oldest": {
                "mode": "manual",
                "value": "{{calculateTimeWindow.output.oldest}}"
              },
              "channelId": {
                "mode": "manual",
                "value": "{{channelLoop}}"
              },
              "showThreads": {
                "mode": "manual",
                "value": "{{ true }}"
              }
            }
          }
        },
        "id": "dc7f5870-9a1a-439d-9a6d-bb5090e3d8f2",
        "position": {
          "x": 1680,
          "y": 10090
        }
      }
    ],
    "edges": [
      {
        "id": "12c2a284-eb99-4079-89d4-8985f70b2629",
        "source": "c64a612c-6dde-45d8-a8d2-1f438ca29117",
        "target": "dc7f5870-9a1a-439d-9a6d-bb5090e3d8f2",
        "animated": false,
        "sourceHandle": "output-success",
        "targetHandle": "input-default",
        "conditionId": null
      },
      {
        "id": "953610dc-187b-4253-8c62-4021ce2db6b6",
        "source": "9616e9db-c0c2-44cd-9d25-c033e312dfc8",
        "target": "b010909f-9c87-4358-a0f8-a8f30bc4e43e",
        "animated": false,
        "sourceHandle": "output-success",
        "targetHandle": "input-default",
        "conditionId": null
      },
      {
        "id": "ab9b8755-b749-449a-8692-42817f743af1",
        "source": "b010909f-9c87-4358-a0f8-a8f30bc4e43e",
        "target": "c64a612c-6dde-45d8-a8d2-1f438ca29117",
        "animated": false,
        "sourceHandle": "output-success",
        "targetHandle": "input-default",
        "conditionId": null
      },
      {
        "id": "1a9c1993-7dc2-4aa1-bb13-e93f25db66ee",
        "source": "dc7f5870-9a1a-439d-9a6d-bb5090e3d8f2",
        "target": "3f6c29a2-ead3-425e-90ea-c561eb38b6ca",
        "animated": false,
        "sourceHandle": "output-success",
        "targetHandle": "input-default",
        "conditionId": null
      },
      {
        "id": "bd48a1c6-fdb3-4c26-85ae-6ef76802c414",
        "source": "3f6c29a2-ead3-425e-90ea-c561eb38b6ca",
        "target": "f1c90c3a-9763-4a05-9227-385f5e5d33bf",
        "animated": false,
        "sourceHandle": "output-success",
        "targetHandle": "input-default",
        "conditionId": null
      },
      {
        "id": "4ff96b3f-0d6a-4c8b-bfc3-58fe19cad592",
        "source": "f1c90c3a-9763-4a05-9227-385f5e5d33bf",
        "target": "2c064569-2f6d-4196-b6c2-7152b9cbadfe",
        "animated": false,
        "sourceHandle": "output-success",
        "targetHandle": "input-default",
        "conditionId": null
      }
    ]
  }
}