diff --git a/app/api/static/index.html b/app/api/static/index.html
index 6a79437..4993540 100644
--- a/app/api/static/index.html
+++ b/app/api/static/index.html
@@ -457,6 +457,18 @@
events.scrollTop = events.scrollHeight;
}
+ function eventsInclude(eventsList, type) {
+ return Array.isArray(eventsList) && eventsList.some((event) => event.type === type);
+ }
+
+ function shouldRenderImmediateResult(data) {
+ if (!data || !data.status) return false;
+ if (data.status === "completed" && eventsInclude(data.events, "task_completed")) {
+ return false;
+ }
+ return true;
+ }
+
async function loadRecentEvents() {
const response = await fetch("/events?limit=1000");
const data = await response.json();
@@ -611,7 +623,9 @@
if (data.events && Array.isArray(data.events)) {
data.events.forEach(addEvent);
}
- renderRuntimeResult(data.result, data.status);
+ if (shouldRenderImmediateResult(data)) {
+ renderRuntimeResult(data.result, data.status);
+ }
}
async function resolveSecret(secret) {
@@ -641,7 +655,9 @@
});
const data = await response.json();
data.events.forEach(addEvent);
- renderRuntimeResult(data.result, data.status);
+ if (shouldRenderImmediateResult(data)) {
+ renderRuntimeResult(data.result, data.status);
+ }
}
async function resolvePassword(password) {
@@ -671,7 +687,9 @@
});
const data = await response.json();
data.events.forEach(addEvent);
- renderRuntimeResult(data.result, data.status);
+ if (shouldRenderImmediateResult(data)) {
+ renderRuntimeResult(data.result, data.status);
+ }
}
async function sendTask() {
@@ -707,7 +725,9 @@
clearSecretControls();
clearPasswordControls();
data.events.forEach(addEvent);
- renderRuntimeResult(data.result, data.status);
+ if (shouldRenderImmediateResult(data)) {
+ renderRuntimeResult(data.result, data.status);
+ }
if (data.task_id) {
attachStream(data.task_id);
}
@@ -742,7 +762,9 @@
data.retry_result.events.forEach(addEvent);
}
currentTaskId = data.retry_result.task_id || currentTaskId;
- renderRuntimeResult(data.retry_result.result, data.retry_result.status);
+ if (shouldRenderImmediateResult(data.retry_result)) {
+ renderRuntimeResult(data.retry_result.result, data.retry_result.status);
+ }
}
if (data.status !== "ok") {
addSystemMessage("Feedback", data.message || "Не удалось сохранить feedback.");
diff --git a/app/core/async_router.py b/app/core/async_router.py
index 8aae773..877a6a9 100644
--- a/app/core/async_router.py
+++ b/app/core/async_router.py
@@ -3,6 +3,7 @@ from __future__ import annotations
import asyncio
import json
import logging
+import re
from typing import Any
from app.core.contracts import ExecutionDirective