From 0209df985ac1709e71466ca25e026afbb5825d09 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Nov 2025 12:59:12 -0500 Subject: [PATCH 1/2] Track cloud synced messages --- src/core/task/Task.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 275265efd50..ad6ca6e9d1c 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) } } @@ -811,13 +816,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) } } From 12e33abe0e8495e9e622c2ed430ca76c77670317 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Nov 2025 13:11:24 -0500 Subject: [PATCH 2/2] PR feedback --- src/core/task/Task.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index ad6ca6e9d1c..9396f4e999b 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -809,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) {