Commit graph

388 Commits

Autor SHA1 Nachricht Datum
Claude Dev
b88b305716 GEOINT: Globaler Schiffsverkehr via AISStream.io
Digitraffic (nur Nordeuropa) ersetzt durch AISStream.io WebSocket:
- Globale Echtzeit-AIS-Daten (tausende Schiffe weltweit)
- Dauerhafter WebSocket-Client im Backend, auto-reconnect
- Schiffsnamen im Popup (MMSI, SOG, COG)
- Binary-Frame Parsing fuer WebSocket-Nachrichten
- Auto-Start bei Server-Hochfahren
- Stale-Cleanup (>15 Min alte Positionen entfernt)
2026-03-24 10:49:23 +01:00
Claude Dev
381313ef12 GEOINT: Globale Flugabdeckung erweitert (64 Stuetzpunkte)
Neue Regionen: Strasse von Hormuz, VAE, Katar, Irak, Jemen,
Rotes Meer, Schwarzes Meer, Marokko, Libyen, Zentralasien,
Florida, Montreal, San Francisco, Denver, Peking, Taiwan,
Chennai, Sri Lanka, Jakarta, Vietnam, Sydney, Neuseeland,
Nairobi, Kapstadt, Lagos, Addis Abeba, Rio, Buenos Aires,
Lima, Bogota.

Schiffsverkehr: Label zeigt "Nordeuropa" (Digitraffic-Abdeckung).
Fuer globale Schiffsdaten waere AISStream.io (API-Key) noetig.
2026-03-24 10:41:39 +01:00
Claude Dev
d53b4552db geoint.js komplett neu geschrieben (Syntax-Fehler durch Patch-Chaos)
Vorherige inkrementelle Patches hatten die Dateistruktur korrumpiert
(orphaned code-Fragmente, fehlende Klammern). Kompletter Neuschrieb
mit allen Features: Flug, Schiff, Erdbeben, GDELT, Heatmap, Koordinaten,
Distanz, Timeline. Saubere Syntax verifiziert.
2026-03-24 10:39:04 +01:00
Claude Dev
a396d63fb2 Fix: GEOINT-Toggle reagiert nicht mehr
Map-Referenz konnte null sein wenn UI._map nach Lage-Wechsel
oder Tile-Parking nicht mehr aktuell war. Jetzt dreifacher
Fallback: uebergebene map -> GEOINT._map -> UI._map.
Checkbox-Handler nutzt ebenfalls Fallback.
2026-03-24 10:34:08 +01:00
Claude Dev
4dc7824f51 GEOINT: Zoom-adaptives Rendering
Rausgezoomt (Zoom 3-4): Nur 50-80 Marker, kleine Punkte,
  Schiffe nur wenn fahrend (SOG > 1kn)
Mittel (Zoom 5-6): 150-200 Marker, Schiffe ab SOG > 0.3kn
Detail (Zoom 7-9): 400 Marker, alle Schiffe, groessere Punkte
Nah (Zoom 10+): 600-800 Marker, volle Details, grosse Punkte

Marker-Groesse skaliert mit Zoom (2-4px).
Verhindert Browser-Ueberlastung bei Weltansicht.
2026-03-24 10:31:52 +01:00
Claude Dev
b248c7e039 GEOINT Performance-Fix: Canvas-Renderer statt DOM-Marker
Vorher: 18.000+ DOM-Elemente (divIcon) -> Browser-Absturz
Jetzt: Canvas-basierte circleMarker (L.canvas Renderer)
- Flugzeuge: max 400 im sichtbaren Bereich, gruene Punkte
- Schiffe: max 500 im sichtbaren Bereich, blaue Punkte
- Canvas rendert tausende Marker als ein einzelnes HTML-Element
- Popups weiterhin per Klick verfuegbar
2026-03-24 10:31:14 +01:00
Claude Dev
9825f4df48 GEOINT: Stabile Flug-/Schiffsdaten ohne Verzögerung oder Verschwinden
Architektur umgebaut: Daten werden global gecacht, Rendering ist
client-seitig. Nur sichtbare Marker werden gerendert (bounds-Filter).
Bei moveend (Zoom/Pan) wird sofort aus dem Cache neu gerendert (300ms),
kein neuer API-Call noetig. API-Refresh bleibt 30s/60s im Hintergrund.

Fix: fehlender break im flights switch-case (ships wurden gestoppt).
2026-03-24 10:30:11 +01:00
Claude Dev
7f09375aed GEOINT: Globaler Flugverkehr + Schiffsverkehr-Layer
Flugverkehr: Globaler Snapshot ueber 29 Stuetzpunkte weltweit.
Backend aggregiert parallel, 30s Cache, kein Flackern (atomarer Swap).
Keine regionale Begrenzung mehr.

Schiffsverkehr: Neuer Layer via Digitraffic AIS API (kostenlos, kein Key).
18.000+ Schiffe global, 60s Refresh. Blaue Schiffs-Icons mit Heading-Rotation.
Popup zeigt MMSI, SOG, COG, Navigationsstatus.

Backend: Batch-Fetching mit asyncio.Lock gegen Race Conditions.
2026-03-24 10:25:46 +01:00
Claude Dev
eebbc82e3f GEOINT Flugverkehr: Kein Flackern, stabiler
- Atomarer Layer-Swap statt clearLayers (Marker verschwinden nie)
- Einzelner API-Call (radius=250nm) statt 4 Grid-Calls (weniger Rate-Limits)
- Refresh-Interval 15s -> 30s (weniger API-Last)
- moveend-Debounce 1.2s -> 2s (ruhigeres Verhalten beim Navigieren)
- Backend Cache-TTL 10s -> 20s, Koordinaten auf 0.5-Grad-Raster gerundet
2026-03-24 10:20:37 +01:00
Claude Dev
db5aa965bd GEOINT Flugverkehr: Lesbarkeit + vollstaendige Abdeckung
Popup: Dunkler Hintergrund (rgba(11,17,33,0.95)) mit gruener Border,
weisse Schrift statt grau, groesser (12/13px). Taktischer Look.

Abdeckung: Grid-basiertes Multi-Point-Fetching statt einzelnem Mittelpunkt.
Kartenbereich wird in bis zu 2x2 Zellen unterteilt, pro Zelle ein API-Call.
Duplikate per hex-ID gefiltert. Deckt jetzt den gesamten sichtbaren
Bereich ab, auch bei weitem Zoom oder Breitbild-Viewports.
2026-03-24 10:17:33 +01:00
Claude Dev
8d5eb91383 GEOINT Flugverkehr: Zoom-Guard gelockert und Debounce erhoeht
- Zoom-Minimum von 5 auf 3 gesenkt (Europa-Uebersicht nutzbar)
- moveend-Debounce von 600ms auf 1200ms (weniger Flackern beim Zoomen)
2026-03-24 10:14:09 +01:00
Claude Dev
ffcf54785d GEOINT Distanz: Bessere Sichtbarkeit auf Satellitenbildern
- Rote Linie mit schwarzem Outline statt duenner gelber Linie
- Groessere Endpunkte (r=6) mit weissem Rand
- Label groesser (12px, bold, weiss), Schatten fuer Kontrast
2026-03-24 09:57:19 +01:00
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