Commit graph

317 Commits

Autor SHA1 Nachricht Datum
claude-dev
7900c38882 Enhance-Prompts: Rolle als Recherche-Planer klarstellen, Verweigerungen verhindern
Beide Prompts (Research + Adhoc) definieren jetzt explizit:
- Modell ist Recherche-Planer, nicht Faktenbehaupter
- Thema muss nicht bekannt oder verifiziert werden
- Briefing IMMER erstellen, keine Rueckfragen/Disclaimer
- Recherche-Schwerpunkte praxisnaeher formuliert

Behebt sporadische Verweigerungen bei unbekannten Faellen.
2026-04-11 19:03:50 +00:00
claude-dev
6cddb05b83 fix: Quellen-Suffix-Refs ([22b]) auf Basisquelle auflösen statt Platzhalter
Claude vergibt manchmal Buchstaben-Suffixe an Quellennummern (z.B. [22b] statt [22]). Bisher wurden dafür leere Platzhalter-Quellen erstellt. Jetzt wird geprüft ob die Basisnummer existiert und die Referenz im Text korrigiert.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:51:33 +00:00
claude-dev
5a56024501 top_articles pro Location in Lagebild-API ergänzen
_build_lagebild_response() liefert jetzt Top-3-Artikel (neueste)
pro Location für Karten-Popups mit klickbaren Quellen-Links.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 11:55:35 +00:00
claude-dev
68c4e2a9c9 Generischen Lagebild-API-Endpunkt hinzufügen
Shared-Logik extrahiert (_build_lagebild_response, _get_snapshot_response).
Neue Endpunkte:
- GET /api/public/lagebild/{incident_id} für beliebige öffentliche Lagen
- GET /api/public/lagebild/{incident_id}/snapshot/{snapshot_id}
Bestehende Iran-Endpunkte bleiben abwärtskompatibel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 11:09:05 +00:00
claude-dev
f2469093ee Revert "Feature: Analyse-Anweisungen (Direktiven) fuer Tabellen und Zusammenfassung"
This reverts commit e0bcd85d90.
2026-04-10 19:34:25 +00:00
claude-dev
e0bcd85d90 Feature: Analyse-Anweisungen (Direktiven) fuer Tabellen und Zusammenfassung
Nutzer koennen per Klick auf Chips Anweisungen zur Beschreibung
hinzufuegen: Zusammenfassung, Vergleichstabelle, Zeitverlauf,
Pro/Contra oder eigene Tabellen. Format: [TABELLE: ...] und
[ZUSAMMENFASSUNG]. Mehrere Anweisungen moeglich. Analyzer-Prompts
beachten diese Anweisungen verbindlich. Beschreibung-generieren
bewahrt bestehende Direktiven.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 18:37:04 +00:00
claude-dev
565ce84abf Feature: Markdown-Tabellen in Lagebildern
Analyzer-Prompts erlauben jetzt Tabellen wenn Daten sich strukturiert
vergleichen lassen (Produkte, Modelle, Kennzahlen etc.).
Frontend parst Markdown-Tabellensyntax und rendert sie als HTML-Tabellen
mit passendem Styling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 17:41:07 +00:00
claude-dev
e2e6a1ed7e Perf: Executive Summary nach Refresh im Hintergrund vorberechnen
Statt beim PDF-Export 30+ Sekunden auf die KI-Zusammenfassung zu
warten, wird sie jetzt automatisch nach jedem Refresh generiert.
Beim Export ist sie dann sofort verfuegbar (gecacht in DB).
Summary-Aenderungen invalidieren den Cache automatisch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 17:31:20 +00:00
claude-dev
d15afdd2af Fix: Sidebar bleibt klickbar während erster Recherche
Sidebar bekommt z-index 9500 (über dem Progress-Overlay mit 9000),
sodass man während der ersten Recherche einer neuen Lage andere
Fälle in der Sidebar anklicken und damit weiterarbeiten kann.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:33:06 +00:00
claude-dev
521d6ac357 Fix: Artikel inline nachladen wenn all_articles_preloaded fehlt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:12:06 +00:00
Claude Dev
3f9cc5a6e0 Fix: HTTPBearer gibt 401 statt 403 bei fehlendem Token
HTTPBearer(auto_error=True) gab 403 zurueck wenn kein Authorization-
Header gesendet wurde. Das Frontend erkennt nur 401 als Session-Ablauf
und leitet zum Login weiter. 403 wurde als generischer Fehler behandelt,
wodurch abgelaufene Sessions still fehlschlugen (kein Redirect zum Login).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:21:33 +02:00
Claude Dev
55c0307e68 Fix: Faktencheck bei fehlenden existing_facts trotz vorhandener Summary
Wenn ein vorheriger Refresh die Summary gespeichert hat aber die
Faktenchecks durch einen Crash verloren gingen, wurden bei allen
Folge-Refreshes keine Artikel an den Factchecker uebergeben
(all_articles_preloaded blieb None), was zu leeren Ergebnissen fuehrte.

