From 2a150dcff5e23d76b9a735df7147f7a077f76c16 Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 24 Feb 2026 03:49:21 -0800 Subject: [PATCH] fix: prevent error event from overriding completed status in controller Add finished guard so that once a task reaches completed/error terminal state, subsequent events don't flip the status back. Co-Authored-By: Claude Opus 4.6 --- .../src/interfaces/rest/controllers/agent.controller.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/services/agent-service/src/interfaces/rest/controllers/agent.controller.ts b/packages/services/agent-service/src/interfaces/rest/controllers/agent.controller.ts index 01e2f99..d91361c 100644 --- a/packages/services/agent-service/src/interfaces/rest/controllers/agent.controller.ts +++ b/packages/services/agent-service/src/interfaces/rest/controllers/agent.controller.ts @@ -63,12 +63,14 @@ export class AgentController { }); let eventCount = 0; + let finished = false; for await (const event of stream) { eventCount++; - this.logger.log(`[Task ${task.id}] Event #${eventCount}: type=${event.type}${event.type === 'text' ? ` len=${(event as any).content?.length}` : ''}`); + this.logger.log(`[Task ${task.id}] Event #${eventCount}: type=${event.type}${event.type === 'text' ? ` len=${(event as any).content?.length}` : ''}${event.type === 'error' ? ` msg=${(event as any).message}` : ''}`); this.gateway.emitStreamEvent(session.id, event); - if (event.type === 'completed') { + if (event.type === 'completed' && !finished) { + finished = true; task.status = TaskStatus.COMPLETED; task.result = event.summary; task.tokensUsed = event.tokensUsed; @@ -80,7 +82,8 @@ export class AgentController { await this.sessionRepository.save(session); } - if (event.type === 'error') { + if (event.type === 'error' && !finished) { + finished = true; task.status = TaskStatus.FAILED; task.result = event.message; task.completedAt = new Date();