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 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-24 03:49:21 -08:00
parent 6876ec569b
commit 2a150dcff5
1 changed files with 6 additions and 3 deletions

View File

@ -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();