Skip to content

Commit e794de1

Browse files
authored
Reporting chat session progress (#7640)
1 parent 0e65f27 commit e794de1

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

src/github/common.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
*--------------------------------------------------------------------------------------------*/
55
import * as OctokitRest from '@octokit/rest';
66
import { Endpoints } from '@octokit/types';
7-
import type { Uri } from 'vscode';
7+
import { ChatSessionStatus, Uri } from 'vscode';
88
import { Repository } from '../api/api';
99
import { GitHubRemote } from '../common/remote';
10+
import { EventType, TimelineEvent } from '../common/timelineEvent';
1011
import { SessionInfo, SessionSetupStep } from './copilotApi';
1112
import { FolderRepositoryManager } from './folderRepositoryManager';
1213
import { GitHubRepository } from './githubRepository';
@@ -157,3 +158,20 @@ export interface RepoInfo {
157158
ghRepository: GitHubRepository;
158159
fm: FolderRepositoryManager;
159160
}
161+
162+
export function copilotEventToSessionStatus(event: TimelineEvent | undefined): ChatSessionStatus {
163+
if (!event) {
164+
return ChatSessionStatus.InProgress;
165+
}
166+
167+
switch (event.event) {
168+
case EventType.CopilotStarted:
169+
return ChatSessionStatus.InProgress;
170+
case EventType.CopilotFinished:
171+
return ChatSessionStatus.Completed;
172+
case EventType.CopilotFinishedError:
173+
return ChatSessionStatus.Failed;
174+
default:
175+
return ChatSessionStatus.InProgress;
176+
}
177+
}

src/github/copilotRemoteAgent.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import vscode from 'vscode';
88
import { parseSessionLogs, parseToolCallDetails } from '../../common/sessionParsing';
99
import { COPILOT_ACCOUNTS } from '../common/comment';
1010
import { CopilotRemoteAgentConfig } from '../common/config';
11-
import { COPILOT_LOGINS, COPILOT_SWE_AGENT, copilotEventToStatus, CopilotPRStatus, mostRecentCopilotEvent } from '../common/copilot';
11+
import { COPILOT_LOGINS, COPILOT_SWE_AGENT, CopilotPRStatus, mostRecentCopilotEvent } from '../common/copilot';
1212
import { commands } from '../common/executeCommands';
1313
import { Disposable } from '../common/lifecycle';
1414
import Logger from '../common/logger';
@@ -18,7 +18,7 @@ import { ITelemetry } from '../common/telemetry';
1818
import { DataUri, toOpenPullRequestWebviewUri } from '../common/uri';
1919
import { dateFromNow } from '../common/utils';
2020
import { getIconForeground, getListErrorForeground, getListWarningForeground, getNotebookStatusSuccessIconForeground } from '../view/theme';
21-
import { IAPISessionLogs, ICopilotRemoteAgentCommandArgs, ICopilotRemoteAgentCommandResponse, OctokitCommon, RemoteAgentResult, RepoInfo } from './common';
21+
import { copilotEventToSessionStatus, IAPISessionLogs, ICopilotRemoteAgentCommandArgs, ICopilotRemoteAgentCommandResponse, OctokitCommon, RemoteAgentResult, RepoInfo } from './common';
2222
import { ChatSessionWithPR, CopilotApi, getCopilotApi, RemoteAgentJobPayload, SessionInfo, SessionSetupStep } from './copilotApi';
2323
import { CopilotPRWatcher, CopilotStateModel } from './copilotPrWatcher';
2424
import { ChatSessionContentBuilder } from './copilotRemoteAgent/chatSessionContentBuilder';
@@ -688,7 +688,7 @@ export class CopilotRemoteAgentManager extends Disposable {
688688
throw new Error(`Failed to find session for pull request: ${number}`);
689689
}
690690
const timeline = await session.getCopilotTimelineEvents(session);
691-
const status = copilotEventToStatus(mostRecentCopilotEvent(timeline));
691+
const status = copilotEventToSessionStatus(mostRecentCopilotEvent(timeline));
692692
const tooltip = await issueMarkdown(session, this.context, this.repositoriesManager);
693693
return {
694694
id: `${session.number}`,
@@ -697,6 +697,7 @@ export class CopilotRemoteAgentManager extends Disposable {
697697
description: `${dateFromNow(session.createdAt)}`,
698698
pullRequest: session,
699699
tooltip,
700+
status,
700701
};
701702
}
702703

@@ -717,7 +718,7 @@ export class CopilotRemoteAgentManager extends Disposable {
717718
const codingAgentPRs = await capi.getAllCodingAgentPRs(this.repositoriesManager);
718719
return await Promise.all(codingAgentPRs.map(async session => {
719720
const timeline = await session.getCopilotTimelineEvents(session);
720-
const status = copilotEventToStatus(mostRecentCopilotEvent(timeline));
721+
const status = copilotEventToSessionStatus(mostRecentCopilotEvent(timeline));
721722
const tooltip = await issueMarkdown(session, this.context, this.repositoriesManager);
722723
return {
723724
id: `${session.number}`,
@@ -726,6 +727,7 @@ export class CopilotRemoteAgentManager extends Disposable {
726727
description: `${dateFromNow(session.createdAt)}`,
727728
pullRequest: session,
728729
tooltip,
730+
status,
729731
};
730732
}));
731733
} catch (error) {
@@ -1225,15 +1227,15 @@ export class CopilotRemoteAgentManager extends Disposable {
12251227
return undefined;
12261228
}
12271229

1228-
private getIconForSession(status: CopilotPRStatus): vscode.Uri | vscode.ThemeIcon {
1230+
private getIconForSession(status: vscode.ChatSessionStatus): vscode.Uri | vscode.ThemeIcon {
12291231
// Use the same icons as webview components for consistency
12301232
const themeData = this.repositoriesManager.folderManagers[0]?.themeWatcher?.themeData;
12311233
if (!themeData) {
12321234
// Fallback to theme icons if no theme data available
12331235
switch (status) {
1234-
case CopilotPRStatus.Completed:
1236+
case vscode.ChatSessionStatus.Completed:
12351237
return new vscode.ThemeIcon('pass-filled', new vscode.ThemeColor('testing.iconPassed'));
1236-
case CopilotPRStatus.Failed:
1238+
case vscode.ChatSessionStatus.Failed:
12371239
return new vscode.ThemeIcon('close', new vscode.ThemeColor('testing.iconFailed'));
12381240
default:
12391241
return new vscode.ThemeIcon('circle-filled', new vscode.ThemeColor('list.warningForeground'));
@@ -1246,12 +1248,12 @@ export class CopilotRemoteAgentManager extends Disposable {
12461248
const themeKind = isDark ? 'dark' : 'light';
12471249

12481250
switch (status) {
1249-
case CopilotPRStatus.Completed:
1251+
case vscode.ChatSessionStatus.Completed:
12501252
return DataUri.copilotSuccessAsImageDataURI(
12511253
getIconForeground(themeData, themeKind),
12521254
getNotebookStatusSuccessIconForeground(themeData, themeKind)
12531255
);
1254-
case CopilotPRStatus.Failed:
1256+
case vscode.ChatSessionStatus.Failed:
12551257
return DataUri.copilotErrorAsImageDataURI(
12561258
getIconForeground(themeData, themeKind),
12571259
getListErrorForeground(themeData, themeKind)

0 commit comments

Comments
 (0)