Skip to content
Merged
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
14 changes: 8 additions & 6 deletions src/lm/tools/displayIssuesTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,16 @@ export class DisplayIssuesTool extends ToolBase<DisplayIssuesParameters> {
case 'number':
return `[${issue[column]}](${issue.url})`;
case 'labels':
return issue[column].map((label) => makeLabel(label)).join(', ');
return issue[column]?.map((label) => label && label.name && label.color ? makeLabel({ name: label.name, color: label.color }) : '').join(', ');
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should be able to leave out the label check like this.

Suggested change
return issue[column]?.map((label) => label && label.name && label.color ? makeLabel({ name: label.name, color: label.color }) : '').join(', ');
return issue[column]?.map((label) => label?.name && label.color ? makeLabel({ name: label.name, color: label.color }) : '').join(', ');

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #6523

case 'assignees':
return issue[column]?.map((assignee) => this.renderUser(assignee)).join(', ');
case 'author':
return this.renderUser(issue[column]);
const account = issue[column];
return account ? this.renderUser(account) : '';
case 'createdAt':
case 'updatedAt':
return new Date(issue[column]).toLocaleDateString();
const updatedAt = issue[column];
return updatedAt ? new Date(updatedAt).toLocaleDateString() : '';
case 'milestone':
return issue[column];
default:
Expand All @@ -119,7 +121,7 @@ export class DisplayIssuesTool extends ToolBase<DisplayIssuesParameters> {
}

private foundIssuesCount(params: DisplayIssuesParameters): number {
return params.totalIssues !== undefined ? params.totalIssues : params.arrayOfIssues.length;
return params.totalIssues !== undefined ? params.totalIssues : (params.arrayOfIssues?.length ?? 0);
}

async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions<DisplayIssuesParameters>): Promise<vscode.PreparedToolInvocation> {
Expand All @@ -143,8 +145,8 @@ export class DisplayIssuesTool extends ToolBase<DisplayIssuesParameters> {

async invoke(options: vscode.LanguageModelToolInvocationOptions<DisplayIssuesParameters>, token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
const issueItemsInfo: vscode.LanguageModelTextPart | undefined = this.chatParticipantState.firstUserMessage;
const issueItems: IssueSearchResultItem[] = options.input.arrayOfIssues;
if (issueItems.length === 0) {
const issueItems: IssueSearchResultItem[] | undefined = options.input.arrayOfIssues;
if (!issueItems || issueItems.length === 0) {
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(vscode.l10n.t('No issues found. Please try another query.'))]);
}
Logger.debug(`Displaying ${this.foundIssuesCount(options.input)} issues, first issue ${issueItems[0].number}`, DisplayIssuesTool.ID);
Expand Down
40 changes: 20 additions & 20 deletions src/lm/tools/searchTools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { escapeMarkdown } from '../../issues/util';
import { concatAsyncIterable, RepoToolBase } from './toolsUtils';

interface ConvertToQuerySyntaxParameters {
naturalLanguageString: string;
naturalLanguageString?: string;
repo?: {
owner?: string;
name?: string;
Expand Down Expand Up @@ -399,33 +399,33 @@ You are getting ready to make a GitHub search query. Given a natural language qu
type SearchToolParameters = ConvertToQuerySyntaxResult;

export interface IssueSearchResultAccount {
login: string;
url: string;
login?: string;
url?: string;
}

interface IssueSearchResultLabel {
name: string;
color: string;
name?: string;
color?: string;
}

export interface IssueSearchResultItem {
title: string;
url: string;
number: number;
labels: IssueSearchResultLabel[];
state: string;
assignees: IssueSearchResultAccount[] | undefined;
createdAt: string;
updatedAt: string;
author: IssueSearchResultAccount;
milestone: string | undefined;
commentCount: number;
reactionCount: number;
title?: string;
url?: string;
number?: number;
labels?: IssueSearchResultLabel[];
state?: string;
assignees?: IssueSearchResultAccount[] | undefined;
createdAt?: string;
updatedAt?: string;
author?: IssueSearchResultAccount;
milestone?: string | undefined;
commentCount?: number;
reactionCount?: number;
}

export interface SearchToolResult {
arrayOfIssues: IssueSearchResultItem[];
totalIssues: number;
arrayOfIssues?: IssueSearchResultItem[];
totalIssues?: number;
}

export class SearchTool extends RepoToolBase<SearchToolParameters> {
Expand Down Expand Up @@ -479,7 +479,7 @@ export class SearchTool extends RepoToolBase<SearchToolParameters> {
}),
totalIssues: searchResult.totalCount ?? searchResult.items.length
};
Logger.debug(`Found ${result.totalIssues} issues, first issue ${result.arrayOfIssues[0]?.number}.`, SearchTool.ID);
Logger.debug(`Found ${result.totalIssues} issues, first issue ${result.arrayOfIssues![0]?.number}.`, SearchTool.ID);

return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(JSON.stringify(result)),
new vscode.LanguageModelTextPart(`Above are the issues I found for the query ${parameterQuery} in json format. You can pass these to a tool that can display them, or you can reason over the issues to answer a question.`)]);
Expand Down
15 changes: 11 additions & 4 deletions src/lm/tools/suggestFixTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,20 @@ export class SuggestFixTool extends RepoToolBase<IssueToolParameters> {
}

async invoke(options: vscode.LanguageModelToolInvocationOptions<IssueToolParameters>, token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
const { folderManager } = await this.getRepoInfo(options.input.repo);
const repo = options.input.repo;
const owner = repo?.owner;
const name = repo?.name;
const issueNumber = options.input.issueNumber;
if (!repo || !owner || !name || !issueNumber) {
return undefined;
}
const { folderManager } = await this.getRepoInfo(repo);
if (!folderManager) {
throw new Error(`No folder manager found for ${options.input.repo.owner}/${options.input.repo.name}. Make sure to have the repository open.`);
throw new Error(`No folder manager found for ${repo.owner}/${repo.name}. Make sure to have the repository open.`);
}
const issue = await folderManager.resolveIssue(options.input.repo.owner, options.input.repo.name, options.input.issueNumber, true);
const issue = await folderManager.resolveIssue(owner, name, issueNumber, true);
if (!issue) {
throw new Error(`No issue found for ${options.input.repo.owner}/${options.input.repo.name}/${options.input.issueNumber}. Make sure the issue exists.`);
throw new Error(`No issue found for ${repo.owner}/${repo.name}/${options.input.issueNumber}. Make sure the issue exists.`);
}

const result: IssueResult = {
Expand Down
8 changes: 4 additions & 4 deletions src/lm/tools/toolsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ export const TOOL_MARKDOWN_RESULT = 'TOOL_MARKDOWN_RESULT';
export const TOOL_COMMAND_RESULT = 'TOOL_COMMAND_RESULT';

export interface IssueToolParameters {
issueNumber: number;
repo: {
owner: string;
name: string;
issueNumber?: number;
repo?: {
owner?: string;
name?: string;
};
}

Expand Down