Betroffen: Incidents 56, 57, 58 (alle mit 0 Faktenchecks trotz Artikeln).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:15:58 +02:00
Claude Dev
3bf4f3debb Fix: Redundanten lokalen Import von find_matching_claim entfernt
Der lokale Import in der Massen-Downgrade-Pruefung ueberschattete den
Top-Level-Import und verursachte: cannot access local variable
find_matching_claim where it is not associated with a value.

Dadurch scheiterte der Faktencheck komplett (0 Faktenchecks).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 22:31:31 +02:00
Claude Dev
9aa80b4aec Lagenwechsel: Popup/Mini-Status pro Lage korrekt wiederherstellen
Beim Zurueckwechseln auf eine laufende Lage wird der gespeicherte
State (minimized/offen) direkt aus _progressState wiederhergestellt.
War das Popup offen -> offen. War es minimiert -> Mini-Bar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:57:51 +02:00
Claude Dev
fb0c47eee4 Fix: Abbrechen-Dialog, Overlay-Stacking, Queue-Cancel
1. Confirm-Dialog z-index ueber Progress-Popup (10000 > 9000)
2. Progress-Popup wird ausgeblendet waehrend Confirm-Dialog offen
3. Kein dunkler-werdendes Overlay bei mehrfachem Abbrechen-Klick
4. Abbrechen funktioniert jetzt auch fuer Lagen in der Warteschlange
   (werden direkt aus der Queue entfernt statt auf Start zu warten)
5. Cancel-Status wird im Popup-Titel angezeigt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:50:30 +02:00
Claude Dev
990ece1346 Fix: Sidebar-Status bei Fehler und Abbruch korrekt aufraumen
handleRefreshError und handleRefreshCancelled haben den Sidebar-
Refresh-Status (Gold-Rand, Spinner-Text) nicht entfernt. Dadurch
blieben Lagen faeelschlicherweise als laufend markiert.

Jetzt wird bei Error/Cancel: _removeSidebarRefreshStatus() aufgerufen,
_progressState geloescht, und Sidebar neu gerendert.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:48:24 +02:00
Claude Dev
3811229ad9 Ctrl+Shift+R: Refresh-Status korrekt wiederherstellen
API /incidents/refreshing gibt jetzt auch queued IDs mit Position
und den aktuell laufenden Task zurueck.

Frontend nutzt started_at aus der API fuer Timer-Wiederherstellung.
Queued Lagen werden mit korrekter Position wiederhergestellt.
Aktiv laufender Task wird als researching angezeigt statt queued.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:40:33 +02:00
Claude Dev
c349947f71 Sidebar: Queue-Position bleibt bei Lagenwechsel erhalten
Position aus _progressState lesen als Fallback wenn extra.queue_position
nicht verfuegbar ist (z.B. bei Lagenwechsel-Restore).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:38:30 +02:00
Claude Dev
762d8dbc1a Sidebar: Refresh-Status fuer ALLE Lagen korrekt anzeigen
Progress-State wird jetzt fuer alle refreshenden Lagen angelegt,
nicht nur fuer die aktuell ausgewaehlte. Sidebar-Update passiert
vor dem Early-Return fuer nicht-aktuelle Lagen.

Bei WebSocket-Reconnect (auch nach Ctrl+Shift+R) wird der State
fuer bereits laufende Refreshes korrekt wiederhergestellt.

