Commit graph

326 Commits

Autor SHA1 Nachricht Datum
Claude Dev
18b7c1f8a0 Fix: CSP blockierte GEOINT-Satellitenbilder und externe APIs
Content-Security-Policy erweitert:
- img-src: server.arcgisonline.com (Esri Satellite Tiles)
- connect-src: earthquake.usgs.gov, api.gdeltproject.org
- script-src: unpkg.com (Leaflet.heat Plugin)
2026-03-24 09:46:42 +01:00
Claude Dev
9941ee646e Fix: GEOINT Satellitenkarte grau - Scanline-Overlay und Tile-Layer-Handling korrigiert
- ::after Pseudo-Element entfernt (ueberdeckte Tiles)
- position:relative vom map-container entfernt
- Tile-Layer Entfernung in separatem Array (vermeidet eachLayer-Mutation)
- pane:overlayPane von Labels entfernt
- bringToBack() auf Satellite-Layer
2026-03-24 09:42:21 +01:00
Claude Dev
b2be1358ab GEOINT-Modus: Experimentelle taktische Kartenansicht mit Echtzeit-Datenlayern
Neuer experimenteller GEOINT-Modus per Checkbox auf der Karten-Kachel:
- Satellitenbilder (Esri World Imagery) statt OSM-Strassenkarte
- Echtzeit-Flugverkehr (airplanes.live via Backend-Proxy, 15s Refresh)
- Erdbeben-Layer (USGS M2.5+, pulsierende Kreise nach Magnitude)
- GDELT Nachrichten (geokodierte Echtzeit-News, Cluster-Darstellung)
- Heatmap-Visualisierung der Artikel-Standorte (Leaflet.heat)
- Timeline-Slider fuer zeitliche Filterung der Artikel-Marker
- Koordinatenanzeige (Lat/Lon unter Mauszeiger)
- Distanzmessung (Klick-zu-Klick mit km-Anzeige)
- Taktisches Styling (dunkle Tonung, gruene Akzente, Scanlines)

Neue Dateien: geoint.js, geoint.css, routers/geoint.py
Inspiriert von WorldView/Gods Eye Konzept, komplett eigenentwickelt.
2026-03-24 09:29:19 +01:00
Claude Dev
fdbffa7e00 Chat-Assistent: UI-Bezeichnungen aktualisiert
Ad-hoc Lage -> Live-Monitoring, Ereignis beobachten
Recherche -> Recherche, Thema analysieren
Erstellen -> Lage anlegen
Lagebild/Recherchebericht Unterscheidung dokumentiert
Neue Regel: AKTUELLE UI-BEZEICHNUNGEN immer verwenden
2026-03-24 08:32:13 +01:00
Claude Dev
d274ec237b Fix: Fehler beim Laden wenn Kacheln ausgeblendet sind
_applyLayout entfernte Widgets ohne die Card-Elemente vorher zu parken.
Beim Wiederherstellen eines Layouts mit versteckten Kacheln (z.B. Timeline)
gingen die DOM-Elemente verloren, was zu null-Referenz-Fehlern fuehrte.

Fixes:
- layout.js: Cards in tile-parking retten bevor Widget entfernt wird
- app.js: Null-Guards in rerenderTimeline und _updateTimelineCount
2026-03-24 07:34:56 +01:00
Claude Dev
c7d7bbbb18 Kachel-Label dynamisch: Recherchebericht bei Recherche-Lagen, Lagebild bei Live-Monitoring
Betrifft: Card-Title, Layout-Toggle, PDF-Export, Benachrichtigungs-Toggle.
Bei Typ research wird ueberall Recherchebericht angezeigt statt Lagebild.
2026-03-24 07:29:14 +01:00
Claude Dev
f60edb42f7 Fix broken source links caused by LLM-generated letter suffixes (e.g. 1383a)
The LLM occasionally generates source references with letter suffixes
(e.g. [1383a], [1396b]) despite being instructed not to. This caused
broken links because the sources array only contained integer nr values.

