Commit Graph

113 Commits

Author SHA1 Message Date
Hermes Agent f145b815e3 feat: Mistral API (ministral-3b-latest) + Theme-Variablen-System
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 5s
- Chat-Endpoint: datenhimmel → Mistral API (api.mistral.ai/v1)
- Model: ministral-3b-latest (max_tokens=400, temp=0.4)
- API-Key aus MISTRAL_API_KEY env-Variable (nicht mehr config.yaml)
- theme.css als zentrales Variablen-System (nur :root tokens + reset)
- theme.css wird ZUSÄTZLICH geladen — alle <style>-Blöcke bleiben intakt
- Kein Layout-Bruch: alle bestehenden Styles funktionieren weiter
2026-07-15 23:02:52 +02:00
Hermes Agent 9016977158 refactor: zentrales Theme-System — alle CSS in theme.css
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 14m39s
- 11 <style>-Blöcke (623 Zeilen) aus app.py entfernt
- 1485 Zeilen theme.css mit CSS-Custom-Properties
- Alle Design-Tokens als Variablen: Farben, Schrift, Abstände, Radien, Schatten
- Body-Klassen (.public, .admin, .welcome, .toast-page, .legacy-table, .test-page)
- Alle Herz-Buttons identisch: .stat-like-btn, .detail-like-btn, .comment-like-btn
- Bei Design-Änderungen nur noch EINE Datei anpassen

Noch 135 inline style='...' — kommen in separatem Refactoring
2026-07-15 22:55:59 +02:00
Hermes Agent eda106849e fix: einheitliche rote Herzen überall — kein Blau, keine Invertierung
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 13m20s
- .detail-like-btn: SVG fill=#EF4444, liked kein background
- .comment-like-btn: SVG fill=#EF4444, border entfernt, liked kein background
- Alle drei Button-Typen (.stat-like, .detail-like, .comment-like) jetzt identisch:
  Default: rote gefüllte Herzen ohne Border
  Liked: nur rote Herzen, kein Hintergrundwechsel