Sidebar-Cleanup bei Refresh-Abschluss fuer alle Lagen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:36:16 +02:00
Claude Dev
244cc56bde Sidebar: Refresh-Status direkt im HTML gerendert statt dynamisch
renderIncidentItem() baut den Refresh-Status (Gold-Rand, Spinner,
Statustext, Warteschlange-Position) direkt ins HTML ein. Ueberlebt
jetzt renderSidebar()-Aufrufe bei Lagenwechsel und Aktualisierungen.

Sidebar wird nach jedem WebSocket-Status-Update neu gerendert,
damit der Status fuer ALLE Lagen immer sichtbar bleibt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:32:37 +02:00
Claude Dev
9bfdf051c9 Fortschritt: Popup minimiert sich bei Klick ausserhalb automatisch
Klick irgendwo ausserhalb des Popups minimiert es zur Mini-Bar.
Beim ersten Durchlauf (blocking) bleibt das Popup offen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:25:51 +02:00
Claude Dev
86ff35977e Fortschritt: Popup wird immer zu Beginn angezeigt
Auto-Minimize entfernt. Popup erscheint sowohl bei erstem Durchlauf
als auch bei Aktualisierung sofort. Kann dann manuell minimiert werden.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:23:42 +02:00
Claude Dev
97ecde87c2 Fortschritt: Auto-Minimize, Action-Lock, Queue-Anzeige in Sidebar
1. Aktualisierungen starten minimiert (Mini-Bar), Popup nur per Klick.
   Verhindert Ueberlagerung von Bearbeiten/Export-Buttons.
2. Erster Durchlauf: Bearbeiten/Export/Archivieren/Loeschen gesperrt,
   nur Abbrechen moeglich.
