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