- media_path-Check: os.path.exists(path) → (MEDIA_DIR / basename).exists()
2026-07-15 22:47:20 +02:00
Hermes Agent 6ab03fbe85 fix: graue Ränder entfernt — .text-only + .stat-like-btn
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 13m47s
- .text-only: border:1px solid #F3F4F6 → entfernt (keine Card-Rahmen)
- .stat-like-btn: border:1px solid #E5E7EB → border:none (kein Button-Rand)
- Herz bleibt solid red #EF4444 im unliked state
2026-07-15 22:41:50 +02:00
Hermes Agent 6600d5e346 fix: Herz-Icon solid red (#EF4444) + CSS liked-state fill
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 12m19s
- SVG fill="none" → fill="#EF4444" (solid red heart)
- CSS default: stroke + fill #EF4444
- CSS liked: stroke + fill #fff (white heart on red button)
- stroke-width 1.5 → 0.5 für cleaner Look
2026-07-15 22:38:20 +02:00
Hermes Agent 82dbc6b076 fix: f-string backslash-escape fixes für Python 3.11 Kompatibilität 2026-07-15 20:12:21 +02:00
Hermes Agent d415736735 fix: Ausverkauft-Banner überdeckt Halle nicht mehr (has-banner class + margin-top)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 14m35s
2026-06-25 10:51:05 +02:00
Hermes Agent 172b33b9be fix: Publish setzt jetzt public=1 + triage_tier=1 (sonst unsichtbar auf Frontpage)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 14m26s
2026-06-25 10:16:13 +02:00
Hermes Agent 0b5696a9c6 feat: Pflicht-Navigation (Impressum/Datenschutz/AGB) auf ALLEN Seiten — Frontpage-Footer + Overlay-Card
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 13m40s
2026-06-25 10:07:00 +02:00
Hermes Agent ff7d96a3a8 feat: Overlay-Look für ALLE Unterseiten — Milchglas + zentrierte Card (Impressum, Login, Register, Profil, Beitrag)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 12m30s
2026-06-25 10:03:08 +02:00
Hermes Agent d108618965 fix: Chat-Button wieder sichtbar + Submit zentriert auf Mobile (dangling CSS bereinigt)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 10m49s
2026-06-25 09:54:49 +02:00
Hermes Agent 4257a11e25 fix: Like-JS neu (kein innerHTML-Überschreiben), Hallenbadge Anthrazit, Datum links in Meta-Zeile
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 14m37s
2026-06-25 09:51:02 +02:00
Hermes Agent a94dbe2659 feat: Sleek Frontend-Redesign — Anthrazit, Off-White, Avatar-Initialen, entfärbte Badges, Mobile-First
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 11m0s
2026-06-25 09:34:39 +02:00
Hermes Agent 3309062f26 feat: LLM-Zusammenfassung extrahiert jetzt auch Halle & speichert beides in DB
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 12m3s
2026-06-25 09:08:36 +02:00
Hermes Agent 5f1abbb519 fix: WhatsApp-Webhook — alte Direktverarbeitung wiederhergestellt (Queue-Infra fehlte komplett)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 5s
2026-06-25 09:02:32 +02:00
Hermes Agent 1173bdb6dc fix: WhatsApp-Webhook — db = get_db() fehlte nach Edge-Queue-Refactor (NameError)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 11m51s
2026-06-25 08:58:49 +02:00
Hermes Agent efe51487f8 fix: /admin Route wiederhergestellt (war durch Edge-Queue-Commit gelöscht)
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 13m4s
2026-06-25 08:52:35 +02:00
Hermes Agent a5eb0e7d27 feat: sys-2 Edge-Queue — Signatur-Prüfung, Dedup, asynchrone Verarbeitung
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 11m21s
- webhook_queue.py: WhatsApp X-Hub-Signature-256 + Telegram Webhook-Intake
- queue_handler.py: SQLite-basierte Queue mit Idempotenz (UNIQUE message_id)
- queue_worker.py: Asynchroner Worker für GPU-Verarbeitung
- app.py: Webhooks umgebaut → sofort 200 OK, Worker verarbeitet später
- Redis 8.0 läuft als Infrastruktur (Queue ist SQLite für Persistenz)
2026-06-21 23:59:17 +02:00
Hermes Agent 5ada0c5018 Fix: Like-Icons im liked-Zustand sichtbar (weißer Stroke)
Problem: Hardgecodetes stroke='#20228a' im SVG verschwand
auf dem ebenfalls blauen .liked-Hintergrund (#20228a).
Fix: CSS-Override für .liked svg/svg path → stroke:#fff !important
in .stat-like-btn, .comment-like-btn und .detail-like-btn.
2026-06-20 11:26:41 +02:00
Hermes Agent 03ae39bc5a Herz-Icon (monochrom BSN-Blau) + Kommentar-Likes
- Like-Icon: Thumbs-Up → modernes Herz-Outline (Feather-Style) in #20228a
- Alle 4 Stellen ersetzt (Frontpage Cards, Card-JS, Detailseite, Detail-JS)
- DB-Migration: ALTER TABLE comments ADD COLUMN likes
- API: POST /api/comment-like/<id> mit Cookie-Dedup
- Like-Button in jedem Kommentar (clike-count)
- CSS .comment-like-btn analog zu .stat-like-btn
- JS: localStorage likedComments für Persistenz
- SQL-Query: comments SELECT um likes erweitert
2026-06-20 11:21:31 +02:00
Hermes Agent b3b110a2ec Filter: Text-Button statt Pfeil-Icon + Overlay-Fenster
- Button zeigt jetzt 'Filter' statt SVG-Pfeil (↑↓)
- Filter-Leiste öffnet sich als Overlay-Fenster (Backdrop + Blur)
- Schließen per Button oder Klick auf Backdrop
- Kein localStorage-Persist mehr (Overlay schließt immer)
2026-06-20 10:44:04 +02:00
Hermes Agent 0dda6f536c Offcanvas-Nav: Community-Sektion mit Login/Registrierung entfernt
Login bleibt nur im Header-Dropdown (rechts oben). Mobile Nav jetzt schlanker:
Navigation → Startseite, Rechtliches → Impressum/Datenschutz/AGB
2026-06-20 10:38:57 +02:00
Hermes Agent 76da62af16 Login-Dropdown in Nav + Welcome-Overlay mit localStorage-Dismiss
- Login/Logout als Dropdown in der Header-Navigation (rechts)
- Dynamisch: eingeloggt = Profil/Abmelden, nicht eingeloggt = Mini-Login-Formular
- Offcanvas-Nav zeigt ebenfalls dynamisch Profil/Logout oder Registrieren/Login
- Welcome-Overlay beim ersten Besuch mit Erklärung der Seite
- Checkbox 'Nicht mehr anzeigen' speichert in localStorage
- Backdrop-Blur wie bei anderen Overlays
2026-06-20 10:35:26 +02:00
Hermes Agent fa63d228f3 Chat: Klickbare Links zu Beiträgen ermöglicht
- Backend: Markdown-Links [text](/beitrag/ID) → HTML <a> im Reply
- Backend: [text](https://...) → klickbare externe Links
- Backend: \n → <br> für korrekte Darstellung mit innerHTML
- Frontend: textContent → innerHTML (Links werden klickbar)
- Ausverkauft-Meldungen: Beitrags-ID im Context für Verlinkung
- System-Prompt: Klarere Link-Anweisungen für LLM
2026-06-19 20:28:06 +02:00
Hermes Agent 0b970f06ed Revert visualViewport-Handler — Overlay rutschte komplett weg
Der translateY(-offsetTop) war zu aggressiv und schob das Overlay
bei iOS-Tastatur-Öffnung komplett aus dem Bildschirm.
Entfernt. Die anderen iOS-Fixes (maximum-scale, 16px-Font, 100dvh) bleiben.
2026-06-19 20:21:12 +02:00
Hermes Agent 4c6baafa10 iOS-Fixes: Zoom + Overlay-Verrutschen bei Tastatur-Öffnung behoben
- Viewport-Meta: maximum-scale=1.0 + viewport-fit=cover + user-scalable=no
  → verhindert Zoom beim Fokussieren von Input-Feldern auf iOS
- Input-Font-Size auf 16px (Chat + Submit-Formular)
  → iOS Safari zoomt nicht mehr rein (<16px trigger)
- Backdrop: height:100dvh für lückenlose Abdeckung
- visualViewport-Resize-Handler: Overlays werden bei iOS-Tastatur
  korrekt nach oben geschoben, kein seitliches Verrutschen mehr
2026-06-19 20:17:06 +02:00
Hermes Agent b458bfd5d4 Mobile-Layout-Fixes: Header-Wrapping + Overlay-Click-Through verhindern
- .site-header: flex-wrap:wrap, kleinere padding/gap, mobile optimiert
- .site-logo-sub: white-space:nowrap entfernt → bricht bei schmalen Screens um
- Overlay-Backdrop z-index auf 10000 (über Bubbles mit 9999)
- Overlays z-index auf 10001 (über Backdrop)
- Bubbles werden via .hidden-Klasse versteckt wenn Overlay offen
- chat-bubble/submit-bubble: opacity/pointer-events Transition
2026-06-19 20:11:00 +02:00
Hermes Agent 4d55bc1b13 phone_hash: Klartext-Telefonnummern durch Hashes ersetzen
- users.phone: NOT NULL entfernt, speichert nur last4
- /register: phone_hash statt Klartext-phone
- WhatsApp-Registrierung: _hash_phone() statt Klartext
- /api/submit: phone_hash in submissions gespeichert
- DB-Migration: bestehendes Klartext-phone in submission #72 gehasht
- submissions: phone_hash column hinzugefügt
2026-06-19 18:06:22 +02:00
Hermes Agent 66f4ef59da fix: user routes mit cleanen String-Templates — kein f-string/.format-Mix 2026-06-19 17:51:41 +02:00
Hermes Agent 392845afb4 user-profiles: Cross-Channel-Identität mit Registrierung, Login, Profil + WhatsApp/Telegram-Flow 2026-06-19 17:44:35 +02:00
Hermes Agent ffff6d1fa3 faq-trigger: auch in /api/chat (Website-Chat) einbauen 2026-06-19 17:37:03 +02:00
Hermes Agent 99a5a8975f chatbot-faq: Nummer-speichern-Hinweis in Willkommenstext + FAQ-Trigger für keine-Antwort-Fragen 2026-06-19 16:57:09 +02:00
Hermes Agent 05532afec6 admin-notify: WhatsApp-Benachrichtigungen an Daniel bei neuer Einsendung + Veröffentlichung 2026-06-19 16:44:20 +02:00
Hermes Agent 9f93d247eb feat: KI-Bewertung + Begründung in Submission-Detail + #76 entblockt 2026-06-19 13:56:48 +02:00
Hermes Agent 8bc524ca9c fix: Audio-Dateien nie auf Frontpage + Sprach-Regeln im Triage-Prompt
- media_publish_flags: .ogg/.mp3/.wav auf '0' (nicht veröffentlichen)
- TRIAGE_PROMPT: Sprachnachrichten-Regeln (dünn=Zusammenfassung, reichhaltig=1:1)
- threading-Import-Fix in WhatsApp/Telegram-Webhooks
2026-06-19 13:36:00 +02:00
Hermes Agent ad3082c195 fix: published_at bei Tier-1-Triage setzen + Mobile-Triage-Badges + für Ungeprüfte
- published_at = CURRENT_TIMESTAMP bei Tier-1-Publish (sonst sortieren NULLs ans Ende)
- Mobile-Cards zeigen jetzt auch Triage-Badge (🟢🟡🔴)
- Desktop-Tabelle zeigt  für noch nicht triagierte Einträge
- TRIAGE_DELAY_SECONDS env-var (default 360)
2026-06-19 13:29:31 +02:00
Hermes Agent 6eadb7342b fix: Frontpage-Text gekürzt (erster Satz/80 Zeichen) + Triage-Timing 6min + SQLite-Fix
- Frontpage: Nur erster Satz pro Karte (max 80 Zeichen)
- Triage: 6 Min Verzögerung nach letzter Nachricht (Thread-Window)
- _run_triage_async: Direkt-SQLite statt get_db() (kein Flask-Context nötig)
2026-06-19 13:04:27 +02:00
Hermes Agent bc8e599018 feat: LLM-Intake-Triage — 3-Stufen-KI-Prüfung aller Chatbot-Einreichungen
- Neue DB-Spalten: triage_tier, triage_reasons, triage_at, public, display_text
- triage_submission() via DeepSeek V4 Flash: klassifiziert in 🟢/🟡/🔴
- display_text: gute Texte 1:1, kurze/noisy Texte werden aufbereitet
- Bild-Sicherheitsprüfung via Gemini Vision (Nazi-Symbole, Gewalt etc.)
- Async nach WhatsApp/Telegram-Webhook — nicht blockierend
- Admin-Dashboard: Triage-Badges + Filter (🟢/🟡/🔴)
- Öffentliches Frontend: Nur public=1 + triage_tier=1 wird angezeigt
- Auto-Antworten: 🟢=Danke, 🟡=Prüfung, 🔴=keine Antwort
2026-06-19 12:56:34 +02:00
Hermes Agent 5181a09c20 feat: Telegram-Bot-Integration — Webhook-Endpoint + Download + Thread-Merge + Auto-Reply
- Neuer Endpoint POST /telegram/webhook (GET=Health-Check)
- Parser für alle Telegram-Nachrichtentypen (Text, Foto, Video, Voice, Audio, Dokument, Sticker, Standort)
- Media-Download via Telegram File API (getFile + Download)
- .mov → .mp4 Konvertierung (ffmpeg)
- 5-Min-Thread-Merge-Logik (gleiches Pattern wie WhatsApp)
- Auto-Reply: Willkommensnachricht für neue Nutzer, Danke für bestehende
- GDPR-Trigger 'Meine Daten löschen' integriert
- #out-Erkennung + ausverkauft-Markierung
- Hintergrund-Transkription + LLM-Auto-Analyse
- TELEGRAM_TOKEN via .env konfigurierbar
2026-06-18 18:38:09 +02:00
Hermes Agent f6581b7de5 feat: Ausverkauft-Auto-Markierung + Chatbot-Integration
Webhook:
- mark_ausverkauft_in_neuheiten(): Cross-Reference-Funktion
  setzt Bit 0 in neuheiten.flags bei #out-Meldungen
- Aufruf sowohl bei neuen Submissions als auch Thread-Appends
- Gefixt: lokales 'import re' entfernt (überschattete globales re)

Chatbot /api/chat:
- Neuheiten-SELECT inkludiert flags-Spalte
- [Neuheit]-Einträge zeigen '🔴 AUSVERKAUFT' bei flags & 1
- [Ausverkauft-Meldung]-Suche in published Submissions
- System-Prompt um Ausverkauft-Regeln ergänzt

Flow: WhatsApp '#out Spielname' → Submission → neuheiten.flags
→ Chatbot warnt aktiv vor vergriffenen Spielen
2026-06-18 15:11:38 +02:00
Hermes Agent bdd7ebb006 fix: OOM-safe SQL filtering + relevance scoring for /api/chat
Problem: On every chat request, ALL 1015 aussteller + 1861 neuheiten rows
were loaded into Python (2876 rows × full-text processing). Multiple
concurrent requests caused OOM kills (exit 137).

Fix:
- SQL LIKE filtering with parameterized queries (WHERE ... OR ... LIMIT 30)
- Relevance scoring in SQL: longer search terms = higher weight
- Tokenization: re.findall strips punctuation ('kosmos?' → 'kosmos')
- Stopword filtering removes noise ('die', 'hat', etc.)
- Removed duplicate 'gibt' in stopwords

Verified: Kosmos, Asmodee (6 Stände), Pegasus (3 Stände), Flip & Write
2026-06-18 14:56:37 +02:00
Hermes Agent ce25870960 fix: Multi-Stand-Merge für Aussteller — Asmodee jetzt mit allen 6 Ständen
- Merge-Logik fasst Aussteller mit ähnlichem Namen zusammen
- Pipe-getrennte Stände korrekt aufgelöst
- Stopwort-Problem identifiziert (wo/finde/ich matchen 558 Einträge)
2026-06-18 14:50:44 +02:00
Hermes Agent 4b50bbfd37 feat: Neuheiten-Suche — 1.861 Spiele in DB + Chatbot-Integration
- Neue Tabelle 'neuheiten' mit 1.861 Spielen von spiel-essen.de
- Themen-Namen aufgelöst (96 Kategorien: Flip'n'Write, Kartenspiel, etc.)
- Chatbot /api/chat durchsucht jetzt Submissions + Aussteller + Neuheiten
- Erweiterter Kontext bei Spiel/Neuheit-Fragen (bis 40 Treffer)
- 586 Verlage mit Verlags-Suche
2026-06-18 14:44:22 +02:00
Hermes Agent ced5604799 feat: Aussteller-Suche für SPIEL Essen — 1015 Verlage in DB + Chatbot-Integration
- Neue Tabelle 'aussteller' mit 1015 Ausstellern von spiel-essen.de
- Chatbot /api/chat durchsucht jetzt Aussteller + Community-Beiträge
- Keyword-Scoring für relevante Treffer (bis 40 bei Hallen-Fragen)
- System-Prompt um Aussteller-Kontext erweitert
- getestet: Pegasus, Kosmos, Halle-3-Suche, Unbekannt-Fallback
2026-06-18 14:41:40 +02:00
Hermes Agent 7c96743237 Double-Opt-In Verification für Kommentare (E-Mail/WhatsApp)
- Neues comments.verification_token Feld (UUID)
- /api/comment: Bei VERIFICATION_REQUIRED=1 → pending + Token
- Verification-Link per E-Mail und WhatsApp versendet
- GET /verify-comment/<token>: Prüfung → LLM-Moderation → published/blocked
- Testsystem-Bypass: VERIFICATION_REQUIRED=0 → direkt published (default)
- Bestehende 40 Kommentare bleiben unangetastet (status='published')
- Token-Einmalgebrauch: 404 bei Wiederverwendung
2026-06-18 01:28:34 +02:00
Hermes Agent 77d4ec426c LLM-Moderation mit DeepSeek V4 Flash + Admin-Kommentarverwaltung + BSN Assistent Umbenennung
- moderate_comment(): LLM-Filter prüft jeden neuen Kommentar auf deutsches Recht & Toxizität
- /api/comment: Moderation vor Benachrichtigung, geblockte Kommentare stillschweigend verworfen
- /admin/comments: Neue Admin-Ansicht für alle Kommentare mit Sperren/Freischalten
- /admin/comment/<id>/<action>: API zum Blocken/Entsperren
- comments.status + moderation_reason Felder in DB
- 'Chat-Assistent' → 'BSN Assistent' überall umbenannt
- System-Prompt: Beitrags-Links im Chat mit echten /beitrag/ID Verweisen
2026-06-18 01:10:02 +02:00
Hermes Agent 90bce41178 Startseite: Kommentar-Count mit Sprechblasen-Icon in BSN-Blau + 34 Demo-Kommentare 2026-06-18 01:00:05 +02:00
Hermes Agent aa1ee564bd Logo-Text: boardgame.network; 🔔→SVG-Glocke in BSN-Blau 2026-06-18 00:56:21 +02:00
Hermes Agent 55da2dbc2d Kommentarsystem: Antworten, Pflichtfelder, Like-Benachrichtigung
- Antworten auf Kommentare (Threading mit parent_id)
- Pflichtfeld E-Mail ODER Handynummer bei Beiträgen und Kommentaren
- Benachrichtigung bei Antworten auf eigene Kommentare (E-Mail/WhatsApp)
- Like-Benachrichtigung an Beitragsersteller (E-Mail/WhatsApp)
- Verschachtelte Kommentardarstellung mit Antwort-Button
- Web-Submit-Overlay um Phone-Feld + Validierung erweitert
- DB-Migration: comments.parent_id/email/phone, submissions.phone
2026-06-18 00:55:09 +02:00
Hermes Agent 97d9768bb5 feat: Kommentar-System mit WhatsApp- & E-Mail-Benachrichtigung
- Neue comments-Tabelle (submission_id, author_name, content)
- POST /api/comment/<id> — Kommentar speichern + Benachrichtigung senden
- WhatsApp: Sender wird per WhatsApp informiert mit Link
- E-Mail: Web-Einreicher mit angegebener E-Mail werden benachrichtigt
- _send_email() über sendmail für Mail-Versand
- Kommentar-Formular + Anzeige auf Detailseite (/beitrag/<id>)
- E-Mail-Feld im Web-Submit-Formular (+ Overlay)
- email-Spalte in submissions-Tabelle
2026-06-18 00:47:51 +02:00