3. Sidebar: Warteschlange-Lagen zeigen Position (#1, #2...) mit
   eigenem visuellen Stil (gedimmt, pulsierender Dot).
4. Sidebar-Status (Recherchiert/Analysiert/Faktencheck) wird fuer
   ALLE laufenden Lagen angezeigt, nicht nur die aktuelle.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:21:52 +02:00
Claude Dev
3f88d00b8c Fortschrittsanzeige: Popup mit Checkboxen, Blur, Pro-Lage-Timer
Ladebalken ersetzt durch zentriertes Popup-Fenster mit Checkbox-Checkliste
(Warteschlange, Recherche, Analyse, Faktencheck) und Echtzeit-Timer.

Erster Durchlauf: Popup nicht wegklickbar, Blur-Effekt auf Kacheln.
Aktualisierung: Popup minimierbar zu kompakter Status-Leiste.
Timer laeuft pro Lage im Hintergrund weiter bei Lagenwechsel.
Gesamtzeit wird am Ende im Abschluss-Popup angezeigt.

Sidebar: Animierter Gold-Rand und Fortschrittstext (Recherchiert/
Analysiert/Faktencheck) unter dem Lage-Namen bei laufendem Refresh.

Zusaetzlicher Cancel-Checkpoint im Orchestrator nach Uebersetzung.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:08:59 +02:00
Claude Dev
3356ba1ae5 E-Mail-Benachrichtigungen: Lagebild vs. Recherche unterscheiden
Template passt Text je nach incident_type an:
- adhoc: "Neues Lagebild - Benachrichtigung" / "Neuigkeiten zur Lage"
- research: "Recherche - Benachrichtigung" / "Neuigkeiten zur Recherche"

incident_type wird durch die gesamte Notification-Kette durchgereicht.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 19:49:59 +02:00
Claude Dev
ac3fe5f22b Fix: Massen-Downgrade von Faktenchecks verhindern
Zwei Bugs behoben die dazu fuehrten, dass alle established Faktenchecks
bei einem inkrementellen Refresh auf unverified zurueckgesetzt wurden:

1. _format_existing_facts() uebergibt jetzt Evidence-Kontext an den LLM,
   damit bestehende Claims im inkrementellen Modus verifiziert bleiben.
2. Neuer Schutz im Orchestrator: Wenn >50% der established Fakten
   herabgestuft wuerden, werden die FC-Ergebnisse komplett verworfen.

Root Cause: Inkrementeller Faktencheck hatte nur Claims+Status aber
keine Evidence. Der LLM konnte bestehende Fakten nicht verifizieren
und gab unverified fuer alles zurueck.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 17:46:16 +02:00
Claude Dev
678b72e7ff fix: Dropdown bleibt offen beim Klick auf Org-Switcher
stopPropagation auf dem Dropdown-Container verhindert, dass der
globale Click-Listener das Menue schliesst wenn man den Org-Switcher
bedient.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 22:35:43 +02:00
Claude Dev
c22ae854fe feat: Global-Admin Org-Switcher fuer info@aegis-sight.de
Ermoeglicht dem Global Admin (is_global_admin Flag) zwischen
Organisationen zu wechseln. Neue Endpoints: GET /api/auth/organizations,
POST /api/auth/switch-org. Org-Dropdown im Header-Menue, nur fuer
Global Admin sichtbar. Komplett herausnehmbar (Flag + Code-Bloecke).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 22:25:41 +02:00
Claude Dev
d3e8c0adc7 feat: Slot-basierter Auto-Refresh mit konfigurierbarer Startzeit
Auto-Refresh nutzt jetzt eine feste Anker-Uhrzeit (refresh_start_time) statt
reinem Intervall-basiertem Driften. Verpasste Slots werden max. 1x aufgeholt.
Bestehendes Intervall-Verhalten bleibt als Fallback erhalten (ohne Startzeit).

Migration: Bestehende Auto-Lagen erhalten 07:00 als Startzeit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:14:34 +02:00
Claude Dev
68c6666d87 cleanup: Blog-Pipeline entfernt (läuft jetzt auf Dev)
Die Blog-Pipeline wurde auf den Dev-Server migriert und läuft dort
als eigenständiger Service im Blog-Container. Die Monitor-seitige
Implementation wird nicht mehr benötigt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 20:54:54 +02:00
Claude Dev
b58eee2990 fix: Gedankenstriche durch Bindestriche statt Kommas ersetzen 2026-03-29 16:41:20 +02:00
Claude Dev
4a3b6ee352 fix: Pipeline 4/4 Artikel erfolgreich
- _extract_json: Typographische Anfuehrungszeichen ersetzen
- _extract_json: Detailliertes Error-Logging bei Parse-Fehlern
- Writer-Prompt: Regel 5 verbietet doppelte Anfuehrungszeichen
  im Markdown (brechen JSON-String-Werte)
- json.loads(strict=False) fuer rohe Newlines

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 16:26:07 +02:00
Claude Dev
8baa4b4716 fix: Pipeline JSON-Parsing robust (first-open-to-last-close + strict=False)
- _extract_json: Neuer Ansatz findet erstes { bis letztes } statt
  fragiler Codeblock-Regex (loest Problem mit Backticks im Markdown)
- json.loads(strict=False) ueberall: Erlaubt rohe Newlines in Strings
  (Claude liefert content_markdown mit echten Newlines statt \n)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 15:21:07 +02:00
Claude Dev
144b7c05c9 fix: Pipeline JSON-Parsing + defensive Zugriffe
- Curator/Writer: Doppelt-encodiertes JSON abfangen (isinstance + json.loads)
- Pipeline: .get() statt direkte Dict-Zugriffe gegen TypeError
- TypeError zum except-Block hinzugefügt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:53:42 +02:00
Claude Dev
c53d441c69 fix: JWT_SECRET lazy-validiert statt beim Import
config.py: get_jwt_secret() wirft RuntimeError nur bei Nutzung,
nicht beim Import. Blog-Pipeline kann importieren ohne JWT_SECRET,
Monitor bleibt geschützt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 13:53:17 +02:00
Claude Dev
5bcaa4e8a1 fix: Blog-Pipeline lauffähig + robust
- Shell-Script: source .env statt dotenv (K1+K2)
- config.py: JWT_SECRET Default statt Crash beim Import (M17)
- JSON-Parsing: Robuste Extraktion aus Claude-Antworten (M16)
- Push-Retry mit exponentiellem Backoff (N8)
- open() mit with-Statement (N9)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 13:47:44 +02:00
Claude Dev
c21fdcef05 fix: Blog-Pipeline sys.path für config-Import 2026-03-29 04:35:36 +02:00
Claude Dev
b3c8cf2676 feat: Blog-Pipeline (Curator + Writer + Push) 2026-03-29 03:35:43 +02:00
Claude Dev
cb851ee72d fix: Textarea-Höhe beim Öffnen von Neuer Fall zurücksetzen 2026-03-28 00:58:14 +01:00
Claude Dev
34a173b27b fix: Textarea Auto-Resize + Emdashes entfernt
Beschreibungs-Textarea waechst automatisch mit dem Inhalt (min 80px).
Greift beim Tippen, nach Beschreibung generieren und im Edit-Modus.
Emdashes (U+2014) durch Doppelpunkte ersetzt.
2026-03-28 00:51:02 +01:00
Claude Dev
779678fbcb fix: Beschreibung generieren Button korrekt enabled/disabled
Button wird beim Bearbeiten einer Lage korrekt aktiviert (Titel per
JS gesetzt loest kein input-Event aus). Im Create-Modus explizit
disabled nach form.reset().
2026-03-28 00:39:01 +01:00
Claude Dev
322004e0b4 fix: Beschreibung generieren gibt jetzt reinen Fließtext aus
Neuer raw_text Parameter in call_claude() umgeht den JSON-System-Prompt.
Haiku gibt direkt lesbaren Text zurück statt JSON-Objekte.
Gesamtes JSON-Parsing (_json_to_text, Markdown-Strip) entfernt.
2026-03-28 00:20:36 +01:00
Claude Dev
813b3d975e fix: Markdown-Code-Block-Wrapper vor JSON-Parse entfernen
Claude CLI gibt bei tools=None oft Antworten in Markdown-Code-Blocks
zurueck (dreifache Backticks json...Backticks). Diese werden jetzt vor
dem JSON-Parse per Regex entfernt.
2026-03-28 00:11:01 +01:00
Claude Dev
ebaf35ce2e fix: Verschachtelte JSON-Antworten bei Beschreibung generieren
Haiku gibt oft tief verschachtelte JSON-Objekte zurück statt reinem
Text. Neue _json_to_text() Funktion konvertiert beliebige JSON-Strukturen
rekursiv in lesbaren Fliesstext mit Aufzaehlungen.
2026-03-28 00:04:57 +01:00
Claude Dev
0780901b61 fix: Button zeigt Wird generiert... statt nur Spinner 2026-03-27 23:58:14 +01:00
Claude Dev
702ae3cfcf fix: JSON-Wrapping bei Beschreibung generieren bereinigen
call_claude erzwingt bei tools=None JSON-Output per System-Prompt.
Haiku wrapped den generierten Text dann in ein JSON-Objekt.
Fix: JSON parsen und erstes String-Feld extrahieren.
2026-03-27 23:56:28 +01:00
Claude Dev
2c3c3b256a fix: Beschreibung generieren Button rechtsbündig neben Label
Button sitzt jetzt in der Label-Zeile statt unter dem Textarea.
Kompakteres Layout, Label und Aktion auf einer Zeile.
2026-03-27 23:53:34 +01:00
Claude Dev
1ce6b7e609 fix: Formular-Labels nicht mehr in Großbuchstaben
text-transform: uppercase von .form-group label entfernt.
2026-03-27 23:52:14 +01:00
Claude Dev
ca2059aca0 fix: Beschreibungs-Hinweis als Info-Icon Tooltip statt form-hint
Hinweistext zur guten Beschreibung erscheint jetzt als Tooltip am
i-Icon neben dem Label, konsistent mit allen anderen Formularfeldern.
Tooltip-Text wechselt weiterhin je nach Typ (Live/Recherche).
2026-03-27 23:50:09 +01:00
Claude Dev
11d0aadc57 fix: Beschreibung generieren — AbortController, Readonly, Gold-Styling
- Textarea readonly + visuell gedimmt während Generierung läuft
- AbortController bricht Request ab wenn Modal geschlossen wird
- Stern-Icon entfernt, Button-Text in Gold (Akzentfarbe)
- api.js _request() unterstützt externen AbortSignal
2026-03-27 23:46:44 +01:00