diff --git a/src/lm/tools/displayIssuesTool.ts b/src/lm/tools/displayIssuesTool.ts index fe0e86d487..30e102b8f4 100644 --- a/src/lm/tools/displayIssuesTool.ts +++ b/src/lm/tools/displayIssuesTool.ts @@ -102,14 +102,16 @@ export class DisplayIssuesTool extends ToolBase { 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(', '); 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: @@ -119,7 +121,7 @@ export class DisplayIssuesTool extends ToolBase { } 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): Promise { @@ -143,8 +145,8 @@ export class DisplayIssuesTool extends ToolBase { async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { 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); diff --git a/src/lm/tools/searchTools.ts b/src/lm/tools/searchTools.ts index 1347cfc9ea..37a66ec002 100644 --- a/src/lm/tools/searchTools.ts +++ b/src/lm/tools/searchTools.ts @@ -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; @@ -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 { @@ -479,7 +479,7 @@ export class SearchTool extends RepoToolBase { }), 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.`)]); diff --git a/src/lm/tools/suggestFixTool.ts b/src/lm/tools/suggestFixTool.ts index c3b97b153b..4ae71fc43f 100644 --- a/src/lm/tools/suggestFixTool.ts +++ b/src/lm/tools/suggestFixTool.ts @@ -24,13 +24,20 @@ export class SuggestFixTool extends RepoToolBase { } async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { - 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 = { diff --git a/src/lm/tools/toolsUtils.ts b/src/lm/tools/toolsUtils.ts index 87f00fd422..9b855bbe84 100644 --- a/src/lm/tools/toolsUtils.ts +++ b/src/lm/tools/toolsUtils.ts @@ -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; }; }