Backend: Add _sanitize_sources() to strip letter suffixes after parsing
and deduplicate, preferring entries with valid URLs.

Frontend: Add fallback in citation renderer - when a suffix reference
like [1383a] has no matching source with URL, fall back to the base
number [1383].

Also cleaned up 99 broken suffix entries and 44 suffix references in
the Irankonflikt incident (ID 6) database records.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 23:47:02 +01:00
Claude Dev
a136e0625f Fix tutorial leaving tiles extremely small after completion
GridStack v12 removeInternalForSave() deletes w/h properties from
save() output when they equal minW/minH (or 1). This caused
_removeDemoView() to pass h:undefined to grid.update(), which
GridStack then defaulted to h:1, shrinking all tiles.

Fix: save layout by reading node properties directly instead of
using _grid.save(false), ensuring w and h are always preserved.
2026-03-23 23:41:33 +01:00
Claude Dev
c8279bc69b Tutorial: Schritt 21 Spotlight verzögert + Schritt 23 Demo entfernt
- Schritt 21: deferSpotlight verhindert falschen initialen Rahmen
- Schritt 23: Kein disableNav/Demo mehr, normaler Step mit Weiter-Button
2026-03-23 23:34:25 +01:00
Claude Dev
3e3273470b Telegram: Eigene Kategorie statt Ausrichtungs-Kategorisierung
- source_rules: t.me -> telegram in DOMAIN_CATEGORY_MAP
- components: telegram Label in _categoryLabels
- CSS: cat-telegram Badge in Telegram-Blau (#0088cc)
- DB: 106 bestehende Telegram-Quellen auf Kategorie telegram gesetzt
- Tutorial: Telegram in Quellenübersicht-Erklaerung aufgenommen
2026-03-23 23:14:59 +01:00
Claude Dev
360f6bb872 Tutorial: Timeline Spotlight-Fix + Karten-Marker pulsieren
Schritt 21: Spotlight+Bubble werden 300ms nach GridStack-Update neu
positioniert. Kein falscher Rahmen mehr auf der Karte.

Schritt 23: Alle Marker pulsieren kurz (scale 1.8x) bevor der Cursor
sie besucht, damit Nutzer sieht was anklickbar ist.
2026-03-23 23:08:01 +01:00
Claude Dev
073c11431d Tutorial Schritt 21: Bubble unter Kachel, Kachel hoeher, scrollIntoView
- position: bottom statt top (Bubble verschwindet nicht mehr oben)
- Kachel auf min h=5 vergroessert (Detail-Panel passt rein)
- scrollIntoView auf die Kachel damit alles sichtbar ist
2026-03-23 23:02:23 +01:00
Claude Dev
7a804f762c Tutorial: Kein Springen bei allen Steps - Bubble erst nach Clamp sichtbar
Nicht-Modal-Steps: visible nach requestAnimationFrame Clamp+Arrow
Modal-Steps: visible nach 450ms Reposition + Clamp+Arrow
Kein Step zeigt die Bubble mehr an der falschen Position.
2026-03-23 22:58:53 +01:00
Claude Dev
66ecde1d61 Tutorial: Kein sichtbarer Sprung bei Modal-Steps
Bubble wird bei Modal-Steps erst unsichtbar positioniert, dann nach
450ms (wenn Modal-Transition abgeschlossen) korrekt repositioniert
und erst dann sichtbar gemacht.
2026-03-23 22:55:14 +01:00
Claude Dev
9b5c718816 Sidebar: Recherche -> Recherchen 2026-03-23 22:51:58 +01:00
Claude Dev
8bbf7fceac Sidebar: Deep-Research -> Recherche 2026-03-23 22:51:20 +01:00
Claude Dev
e9d1f2ddb3 Wording: Neue Lage -> Neuer Fall, Analyse -> Recherche
Dashboard:
- Button: + Neuer Fall (statt + Neue Lage)
- Modal-Titel: Neuen Fall anlegen
- Dropdown: Recherche - Thema analysieren (statt Analyse - Thema recherchieren)
- Empty-State: neuen Fall statt neue Lage

Tutorial:
- Alle Referenzen auf Neue Lage -> Neuer Fall
- Analyse/Recherche -> Recherche
- Fake-Dropdown: vollstaendige Optionsbeschreibungen
2026-03-23 22:42:56 +01:00
Claude Dev
b712dd5572 Tutorial: Bubble-Reposition nach Modal-Transition (450ms Delay)
Modal braucht Zeit fuer CSS-Transition. Erste Positionierung war falsch
weil getBoundingClientRect() waehrend Animation falsche Werte liefert.
Jetzt wird nach 450ms nochmal komplett repositioniert inkl. Clamp + Arrow.
2026-03-23 22:37:28 +01:00
Claude Dev
ea96947d0f Tutorial: Modal-Bubble immer rechts vom Modal positionieren
Links ist die Sidebar, rechts ist immer der bessere Platz.
Bubble-Breite passt sich an spaceRight an (min 260px).
2026-03-23 22:35:38 +01:00
Claude Dev
17681e62fb Tutorial: Modals automatisch schliessen bei Zurueck-Navigation
_enterStep schliesst alle offenen Modals wenn der neue Step kein
Modal-Step ist. Verhindert Blur auf Seitenleiste und haengengebliebene
Modals bei Rueckwaerts-Navigation (z.B. Schritt 4 -> 2).
2026-03-23 22:31:12 +01:00
Claude Dev
fe62cbbaee Tutorial: Vollstaendige Neupositionierung bei Fenstergroessen-Aenderung
_onResize fuehrt jetzt alle Positionierungsschritte durch:
- Spotlight-Update
- Modal-Scroll zum bubbleTarget
- Bubble-Positionierung mit dynamischer Breite
- Viewport-Clamping (oben + unten)
- Pfeil-Alignment auf Ziel-Element
2026-03-23 22:28:07 +01:00
Claude Dev
1159fe04a0 Tutorial: Pfeil zeigt dynamisch auf Ziel-Element
CSS: --arrow-top Variable fuer left/right Pfeile
JS: Berechnet Pfeil-Position relativ zum bubbleTarget nach Clamping
Pfeil bleibt immer zwischen 18px vom Rand der Bubble
2026-03-23 22:26:56 +01:00
Claude Dev
d299cdbdf4 Tutorial: Bubble wird oben und unten im Viewport geclampt
Verhindert dass Schritt 10 und andere Steps mit weit unten liegenden
Feldern unter den Viewport rutschen.
2026-03-23 22:25:56 +01:00
Claude Dev
7662332714 Tutorial: Bubble-Breite passt sich dynamisch an Platz neben Modal an
Bubble wird auf verfuegbaren Platz (min 260px) verkleinert und immer
auf der Seite mit mehr Platz positioniert. Kein top-Fallback mehr der
die Bubble aus dem Bildschirm schiebt.
2026-03-23 22:24:20 +01:00
Claude Dev
0ffc9b6fb6 Tutorial Schritt 3: Kein Auto-Open mehr, Modal oeffnet erst bei Weiter
Step zeigt nur den Button mit Erklaerung. Modal oeffnet sich erst
beim Klick auf Weiter (im onExit wenn naechster Step ein Modal-Step ist).
2026-03-23 22:21:39 +01:00
Claude Dev
485a527bf6 Tutorial: Race-Condition bei Neustart behoben
- start(forceRestart) awaited jetzt API.resetTutorialState()
- _startInternal awaited API.saveTutorialState(step 0)
- stop() ueberspringt State-Save wenn _isRestarting flag gesetzt
- start() kann jetzt auch bei laufendem Tutorial Restart ausfuehren
2026-03-23 22:17:15 +01:00
Claude Dev
383fe1ca8c Tutorial: Modal-Scroll mit scrollIntoView + scrollTop-Fallback
scrollIntoView scrollt den naechsten scrollbaren Container (modal-body).
Zusaetzlich wird scrollTop direkt gesetzt als Fallback via offsetTop-Berechnung.
2026-03-23 22:14:35 +01:00
Claude Dev
fc5846e878 Tutorial: Modal-Flash beseitigt + Bubble korrekt am Modal positioniert
- Step 3 onExit schliesst Modal nicht mehr wenn naechster Step Modal ist
- Bubble-Positionierung fuer Modal-Steps: prueft Platz links/rechts vom
  Modal statt vom Formularfeld, faellt auf top zurueck bei schmalen Screens
2026-03-23 22:10:20 +01:00
Claude Dev
186efd6aab Tutorial: Modal scrollt automatisch zum Feld beim Betreten jedes Schritts
_enterStep scrollt jetzt bei Modal-Steps zum bubbleTarget bevor
die Bubble positioniert wird. Damit ist das Formularfeld immer
zentriert sichtbar wenn der Schritt erscheint.
2026-03-23 22:04:48 +01:00
Claude Dev
2a8f395b32 Tutorial: Bubble bei Modal-Steps horizontal am Modal ausrichten, vertikal am Feld
Verhindert dass die Bubble ganz links am Rand landet wenn das
Formularfeld breiter als der verfuegbare Platz ist.
2026-03-23 22:03:35 +01:00
Claude Dev
412f869210 Tutorial: Server-State bei Neustart korrekt zuruecksetzen
- forceRestart ruft API.resetTutorialState() auf
- _startInternal setzt Server-State auf Step 0 bei Neustart
- Chat zeigt jetzt 1/31 statt altem Stand
2026-03-23 21:57:10 +01:00
Claude Dev
d2afd102e0 Tutorial: Modal-Felder zentriert scrollen in Schritten 5-10
- _scrollModalTo scrollt Element in die Mitte des sichtbaren Bereichs
- _scrollModalAndReposition repositioniert Bubble nach Scroll
- Alle Modal-Simulationen nutzen zentriertes Scrolling
- Schritt 4+5 nutzen jetzt _scrollModalTo statt manuelles scrollTo
2026-03-23 21:55:48 +01:00
Claude Dev
52358a4f2a Tutorial: bubbleTarget - Pfeil zeigt auf spezifische Formularfelder statt aufs gesamte Modal
Jeder Modal-Schritt hat jetzt ein bubbleTarget:
- Schritt 4: Titel-Feld
- Schritt 5: Typ-Dropdown
- Schritt 6: International-Toggle
- Schritt 7: Sichtbarkeit
- Schritt 8: Aktualisierungsmodus
- Schritt 9: Aufbewahrung
- Schritt 10: Benachrichtigungen
2026-03-23 21:53:20 +01:00
Claude Dev
69922b0566 Tutorial: Spotlight ausblenden bei Modal-Oeffnung in Schritt 3 2026-03-23 21:52:17 +01:00
Claude Dev
c6b154dbba Tutorial Patch 2: Pfeile, Cursor-Z-Index, Modal-Scroll, Karteninteraktion, Layout-Demo, Theme-Toggle
- Schritt 3: Bubble repositioniert sich auf Modal nach Oeffnung
- Schritt 5: Cursor-Z-Index ueber Dropdown (999999)
- Schritt 7ff: Modal scrollt automatisch zu Feldern (async scrollModalTo)
- Schritt 20: Goldener Rahmen um gesamte Faktencheck-Kachel
- Schritt 21: Timeline-Kachel wird temporaer vergroessert
- Schritt 23: Alle Karteninteraktionen deaktiviert (kein Zoom/Click)
- Schritt 25: Drag nach rechts + zurueck, dann Resize vom Original
- Schritt 26: Theme-Toggle-Simulation (hell/dunkel/zurueck)
- Schritt 27: Button bleibt sichtbar nach Quellenverwaltung-Oeffnung
- Spotlight ausgeblendet waehrend Layout-Demo
2026-03-23 21:48:14 +01:00
Claude Dev
584183951f Tutorial: Umfassende Verbesserungen an Schritten 5,8+,11,20-26,28,31,32
- Schritt 5: Simuliertes Dropdown statt einfachem Wechsel
- Ab Schritt 8: Verbessertes Modal-Scrolling fuer alle Formularfelder
- Schritt 11: Cursor-Demo zwischen Alle/Eigene Filtern
- Schritt 20: Status-Durchlauf statt Scroll-Sprung
- Schritt 21: Quellenübersicht nach Timeline/Karte verschoben
- Schritt 22: Timeline mit Cursor-Navigation durch Zeitpunkte
- Schritt 23: Cursor zeigt Orte einlesen + Vollbild Buttons
- Schritt 24: Z-Index Fix fuer Bubble ueber Vollbild-Karte
- Schritt 25/26: Kombinierte Drag+Resize Demo
- Schritt 28/31: Position hoeher (position:top statt right/left)
- Schritt 32: Bubble tiefer zentriert (55% statt 50%)
- 6 neue Simulationsfunktionen hinzugefuegt
2026-03-23 21:23:07 +01:00
Claude Dev
6b4af4cf2a fix: justify-content: center überall wiederhergestellt + Quellen-Duplikatprüfung
- CSS: 24x fälschliches flex-start zurück auf center (Login, Buttons, Modals, Badges, Map etc.)
- Sources: Domain-Duplikatprüfung bei manuellem Hinzufügen (web_source 1x pro Domain, Domain aus URL extrahieren)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 00:13:36 +01:00
Claude Dev
17088e588f fix: Credits-Dropdown linksbündig, Balken-Track sichtbar, Prozentzahl rechts, kein Fettdruck, mehr Abstand 2026-03-18 00:08:20 +01:00
Claude Dev
97997724de fix: Credits-Anzeige linksbündig, Balken-Hintergrund sichtbar 2026-03-18 00:03:18 +01:00
Claude Dev
acb3c6a6cb feat: Netzwerkanalyse Qualitätsverbesserung — 3 neue Cleanup-Stufen
Phase 1: Entity-Map Key nur noch name_normalized (statt name+type), Typ-Priorität bei Konflikten
Phase 2a (neu): Code-basierte Dedup nach name_normalized, merged Typ-Duplikate
Phase 2c (neu): Semantische Dedup via Opus — erkennt Synonyme, Abkürzungen, Sprachvarianten
Phase 2d (neu): Cleanup — Self-Loops, Richtungsnormalisierung, Duplikat-Relations, verwaiste Entities
Gemeinsamer _merge_entity_in_db Helper für konsistente Entity-Zusammenführung
Phase 2b (Opus-Korrekturpass) entfernt, ersetzt durch präzisere Phase 2c

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:53:28 +01:00
Claude Dev
7bfa1d29cf feat: Credits-System mit Verbrauchsanzeige im User-Dropdown
- DB-Migration: credits_total/credits_used/cost_per_credit auf licenses, token_usage_monthly Tabelle
- Orchestrator: Monatliche Token-Aggregation + Credits-Abzug nach Refresh
- Auth: Credits-Daten im /me Endpoint + Bugfix fehlende Klammer in get()
- Frontend: Credits-Balken im User-Dropdown mit Farbwechsel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:53:19 +01:00
Claude Dev
4d6d022bee refactor: Netzwerkanalyse Phase 2 auf batched Extraktion umgestellt
- Statt einem Mega-Opus-Call: Haiku extrahiert Beziehungen pro Artikel-Batch
- Stufe A: Per-Batch Extraktion mit nur den relevanten Entitäten (~20-50 statt 3.463)
- Stufe B: Globaler Merge + Deduplizierung (Richtungsnormalisierung, Gewichts-Boost)
- Phase 2b: Separater Opus-Korrekturpass (name_fix, merge, add) in 500er-Batches
- Löst das Problem: 0 Relations bei großen Analysen (3.463 Entitäten -> 1.791 Relations)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 22:51:17 +01:00
Claude Dev
5e194d43e0 feat: Tutorial-Fortschritt serverseitig persistieren (Resume/Restart)
- Neuer Router /api/tutorial mit GET/PUT/DELETE für Fortschritt pro User
- DB-Migration: tutorial_step + tutorial_completed in users-Tabelle
- Resume-Dialog bei abgebrochenem Tutorial (Fortsetzen/Neu starten)
- Chat-Hinweis passt sich dem Tutorial-Status dynamisch an
- API-Methoden: getTutorialState, saveTutorialState, resetTutorialState

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 22:51:06 +01:00
Claude Dev
4b9ed6439a fix: PDF-Export verbessert - Seitenraender, kein Abschneiden, klickbare Links
- @page margins 18mm/15mm fuer korrekte Seitenraender
- Header kompakt: Titel + Lagebild direkt auf Seite 1 (keine leere Seite)
- Citations/Quellenverweise als klickbare unterstrichene Links im PDF
- break-inside:avoid statt page-break-inside fuer korrekte Seitenumbrueche
- Kartenexport entfernt (nicht sinnvoll als PDF)
- Schriftgroessen leicht reduziert fuer bessere Platznutzung
2026-03-17 10:34:38 +01:00
Claude Dev
0b3fbb1efc feat: PDF-Export mit Kachel-Auswahl und hellem Drucklayout
- Neuer PDF-Export-Dialog mit Checkboxen: Lagebild, Quellen, Faktencheck, Karte, Timeline
- Helles, schlichtes Drucklayout (weiss, Serifenlos, A4-optimiert)
- Oeffnet neues Fenster mit sauberem HTML fuer Drucken/PDF-Speichern
- Ersetzt alte window.print() Funktion die das dunkle Theme exportierte
- Quellenübersicht als Tabelle + Artikelliste mit Links
- Faktencheck mit farbcodierten Status-Badges
2026-03-17 10:29:01 +01:00
Claude Dev
474e2beca9 fix: URL-Verifizierung fuer WebSearch-Ergebnisse
- Prompt-Verbesserung: Claude muss exakte URLs aus WebSearch kopieren, keine konstruierten URLs
- Neue _verify_article_urls() Funktion im Orchestrator
- HEAD-Request auf jede WebSearch-URL, GET-Fallback bei 405
- Bei 404/unerreichbar: Ersetzung durch Google-Suchlink (site:domain headline)
- Nur WebSearch-URLs werden geprueft, RSS-URLs sind bereits verifiziert
2026-03-17 10:22:01 +01:00
Claude Dev
742f49467e fix: saveSource() liest source_type wieder aus _discoveredData statt Select
Stellt das Original-Verhalten wieder her: Der Typ wird aus den
Auto-Discovery-Daten gelesen, nicht aus dem versteckten Select-Element.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 23:55:42 +01:00
Claude Dev
e3f50e63fd fix: Fehlendes src-type-display Element im Quellen-Formular ergänzt
Das readonly Input zeigt dem Nutzer den erkannten Quellentyp (RSS-Feed,
Web-Quelle, Telegram) nach der Auto-Erkennung an. Der hidden Select
dient weiterhin als Datenspeicher für saveSource().
Telegram-Pfad setzt jetzt ebenfalls src-type-display.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 23:24:27 +01:00
Claude Dev
ada0596c2b Revert "fix: Tote src-type-display Referenzen entfernt (Element existiert nicht im HTML)"
This reverts commit 34eb28d622.
2026-03-16 23:21:34 +01:00
Claude Dev
34eb28d622 fix: Tote src-type-display Referenzen entfernt (Element existiert nicht im HTML)
discoverSource() und editSource() referenzierten ein nicht existierendes
DOM-Element src-type-display, was beim Hinzufügen/Bearbeiten von Quellen
den Fehler "Cannot set properties of null (setting value)" auslöste.
src-type-select wird bereits korrekt mit Null-Check gesetzt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 23:09:47 +01:00