@@ -1046,7 +1046,7 @@ export class CopilotRemoteAgentManager extends Disposable {
1046
1046
return await this . parseSessionLogsIntoResponseTurn ( pullRequest , logs , session ) ;
1047
1047
} else if ( session . state === 'in_progress' ) {
1048
1048
// For in-progress sessions without logs, create a placeholder response
1049
- const placeholderParts = [ new vscode . ChatResponseMarkdownPart ( 'Session is initializing...' ) ] ;
1049
+ const placeholderParts = [ new vscode . ChatResponseProgressPart ( 'Session is initializing...' ) ] ;
1050
1050
const responseResult : vscode . ChatResult = { } ;
1051
1051
return new vscode . ChatResponseTurn2 ( placeholderParts , responseResult , 'copilot-swe-agent' ) ;
1052
1052
} else {
@@ -1184,7 +1184,16 @@ export class CopilotRemoteAgentManager extends Disposable {
1184
1184
const pollingInterval = 3000 ; // 3 seconds
1185
1185
1186
1186
return new Promise < void > ( ( resolve , reject ) => {
1187
+ let cancellationListener : vscode . Disposable | undefined ;
1188
+ let isCompleted = false ;
1189
+
1187
1190
const complete = async ( ) => {
1191
+ if ( isCompleted ) {
1192
+ return ;
1193
+ }
1194
+ isCompleted = true ;
1195
+ cancellationListener ?. dispose ( ) ;
1196
+
1188
1197
const multiDiffPart = await this . getFileChangesMultiDiffPart ( pullRequest ) ;
1189
1198
if ( multiDiffPart ) {
1190
1199
stream . push ( multiDiffPart ) ;
@@ -1198,6 +1207,24 @@ export class CopilotRemoteAgentManager extends Disposable {
1198
1207
1199
1208
resolve ( ) ;
1200
1209
} ;
1210
+
1211
+ cancellationListener = token . onCancellationRequested ( async ( ) => {
1212
+ if ( isCompleted ) {
1213
+ return ;
1214
+ }
1215
+
1216
+ try {
1217
+ const sessionInfo = await capi . getSessionInfo ( sessionId ) ;
1218
+ if ( sessionInfo && sessionInfo . state !== 'completed' && sessionInfo . workflow_run_id ) {
1219
+ await pullRequest . githubRepository . cancelWorkflow ( sessionInfo . workflow_run_id ) ;
1220
+ stream . markdown ( vscode . l10n . t ( 'Session has been cancelled.' ) ) ;
1221
+ complete ( ) ;
1222
+ }
1223
+ } catch ( error ) {
1224
+ Logger . error ( `Error while trying to cancel session ${ sessionId } workflow: ${ error } ` , CopilotRemoteAgentManager . ID ) ;
1225
+ }
1226
+ } ) ;
1227
+
1201
1228
const pollForUpdates = async ( ) : Promise < void > => {
1202
1229
try {
1203
1230
if ( token . isCancellationRequested ) {
0 commit comments