Skip to content

Commit 8a971f9

Browse files
Copilotalexr00
andauthored
Resolve search repository exactly
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 200e79a commit 8a971f9

3 files changed

Lines changed: 10 additions & 6 deletions

File tree

‎src/lm/tools/searchTools.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class SearchTool extends RepoToolBase<SearchToolParameters> {
8686
}
8787

8888
async invoke(options: vscode.LanguageModelToolInvocationOptions<SearchToolParameters>, _token: vscode.CancellationToken): Promise<vscode.LanguageModelToolResult | undefined> {
89-
const { owner, name, folderManager } = await this.getRepoInfo({ owner: options.input.repo?.owner, name: options.input.repo?.name });
89+
const { owner, name, folderManager } = await this.getRepoInfo({ owner: options.input.repo?.owner, name: options.input.repo?.name, exact: true });
9090

9191
const parameterQuery = this.toRepositoryQuery(options.input.query, owner, name);
9292
Logger.debug(`Searching with query \`${parameterQuery}\``, SearchTool.ID);

‎src/lm/tools/toolsUtils.ts‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,19 @@ export abstract class RepoToolBase<T> extends ToolBase<T> {
5353
super();
5454
}
5555

56-
protected async getRepoInfo(options: { owner?: string, name?: string }): Promise<{ owner: string; name: string; folderManager: FolderRepositoryManager }> {
56+
protected async getRepoInfo(options: { owner?: string, name?: string, exact?: boolean }): Promise<{ owner: string; name: string; folderManager: FolderRepositoryManager }> {
5757
if (!this.credentialStore.isAnyAuthenticated()) {
5858
throw new AuthenticationError();
5959
}
60+
if (options.exact && (!options.owner || !options.name)) {
61+
throw new Error('Repository owner and name are required.');
62+
}
6063

6164
let owner: string | undefined;
6265
let name: string | undefined;
6366
let folderManager: FolderRepositoryManager | undefined;
6467
// The llm likes to make up an owner and name if it isn't provided one, and they tend to include 'owner' and 'name' respectively
65-
if (options.owner && options.name && !options.owner.includes('owner') && !options.name.includes('name')) {
68+
if (options.owner && options.name && (options.exact || (!options.owner.includes('owner') && !options.name.includes('name')))) {
6669
owner = options.owner;
6770
name = options.name;
6871
folderManager = this.repositoriesManager.getManagerForRepository(options.owner, options.name);

‎src/test/lm/tools/searchTools.test.ts‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ describe('SearchTool', function () {
5252
title: 'Known matching issue',
5353
titleHTML: 'Known matching issue',
5454
body: '',
55-
url: 'https://github.com/microsoft/vscode/issues/332663',
55+
url: 'https://github.com/repository-owner/repository-name/issues/332663',
5656
number: 332663,
5757
labels: [],
5858
state: 'OPEN',
@@ -79,16 +79,17 @@ describe('SearchTool', function () {
7979
repositoriesManager as unknown as RepositoriesManager,
8080
).invoke({
8181
input: {
82-
repo: { owner: 'microsoft', name: 'vscode' },
82+
repo: { owner: 'repository-owner', name: 'repository-name' },
8383
query: 'is:issue is:open assignee:jruales',
8484
},
8585
toolInvocationToken: undefined,
8686
}, tokenSource.token);
8787
tokenSource.dispose();
8888

89+
assert.strictEqual(repositoriesManager.getManagerForRepository.calledOnceWith('repository-owner', 'repository-name'), true);
8990
assert.strictEqual(githubRepository.getIssues.calledOnceWith(
9091
undefined,
91-
'(is:issue is:open assignee:jruales) AND repo:microsoft/vscode',
92+
'(is:issue is:open assignee:jruales) AND repo:repository-owner/repository-name',
9293
), true);
9394
assert.strictEqual(folderManager.getIssues.notCalled, true);
9495
const searchResult = JSON.parse((result!.content[0] as vscode.LanguageModelTextPart).value) as SearchToolResult;

0 commit comments

Comments
 (0)