Commit graph

302 Commits

Autor SHA1 Nachricht Datum
Claude Dev
8feaac3320 Fix: Leere Sidebar-Section (doppelter Strich) nach Netzwerk-Entfernung beseitigt 2026-03-25 01:03:40 +01:00
Claude Dev
138fdd8594 Cleanup: Alle Netzwerkanalyse-Reste vollständig entfernt
- 7 JS/CSS-Dateien gelöscht (api_network, app_network, network-graph, network-cluster, cluster-data, network.css, network-cluster.css)
- 2 Backend-Dateien gelöscht (routers/network_analysis.py, models_network.py)
- dashboard.html: Modal Neue Netzwerkanalyse entfernt
- app.js: 15 Netzwerk-Referenzen + kaputte Blöcke bereinigt
- DB-Schema CREATE TABLEs bleiben (geteilte DB mit Netzwerkanalyse-App)
2026-03-25 01:00:03 +01:00
Claude Dev
dd25daa253 Netzwerkanalyse in eigenständige App ausgelagert
- Router-Import und Einbindung entfernt
- Dashboard: Netzwerk-UI, CSS, JS-Referenzen entfernt
- Netzwerk-Sidebar-Sektion und network-view entfernt
2026-03-25 00:40:29 +01:00
Claude Dev
285dfbebce Einheitliches AegisSight Favicon (SVG) auf allen Seiten
- favicon.svg (AegisSight Schild-Logo) hinzugefügt
- index.html + dashboard.html: PNG/ICO-Referenzen durch SVG ersetzt
2026-03-25 00:12:55 +01:00
Claude Dev
eaf8fcd124 Fix: Echte Umlaute statt Umschreibungen (gültig, für, prüfen) 2026-03-25 00:04:41 +01:00
Claude Dev
8f1a45c1a9 Auth: Nur noch Magic Link, Code-Verifizierung entfernt
- /api/auth/verify-code Endpoint entfernt
- generate_magic_code() und VerifyCodeRequest entfernt
- VerifyCodeLimiter (Brute-Force-Schutz) entfernt (nicht mehr noetig)
- E-Mail-Template: Nur noch Anmelde-Link, kein 6-stelliger Code
- Login-Seite: Zeigt nach E-Mail-Eingabe Hinweis statt Code-Feld
- Magic Link Token-Verifikation via URL bleibt bestehen
2026-03-25 00:01:19 +01:00
Claude Dev
5789cc1706 globe-feed komplett neu geschrieben (unhashable dict Fix)
Saubere Implementierung mit set() fuer Artikel-Deduplizierung.
54 Features mit ortsspezifischen Artikeln fuer Lage 45.
2026-03-24 14:47:28 +01:00
Claude Dev
8a520389c5 globe-incidents: Nur aktive Live-Monitorings, keine Recherchen/Archive 2026-03-24 13:45:17 +01:00
Claude Dev
42591ef7e0 globe-feed: Vollstaendige Artikel-Details pro Standort 2026-03-24 13:41:39 +01:00
Claude Dev
da7f3822c1 API: globe-incidents Endpoint fuer Lage-Auswahl im Globe 2026-03-24 13:30:52 +01:00
Claude Dev
3d270f60d3 Globe-Ingest: Neuer Endpoint POST /api/public/globe-ingest
Nimmt externe Ereignisse (EONET, USGS) als Artikel in eine Lage auf.
Duplikat-Check per Headline. Locations direkt mit Koordinaten.
2026-03-24 13:27:17 +01:00
Claude Dev
094f2463bb Neuer API-Endpoint: /api/public/globe-feed fuer Globe-Integration
Liefert Locations + Artikel-Headlines + Summaries als GeoJSON.
Flexible Lage-Auswahl per incident_id oder alle oeffentlichen.
Farbkodiert nach Kategorie (primary/secondary/tertiary/mentioned).
2026-03-24 13:11:16 +01:00
Claude Dev
e64447ab7f GEOINT-Modus aus Monitor entfernt
Wird als eigenstaendige Anwendung auf separater Subdomain neu aufgebaut.
Alle GEOINT-Dateien entfernt, dashboard.html/components.js/main.py
auf pre-GEOINT Stand zurueckgesetzt.
2026-03-24 11:06:19 +01:00
Claude Dev
8212617276 Fix: AISStream Auto-Start via @app.on_event(startup)
Router-Level on_event funktioniert nicht in FastAPI,
muss auf app-Level registriert werden. AISStream verbindet
sich jetzt beim Server-Start automatisch und sammelt
kontinuierlich Schiffspositionen (13.000+ global).
2026-03-24 10:56:00 +01:00
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