diff --git a/apps/code/src/renderer/features/sessions/service/service.ts b/apps/code/src/renderer/features/sessions/service/service.ts index 930e5f0dc..7219d3730 100644 --- a/apps/code/src/renderer/features/sessions/service/service.ts +++ b/apps/code/src/renderer/features/sessions/service/service.ts @@ -1128,6 +1128,7 @@ export class SessionService { private updatePromptStateFromEvents( taskRunId: string, events: AcpMessage[], + { isLive = false }: { isLive?: boolean } = {}, ): void { for (const acpMsg of events) { const msg = acpMsg.message; @@ -1179,6 +1180,17 @@ export class SessionService { promptStartedAt: null, currentPromptId: null, }); + if (isLive) { + // Queued messages will start a new turn — suppress the "done" notification in that case. + if (session.messageQueue.length === 0) { + notifyPromptComplete( + session.taskTitle, + "end_turn", + session.taskId, + ); + } + taskViewedApi.markActivity(session.taskId); + } } } // Lifecycle handshake from the agent — flip status to "connected" @@ -1264,7 +1276,7 @@ export class SessionService { } else { sessionStoreSetters.appendEvents(taskRunId, [acpMsg]); } - this.updatePromptStateFromEvents(taskRunId, [acpMsg]); + this.updatePromptStateFromEvents(taskRunId, [acpMsg], { isLive: true }); const msg = acpMsg.message; @@ -3511,7 +3523,9 @@ export class SessionService { sessionStoreSetters.clearTailOptimisticItems(taskRunId); } sessionStoreSetters.appendEvents(taskRunId, newEvents, expectedCount); - this.updatePromptStateFromEvents(taskRunId, newEvents); + this.updatePromptStateFromEvents(taskRunId, newEvents, { + isLive: true, + }); } else { this.reconcileCloudLogGap({ taskId: update.taskId,