Skip to content

Commit 4b78634

Browse files
authored
Error message for non open repositories is a bit cryptic. (#6391)
Fixes #6363
1 parent b673dd7 commit 4b78634

6 files changed

Lines changed: 28 additions & 17 deletions

File tree

src/lm/tools/fetchIssueTool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
3636
public static readonly toolId = 'github-pull-request_issue_fetch';
3737

3838
async invoke(options: vscode.LanguageModelToolInvocationOptions<FetchIssueToolParameters>, _token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult> {
39-
const { owner, name, folderManager } = this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
39+
const { owner, name, folderManager } = await this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
4040
const issueOrPullRequest = await folderManager.resolveIssueOrPullRequest(owner, name, options.parameters.issueNumber);
4141
if (!issueOrPullRequest) {
4242
throw new Error(`No issue or PR found for ${owner}/${name}/${options.parameters.issueNumber}. Make sure the issue or PR exists.`);
@@ -70,7 +70,7 @@ export class FetchIssueTool extends RepoToolBase<FetchIssueToolParameters> {
7070
invocationMessage: vscode.l10n.t('Fetching item from GitHub')
7171
};
7272
}
73-
const { owner, name } = this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
73+
const { owner, name } = await this.getRepoInfo({ owner: options.parameters.repo?.owner, name: options.parameters.repo?.name });
7474
const url = (owner && name) ? `https://github.com/${owner}/${name}/issues/${options.parameters.issueNumber}` : undefined;
7575
return {
7676
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),

src/lm/tools/fetchNotificationTool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class FetchNotificationTool extends RepoToolBase<FetchNotificationToolPar
6161
const unread = threadData.unread;
6262
const owner = threadData.repository.owner.login;
6363
const name = threadData.repository.name;
64-
const { folderManager } = this.getRepoInfo({ owner, name });
64+
const { folderManager } = await this.getRepoInfo({ owner, name });
6565
const issueOrPR = await folderManager.resolveIssueOrPullRequest(owner, name, Number(issueNumber));
6666
if (!issueOrPR) {
6767
throw new Error(`No notification found with thread ID #${threadId}.`);

src/lm/tools/searchTools.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ You are getting ready to make a GitHub search query. Given a natural language qu
353353
}
354354

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

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

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

440440
const parameterQuery = options.parameters.query;
441441
Logger.debug(`Searching with query \`${parameterQuery}\``, SearchTool.ID);

src/lm/tools/suggestFixTool.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
'use strict';
66

77
import * as vscode from 'vscode';
8+
import { CredentialStore } from '../../github/credentials';
89
import { RepositoriesManager } from '../../github/repositoriesManager';
9-
import { IssueResult, IssueToolParameters } from './toolsUtils';
10+
import { ChatParticipantState } from '../participants';
11+
import { IssueResult, IssueToolParameters, RepoToolBase } from './toolsUtils';
1012

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

14-
constructor(private readonly repositoriesManager: RepositoriesManager) { }
16+
constructor(credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {
17+
super(credentialStore, repositoriesManager, chatParticipantState);
18+
}
1519

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

2226
async invoke(options: vscode.LanguageModelToolInvocationOptions<IssueToolParameters>, token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
23-
const folderManager = this.repositoriesManager.getManagerForRepository(options.parameters.repo.owner, options.parameters.repo.name);
27+
const { folderManager } = await this.getRepoInfo(options.parameters.repo);
2428
if (!folderManager) {
2529
throw new Error(`No folder manager found for ${options.parameters.repo.owner}/${options.parameters.repo.name}. Make sure to have the repository open.`);
2630
}

src/lm/tools/tools.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { NotificationSummarizationTool } from './summarizeNotificationsTool';
1919
export function registerTools(context: vscode.ExtensionContext, credentialStore: CredentialStore, repositoriesManager: RepositoriesManager, chatParticipantState: ChatParticipantState) {
2020
registerFetchingTools(context, credentialStore, repositoriesManager, chatParticipantState);
2121
registerSummarizationTools(context);
22-
registerSuggestFixTool(context, repositoriesManager);
22+
registerSuggestFixTool(context, credentialStore, repositoriesManager, chatParticipantState);
2323
registerSearchTools(context, credentialStore, repositoriesManager, chatParticipantState);
2424
}
2525

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

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

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

src/lm/tools/toolsUtils.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export abstract class RepoToolBase<T> extends ToolBase<T> {
5454
super(chatParticipantState);
5555
}
5656

57-
protected getRepoInfo(options: { owner?: string, name?: string }): { owner: string; name: string; folderManager: FolderRepositoryManager } {
57+
protected async getRepoInfo(options: { owner?: string, name?: string }): Promise<{ owner: string; name: string; folderManager: FolderRepositoryManager }> {
5858
let owner: string | undefined;
5959
let name: string | undefined;
6060
let folderManager: FolderRepositoryManager | undefined;
@@ -63,13 +63,20 @@ export abstract class RepoToolBase<T> extends ToolBase<T> {
6363
owner = options.owner;
6464
name = options.name;
6565
folderManager = this.repositoriesManager.getManagerForRepository(options.owner, options.name);
66-
} else if (this.repositoriesManager.folderManagers.length > 0) {
66+
}
67+
68+
if (!folderManager && this.repositoriesManager.folderManagers.length > 0) {
6769
folderManager = this.repositoriesManager.folderManagers[0];
68-
owner = folderManager.gitHubRepositories[0].remote.owner;
69-
name = folderManager.gitHubRepositories[0].remote.repositoryName;
70+
if (owner && name) {
71+
await folderManager.createGitHubRepositoryFromOwnerName(owner, name);
72+
} else {
73+
owner = folderManager.gitHubRepositories[0].remote.owner;
74+
name = folderManager.gitHubRepositories[0].remote.repositoryName;
75+
}
7076
}
77+
7178
if (!folderManager || !owner || !name) {
72-
throw new Error(`No folder manager found for ${owner}/${name}. Make sure to have the repository open.`);
79+
throw new Error(`No repository found for ${owner}/${name}. Make sure to have the repository open.`);
7380
}
7481
return { owner, name, folderManager };
7582
}

0 commit comments

Comments
 (0)