Skip to content

Commit e5a1edb

Browse files
committed
feat: show related file provider results in chat # completions
1 parent e6bb858 commit e5a1edb

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingService.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { compareBy, delta } from '../../../../../base/common/arrays.js';
7-
import { AsyncIterableSource } from '../../../../../base/common/async.js';
7+
import { AsyncIterableSource, raceTimeout } from '../../../../../base/common/async.js';
88
import { CancellationToken, CancellationTokenSource } from '../../../../../base/common/cancellation.js';
99
import { Codicon } from '../../../../../base/common/codicons.js';
1010
import { BugIndicatingError } from '../../../../../base/common/errors.js';
@@ -393,6 +393,30 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
393393
this._chatRelatedFilesProviders.delete(handle);
394394
});
395395
}
396+
397+
async getRelatedFiles(chatSessionId: string, prompt: string, token: CancellationToken): Promise<readonly URI[] | undefined> {
398+
const currentSession = this._currentSessionObs.get();
399+
if (!currentSession || chatSessionId !== currentSession.chatSessionId) {
400+
return undefined;
401+
}
402+
const currentWorkingSet = [...currentSession.workingSet.keys()];
403+
404+
const providers = Array.from(this._chatRelatedFilesProviders.values());
405+
const result = await Promise.all(providers.map(async provider => {
406+
try {
407+
return await raceTimeout(provider.provideRelatedFiles({ prompt, files: currentWorkingSet }, token), 2000);
408+
} catch (e) {
409+
return undefined;
410+
}
411+
}));
412+
413+
return result.reduce<URI[]>((acc, cur) => {
414+
if (cur) {
415+
acc.push(...cur);
416+
}
417+
return acc;
418+
}, []);
419+
}
396420
}
397421

398422
/**

src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts

+12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { LifecyclePhase } from '../../../../services/lifecycle/common/lifecycle.
2929
import { QueryBuilder } from '../../../../services/search/common/queryBuilder.js';
3030
import { ISearchService } from '../../../../services/search/common/search.js';
3131
import { ChatAgentLocation, IChatAgentData, IChatAgentNameService, IChatAgentService, getFullyQualifiedId } from '../../common/chatAgents.js';
32+
import { IChatEditingService } from '../../common/chatEditingService.js';
3233
import { ChatRequestAgentPart, ChatRequestAgentSubcommandPart, ChatRequestTextPart, ChatRequestToolPart, ChatRequestVariablePart, chatAgentLeader, chatSubcommandLeader, chatVariableLeader } from '../../common/chatParserTypes.js';
3334
import { IChatSlashCommandService } from '../../common/chatSlashCommands.js';
3435
import { IChatVariablesService, IDynamicVariable } from '../../common/chatVariables.js';
@@ -437,6 +438,7 @@ class BuiltinDynamicCompletions extends Disposable {
437438
@ILabelService private readonly labelService: ILabelService,
438439
@ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService,
439440
@IChatWidgetService private readonly chatWidgetService: IChatWidgetService,
441+
@IChatEditingService private readonly _chatEditingService: IChatEditingService,
440442
@IInstantiationService private readonly instantiationService: IInstantiationService,
441443
) {
442444
super();
@@ -574,6 +576,16 @@ class BuiltinDynamicCompletions extends Disposable {
574576
}
575577
}
576578

579+
// RELATED FILES
580+
if (widget.location === ChatAgentLocation.EditingSession && widget.viewModel && this._chatEditingService.currentEditingSessionObs.get()?.chatSessionId === widget.viewModel?.sessionId) {
581+
for (const relatedFile of (await this._chatEditingService.getRelatedFiles(widget.viewModel.sessionId, widget.getInput(), token) ?? [])) {
582+
if (seen.has(relatedFile)) {
583+
continue;
584+
}
585+
result.suggestions.push(makeFileCompletionItem(relatedFile));
586+
}
587+
}
588+
577589
// mark results as incomplete because further typing might yield
578590
// in more search results
579591
result.incomplete = true;

src/vs/workbench/contrib/chat/common/chatEditingService.ts

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export interface IChatEditingService {
4343
restoreSnapshot(requestId: string | undefined): Promise<void>;
4444

4545
registerRelatedFilesProvider(handle: number, provider: IChatRelatedFilesProvider): IDisposable;
46+
getRelatedFiles(chatSessionId: string, prompt: string, token: CancellationToken): Promise<readonly URI[] | undefined>;
4647
}
4748

4849
export interface IChatRequestDraft {

0 commit comments

Comments
 (0)