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
|
analysis, analysis_usage = analysis_result
|
||||||
fact_checks, fc_usage = factcheck_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)
|
await _pipe_done("summary", count_value=None, count_secondary=None)
|
||||||
|
|
||||||
# --- Analyse-Ergebnisse verarbeiten ---
|
# --- Analyse-Ergebnisse verarbeiten ---
|
||||||
@@ -1632,15 +1632,15 @@ class AgentOrchestrator:
|
|||||||
# Pipeline-Schritt 9: Benachrichtigen (fertig)
|
# Pipeline-Schritt 9: Benachrichtigen (fertig)
|
||||||
await _pipe_done("notify", count_value=_notify_count, count_secondary=None)
|
await _pipe_done("notify", count_value=_notify_count, count_secondary=None)
|
||||||
|
|
||||||
# Falls Analyse-Block uebersprungen wurde (kein neuer Artikel und Summary existiert),
|
# Falls Analyse-Block übersprungen wurde (kein neuer Artikel und Summary existiert),
|
||||||
# die noch offenen Pipeline-Schritte als uebersprungen markieren.
|
# die noch offenen Pipeline-Schritte als übersprungen markieren.
|
||||||
for _skipped_key in ("summary", "factcheck", "qc", "notify"):
|
for _skipped_key in ("summary", "factcheck", "qc", "notify"):
|
||||||
if _skipped_key in _step_ids or _skipped_key not in {"summary", "factcheck", "qc", "notify"}:
|
if _skipped_key in _step_ids or _skipped_key not in {"summary", "factcheck", "qc", "notify"}:
|
||||||
pass
|
pass
|
||||||
# Saubere Variante: alle noch offenen Steps am Ende skippen
|
# Saubere Variante: alle noch offenen Steps am Ende skippen
|
||||||
for _open_key in list(_step_ids.keys()):
|
for _open_key in list(_step_ids.keys()):
|
||||||
await _pipe_skip(_open_key)
|
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()
|
_started_keys = set()
|
||||||
try:
|
try:
|
||||||
_check_cursor = await db.execute(
|
_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)
|
incident_row = await _check_incident_access(db, incident_id, current_user["id"], tenant_id)
|
||||||
is_research = (incident_row["type"] or "adhoc") == "research"
|
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(
|
cursor = await db.execute(
|
||||||
"""SELECT id, started_at, completed_at, status, retry_count
|
"""SELECT id, started_at, completed_at, status, retry_count
|
||||||
FROM refresh_log
|
FROM refresh_log
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ PIPELINE_STEPS = [
|
|||||||
"key": "collect",
|
"key": "collect",
|
||||||
"label": "Nachrichten sammeln",
|
"label": "Nachrichten sammeln",
|
||||||
"icon": "rss",
|
"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",
|
"key": "dedup",
|
||||||
@@ -54,7 +54,7 @@ PIPELINE_STEPS = [
|
|||||||
"key": "summary",
|
"key": "summary",
|
||||||
"label": "Lagebild verfassen",
|
"label": "Lagebild verfassen",
|
||||||
"icon": "file-text",
|
"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",
|
"key": "factcheck",
|
||||||
@@ -72,7 +72,7 @@ PIPELINE_STEPS = [
|
|||||||
"key": "notify",
|
"key": "notify",
|
||||||
"label": "Benachrichtigen",
|
"label": "Benachrichtigen",
|
||||||
"icon": "bell",
|
"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) {
|
@media (max-width: 900px) {
|
||||||
/* Snake aufloesen — alle Reihen werden vertikal gestapelt */
|
/* Snake auflösen, alle Reihen werden vertikal gestapelt */
|
||||||
.pipeline-row,
|
.pipeline-row,
|
||||||
.pipeline-row[data-direction="rtl"] {
|
.pipeline-row[data-direction="rtl"] {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -290,7 +290,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="pipeline-body">
|
<div class="pipeline-body">
|
||||||
<div class="pipeline-stage" id="pipeline-stage" aria-label="Analysepipeline-Visualisierung">
|
<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>
|
</div>
|
||||||
<aside class="pipeline-sidenote" id="pipeline-sidenote" hidden>
|
<aside class="pipeline-sidenote" id="pipeline-sidenote" hidden>
|
||||||
Recherche-Lagen werden mehrfach evaluiert, um das Bild Schritt für Schritt aufzubauen.
|
Recherche-Lagen werden mehrfach evaluiert, um das Bild Schritt für Schritt aufzubauen.
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ const Pipeline = {
|
|||||||
const key = d.step_key;
|
const key = d.step_key;
|
||||||
if (!key) return;
|
if (!key) return;
|
||||||
|
|
||||||
// State aktualisieren — letzter Pass gewinnt
|
// State aktualisieren, letzter Pass gewinnt
|
||||||
const prev = this._stateByKey[key];
|
const prev = this._stateByKey[key];
|
||||||
const passNr = d.pass_number || 1;
|
const passNr = d.pass_number || 1;
|
||||||
if (!prev || passNr >= (prev.pass_number || 1)) {
|
if (!prev || passNr >= (prev.pass_number || 1)) {
|
||||||
@@ -177,11 +177,11 @@ const Pipeline = {
|
|||||||
|
|
||||||
// Brandneue Lage ohne Refresh
|
// Brandneue Lage ohne Refresh
|
||||||
if (!this._lastRefreshHeader) {
|
if (!this._lastRefreshHeader) {
|
||||||
this._renderEmpty('Noch nie aktualisiert — starte den ersten Refresh.');
|
this._renderEmpty('Noch nie aktualisiert. Starte den ersten Refresh.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sichtbare Blöcke (skipped komplett ausgeblendet — Anforderung 4b)
|
// Sichtbare Blöcke (skipped komplett ausgeblendet, Anforderung 4b)
|
||||||
const visible = (this._definition || []).filter(s => {
|
const visible = (this._definition || []).filter(s => {
|
||||||
const st = this._stateByKey[s.key];
|
const st = this._stateByKey[s.key];
|
||||||
return !st || st.status !== 'skipped';
|
return !st || st.status !== 'skipped';
|
||||||
@@ -469,12 +469,12 @@ const Pipeline = {
|
|||||||
if (status === 'done') return '<span class="count-status">erledigt</span>';
|
if (status === 'done') return '<span class="count-status">erledigt</span>';
|
||||||
if (status === 'active') return '<span class="count-status">läuft...</span>';
|
if (status === 'active') return '<span class="count-status">läuft...</span>';
|
||||||
if (status === 'error') return '<span class="count-status">Fehler</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 === 'active') return '<span class="count-status">läuft...</span>';
|
||||||
if (status === 'error') return '<span class="count-status">Fehler</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) {
|
switch (stepKey) {
|
||||||
case 'sources_review':
|
case 'sources_review':
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren