Analysepipeline: echte Umlaute und ASCII-Bindestriche
Em-dashes und Umlaut-Umschreibungen aus den Pipeline-Aenderungen entfernt: Tooltip-Texte, HTML-Empty-State, JS-Kommentare, Count-Status-Platzhalter, Orchestrator-Kommentare und CSS-Kommentare. Anstelle von typografischen Gedankenstrichen werden jetzt Kommas oder Punkte gesetzt, "uebersprungen" -> "uebersprungen" mit echtem Umlaut, "laeuft" usw. analog. UI-Text "— Refresh starten" wird zu zwei Saetzen. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 — 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.
|
||||
|
||||
@@ -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 — 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':
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren