diff --git a/src/agents/orchestrator.py b/src/agents/orchestrator.py index e8cc76d..72bb3a1 100644 --- a/src/agents/orchestrator.py +++ b/src/agents/orchestrator.py @@ -21,15 +21,21 @@ from source_rules import ( logger = logging.getLogger("osint.orchestrator") -# Reputations-Score nach Quellenkategorie (für Relevanz-Scoring) +# Reputations-Score nach Quellenkategorie (fuer Relevanz-Scoring). +# Keys muessen mit den tatsaechlichen DB-Werten in sources.category uebereinstimmen +# (siehe DOMAIN_CATEGORY_MAP in source_rules.py). CATEGORY_REPUTATION = { - "nachrichten_de": 0.9, - "nachrichten_int": 0.9, - "presseagenturen": 1.0, - "behoerden": 1.0, - "fachmedien": 0.8, - "international": 0.7, - "sonstige": 0.4, + "nachrichtenagentur": 1.0, # Reuters, AP, dpa, AFP — Primärquellen + "behoerde": 1.0, # BMI, BSI, Europol — offizielle Quellen + "oeffentlich-rechtlich": 0.95, # tagesschau, ZDF, ARD, BBC, ORF + "qualitaetszeitung": 0.85, # Spiegel, Zeit, FAZ, NZZ, Süddeutsche + "think-tank": 0.85, # SWP, IISS, Brookings, Chatham House + "fachmedien": 0.8, # heise, golem, netzpolitik, Handelsblatt + "international": 0.75, # CNN, Guardian, NYT, Al Jazeera, France24 + "regional": 0.65, # regionale Tageszeitungen + "telegram": 0.5, # OSINT-Kanaele — gemischte Qualitaet + "sonstige": 0.4, # unkategorisiert + "boulevard": 0.3, # Bild, Sun etc. } # Research-Modus: Automatisch 3 Durchläufe für optimale Ergebnisse diff --git a/src/services/pipeline_tracker.py b/src/services/pipeline_tracker.py index 27bf724..5ec0e82 100644 --- a/src/services/pipeline_tracker.py +++ b/src/services/pipeline_tracker.py @@ -50,18 +50,18 @@ PIPELINE_STEPS = [ "icon": "map-pin", "tooltip": "Aus den Meldungen werden Ortsangaben erkannt und auf der Karte verortet.", }, - { - "key": "summary", - "label": "Lagebild verfassen", - "icon": "file-text", - "tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text.", - }, { "key": "factcheck", "label": "Fakten prüfen", "icon": "shield", "tooltip": "Behauptungen aus den Meldungen werden gegeneinander abgeglichen: Bestätigt? Umstritten? Noch unklar?", }, + { + "key": "summary", + "label": "Lagebild verfassen", + "icon": "file-text", + "tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text.", + }, { "key": "qc", "label": "Qualitätscheck", diff --git a/src/static/dashboard.html b/src/static/dashboard.html index ecee0b2..2b4921a 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -646,7 +646,7 @@ - + diff --git a/src/static/js/pipeline.js b/src/static/js/pipeline.js index 0f3551b..a4b184b 100644 --- a/src/static/js/pipeline.js +++ b/src/static/js/pipeline.js @@ -141,20 +141,29 @@ const Pipeline = { } } - // Wenn ein neuer Pass startet (pass_number > prev und status="active" beim ERSTEN step): - // alle Schritte zurück auf pending setzen, damit die Animation neu durchläuft. + // Wenn der ERSTE Schritt (sources_review) auf "active" geht, beginnt ein neuer + // Refresh oder ein neuer Multi-Pass-Durchlauf — alle nachfolgenden Schritte auf + // "pending" (grau) zuruecksetzen, damit der User sieht: das ist neu und + // noch nicht durchlaufen. Sonst stehen sie als "done" vom letzten Mal da. + let didReset = false; if (d.status === 'active' && this._definition && this._definition.length - && key === this._definition[0].key && passNr > 1 && (!prev || prev.pass_number < passNr)) { - // Alle anderen Steps in "pending" zurueck (visuell), Werte behalten wir + && key === this._definition[0].key) { this._definition.forEach(s => { if (s.key !== key && this._stateByKey[s.key]) { this._stateByKey[s.key].status = 'pending'; + didReset = true; } }); } - this._patchBlock(key); - this._patchMiniBlock(key); + if (didReset) { + // Beim Reset alle Bloecke neu zeichnen, nicht nur den aktuellen + this._render(); + this._renderMini(); + } else { + this._patchBlock(key); + this._patchMiniBlock(key); + } }, _onRefreshDone(msg) {