Befunde aus dem Testbetrieb auf der Linux-VM behoben (#572)
- #578: Abgebrochene Laeufe (Schrittgrenze, Zeitueberschreitung, Abbruch, Ausnahme) tragen ihre bezahlten Token - vorher 0 in RunUsage, fuer das Budget unsichtbar. - #580: WebFetch prueft die aufgeloeste Zieladresse beim Verbinden; ein erlaubter Name, der auf 127.0.0.1 aufloest, wird gesperrt. - #575: Dateien entstehen unter Unix mit 0600 (AtomicFile, Protokolle, FileRW-Anhaengen, state.db), Protokollverzeichnisse mit 0700. - #576: SIGTERM/SIGINT beenden auch mit Fenster geordnet. - #593: OpenRouter-Statusdienst wird gestartet. - #589: Auftragsnachricht nennt aktuelle Zeit, Zeitzone und Termin. - #581: Unvollstaendiges Argument-JSON erreicht das Werkzeug nicht mehr; das Modell bekommt eine verstaendliche Rueckmeldung statt Parsertext. - #591: Weboberflaeche liest die Felder, die API und Ereignisstrom liefern (Freigaben, Protokoll, Taskboard mit Termin, Werkzeug-Einstellungen, Tokennutzung); Ereignisstrom in camelCase. - #592: Chat zeigt Nachrichten nicht mehr doppelt. - #536 (teilweise): A2A-Antworten tragen Absender und Empfaenger, Parser wirft nicht mehr; Datums- und Volltextfilter in Agenten-Chats. - deploy/publish.py: Packager-Pfad net10.0, Schalter --agent-file. - Version 0.1.4. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -24,14 +24,25 @@ let agentenSelector = null;
|
||||
let statusPlakette = null;
|
||||
let entladeEreignisse = [];
|
||||
|
||||
// #592: Zählt die Aufbauten dieser Ansicht. Ein Aufbau, der während seines await von
|
||||
// einem neueren überholt wurde, meldet keine Ereignisse mehr an — sonst hingen zwei
|
||||
// "chat"-Listener und jede Nachricht erschien doppelt.
|
||||
let aufbauZaehler = 0;
|
||||
|
||||
function raeumeEreignisseAuf() {
|
||||
entladeEreignisse.forEach((cleanup) => cleanup());
|
||||
entladeEreignisse = [];
|
||||
}
|
||||
|
||||
export async function rendereChat(parameter = {}) {
|
||||
const container = document.getElementById("ansicht-inhalt");
|
||||
if (!container) return;
|
||||
container.replaceChildren();
|
||||
|
||||
const dieserAufbau = ++aufbauZaehler;
|
||||
|
||||
// Alte Ereignisse aufräumen
|
||||
entladeEreignisse.forEach((cleanup) => cleanup());
|
||||
entladeEreignisse = [];
|
||||
raeumeEreignisseAuf();
|
||||
|
||||
const chatShell = erstelleElement("div", { klasse: "chat-ansicht" });
|
||||
|
||||
@@ -128,6 +139,12 @@ export async function rendereChat(parameter = {}) {
|
||||
// Lade Agenten und initialisiere
|
||||
await ladeAgenten(parameter.agentId);
|
||||
|
||||
// Während des Ladens neu aufgebaut? Dann gehört die Ansicht dem neueren Aufbau.
|
||||
if (dieserAufbau !== aufbauZaehler) return;
|
||||
|
||||
// Falls zwischendurch doch etwas angemeldet wurde: vorher abräumen, nie doppelt.
|
||||
raeumeEreignisseAuf();
|
||||
|
||||
// SSE-Abonnements
|
||||
entladeEreignisse.push(
|
||||
abonnieren("chat", (daten) => {
|
||||
@@ -203,7 +220,12 @@ async function waehleAgent(agentId) {
|
||||
const agent = agentenListe.find((a) => a.agentId === agentId);
|
||||
aktualisiereLaufStatus(agent?.isRunning ?? false);
|
||||
|
||||
window.location.hash = `#/chat/${encodeURIComponent(agentId)}`;
|
||||
// Adresse mitführen, ohne hashchange auszulösen (#592): Ein Setzen von location.hash
|
||||
// ließ den Router die ganze Ansicht mitten im Laden ein zweites Mal aufbauen.
|
||||
const ziel = `#/chat/${encodeURIComponent(agentId)}`;
|
||||
if (window.location.hash !== ziel) {
|
||||
history.replaceState(null, "", ziel);
|
||||
}
|
||||
|
||||
await ladeChatVerlauf(agentId);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user