Promote develop → main (2026-05-01 20:17 UTC)

This commit was merged in pull request #11.
Dieser Commit ist enthalten in:
2026-05-01 22:17:42 +02:00
Commit 8b8e31e3cd
4 geänderte Dateien mit 36 neuen und 21 gelöschten Zeilen

Datei anzeigen

@@ -21,15 +21,21 @@ from source_rules import (
logger = logging.getLogger("osint.orchestrator") 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 = { CATEGORY_REPUTATION = {
"nachrichten_de": 0.9, "nachrichtenagentur": 1.0, # Reuters, AP, dpa, AFP — Primärquellen
"nachrichten_int": 0.9, "behoerde": 1.0, # BMI, BSI, Europol — offizielle Quellen
"presseagenturen": 1.0, "oeffentlich-rechtlich": 0.95, # tagesschau, ZDF, ARD, BBC, ORF
"behoerden": 1.0, "qualitaetszeitung": 0.85, # Spiegel, Zeit, FAZ, NZZ, Süddeutsche
"fachmedien": 0.8, "think-tank": 0.85, # SWP, IISS, Brookings, Chatham House
"international": 0.7, "fachmedien": 0.8, # heise, golem, netzpolitik, Handelsblatt
"sonstige": 0.4, "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 # Research-Modus: Automatisch 3 Durchläufe für optimale Ergebnisse

Datei anzeigen

@@ -50,18 +50,18 @@ PIPELINE_STEPS = [
"icon": "map-pin", "icon": "map-pin",
"tooltip": "Aus den Meldungen werden Ortsangaben erkannt und auf der Karte verortet.", "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", "key": "factcheck",
"label": "Fakten prüfen", "label": "Fakten prüfen",
"icon": "shield", "icon": "shield",
"tooltip": "Behauptungen aus den Meldungen werden gegeneinander abgeglichen: Bestätigt? Umstritten? Noch unklar?", "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", "key": "qc",
"label": "Qualitätscheck", "label": "Qualitätscheck",

Datei anzeigen

@@ -646,7 +646,7 @@
<script src="/static/js/ws.js?v=20260316b"></script> <script src="/static/js/ws.js?v=20260316b"></script>
<script src="/static/js/components.js?v=20260427a"></script> <script src="/static/js/components.js?v=20260427a"></script>
<script src="/static/js/layout.js?v=20260316b"></script> <script src="/static/js/layout.js?v=20260316b"></script>
<script src="/static/js/pipeline.js?v=20260501a"></script> <script src="/static/js/pipeline.js?v=20260501i"></script>
<script src="/static/js/app.js?v=20260501h"></script> <script src="/static/js/app.js?v=20260501h"></script>
<script src="/static/js/cluster-data.js?v=20260322f"></script> <script src="/static/js/cluster-data.js?v=20260322f"></script>
<script src="/static/js/tutorial.js?v=20260316z"></script> <script src="/static/js/tutorial.js?v=20260316z"></script>

Datei anzeigen

@@ -141,20 +141,29 @@ const Pipeline = {
} }
} }
// Wenn ein neuer Pass startet (pass_number > prev und status="active" beim ERSTEN step): // Wenn der ERSTE Schritt (sources_review) auf "active" geht, beginnt ein neuer
// alle Schritte zurück auf pending setzen, damit die Animation neu durchläuft. // 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 if (d.status === 'active' && this._definition && this._definition.length
&& key === this._definition[0].key && passNr > 1 && (!prev || prev.pass_number < passNr)) { && key === this._definition[0].key) {
// Alle anderen Steps in "pending" zurueck (visuell), Werte behalten wir
this._definition.forEach(s => { this._definition.forEach(s => {
if (s.key !== key && this._stateByKey[s.key]) { if (s.key !== key && this._stateByKey[s.key]) {
this._stateByKey[s.key].status = 'pending'; this._stateByKey[s.key].status = 'pending';
didReset = true;
} }
}); });
} }
this._patchBlock(key); if (didReset) {
this._patchMiniBlock(key); // Beim Reset alle Bloecke neu zeichnen, nicht nur den aktuellen
this._render();
this._renderMini();
} else {
this._patchBlock(key);
this._patchMiniBlock(key);
}
}, },
_onRefreshDone(msg) { _onRefreshDone(msg) {