Skip to content

Commit c4ff85a

Browse files
Copilotalexr00
andcommitted
Add Open button to issue/PR and notification summaries
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 738ac18 commit c4ff85a

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

src/lm/tools/fetchIssueTool.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ export interface FetchIssueResult {
3636
author?: string;
3737
assignees?: string[];
3838
reviewers?: string[];
39+
issueNumber?: number;
40+
itemType?: 'issue' | 'pr';
3941
}
4042

4143
export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
@@ -51,6 +53,7 @@ export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
5153
if (!issueOrPullRequest) {
5254
throw new Error(`No issue or pull request found for ${owner}/${name}/${issueNumber}. Make sure the issue or pull request exists.`);
5355
}
56+
const itemType = issueOrPullRequest instanceof PullRequestModel ? 'pr' : 'issue';
5457
const result: FetchIssueResult = {
5558
owner,
5659
repo: name,
@@ -59,7 +62,9 @@ export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
5962
comments: issueOrPullRequest.item.comments?.map(c => ({ body: c.body, author: c.author.login })) ?? [],
6063
author: issueOrPullRequest.author?.login,
6164
assignees: issueOrPullRequest.assignees?.map(a => a.login),
62-
reviewers: issueOrPullRequest instanceof PullRequestModel ? issueOrPullRequest.reviewers?.map(r => isITeam(r) ? r.name : r.login).filter((login): login is string => !!login) : undefined
65+
reviewers: issueOrPullRequest instanceof PullRequestModel ? issueOrPullRequest.reviewers?.map(r => isITeam(r) ? r.name : r.login).filter((login): login is string => !!login) : undefined,
66+
issueNumber,
67+
itemType
6368
};
6469
if (issueOrPullRequest instanceof PullRequestModel && issueOrPullRequest.isResolved()) {
6570
const fileChanges = await issueOrPullRequest.getFileChangesInfo();

src/lm/tools/summarizeIssueTool.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import * as vscode from 'vscode';
88
import { FetchIssueResult } from './fetchIssueTool';
9-
import { concatAsyncIterable } from './toolsUtils';
9+
import { concatAsyncIterable, TOOL_COMMAND_RESULT } from './toolsUtils';
1010

1111
export class IssueSummarizationTool implements vscode.LanguageModelTool<FetchIssueResult> {
1212
public static readonly toolId = 'github-pull-request_issue_summarize';
@@ -58,17 +58,34 @@ Body: ${comment.body}
5858
const model = models[0];
5959
const repo = options.input.repo;
6060
const owner = options.input.owner;
61+
const content: vscode.LanguageModelTextPart[] = [];
62+
63+
// Add Open command if we have the necessary information
64+
const issueNumber = options.input.issueNumber;
65+
const itemType = options.input.itemType;
66+
if (owner && repo && issueNumber && itemType) {
67+
const type = itemType === 'issue' ? 'issues' : 'pull';
68+
const url = `https://github.com/${owner}/${repo}/${type}/${issueNumber}`;
69+
const openCommand: vscode.Command = {
70+
title: 'Open',
71+
command: 'vscode.open',
72+
arguments: [vscode.Uri.parse(url)]
73+
};
74+
content.push(new vscode.LanguageModelTextPart(TOOL_COMMAND_RESULT));
75+
content.push(new vscode.LanguageModelTextPart(JSON.stringify(openCommand)));
76+
}
6177

6278
if (model && repo && owner) {
6379
const messages = [vscode.LanguageModelChatMessage.User(this.summarizeInstructions(repo, owner))];
6480
messages.push(vscode.LanguageModelChatMessage.User(`The issue or pull request information is as follows:`));
6581
messages.push(vscode.LanguageModelChatMessage.User(issueOrPullRequestInfo));
6682
const response = await model.sendRequest(messages, {});
6783
const responseText = await concatAsyncIterable(response.text);
68-
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(responseText)]);
84+
content.push(new vscode.LanguageModelTextPart(responseText));
6985
} else {
70-
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(issueOrPullRequestInfo)]);
86+
content.push(new vscode.LanguageModelTextPart(issueOrPullRequestInfo));
7187
}
88+
return new vscode.LanguageModelToolResult(content);
7289
}
7390

7491
private summarizeInstructions(repo: string, owner: string): string {

src/lm/tools/summarizeNotificationsTool.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ Body: ${comment.body}
7070
const content: vscode.LanguageModelTextPart[] = [];
7171
const threadId = options.input.threadId;
7272
const notificationKey = options.input.notificationKey;
73+
const owner = options.input.owner;
74+
const repo = options.input.repo;
75+
const itemNumber = options.input.itemNumber;
76+
const itemType = options.input.itemType;
77+
7378
if (threadId && notificationKey) {
7479
const markAsReadCommand = {
7580
title: 'Mark As Read',
@@ -85,9 +90,20 @@ Body: ${comment.body}
8590
content.push(new vscode.LanguageModelTextPart(JSON.stringify(markAsReadCommand)));
8691
content.push(new vscode.LanguageModelTextPart(TOOL_COMMAND_RESULT));
8792
content.push(new vscode.LanguageModelTextPart(JSON.stringify(markAsDoneCommand)));
93+
94+
// Add Open command
95+
if (owner && repo && itemNumber && itemType) {
96+
const type = itemType === 'issue' ? 'issues' : 'pull';
97+
const url = `https://github.com/${owner}/${repo}/${type}/${itemNumber}`;
98+
const openCommand: vscode.Command = {
99+
title: 'Open',
100+
command: 'vscode.open',
101+
arguments: [vscode.Uri.parse(url)]
102+
};
103+
content.push(new vscode.LanguageModelTextPart(TOOL_COMMAND_RESULT));
104+
content.push(new vscode.LanguageModelTextPart(JSON.stringify(openCommand)));
105+
}
88106
}
89-
const owner = options.input.owner;
90-
const repo = options.input.repo;
91107
if (model && owner && repo) {
92108
const messages = [vscode.LanguageModelChatMessage.User(this.summarizeInstructions(owner, repo))];
93109
messages.push(vscode.LanguageModelChatMessage.User(`The notification information is as follows:`));

0 commit comments

Comments
 (0)