@@ -314,6 +314,9 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
314314 private tokenUsageSnapshot ?: TokenUsage
315315 private tokenUsageSnapshotAt ?: number
316316
317+ // Cloud Sync Tracking
318+ private cloudSyncedMessageTimestamps : Set < number > = new Set ( )
319+
317320 constructor ( {
318321 provider,
319322 apiConfiguration,
@@ -797,27 +800,42 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
797800 event : TelemetryEventName . TASK_MESSAGE ,
798801 properties : { taskId : this . taskId , message } ,
799802 } )
803+ // Track that this message has been synced to cloud
804+ this . cloudSyncedMessageTimestamps . add ( message . ts )
800805 }
801806 }
802807
803808 public async overwriteClineMessages ( newMessages : ClineMessage [ ] ) {
804809 this . clineMessages = newMessages
805810 restoreTodoListForTask ( this )
806811 await this . saveClineMessages ( )
812+
813+ // When overwriting messages (e.g., during task resume), repopulate the cloud sync tracking Set
814+ // with timestamps from all non-partial messages to prevent re-syncing previously synced messages
815+ this . cloudSyncedMessageTimestamps . clear ( )
816+ for ( const msg of newMessages ) {
817+ if ( msg . partial !== true ) {
818+ this . cloudSyncedMessageTimestamps . add ( msg . ts )
819+ }
820+ }
807821 }
808822
809823 private async updateClineMessage ( message : ClineMessage ) {
810824 const provider = this . providerRef . deref ( )
811825 await provider ?. postMessageToWebview ( { type : "messageUpdated" , clineMessage : message } )
812826 this . emit ( RooCodeEventName . Message , { action : "updated" , message } )
813827
828+ // Check if we should sync to cloud and haven't already synced this message
814829 const shouldCaptureMessage = message . partial !== true && CloudService . isEnabled ( )
830+ const hasNotBeenSynced = ! this . cloudSyncedMessageTimestamps . has ( message . ts )
815831
816- if ( shouldCaptureMessage ) {
832+ if ( shouldCaptureMessage && hasNotBeenSynced ) {
817833 CloudService . instance . captureEvent ( {
818834 event : TelemetryEventName . TASK_MESSAGE ,
819835 properties : { taskId : this . taskId , message } ,
820836 } )
837+ // Track that this message has been synced to cloud
838+ this . cloudSyncedMessageTimestamps . add ( message . ts )
821839 }
822840 }
823841
0 commit comments