Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { ChatRequestTurn, ChatRequestTurn2, ChatResponseMarkdownPart, ChatRespon
import { IGitService } from '../../../platform/git/common/gitService';
import { PullRequestSearchItem, SessionInfo } from '../../../platform/github/common/githubAPI';
import { getAuthorDisplayName, toOpenPullRequestWebviewUri } from '../vscode/copilotCodingAgentUtils';
import { IPullRequestFileChangesService } from './pullRequestFileChangesService';

export interface SessionResponseLogChunk {
choices: Array<{
Expand Down Expand Up @@ -99,8 +98,7 @@ export interface ParsedToolCallDetails {
export class ChatSessionContentBuilder {
constructor(
private type: string,
@IGitService private readonly _gitService: IGitService,
@IPullRequestFileChangesService private readonly _prFileChangesService: IPullRequestFileChangesService,
@IGitService private readonly _gitService: IGitService
) {
}

Expand Down Expand Up @@ -194,13 +192,6 @@ export class ChatSessionContentBuilder {
}
}

if (session.state === 'completed' || session.state === 'failed' /** session can fail with proposed changes */) {
const multiDiffPart = await this._prFileChangesService.getFileChangesMultiDiffPart(pullRequest);
if (multiDiffPart) {
responseParts.push(multiDiffPart);
}
}

if (responseParts.length > 0) {
const responseResult: ChatResult = {};
return new ChatResponseTurn2(responseParts, responseResult, this.type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,16 @@ export class CopilotCloudSessionsProvider extends Disposable implements vscode.C
return undefined;
}

const multiDiffPart = await this._prFileChangesService.getFileChangesMultiDiffPart(pr);
const changes = multiDiffPart
? multiDiffPart.value.map(change =>
new vscode.ChatSessionChangedFile(change.modifiedUri!, change.added!, change.removed!, change.originalUri))
: {
files: pr.files.totalCount,
insertions: pr.additions,
deletions: pr.deletions
};

const session = {
resource: vscode.Uri.from({ scheme: CopilotCloudSessionsProvider.TYPE, path: '/' + pr.number }),
label: pr.title,
Expand All @@ -414,11 +424,7 @@ export class CopilotCloudSessionsProvider extends Disposable implements vscode.C
endTime: validateISOTimestamp(sessionItem.completed_at),
}
} : {}),
changes: {
files: pr.files.totalCount,
insertions: pr.additions,
deletions: pr.deletions
},
changes,
fullDatabaseId: pr.fullDatabaseId.toString(),
pullRequestDetails: pr,
} satisfies vscode.ChatSessionItem & {
Expand Down Expand Up @@ -525,7 +531,7 @@ export class CopilotCloudSessionsProvider extends Disposable implements vscode.C
return (this.sessionReferencesMap.get(resource) ?? []).concat(summaryRef ? [summaryRef] : []);
});

const sessionContentBuilder = new ChatSessionContentBuilder(CopilotCloudSessionsProvider.TYPE, this._gitService, this._prFileChangesService);
const sessionContentBuilder = new ChatSessionContentBuilder(CopilotCloudSessionsProvider.TYPE, this._gitService);
const history = await sessionContentBuilder.buildSessionHistory(getProblemStatement(sortedSessions), sortedSessions, pr, (sessionId: string) => this._octoKitService.getSessionLogs(sessionId), storedReferences);

const selectedAgent =
Expand Down Expand Up @@ -1250,12 +1256,6 @@ export class CopilotCloudSessionsProvider extends Disposable implements vscode.C
return;
}
isCompleted = true;

this.logService.info(`Session completed, attempting to get file changes for PR #${pullRequest.number}`);
const multiDiffPart = await this._prFileChangesService.getFileChangesMultiDiffPart(pullRequest);
if (multiDiffPart) {
stream.push(multiDiffPart);
}
resolve();
};

Expand Down Expand Up @@ -1343,7 +1343,7 @@ export class CopilotCloudSessionsProvider extends Disposable implements vscode.C
}

// Parse the new log content
const contentBuilder = new ChatSessionContentBuilder(CopilotCloudSessionsProvider.TYPE, this._gitService, this._prFileChangesService);
const contentBuilder = new ChatSessionContentBuilder(CopilotCloudSessionsProvider.TYPE, this._gitService);

const logChunks = contentBuilder.parseSessionLogs(newLogContent);
let hasStreamedContent = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
*--------------------------------------------------------------------------------------------*/

import * as vscode from 'vscode';
import { IGitService } from '../../../platform/git/common/gitService';
import { PullRequestSearchItem } from '../../../platform/github/common/githubAPI';
import { IOctoKitService } from '../../../platform/github/common/githubService';
import { ILogService } from '../../../platform/log/common/logService';
import { createServiceIdentifier } from '../../../util/common/services';
import { getRepoId } from '../vscode/copilotCodingAgentUtils';
import { toPRContentUri } from './prContentProvider';

export const IPullRequestFileChangesService = createServiceIdentifier<IPullRequestFileChangesService>('IPullRequestFileChangesService');
Expand All @@ -23,24 +21,17 @@ export class PullRequestFileChangesService implements IPullRequestFileChangesSer
declare readonly _serviceBrand: undefined;

constructor(
@IGitService private readonly _gitService: IGitService,
@IOctoKitService private readonly _octoKitService: IOctoKitService,
@ILogService private readonly logService: ILogService,
) { }

async getFileChangesMultiDiffPart(pullRequest: PullRequestSearchItem): Promise<vscode.ChatResponseMultiDiffPart | undefined> {
try {
this.logService.trace(`Getting file changes for PR #${pullRequest.number}`);
const repoId = await getRepoId(this._gitService);
let repoName, repoOwner = undefined;
if (repoId) {
repoName = repoId.repo;
repoOwner = repoId.org;
} else {
repoOwner = pullRequest.repository.owner.login;
repoName = pullRequest.repository.name;
}
if (!repoName || !repoOwner) {
const repoOwner = pullRequest.repository.owner.login;
const repoName = pullRequest.repository.name;

if (!repoOwner || !repoName) {
this.logService.warn('No repo ID available for fetching PR file changes');
return undefined;
}
Expand Down