Skip to content

Commit e1d6814

Browse files
committed
use raceTimeout and raceCancellation
1 parent b176a12 commit e1d6814

File tree

2 files changed

+45
-21
lines changed

2 files changed

+45
-21
lines changed

src/extension/tools/node/findFilesTool.tsx

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { URI } from '../../../util/vs/base/common/uri';
1111
import * as l10n from '@vscode/l10n';
1212
import { ISearchService } from '../../../platform/search/common/searchService';
1313
import { IWorkspaceService } from '../../../platform/workspace/common/workspaceService';
14+
import { raceCancellation, raceTimeout } from '../../../util/vs/base/common/async';
1415
import { CancellationToken } from '../../../util/vs/base/common/cancellation';
1516
import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';
1617
import { ExtendedLanguageModelToolResult, LanguageModelPromptTsxPart, MarkdownString } from '../../../vscodeTypes';
@@ -43,20 +44,29 @@ export class FindFilesTool implements ICopilotTool<IFindFilesToolParams> {
4344
// try find files with a timeout of 10s
4445
// TODO: consider making the timeout configurable
4546
const timeoutInMs = 10_000;
46-
const results = await Promise.race([
47-
this.searchService.findFiles(pattern, undefined, token),
48-
new Promise<never>((_, reject) => setTimeout(() => reject(new Error('Timeout in searching files')), timeoutInMs))
49-
]);
47+
const results = await raceTimeout(
48+
raceCancellation(
49+
Promise.resolve(this.searchService.findFiles(pattern, undefined, token)),
50+
token
51+
),
52+
timeoutInMs
53+
);
54+
55+
if (results === undefined) {
56+
throw new Error('Timeout in searching files');
57+
}
5058

5159
checkCancellation(token);
5260

5361
const maxResults = options.input.maxResults ?? 20;
5462
const resultsToShow = results.slice(0, maxResults);
5563
// Render the prompt element with a timeout
56-
const prompt = await Promise.race([
57-
renderPromptElementJSON(this.instantiationService, FindFilesResult, { fileResults: resultsToShow, totalResults: results.length }, options.tokenizationOptions, token),
58-
new Promise<never>((_, reject) => setTimeout(() => reject(new Error('Timeout in rendering prompt element')), timeoutInMs))
59-
]);
64+
const prompt = await raceTimeout(
65+
raceCancellation(
66+
renderPromptElementJSON(this.instantiationService, FindFilesResult, { fileResults: resultsToShow, totalResults: results.length }, options.tokenizationOptions, token),
67+
token),
68+
timeoutInMs
69+
);
6070

6171
const result = new ExtendedLanguageModelToolResult([new LanguageModelPromptTsxPart(prompt)]);
6272
const query = `\`${options.input.query}\``;

src/extension/tools/node/findTextInFilesTool.tsx

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { IPromptPathRepresentationService } from '../../../platform/prompts/comm
1111
import { ISearchService } from '../../../platform/search/common/searchService';
1212
import { IWorkspaceService } from '../../../platform/workspace/common/workspaceService';
1313
import { asArray } from '../../../util/vs/base/common/arrays';
14+
import { raceCancellation, raceTimeout } from '../../../util/vs/base/common/async';
1415
import { CancellationToken } from '../../../util/vs/base/common/cancellation';
1516
import { count } from '../../../util/vs/base/common/strings';
1617
import { URI } from '../../../util/vs/base/common/uri';
@@ -55,22 +56,35 @@ export class FindTextInFilesTool implements ICopilotTool<IFindTextInFilesToolPar
5556
// try find text with a timeout of 10s
5657
// TODO: consider making the timeout configurable
5758
const timeoutInMs = 10_000;
58-
let results = await Promise.race([
59-
this.searchAndCollectResults(options.input.query, isRegExp, patterns, maxResults, token),
60-
new Promise<never>((_, reject) => setTimeout(() => reject(new Error("Timeout in searching text in files")), timeoutInMs))]);
59+
let results = await raceTimeout(
60+
raceCancellation(
61+
this.searchAndCollectResults(options.input.query, isRegExp, patterns, maxResults, token),
62+
token
63+
),
64+
timeoutInMs
65+
);
66+
67+
if (results && !results.length && queryIsValidRegex) {
68+
results = await raceTimeout(
69+
raceCancellation(
70+
this.searchAndCollectResults(options.input.query, !isRegExp, patterns, maxResults, token),
71+
token
72+
),
73+
timeoutInMs
74+
);
75+
}
6176

62-
checkCancellation(token);
63-
if (!results.length && queryIsValidRegex) {
64-
results = await Promise.race([
65-
this.searchAndCollectResults(options.input.query, !isRegExp, patterns, maxResults, token),
66-
new Promise<never>((_, reject) => setTimeout(() => reject(new Error("Timeout in searching text in files")), timeoutInMs))]);
77+
if (results === undefined) {
78+
throw new Error('Timeout in searching files');
6779
}
6880

69-
checkCancellation(token);
70-
const prompt = await Promise.race([
71-
renderPromptElementJSON(this.instantiationService, FindTextInFilesResult, { textResults: results, maxResults, askedForTooManyResults: Boolean(askedForTooManyResults) }, options.tokenizationOptions, token),
72-
new Promise<never>((_, reject) => setTimeout(() => reject(new Error('Timeout in rendering prompt element')), timeoutInMs))
73-
]);
81+
const prompt = await raceTimeout(
82+
raceCancellation(
83+
renderPromptElementJSON(this.instantiationService, FindTextInFilesResult, { textResults: results, maxResults, askedForTooManyResults: Boolean(askedForTooManyResults) }, options.tokenizationOptions, token),
84+
token
85+
),
86+
timeoutInMs
87+
);
7488

7589
const result = new ExtendedLanguageModelToolResult([new LanguageModelPromptTsxPart(prompt)]);
7690
const textMatches = results.flatMap(r => {

0 commit comments

Comments
 (0)