Recherche abbrechen + Chats löschen (mit Aufräumen) + Truncation-Fix

- Manueller Abbruch: POST /api/sessions/:id/abort (nur Owner), AbortController
  für laufende Jobs (auch mitten im API-Stream), cancelQueued für wartende,
  ⛔-Button in der Activity-Bar, 'abgebrochen'-Event + History-Eintrag
- Chats löschen: 🗑-Button in der Sidebar mit Bestätigung, Ownership-Check
  (vorher konnte jeder fremde Chats löschen), löscht jetzt auch Messages
  und Dashboard-Dateien (HTML/GPX/tour.json) mit
- Truncation-Fix: finish_reason 'length' wird erkannt (sichtbarer Fehler
  statt leerer Abschluss), max_tokens auf 131072 (GLM-Max), 10-Min-Timeout
  gegen hängende Streams
This commit is contained in:
nico committed 2026-08-28 07:17:06 +02:00
1 parent 0b51bb6142
commit 8a2bf46b09
8 files changed
+237 -39

No files matched your search

+23 -1
View File
@@ -6,6 +6,28 @@ events.setMaxListeners(100);
let queue = [];
let running = false;
// Abort-Controller für laufende Jobs (für manuellen Abbruch)
const controllers = new Map();
/** Abort-Controller für eine Session registrieren (einmal pro Job). */
function registerController(sessionId) {
const controller = new AbortController();
controllers.set(sessionId, controller);
return controller;
}
/** Laufenden Job einer Session abbrechen. */
function abortRunning(sessionId) {
const controller = controllers.get(sessionId);
if (controller) controller.abort();
controllers.delete(sessionId);
}
/** Controller nach Job-Ende entfernen. */
function clearController(sessionId) {
controllers.delete(sessionId);
}
/** Einen Job anmelden. Läuft sofort, wenn nichts anderes läuft, sonst wartet er. */
function enqueue(job) {
queue.push(job);
@@ -45,4 +67,4 @@ function state() {
return { running, queued: queue.map((j) => j.sessionId) };
}
module.exports = { events, enqueue, queuedBefore, isRunning, cancelQueued, state };
module.exports = { events, enqueue, queuedBefore, isRunning, cancelQueued, state, registerController, abortRunning, clearController };