Promote develop → main (2026-05-01 12:48 UTC) #7

Zusammengeführt
IntelSight_Admin hat 5 Commits von develop nach main 2026-05-01 14:48:17 +02:00 zusammengeführt
6 geänderte Dateien mit 16 neuen und 16 gelöschten Zeilen
Nur Änderungen aus Commit 7b5adccf2b werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@@ -1292,7 +1292,7 @@ class AgentOrchestrator:
analysis, analysis_usage = analysis_result
fact_checks, fc_usage = factcheck_result
# Pipeline-Schritt 6: Lagebild verfassen (fertig keine Zahl, nur Status)
# Pipeline-Schritt 6: Lagebild verfassen (fertig, keine Zahl, nur Status)
await _pipe_done("summary", count_value=None, count_secondary=None)
# --- Analyse-Ergebnisse verarbeiten ---
@@ -1632,15 +1632,15 @@ class AgentOrchestrator:
# Pipeline-Schritt 9: Benachrichtigen (fertig)
await _pipe_done("notify", count_value=_notify_count, count_secondary=None)
# Falls Analyse-Block uebersprungen wurde (kein neuer Artikel und Summary existiert),
# die noch offenen Pipeline-Schritte als uebersprungen markieren.
# Falls Analyse-Block übersprungen wurde (kein neuer Artikel und Summary existiert),
# die noch offenen Pipeline-Schritte als übersprungen markieren.
for _skipped_key in ("summary", "factcheck", "qc", "notify"):
if _skipped_key in _step_ids or _skipped_key not in {"summary", "factcheck", "qc", "notify"}:
pass
# Saubere Variante: alle noch offenen Steps am Ende skippen
for _open_key in list(_step_ids.keys()):
await _pipe_skip(_open_key)
# Auch Steps die nie gestartet wurden (bei uebersprungenem Outer-If)
# Auch Steps die nie gestartet wurden (bei übersprungenem Outer-If)
_started_keys = set()
try:
_check_cursor = await db.execute(

Datei anzeigen

@@ -637,7 +637,7 @@ async def get_pipeline(
incident_row = await _check_incident_access(db, incident_id, current_user["id"], tenant_id)
is_research = (incident_row["type"] or "adhoc") == "research"
# Juengsten Refresh-Log waehlen: bevorzugt running, sonst der letzte completed
# Jüngsten Refresh-Log wählen: bevorzugt running, sonst der letzte completed
cursor = await db.execute(
"""SELECT id, started_at, completed_at, status, retry_count
FROM refresh_log

Datei anzeigen

@@ -30,7 +30,7 @@ PIPELINE_STEPS = [
"key": "collect",
"label": "Nachrichten sammeln",
"icon": "rss",
"tooltip": "Aus den passenden Quellen werden alle relevanten Meldungen eingesammelt aus deinen RSS-Feeds, dem Web und optional Telegram-Kanälen.",
"tooltip": "Aus den passenden Quellen werden alle relevanten Meldungen eingesammelt - aus deinen RSS-Feeds, dem Web und optional Telegram-Kanälen.",
},
{
"key": "dedup",
@@ -54,7 +54,7 @@ PIPELINE_STEPS = [
"key": "summary",
"label": "Lagebild verfassen",
"icon": "file-text",
"tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben mit Quellenangaben am Text.",
"tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text.",
},
{
"key": "factcheck",
@@ -72,7 +72,7 @@ PIPELINE_STEPS = [
"key": "notify",
"label": "Benachrichtigen",
"icon": "bell",
"tooltip": "Wenn etwas Wichtiges dabei war, gehen Benachrichtigungen raus im Glockensymbol oben rechts und optional per E-Mail.",
"tooltip": "Wenn etwas Wichtiges dabei war, gehen Benachrichtigungen raus, im Glockensymbol oben rechts und optional per E-Mail.",
},
]

Datei anzeigen

@@ -5994,7 +5994,7 @@ body.tutorial-active .tutorial-cursor {
}
@media (max-width: 900px) {
/* Snake aufloesen alle Reihen werden vertikal gestapelt */
/* Snake auflösen, alle Reihen werden vertikal gestapelt */
.pipeline-row,
.pipeline-row[data-direction="rtl"] {
flex-direction: column;

Datei anzeigen

@@ -290,7 +290,7 @@
</div>
<div class="pipeline-body">
<div class="pipeline-stage" id="pipeline-stage" aria-label="Analysepipeline-Visualisierung">
<div class="pipeline-empty" id="pipeline-empty">Noch nie aktualisiert &mdash; starte den ersten Refresh.</div>
<div class="pipeline-empty" id="pipeline-empty">Noch nie aktualisiert. Starte den ersten Refresh.</div>
</div>
<aside class="pipeline-sidenote" id="pipeline-sidenote" hidden>
Recherche-Lagen werden mehrfach evaluiert, um das Bild Schritt für Schritt aufzubauen.

Datei anzeigen

@@ -118,7 +118,7 @@ const Pipeline = {
const key = d.step_key;
if (!key) return;
// State aktualisieren letzter Pass gewinnt
// State aktualisieren, letzter Pass gewinnt
const prev = this._stateByKey[key];
const passNr = d.pass_number || 1;
if (!prev || passNr >= (prev.pass_number || 1)) {
@@ -177,11 +177,11 @@ const Pipeline = {
// Brandneue Lage ohne Refresh
if (!this._lastRefreshHeader) {
this._renderEmpty('Noch nie aktualisiert &mdash; starte den ersten Refresh.');
this._renderEmpty('Noch nie aktualisiert. Starte den ersten Refresh.');
return;
}
// Sichtbare Blöcke (skipped komplett ausgeblendet Anforderung 4b)
// Sichtbare Blöcke (skipped komplett ausgeblendet, Anforderung 4b)
const visible = (this._definition || []).filter(s => {
const st = this._stateByKey[s.key];
return !st || st.status !== 'skipped';
@@ -469,12 +469,12 @@ const Pipeline = {
if (status === 'done') return '<span class="count-status">erledigt</span>';
if (status === 'active') return '<span class="count-status">läuft...</span>';
if (status === 'error') return '<span class="count-status">Fehler</span>';
return '<span class="count-status"></span>';
return '<span class="count-status">-</span>';
}
if (status === 'pending') return '<span class="count-status"></span>';
if (status === 'pending') return '<span class="count-status">-</span>';
if (status === 'active') return '<span class="count-status">läuft...</span>';
if (status === 'error') return '<span class="count-status">Fehler</span>';
if (cv == null) return '<span class="count-status"></span>';
if (cv == null) return '<span class="count-status">-</span>';
switch (stepKey) {
case 'sources_review':