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
4 changes: 2 additions & 2 deletions src/lm/tools/fetchIssueTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
public static readonly toolId = 'github-pull-request_issue_fetch';

async invoke(options: vscode.LanguageModelToolInvocationOptions<FetchIssueToolParameters>, _token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult> {
const { owner, name, folderManager } = this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const { owner, name, folderManager } = await this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const issueOrPullRequest = await folderManager.resolveIssueOrPullRequest(owner, name, options.parameters.issueNumber);
if (!issueOrPullRequest) {
throw new Error(`No issue or PR found for ${owner}/${name}/${options.parameters.issueNumber}. Make sure the issue or PR exists.`);
Expand Down Expand Up @@ -70,7 +70,7 @@ export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
invocationMessage: vscode.l10n.t('Fetching item from GitHub')
};
}
const { owner, name } = this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const { owner, name } = await this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const url = (owner && name) ? `https://github.com/${owner}/${name}/issues/${options.parameters.issueNumber}` : undefined;
return {
invocationMessage: url ? vscode.l10n.t('Fetching item [#{0}]({1}) from GitHub', options.parameters.issueNumber, url) : vscode.l10n.t('Fetching item #{0} from GitHub', options.parameters.issueNumber),
Expand Down
2 changes: 1 addition & 1 deletion src/lm/tools/fetchNotificationTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export class FetchNotificationTool extends RepoToolBase<FetchNotificationToolPar
const unread = threadData.unread;
const owner = threadData.repository.owner.login;
const name = threadData.repository.name;
const { folderManager } = this.getRepoInfo({ owner, name });
const { folderManager } = await this.getRepoInfo({ owner, name });
const issueOrPR = await folderManager.resolveIssueOrPullRequest(owner, name, Number(issueNumber));
if (!issueOrPR) {
throw new Error(`No notification found with thread ID #${threadId}.`);
Expand Down
4 changes: 2 additions & 2 deletions src/lm/tools/searchTools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ You are getting ready to make a GitHub search query. Given a natural language qu
}

async invoke(options: vscode.LanguageModelToolInvocationOptions<ConvertToQuerySyntaxParameters>, token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
const { owner, name, folderManager } = this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const { owner, name, folderManager } = await this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const firstUserMessage = `${this.chatParticipantState.firstUserMessage?.value}, ${options.parameters.naturalLanguageString}`;

const labels = await folderManager.getLabels(undefined, { owner, repo: name });
Expand Down Expand Up @@ -435,7 +435,7 @@ export class SearchTool extends RepoToolBase<SearchToolParameters> {
}

async invoke(options: vscode.LanguageModelToolInvocationOptions<SearchToolParameters>, _token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
const { folderManager } = this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
const { folderManager } = await this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });

const parameterQuery = options.parameters.query;
Logger.debug(`Searching with query \`${parameterQuery}\``, SearchTool.ID);
Expand Down
12 changes: 8 additions & 4 deletions src/lm/tools/suggestFixTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,17 @@
'use strict';

import * as vscode from 'vscode';
import { CredentialStore } from '../../github/credentials';
import { RepositoriesManager } from '../../github/repositoriesManager';
import { IssueResult, IssueToolParameters } from './toolsUtils';
import { ChatParticipantState } from '../participants';
import { IssueResult, IssueToolParameters, RepoToolBase } from './toolsUtils';

export class SuggestFixTool implements vscode.LanguageModelTool<IssueToolParameters> {
export class SuggestFixTool extends RepoToolBase<IssueToolParameters> {
public static readonly toolId = 'github-pull-request_suggest-fix';

constructor(private readonly repositoriesManager: RepositoriesManager) { }
constructor(credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {
super(credentialStore, repositoriesManager, chatParticipantState);
}

async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions<IssueToolParameters>): Promise<vscode.PreparedToolInvocation> {
return {
Expand All @@ -20,7 +24,7 @@ export class SuggestFixTool implements vscode.LanguageModelTool<IssueToolParamet
}

async invoke(options: vscode.LanguageModelToolInvocationOptions<IssueToolParameters>, token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
const folderManager = this.repositoriesManager.getManagerForRepository(options.parameters.repo.owner, options.parameters.repo.name);
const { folderManager } = await this.getRepoInfo(options.parameters.repo);
if (!folderManager) {
throw new Error(`No folder manager found for ${options.parameters.repo.owner}/${options.parameters.repo.name}. Make sure to have the repository open.`);
}
Expand Down
6 changes: 3 additions & 3 deletions src/lm/tools/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { NotificationSummarizationTool } from './summarizeNotificationsTool';
export function registerTools(context: vscode.ExtensionContext, credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {
registerFetchingTools(context, credentialStore, repositoriesManager, chatParticipantState);
registerSummarizationTools(context);
registerSuggestFixTool(context, repositoriesManager);
registerSuggestFixTool(context, credentialStore, repositoriesManager, chatParticipantState);
registerSearchTools(context, credentialStore, repositoriesManager, chatParticipantState);
}

Expand All @@ -33,8 +33,8 @@ function registerSummarizationTools(context: vscode.ExtensionContext) {
context.subscriptions.push(vscode.lm.registerTool(NotificationSummarizationTool.toolId, new NotificationSummarizationTool()));
}

function registerSuggestFixTool(context: vscode.ExtensionContext, repositoriesManager: RepositoriesManager) {
context.subscriptions.push(vscode.lm.registerTool(SuggestFixTool.toolId, new SuggestFixTool(repositoriesManager)));
function registerSuggestFixTool(context: vscode.ExtensionContext, credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {
context.subscriptions.push(vscode.lm.registerTool(SuggestFixTool.toolId, new SuggestFixTool(credentialStore, repositoriesManager, chatParticipantState)));
}

function registerSearchTools(context: vscode.ExtensionContext, credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {
Expand Down
17 changes: 12 additions & 5 deletions src/lm/tools/toolsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export abstract class RepoToolBase<T> extends ToolBase<T> {
super(chatParticipantState);
}

protected getRepoInfo(options: { owner?: string, name?: string }): { owner: string; name: string; folderManager: FolderRepositoryManager } {
protected async getRepoInfo(options: { owner?: string, name?: string }): Promise<{ owner: string; name: string; folderManager: FolderRepositoryManager }> {
let owner: string | undefined;
let name: string | undefined;
let folderManager: FolderRepositoryManager | undefined;
Expand All @@ -63,13 +63,20 @@ export abstract class RepoToolBase<T> extends ToolBase<T> {
owner = options.owner;
name = options.name;
folderManager = this.repositoriesManager.getManagerForRepository(options.owner, options.name);
} else if (this.repositoriesManager.folderManagers.length > 0) {
}

if (!folderManager && this.repositoriesManager.folderManagers.length > 0) {
folderManager = this.repositoriesManager.folderManagers[0];
owner = folderManager.gitHubRepositories[0].remote.owner;
name = folderManager.gitHubRepositories[0].remote.repositoryName;
if (owner && name) {
await folderManager.createGitHubRepositoryFromOwnerName(owner, name);
} else {
owner = folderManager.gitHubRepositories[0].remote.owner;
name = folderManager.gitHubRepositories[0].remote.repositoryName;
}
}

if (!folderManager || !owner || !name) {
throw new Error(`No folder manager found for ${owner}/${name}. Make sure to have the repository open.`);
throw new Error(`No repository found for ${owner}/${name}. Make sure to have the repository open.`);
}
return { owner, name, folderManager };
}
Expand Down