From bdd8fee8267c7ae5ccf6b7d8f62ddbee398e7f91 Mon Sep 17 00:00:00 2001 From: larchanka Date: Fri, 10 Apr 2026 16:55:32 +0200 Subject: [PATCH] fix(orchestrator): Ensure abandoned tasks are marked as failed on error --- src/core/orchestrator.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/core/orchestrator.ts b/src/core/orchestrator.ts index ca4d865..a34876f 100644 --- a/src/core/orchestrator.ts +++ b/src/core/orchestrator.ts @@ -565,6 +565,9 @@ export class Orchestrator { if (details.originalErrorMessage != null) parts.push(String(details.originalErrorMessage)); lastError = parts.join(" "); } + + this.sendAndWait(taskMemory, "task.fail", { taskId, reason: lastError }).catch(() => { }); + if (attempt === Orchestrator.MAX_PLAN_RETRIES) { this.sendToTelegram(chatId, lastError); return; @@ -576,6 +579,9 @@ export class Orchestrator { const plan = planPayload.result as { nodes: unknown[]; edges?: unknown[]; complexity?: string } | undefined; if (!plan?.nodes || !Array.isArray(plan.nodes)) { lastError = "Invalid plan from planner: missing or invalid nodes."; + + this.sendAndWait(taskMemory, "task.fail", { taskId, reason: lastError }).catch(() => { }); + if (attempt === Orchestrator.MAX_PLAN_RETRIES) { this.sendToTelegram(chatId, lastError); return; @@ -616,6 +622,9 @@ export class Orchestrator { if (details.originalErrorMessage != null) parts.push(String(details.originalErrorMessage)); lastError = parts.join(". "); } + + this.sendAndWait(taskMemory, "task.fail", { taskId, reason: lastError }).catch(() => { }); + if (attempt === Orchestrator.MAX_PLAN_RETRIES) { this.sendToTelegram(chatId, lastError); return;