fix(orchestrator): aktive Pipeline-Schritte beim Cancel mitschliessen
Beim User-Cancel wurde nur refresh_log auf cancelled gesetzt, der zuletzt aktive refresh_pipeline_steps-Eintrag blieb verwaist. Der /api/incidents/<id>/pipeline-Endpoint liefert daraus dauerhaft "Schritt X laeuft" an die UI, auch lange nach dem Cancel. - pipeline_tracker.cancel_active_steps(): neuer Bulk-Helper, setzt alle noch active-Schritte eines refresh_log_id auf cancelled mit completed_at - _mark_refresh_cancelled holt die refresh_log_id, macht das refresh_log- Update wie bisher und ruft danach cancel_active_steps auf Reproduziert bei Lage 80 (Bjoern Hoecke), refresh_log 1273. Frontend- CSS kennt status-cancelled nicht, faellt auf den neutralen Default-Style zurueck (kein Spinner mehr, kein Haken, korrekt ent-hangen).
Dieser Commit ist enthalten in:
@@ -627,16 +627,32 @@ class AgentOrchestrator:
|
||||
self._queue.task_done()
|
||||
|
||||
async def _mark_refresh_cancelled(self, incident_id: int):
|
||||
"""Markiert den laufenden Refresh-Log-Eintrag als cancelled."""
|
||||
"""Markiert den laufenden Refresh-Log-Eintrag als cancelled und schliesst
|
||||
alle noch aktiven Pipeline-Schritte. Ohne den zweiten Schritt blieb der
|
||||
zuletzt aktive Step-Eintrag verwaist und das Frontend zeigte dauerhaft
|
||||
'Schritt X laeuft', weil /api/incidents/<id>/pipeline aus
|
||||
refresh_pipeline_steps liest."""
|
||||
from database import get_db
|
||||
from services.pipeline_tracker import cancel_active_steps
|
||||
db = await get_db()
|
||||
try:
|
||||
now_str = datetime.now(TIMEZONE).strftime('%Y-%m-%d %H:%M:%S')
|
||||
cur = await db.execute(
|
||||
"SELECT id FROM refresh_log WHERE incident_id = ? AND status = 'running'",
|
||||
(incident_id,),
|
||||
)
|
||||
row = await cur.fetchone()
|
||||
refresh_log_id = row["id"] if row else None
|
||||
|
||||
await db.execute(
|
||||
"""UPDATE refresh_log SET status = 'cancelled', error_message = 'Vom Nutzer abgebrochen',
|
||||
completed_at = ? WHERE incident_id = ? AND status = 'running'""",
|
||||
(datetime.now(TIMEZONE).strftime('%Y-%m-%d %H:%M:%S'), incident_id),
|
||||
(now_str, incident_id),
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
if refresh_log_id is not None:
|
||||
await cancel_active_steps(db, refresh_log_id=refresh_log_id)
|
||||
except Exception as e:
|
||||
logger.warning(f"Konnte Refresh-Log nicht als abgebrochen markieren: {e}")
|
||||
finally:
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren