@@ -27,6 +27,7 @@ type SyncState = {
2727 offset : number ;
2828 batchNumber : number ;
2929 tasksProcessed : number ;
30+ initialSync : boolean ;
3031} ;
3132
3233/**
@@ -148,13 +149,21 @@ export class Asana extends Tool<Asana> implements ProjectTool {
148149 * Start syncing tasks from an Asana project
149150 */
150151 async startSync <
151- TCallback extends ( task : NewActivityWithNotes , ...args : any [ ] ) => any
152+ TCallback extends (
153+ task : NewActivityWithNotes ,
154+ syncMeta : { initialSync : boolean } ,
155+ ...args : any [ ]
156+ ) => any
152157 > (
153158 authToken : string ,
154159 projectId : string ,
155160 callback : TCallback ,
156161 options ?: ProjectSyncOptions ,
157- ...extraArgs : TCallback extends ( task : any , ...rest : infer R ) => any
162+ ...extraArgs : TCallback extends (
163+ task : any ,
164+ syncMeta : any ,
165+ ...rest : infer R
166+ ) => any
158167 ? R
159168 : [ ]
160169 ) : Promise < void > {
@@ -198,6 +207,7 @@ export class Asana extends Tool<Asana> implements ProjectTool {
198207 offset : 0 ,
199208 batchNumber : 1 ,
200209 tasksProcessed : 0 ,
210+ initialSync : true ,
201211 } ) ;
202212
203213 // Queue first batch
@@ -268,8 +278,12 @@ export class Asana extends Tool<Asana> implements ProjectTool {
268278 task ,
269279 projectId
270280 ) ;
271- // Execute the callback using the callback token
272- await this . tools . callbacks . run ( callbackToken , activityWithNotes ) ;
281+ // Execute the callback using the callback token with syncMeta
282+ await this . tools . callbacks . run (
283+ callbackToken ,
284+ activityWithNotes ,
285+ { initialSync : state . initialSync }
286+ ) ;
273287 }
274288
275289 // Check if more pages by checking if we got a full batch
@@ -280,6 +294,7 @@ export class Asana extends Tool<Asana> implements ProjectTool {
280294 offset : state . offset + batchSize ,
281295 batchNumber : state . batchNumber + 1 ,
282296 tasksProcessed : state . tasksProcessed + tasksResult . data . length ,
297+ initialSync : state . initialSync ,
283298 } ) ;
284299
285300 // Queue next batch
@@ -291,7 +306,7 @@ export class Asana extends Tool<Asana> implements ProjectTool {
291306 ) ;
292307 await this . tools . tasks . runTask ( nextBatch ) ;
293308 } else {
294- // Cleanup sync state
309+ // Initial sync is complete - cleanup sync state
295310 await this . clear ( `sync_state_${ projectId } ` ) ;
296311 }
297312 }
@@ -423,8 +438,8 @@ export class Asana extends Tool<Asana> implements ProjectTool {
423438 projectId
424439 ) ;
425440
426- // Execute stored callback
427- await this . run ( callbackToken , activityWithNotes ) ;
441+ // Execute stored callback - webhooks are never part of initial sync
442+ await this . tools . callbacks . run ( callbackToken , activityWithNotes , { initialSync : false } ) ;
428443 } catch ( error ) {
429444 console . warn ( "Failed to process Asana task webhook:" , error ) ;
430445 }
0 commit comments