diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 275265efd50..9396f4e999b 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -314,6 +314,9 @@ export class Task extends EventEmitter implements TaskLike { private tokenUsageSnapshot?: TokenUsage private tokenUsageSnapshotAt?: number + // Cloud Sync Tracking + private cloudSyncedMessageTimestamps: Set = new Set() + constructor({ provider, apiConfiguration, @@ -797,6 +800,8 @@ export class Task extends EventEmitter implements TaskLike { event: TelemetryEventName.TASK_MESSAGE, properties: { taskId: this.taskId, message }, }) + // Track that this message has been synced to cloud + this.cloudSyncedMessageTimestamps.add(message.ts) } } @@ -804,6 +809,15 @@ export class Task extends EventEmitter implements TaskLike { this.clineMessages = newMessages restoreTodoListForTask(this) await this.saveClineMessages() + + // When overwriting messages (e.g., during task resume), repopulate the cloud sync tracking Set + // with timestamps from all non-partial messages to prevent re-syncing previously synced messages + this.cloudSyncedMessageTimestamps.clear() + for (const msg of newMessages) { + if (msg.partial !== true) { + this.cloudSyncedMessageTimestamps.add(msg.ts) + } + } } private async updateClineMessage(message: ClineMessage) { @@ -811,13 +825,17 @@ export class Task extends EventEmitter implements TaskLike { await provider?.postMessageToWebview({ type: "messageUpdated", clineMessage: message }) this.emit(RooCodeEventName.Message, { action: "updated", message }) + // Check if we should sync to cloud and haven't already synced this message const shouldCaptureMessage = message.partial !== true && CloudService.isEnabled() + const hasNotBeenSynced = !this.cloudSyncedMessageTimestamps.has(message.ts) - if (shouldCaptureMessage) { + if (shouldCaptureMessage && hasNotBeenSynced) { CloudService.instance.captureEvent({ event: TelemetryEventName.TASK_MESSAGE, properties: { taskId: this.taskId, message }, }) + // Track that this message has been synced to cloud + this.cloudSyncedMessageTimestamps.add(message.ts) } }