@@ -432,6 +432,7 @@ export interface ReconcileTaskConnectionParams {
432432 session : ReconcileSessionState | undefined ;
433433 repoPath : string | null ;
434434 isCloud : boolean ;
435+ isTaskAuthor ?: boolean ;
435436 isSuspended ?: boolean ;
436437 isOnline : boolean ;
437438 cloudAuth : CloudConnectionAuth ;
@@ -2967,13 +2968,15 @@ export class SessionService {
29672968 stopReason === "end_turn" &&
29682969 session . messageQueue . length === 0
29692970 ) {
2970- this . d . notifyPromptComplete (
2971- session . taskTitle ,
2972- stopReason ,
2973- session . taskId ,
2974- turnStartedAtTs ? acpMsg . ts - turnStartedAtTs : undefined ,
2975- ) ;
2976- this . speakDeterministic ( taskRunId , session , "done" ) ;
2971+ if ( session . isTaskAuthor !== false ) {
2972+ this . d . notifyPromptComplete (
2973+ session . taskTitle ,
2974+ stopReason ,
2975+ session . taskId ,
2976+ turnStartedAtTs ? acpMsg . ts - turnStartedAtTs : undefined ,
2977+ ) ;
2978+ this . speakDeterministic ( taskRunId , session , "done" ) ;
2979+ }
29772980 }
29782981 this . d . taskViewedApi . markActivity ( session . taskId ) ;
29792982 this . finalizeTurnContent ( taskRunId , "turn_complete" , acpMsg . ts ) ;
@@ -3137,7 +3140,11 @@ export class SessionService {
31373140 : this . drainQueuedMessages ( taskRunId , session ) ;
31383141
31393142 // Only notify when nothing is sendable - queued messages start a new turn
3140- if ( stopReason && ! hasSendableMessages ) {
3143+ if (
3144+ stopReason &&
3145+ ! hasSendableMessages &&
3146+ session . isTaskAuthor !== false
3147+ ) {
31413148 this . d . notifyPromptComplete (
31423149 session . taskTitle ,
31433150 stopReason ,
@@ -3383,8 +3390,10 @@ export class SessionService {
33833390
33843391 this . d . store . setPendingPermissions ( taskRunId , newPermissions ) ;
33853392 this . d . taskViewedApi . markActivity ( session . taskId ) ;
3386- this . d . notifyPermissionRequest ( session . taskTitle , session . taskId ) ;
3387- this . speakDeterministic ( taskRunId , session , "needs_input" ) ;
3393+ if ( session . isTaskAuthor !== false ) {
3394+ this . d . notifyPermissionRequest ( session . taskTitle , session . taskId ) ;
3395+ this . speakDeterministic ( taskRunId , session , "needs_input" ) ;
3396+ }
33883397 }
33893398
33903399 private handleCloudPermissionRequest (
@@ -3441,8 +3450,10 @@ export class SessionService {
34413450
34423451 this . d . store . setPendingPermissions ( taskRunId , newPermissions ) ;
34433452 this . d . taskViewedApi . markActivity ( session . taskId ) ;
3444- this . d . notifyPermissionRequest ( session . taskTitle , session . taskId ) ;
3445- this . speakDeterministic ( taskRunId , session , "needs_input" ) ;
3453+ if ( session . isTaskAuthor !== false ) {
3454+ this . d . notifyPermissionRequest ( session . taskTitle , session . taskId ) ;
3455+ this . speakDeterministic ( taskRunId , session , "needs_input" ) ;
3456+ }
34463457 }
34473458
34483459 private surfacePersistedPendingPermissions (
@@ -5611,6 +5622,7 @@ export class SessionService {
56115622 runStatus ?: TaskRunStatus ,
56125623 initialReasoningEffort ?: string ,
56135624 runState ?: Record < string , unknown > ,
5625+ isTaskAuthor = true ,
56145626 ) : ( ) => void {
56155627 const taskRunId = runId ;
56165628 const persistedConfigOptions = this . d . getPersistedConfigOptions ( taskRunId ) ;
@@ -5675,6 +5687,9 @@ export class SessionService {
56755687 // Ensure configOptions is populated on revisit
56765688 const existing = this . d . store . getSessionByTaskId ( taskId ) ;
56775689 if ( existing ) {
5690+ if ( existing . isTaskAuthor !== isTaskAuthor ) {
5691+ this . d . store . updateSession ( existing . taskRunId , { isTaskAuthor } ) ;
5692+ }
56785693 const existingMode = getConfigOptionByCategory (
56795694 existing . configOptions ,
56805695 "mode" ,
@@ -5801,6 +5816,7 @@ export class SessionService {
58015816 const session = createBaseSession ( taskRunId , taskId , taskTitle ) ;
58025817 session . status = "disconnected" ;
58035818 session . isCloud = true ;
5819+ session . isTaskAuthor = isTaskAuthor ;
58045820 session . adapter = adapter ;
58055821 session . configOptions = buildInitialConfigOptions (
58065822 initialMode ,
@@ -5814,6 +5830,9 @@ export class SessionService {
58145830 } else {
58155831 // Ensure cloud flag and configOptions are set on existing sessions
58165832 const updates : Partial < AgentSession > = { } ;
5833+ if ( existing . isTaskAuthor !== isTaskAuthor ) {
5834+ updates . isTaskAuthor = isTaskAuthor ;
5835+ }
58175836 if ( ! existing . isCloud ) updates . isCloud = true ;
58185837 if ( existing . adapter !== adapter ) updates . adapter = adapter ;
58195838 if ( ! existing . configOptions ?. length || existing . adapter !== adapter ) {
@@ -6851,6 +6870,7 @@ export class SessionService {
68516870 session,
68526871 repoPath,
68536872 isCloud,
6873+ isTaskAuthor = true ,
68546874 isSuspended,
68556875 isOnline,
68566876 cloudAuth,
@@ -6866,6 +6886,7 @@ export class SessionService {
68666886 task ,
68676887 cloudAuth ,
68686888 onCloudStatusChange ,
6889+ isTaskAuthor ,
68696890 ) ;
68706891 }
68716892
@@ -6952,6 +6973,7 @@ export class SessionService {
69526973 task : Task ,
69536974 cloudAuth : CloudConnectionAuth ,
69546975 onCloudStatusChange ?: ( ) => void ,
6976+ isTaskAuthor = true ,
69556977 ) : ( ) => void {
69566978 this . updateSessionTaskTitle (
69576979 task . id ,
@@ -6989,6 +7011,7 @@ export class SessionService {
69897011 task . latest_run ?. status ,
69907012 initialReasoningEffort ,
69917013 task . latest_run ?. state ,
7014+ isTaskAuthor ,
69927015 ) ;
69937016 }
69947017
0 commit comments