Skip to content

Commit ca0056a

Browse files
authored
Attach GHPR comments as chat context to fix comments with Agent (#6818)
Fixes #6782
1 parent 118aac5 commit ca0056a

6 files changed

Lines changed: 97 additions & 4 deletions

File tree

package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3728,6 +3728,20 @@
37283728
]
37293729
},
37303730
"when": "config.githubPullRequests.experimental.chat"
3731+
},
3732+
{
3733+
"name": "github-pull-request_activePullRequest",
3734+
"tags": [
3735+
"github",
3736+
"pull request"
3737+
],
3738+
"toolReferenceName": "activePullRequest",
3739+
"displayName": "%languageModelTools.github-pull-request_activePullRequest.displayName%",
3740+
"modelDescription": "Get information about the active GitHub pull request. This information includes: comments, files changed, pull request title + description, pull request state, and pull request status checks/CI. When asked about the active pull request, do this first!",
3741+
"icon": "$(pull-request)",
3742+
"canBeReferencedInPrompt": true,
3743+
"userDescription": "%languageModelTools.github-pull-request_activePullRequest.description%",
3744+
"when": "config.githubPullRequests.experimental.chat"
37313745
}
37323746
]
37333747
},

package.nls.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,8 @@
359359
"languageModelTools.github-pull-request_suggest-fix.displayName": "Suggest a Fix for a GitHub Issue",
360360
"languageModelTools.github-pull-request_formSearchQuery.displayName": "Convert natural language to a GitHub search query",
361361
"languageModelTools.github-pull-request_doSearch.displayName": "Execute a GitHub search",
362-
"languageModelTools.github-pull-request_renderIssues.displayName": "Render issue items in a markdown table"
362+
"languageModelTools.github-pull-request_renderIssues.displayName": "Render issue items in a markdown table",
363+
"languageModelTools.github-pull-request_activePullRequest.displayName": "Active Pull Request",
364+
"languageModelTools.github-pull-request_activePullRequest.description": "Get information about the active GitHub pull request. This information includes: comments, files changed, pull request title + description, pull request state, and pull request status checks/CI."
363365

364366
}

src/github/interface.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ export enum ReviewEvent {
1818
}
1919

2020
export enum GithubItemStateEnum {
21-
Open,
22-
Merged,
23-
Closed,
21+
Open = 'OPEN',
22+
Merged = 'MERGED',
23+
Closed = 'CLOSED',
2424
}
2525

2626
export enum PullRequestMergeability {

src/github/issueOverview.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,4 +599,8 @@ export class IssueOverviewPanel<TItem extends IssueModel = IssueModel> extends W
599599
public getCurrentTitle(): string {
600600
return this._panel.title;
601601
}
602+
603+
public getCurrentItem(): TItem | undefined {
604+
return this._item;
605+
}
602606
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
'use strict';
6+
7+
import * as vscode from 'vscode';
8+
import { PullRequestModel } from '../../github/pullRequestModel';
9+
import { PullRequestOverviewPanel } from '../../github/pullRequestOverview';
10+
import { RepositoriesManager } from '../../github/repositoriesManager';
11+
import { FetchIssueResult } from './fetchIssueTool';
12+
13+
export class ActivePullRequestTool implements vscode.LanguageModelTool<FetchIssueResult> {
14+
public static readonly toolId = 'github-pull-request_activePullRequest';
15+
constructor(private readonly folderManagers: RepositoriesManager) { }
16+
17+
private _findActivePullRequest(): PullRequestModel | undefined {
18+
const folderManager = this.folderManagers.folderManagers.find((manager) => manager.activePullRequest);
19+
return folderManager?.activePullRequest ?? PullRequestOverviewPanel.currentPanel?.getCurrentItem();
20+
}
21+
22+
async prepareInvocation(): Promise<vscode.PreparedToolInvocation> {
23+
const pullRequest = this._findActivePullRequest();
24+
return {
25+
invocationMessage: pullRequest ? vscode.l10n.t('Pull request "{0}"', pullRequest.title) : vscode.l10n.t('Active pull request'),
26+
};
27+
}
28+
29+
async invoke(_options: vscode.LanguageModelToolInvocationOptions<any>, _token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
30+
let pullRequest = this._findActivePullRequest();
31+
32+
if (!pullRequest) {
33+
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart('There is no active pull request')]);
34+
}
35+
36+
const status = await pullRequest.getStatusChecks();
37+
const pullRequestInfo = {
38+
title: pullRequest.title,
39+
body: pullRequest.body,
40+
author: pullRequest.author,
41+
comments: pullRequest.comments.map(comment => {
42+
return {
43+
author: comment.user?.login,
44+
body: comment.body,
45+
commentState: comment.isResolved ? 'resolved' : 'unresolved',
46+
file: comment.path
47+
};
48+
}),
49+
state: pullRequest.state,
50+
statusChecks: status[0]?.statuses.map((status) => {
51+
return {
52+
context: status.context,
53+
description: status.description,
54+
state: status.state,
55+
name: status.workflowName,
56+
targetUrl: status.targetUrl
57+
};
58+
}),
59+
reviewRequirements: {
60+
approvalsNeeded: status[1]?.count ?? 0,
61+
currentApprovals: status[1]?.approvals.length ?? 0,
62+
areChangesRequested: (status[1]?.requestedChanges.length ?? 0) > 0,
63+
},
64+
isDraft: pullRequest.isDraft,
65+
};
66+
67+
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(JSON.stringify(pullRequestInfo))]);
68+
69+
}
70+
71+
}

src/lm/tools/tools.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import * as vscode from 'vscode';
88
import { CredentialStore } from '../../github/credentials';
99
import { RepositoriesManager } from '../../github/repositoriesManager';
1010
import { ChatParticipantState } from '../participants';
11+
import { ActivePullRequestTool } from './activePullRequestTool';
1112
import { DisplayIssuesTool } from './displayIssuesTool';
1213
import { FetchIssueTool } from './fetchIssueTool';
1314
import { FetchNotificationTool } from './fetchNotificationTool';
@@ -21,6 +22,7 @@ export function registerTools(context: vscode.ExtensionContext, credentialStore:
2122
registerSummarizationTools(context);
2223
registerSuggestFixTool(context, credentialStore, repositoriesManager, chatParticipantState);
2324
registerSearchTools(context, credentialStore, repositoriesManager, chatParticipantState);
25+
context.subscriptions.push(vscode.lm.registerTool(ActivePullRequestTool.toolId, new ActivePullRequestTool(repositoriesManager)));
2426
}
2527

2628
function registerFetchingTools(context: vscode.ExtensionContext, credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {

0 commit comments

Comments
 (0)