From f520d705ae646c2e26d624924d503562e20d9517 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 26 Jan 2026 11:26:50 -0800 Subject: [PATCH] Deleted 'related files' context attachment feature (#290189) * Deleted 'related files' context attachment feature * Delete leftover css * Bump distro --- package.json | 2 +- .../common/extensionsApiProposals.ts | 5 +- .../api/browser/mainThreadChatAgents2.ts | 17 -- .../workbench/api/common/extHost.api.impl.ts | 4 - .../workbench/api/common/extHost.protocol.ts | 4 - .../api/common/extHostChatAgents2.ts | 31 ---- .../api/common/extHostTypeConverters.ts | 10 -- .../chat/browser/actions/chatContext.ts | 66 +------ .../chat/browser/actions/chatNewActions.ts | 1 - .../chatInputRelatedFilesContrib.ts | 161 ------------------ .../contrib/chat/browser/chat.contribution.ts | 7 - .../chatEditing/chatEditingServiceImpl.ts | 36 +--- .../contrib/chat/browser/widget/chatWidget.ts | 6 - .../browser/widget/input/chatInputPart.ts | 79 +-------- .../input/editor/chatInputCompletions.ts | 16 -- .../chat/browser/widget/media/chat.css | 76 --------- .../chat/common/editing/chatEditingService.ts | 27 --- .../vscode.proposed.chatEditing.d.ts | 29 ---- ...scode.proposed.chatParticipantPrivate.d.ts | 2 +- 19 files changed, 9 insertions(+), 570 deletions(-) delete mode 100644 src/vs/workbench/contrib/chat/browser/attachments/chatInputRelatedFilesContrib.ts delete mode 100644 src/vscode-dts/vscode.proposed.chatEditing.d.ts diff --git a/package.json b/package.json index a51ddcdd47c..4e97573bbb4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.109.0", - "distro": "5f31a333fe6a2ba288b244f54da7a647e5dcf0c8", + "distro": "a1aa83355e88aa5c0b79a2f427e88559cb699562", "author": { "name": "Microsoft Corporation" }, diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index bfd1f278c35..a70854f46c9 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -43,9 +43,6 @@ const _allApiProposals = { chatContextProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatContextProvider.d.ts', }, - chatEditing: { - proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatEditing.d.ts', - }, chatOutputRenderer: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatOutputRenderer.d.ts', }, @@ -54,7 +51,7 @@ const _allApiProposals = { }, chatParticipantPrivate: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', - version: 11 + version: 12 }, chatPromptFiles: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatPromptFiles.d.ts', diff --git a/src/vs/workbench/api/browser/mainThreadChatAgents2.ts b/src/vs/workbench/api/browser/mainThreadChatAgents2.ts index 77ba586d6e5..9d81f730ba1 100644 --- a/src/vs/workbench/api/browser/mainThreadChatAgents2.ts +++ b/src/vs/workbench/api/browser/mainThreadChatAgents2.ts @@ -28,7 +28,6 @@ import { AddDynamicVariableAction, IAddDynamicVariableContext } from '../../cont import { IChatAgentHistoryEntry, IChatAgentImplementation, IChatAgentRequest, IChatAgentService } from '../../contrib/chat/common/participants/chatAgents.js'; import { IPromptFileContext, IPromptsService } from '../../contrib/chat/common/promptSyntax/service/promptsService.js'; import { isValidPromptType } from '../../contrib/chat/common/promptSyntax/promptTypes.js'; -import { IChatEditingService, IChatRelatedFileProviderMetadata } from '../../contrib/chat/common/editing/chatEditingService.js'; import { IChatModel } from '../../contrib/chat/common/model/chatModel.js'; import { ChatRequestAgentPart } from '../../contrib/chat/common/requestParser/chatParserTypes.js'; import { ChatRequestParser } from '../../contrib/chat/common/requestParser/chatRequestParser.js'; @@ -96,8 +95,6 @@ export class MainThreadChatAgents2 extends Disposable implements MainThreadChatA private readonly _chatParticipantDetectionProviders = this._register(new DisposableMap()); - private readonly _chatRelatedFilesProviders = this._register(new DisposableMap()); - private readonly _promptFileProviders = this._register(new DisposableMap()); private readonly _promptFileProviderEmitters = this._register(new DisposableMap>()); private readonly _promptFileContentRegistrations = this._register(new DisposableMap>()); @@ -114,7 +111,6 @@ export class MainThreadChatAgents2 extends Disposable implements MainThreadChatA @IChatAgentService private readonly _chatAgentService: IChatAgentService, @IChatSessionsService private readonly _chatSessionService: IChatSessionsService, @IChatService private readonly _chatService: IChatService, - @IChatEditingService private readonly _chatEditingService: IChatEditingService, @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @IChatWidgetService private readonly _chatWidgetService: IChatWidgetService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @@ -447,19 +443,6 @@ export class MainThreadChatAgents2 extends Disposable implements MainThreadChatA this._chatParticipantDetectionProviders.deleteAndDispose(handle); } - $registerRelatedFilesProvider(handle: number, metadata: IChatRelatedFileProviderMetadata): void { - this._chatRelatedFilesProviders.set(handle, this._chatEditingService.registerRelatedFilesProvider(handle, { - description: metadata.description, - provideRelatedFiles: async (request, token) => { - return (await this._proxy.$provideRelatedFiles(handle, request, token))?.map((v) => ({ uri: URI.from(v.uri), description: v.description })) ?? []; - } - })); - } - - $unregisterRelatedFilesProvider(handle: number): void { - this._chatRelatedFilesProviders.deleteAndDispose(handle); - } - async $registerPromptFileProvider(handle: number, type: string, extensionId: ExtensionIdentifier): Promise { const extension = await this._extensionService.getExtension(extensionId.value); if (!extension) { diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index b1179119f0b..21cb7bb1839 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1530,10 +1530,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension, 'chatParticipantPrivate'); return extHostChatAgents2.registerChatParticipantDetectionProvider(extension, provider); }, - registerRelatedFilesProvider(provider: vscode.ChatRelatedFilesProvider, metadata: vscode.ChatRelatedFilesProviderMetadata) { - checkProposedApiEnabled(extension, 'chatEditing'); - return extHostChatAgents2.registerRelatedFilesProvider(extension, provider, metadata); - }, onDidDisposeChatSession: (listeners, thisArgs?, disposables?) => { checkProposedApiEnabled(extension, 'chatParticipantPrivate'); return _asExtensionEvent(extHostChatAgents2.onDidDisposeChatSession)(listeners, thisArgs, disposables); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2ee8de6cb01..82292bd6198 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -57,7 +57,6 @@ import { CallHierarchyItem } from '../../contrib/callHierarchy/common/callHierar import { IChatAgentMetadata, IChatAgentRequest, IChatAgentResult, UserSelectedTools } from '../../contrib/chat/common/participants/chatAgents.js'; import { ICodeMapperRequest, ICodeMapperResult } from '../../contrib/chat/common/editing/chatCodeMapperService.js'; import { IChatContextItem } from '../../contrib/chat/common/contextContrib/chatContext.js'; -import { IChatRelatedFile, IChatRelatedFileProviderMetadata as IChatRelatedFilesProviderMetadata, IChatRequestDraft } from '../../contrib/chat/common/editing/chatEditingService.js'; import { IChatProgressHistoryResponseContent, IChatRequestVariableData } from '../../contrib/chat/common/model/chatModel.js'; import { ChatResponseClearToPreviousToolInvocationReason, IChatContentInlineReference, IChatExternalEditsDto, IChatFollowup, IChatMultiDiffData, IChatMultiDiffDataSerialized, IChatNotebookEdit, IChatProgress, IChatTask, IChatTaskDto, IChatUserActionEvent, IChatVoteAction } from '../../contrib/chat/common/chatService/chatService.js'; import { IChatSessionItem, IChatSessionProviderOptionGroup, IChatSessionProviderOptionItem } from '../../contrib/chat/common/chatSessionsService.js'; @@ -1403,8 +1402,6 @@ export interface MainThreadChatAgentsShape2 extends IChatAgentProgressShape, IDi $registerAgent(handle: number, extension: ExtensionIdentifier, id: string, metadata: IExtensionChatAgentMetadata, dynamicProps: IDynamicChatAgentProps | undefined): void; $registerChatParticipantDetectionProvider(handle: number): void; $unregisterChatParticipantDetectionProvider(handle: number): void; - $registerRelatedFilesProvider(handle: number, metadata: IChatRelatedFilesProviderMetadata): void; - $unregisterRelatedFilesProvider(handle: number): void; $registerPromptFileProvider(handle: number, type: string, extension: ExtensionIdentifier): void; $unregisterPromptFileProvider(handle: number): void; $onDidChangePromptFiles(handle: number): void; @@ -1473,7 +1470,6 @@ export interface ExtHostChatAgentsShape2 { $provideChatSummary(handle: number, context: IChatAgentHistoryEntryDto[], token: CancellationToken): Promise; $releaseSession(sessionResource: UriComponents): void; $detectChatParticipant(handle: number, request: Dto, context: { history: IChatAgentHistoryEntryDto[] }, options: { participants: IChatParticipantMetadata[]; location: ChatAgentLocation }, token: CancellationToken): Promise; - $provideRelatedFiles(handle: number, request: Dto, token: CancellationToken): Promise[] | undefined>; $providePromptFiles(handle: number, type: PromptsType, context: IPromptFileContext, token: CancellationToken): Promise[] | undefined>; $setRequestTools(requestId: string, tools: UserSelectedTools): void; } diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index 10600725cd6..cdcdb1580ea 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -21,7 +21,6 @@ import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescriptio import { ILogService } from '../../../platform/log/common/log.js'; import { isChatViewTitleActionContext } from '../../contrib/chat/common/actions/chatActions.js'; import { IChatAgentRequest, IChatAgentResult, IChatAgentResultTimings, UserSelectedTools } from '../../contrib/chat/common/participants/chatAgents.js'; -import { IChatRelatedFile, IChatRequestDraft } from '../../contrib/chat/common/editing/chatEditingService.js'; import { ChatAgentVoteDirection, IChatContentReference, IChatFollowup, IChatResponseErrorDetails, IChatUserActionEvent, IChatVoteAction } from '../../contrib/chat/common/chatService/chatService.js'; import { LocalChatSessionUri } from '../../contrib/chat/common/model/chatUri.js'; import { ChatAgentLocation } from '../../contrib/chat/common/constants.js'; @@ -446,9 +445,6 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS private static _participantDetectionProviderIdPool = 0; private readonly _participantDetectionProviders = new Map(); - private static _relatedFilesProviderIdPool = 0; - private readonly _relatedFilesProviders = new Map(); - private static _contributionsProviderIdPool = 0; private readonly _promptFileProviders = new Map(); @@ -523,16 +519,6 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS }); } - registerRelatedFilesProvider(extension: IExtensionDescription, provider: vscode.ChatRelatedFilesProvider, metadata: vscode.ChatRelatedFilesProviderMetadata): vscode.Disposable { - const handle = ExtHostChatAgents2._relatedFilesProviderIdPool++; - this._relatedFilesProviders.set(handle, new ExtHostRelatedFilesProvider(extension, provider)); - this._proxy.$registerRelatedFilesProvider(handle, metadata); - return toDisposable(() => { - this._relatedFilesProviders.delete(handle); - this._proxy.$unregisterRelatedFilesProvider(handle); - }); - } - /** * Internal method that handles all prompt file provider types. * Routes custom agents, instructions, prompt files, and skills to the unified internal implementation. @@ -576,16 +562,6 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS return disposables; } - async $provideRelatedFiles(handle: number, request: IChatRequestDraft, token: CancellationToken): Promise[] | undefined> { - const provider = this._relatedFilesProviders.get(handle); - if (!provider) { - return Promise.resolve([]); - } - - const extRequestDraft = typeConvert.ChatRequestDraft.to(request); - return await provider.provider.provideRelatedFiles(extRequestDraft, token) ?? undefined; - } - async $providePromptFiles(handle: number, type: PromptsType, context: IPromptFileContext, token: CancellationToken): Promise { const providerData = this._promptFileProviders.get(handle); if (!providerData) { @@ -996,13 +972,6 @@ class ExtHostParticipantDetector { ) { } } -class ExtHostRelatedFilesProvider { - constructor( - public readonly extension: IExtensionDescription, - public readonly provider: vscode.ChatRelatedFilesProvider, - ) { } -} - class ExtHostChatAgent { private _followupProvider: vscode.ChatFollowupProvider | undefined; diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index b1869dc04f2..d14c61952d1 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -40,7 +40,6 @@ import { ProgressLocation as MainProgressLocation } from '../../../platform/prog import { DEFAULT_EDITOR_ASSOCIATION, SaveReason } from '../../common/editor.js'; import { IViewBadge } from '../../common/views.js'; import { IChatAgentRequest, IChatAgentResult } from '../../contrib/chat/common/participants/chatAgents.js'; -import { IChatRequestDraft } from '../../contrib/chat/common/editing/chatEditingService.js'; import { IChatRequestModeInstructions } from '../../contrib/chat/common/model/chatModel.js'; import { IChatAgentMarkdownContentWithVulnerability, IChatCodeCitation, IChatCommandButton, IChatConfirmation, IChatContentInlineReference, IChatContentReference, IChatExtensionsContent, IChatFollowup, IChatMarkdownContent, IChatMoveMessage, IChatMultiDiffDataSerialized, IChatProgressMessage, IChatPullRequestContent, IChatQuestionCarousel, IChatResponseCodeblockUriPart, IChatTaskDto, IChatTaskResult, IChatTerminalToolInvocationData, IChatTextEdit, IChatThinkingPart, IChatToolInvocationSerialized, IChatTreeData, IChatUserActionEvent, IChatWarningMessage, IChatWorkspaceEdit } from '../../contrib/chat/common/chatService/chatService.js'; import { LocalChatSessionUri } from '../../contrib/chat/common/model/chatUri.js'; @@ -3344,15 +3343,6 @@ export namespace ChatAgentRequest { } } -export namespace ChatRequestDraft { - export function to(request: IChatRequestDraft): vscode.ChatRequestDraft { - return { - prompt: request.prompt, - files: request.files.map((uri) => URI.revive(uri)) - }; - } -} - export namespace ChatLocation { export function to(loc: ChatAgentLocation): types.ChatLocation { switch (loc) { diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContext.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContext.ts index 28eb5e87051..fb17967129b 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContext.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContext.ts @@ -2,11 +2,9 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CancellationToken } from '../../../../../base/common/cancellation.js'; import { Codicon } from '../../../../../base/common/codicons.js'; import { Disposable, DisposableStore } from '../../../../../base/common/lifecycle.js'; import { isElectron } from '../../../../../base/common/platform.js'; -import { dirname } from '../../../../../base/common/resources.js'; import { ThemeIcon } from '../../../../../base/common/themables.js'; import { localize } from '../../../../../nls.js'; import { IClipboardService } from '../../../../../platform/clipboard/common/clipboardService.js'; @@ -22,8 +20,7 @@ import { UntitledTextEditorInput } from '../../../../services/untitled/common/un import { FileEditorInput } from '../../../files/browser/editors/fileEditorInput.js'; import { NotebookEditorInput } from '../../../notebook/common/notebookEditorInput.js'; import { IChatContextPickService, IChatContextValueItem, IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPicker } from '../attachments/chatContextPickService.js'; -import { IChatEditingService } from '../../common/editing/chatEditingService.js'; -import { IChatRequestToolEntry, IChatRequestToolSetEntry, IChatRequestVariableEntry, IImageVariableEntry, OmittedState, toToolSetVariableEntry, toToolVariableEntry } from '../../common/attachments/chatVariableEntries.js'; +import { IChatRequestToolEntry, IChatRequestToolSetEntry, IChatRequestVariableEntry, IImageVariableEntry, toToolSetVariableEntry, toToolVariableEntry } from '../../common/attachments/chatVariableEntries.js'; import { isToolSet, ToolDataSource } from '../../common/tools/languageModelToolsService.js'; import { IChatWidget } from '../chat.js'; import { imageToHash, isImage } from '../widget/input/editor/chatPasteProviders.js'; @@ -55,7 +52,6 @@ export class ChatContextContributions extends Disposable implements IWorkbenchCo this._store.add(contextPickService.registerChatContextItem(instantiationService.createInstance(ToolsContextPickerPick))); this._store.add(contextPickService.registerChatContextItem(instantiationService.createInstance(ChatInstructionsPickerPick))); this._store.add(contextPickService.registerChatContextItem(instantiationService.createInstance(OpenEditorContextValuePick))); - this._store.add(contextPickService.registerChatContextItem(instantiationService.createInstance(RelatedFilesContextPickerPick))); this._store.add(contextPickService.registerChatContextItem(instantiationService.createInstance(ClipboardImageContextValuePick))); this._store.add(contextPickService.registerChatContextItem(instantiationService.createInstance(ScreenshotContextValuePick))); } @@ -168,66 +164,6 @@ class OpenEditorContextValuePick implements IChatContextValueItem { } -class RelatedFilesContextPickerPick implements IChatContextPickerItem { - - readonly type = 'pickerPick'; - - readonly label: string = localize('chatContext.relatedFiles', 'Related Files'); - readonly icon: ThemeIcon = Codicon.sparkle; - readonly ordinal = 300; - - constructor( - @IChatEditingService private readonly _chatEditingService: IChatEditingService, - @ILabelService private readonly _labelService: ILabelService, - ) { } - - isEnabled(widget: IChatWidget): boolean { - return this._chatEditingService.hasRelatedFilesProviders() && (Boolean(widget.getInput()) || widget.attachmentModel.fileAttachments.length > 0); - } - - asPicker(widget: IChatWidget): IChatContextPicker { - - const picks = (async () => { - const chatSessionResource = widget.viewModel?.sessionResource; - if (!chatSessionResource) { - return []; - } - const relatedFiles = await this._chatEditingService.getRelatedFiles(chatSessionResource, widget.getInput(), widget.attachmentModel.fileAttachments, CancellationToken.None); - if (!relatedFiles) { - return []; - } - const attachments = widget.attachmentModel.getAttachmentIDs(); - return this._chatEditingService.getRelatedFiles(chatSessionResource, widget.getInput(), widget.attachmentModel.fileAttachments, CancellationToken.None) - .then((files) => (files ?? []).reduce<(IChatContextPickerPickItem | IQuickPickSeparator)[]>((acc, cur) => { - acc.push({ type: 'separator', label: cur.group }); - for (const file of cur.files) { - const label = this._labelService.getUriBasenameLabel(file.uri); - acc.push({ - label: label, - description: this._labelService.getUriLabel(dirname(file.uri), { relative: true }), - disabled: attachments.has(file.uri.toString()), - asAttachment: () => { - return { - kind: 'file', - id: file.uri.toString(), - value: file.uri, - name: label, - omittedState: OmittedState.NotOmitted - }; - } - }); - } - return acc; - }, [])); - })(); - - return { - placeholder: localize('relatedFiles', 'Add related files to your working set'), - picks, - }; - } -} - class ClipboardImageContextValuePick implements IChatContextValueItem { readonly type = 'valuePick'; diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.ts index cf389342c93..1bed8d9733a 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.ts @@ -325,7 +325,6 @@ async function runNewChatAction( } widget.attachmentModel.clear(true); - widget.input.relatedFiles?.clear(); widget.focusInput(); accessibilityService.alert(localize('newChat', "New chat")); diff --git a/src/vs/workbench/contrib/chat/browser/attachments/chatInputRelatedFilesContrib.ts b/src/vs/workbench/contrib/chat/browser/attachments/chatInputRelatedFilesContrib.ts deleted file mode 100644 index f79a3cbf7b0..00000000000 --- a/src/vs/workbench/contrib/chat/browser/attachments/chatInputRelatedFilesContrib.ts +++ /dev/null @@ -1,161 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { CancellationToken } from '../../../../../base/common/cancellation.js'; -import { Emitter, Event } from '../../../../../base/common/event.js'; -import { Disposable, DisposableStore } from '../../../../../base/common/lifecycle.js'; -import { ResourceMap, ResourceSet } from '../../../../../base/common/map.js'; -import { autorun } from '../../../../../base/common/observable.js'; -import { isEqual } from '../../../../../base/common/resources.js'; -import { URI } from '../../../../../base/common/uri.js'; -import { localize } from '../../../../../nls.js'; -import { IWorkbenchContribution } from '../../../../common/contributions.js'; -import { IChatEditingService, IChatEditingSession } from '../../common/editing/chatEditingService.js'; -import { IChatWidget, IChatWidgetService } from '../chat.js'; - -export class ChatRelatedFilesContribution extends Disposable implements IWorkbenchContribution { - static readonly ID = 'chat.relatedFilesWorkingSet'; - - private readonly chatEditingSessionDisposables = new ResourceMap(); - private _currentRelatedFilesRetrievalOperation: Promise | undefined; - - constructor( - @IChatEditingService private readonly chatEditingService: IChatEditingService, - @IChatWidgetService private readonly chatWidgetService: IChatWidgetService, - ) { - super(); - - this._register(autorun((reader) => { - const sessions = this.chatEditingService.editingSessionsObs.read(reader); - sessions.forEach(session => { - const widget = this.chatWidgetService.getWidgetBySessionResource(session.chatSessionResource); - if (widget && !this.chatEditingSessionDisposables.has(session.chatSessionResource)) { - this._handleNewEditingSession(session, widget); - } - }); - })); - } - - private _updateRelatedFileSuggestions(currentEditingSession: IChatEditingSession, widget: IChatWidget) { - if (this._currentRelatedFilesRetrievalOperation) { - return; - } - - const workingSetEntries = currentEditingSession.entries.get(); - if (workingSetEntries.length > 0 || widget.attachmentModel.fileAttachments.length === 0) { - // Do this only for the initial working set state - return; - } - - this._currentRelatedFilesRetrievalOperation = this.chatEditingService.getRelatedFiles(currentEditingSession.chatSessionResource, widget.getInput(), widget.attachmentModel.fileAttachments, CancellationToken.None) - .then((files) => { - if (!files?.length || !widget.viewModel || !widget.input.relatedFiles) { - return; - } - - const currentEditingSession = this.chatEditingService.getEditingSession(widget.viewModel.sessionResource); - if (!currentEditingSession || currentEditingSession.entries.get().length) { - return; // Might have disposed while we were calculating - } - - const existingFiles = new ResourceSet([...widget.attachmentModel.fileAttachments, ...widget.input.relatedFiles.removedFiles]); - if (!existingFiles.size) { - return; - } - - // Pick up to 2 related files - const newSuggestions = new ResourceMap(); - for (const group of files) { - for (const file of group.files) { - if (newSuggestions.size >= 2) { - break; - } - if (existingFiles.has(file.uri)) { - continue; - } - newSuggestions.set(file.uri, localize('relatedFile', "{0} (Suggested)", file.description)); - existingFiles.add(file.uri); - } - } - - widget.input.relatedFiles.value = [...newSuggestions.entries()].map(([uri, description]) => ({ uri, description })); - }) - .finally(() => { - this._currentRelatedFilesRetrievalOperation = undefined; - }); - - } - - private _handleNewEditingSession(currentEditingSession: IChatEditingSession, widget: IChatWidget) { - const disposableStore = new DisposableStore(); - disposableStore.add(currentEditingSession.onDidDispose(() => { - disposableStore.clear(); - })); - this._updateRelatedFileSuggestions(currentEditingSession, widget); - const onDebouncedType = Event.debounce(widget.inputEditor.onDidChangeModelContent, () => null, 3000); - disposableStore.add(onDebouncedType(() => { - this._updateRelatedFileSuggestions(currentEditingSession, widget); - })); - disposableStore.add(widget.attachmentModel.onDidChange(() => { - this._updateRelatedFileSuggestions(currentEditingSession, widget); - })); - disposableStore.add(currentEditingSession.onDidDispose(() => { - disposableStore.dispose(); - })); - disposableStore.add(widget.onDidAcceptInput(() => { - widget.input.relatedFiles?.clear(); - this._updateRelatedFileSuggestions(currentEditingSession, widget); - })); - this.chatEditingSessionDisposables.set(currentEditingSession.chatSessionResource, disposableStore); - } - - override dispose() { - for (const store of this.chatEditingSessionDisposables.values()) { - store.dispose(); - } - super.dispose(); - } -} - -export interface IChatRelatedFile { - uri: URI; - description: string; -} -export class ChatRelatedFiles extends Disposable { - - private readonly _onDidChange = this._register(new Emitter()); - readonly onDidChange: Event = this._onDidChange.event; - - private _removedFiles = new ResourceSet(); - get removedFiles() { - return this._removedFiles; - } - - private _value: IChatRelatedFile[] = []; - get value() { - return this._value; - } - - set value(value: IChatRelatedFile[]) { - this._value = value; - this._onDidChange.fire(); - } - - remove(uri: URI) { - this._value = this._value.filter(file => !isEqual(file.uri, uri)); - this._removedFiles.add(uri); - this._onDidChange.fire(); - } - - clearRemovedFiles() { - this._removedFiles.clear(); - } - - clear() { - this._value = []; - this._removedFiles.clear(); - this._onDidChange.fire(); - } -} diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 5ee4b4bff13..cf52d32910b 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -123,7 +123,6 @@ import { ChatImplicitContextContribution } from './attachments/chatImplicitConte import './widget/input/editor/chatInputCompletions.js'; import './widget/input/editor/chatInputEditorContrib.js'; import './widget/input/editor/chatInputEditorHover.js'; -import { ChatRelatedFilesContribution } from './attachments/chatInputRelatedFilesContrib.js'; import { LanguageModelToolsConfirmationService } from './tools/languageModelToolsConfirmationService.js'; import { LanguageModelToolsService, globalAutoApproveDescription } from './tools/languageModelToolsService.js'; import './promptSyntax/promptCodingAgentActionContribution.js'; @@ -276,11 +275,6 @@ configurationRegistry.registerConfiguration({ description: nls.localize('chat.detectParticipant.enabled', "Enables chat participant autodetection for panel chat."), default: true }, - 'chat.renderRelatedFiles': { - type: 'boolean', - description: nls.localize('chat.renderRelatedFiles', "Controls whether related files should be rendered in the chat input."), - default: false - }, [ChatConfiguration.InlineReferencesStyle]: { type: 'string', enum: ['box', 'link'], @@ -1354,7 +1348,6 @@ registerWorkbenchContribution2(ChatPromptFilesExtensionPointHandler.ID, ChatProm registerWorkbenchContribution2(ChatCompatibilityNotifier.ID, ChatCompatibilityNotifier, WorkbenchPhase.Eventually); registerWorkbenchContribution2(CodeBlockActionRendering.ID, CodeBlockActionRendering, WorkbenchPhase.BlockRestore); registerWorkbenchContribution2(ChatImplicitContextContribution.ID, ChatImplicitContextContribution, WorkbenchPhase.Eventually); -registerWorkbenchContribution2(ChatRelatedFilesContribution.ID, ChatRelatedFilesContribution, WorkbenchPhase.Eventually); registerWorkbenchContribution2(ChatViewsWelcomeHandler.ID, ChatViewsWelcomeHandler, WorkbenchPhase.BlockStartup); registerWorkbenchContribution2(ChatGettingStartedContribution.ID, ChatGettingStartedContribution, WorkbenchPhase.Eventually); registerWorkbenchContribution2(ChatSetupContribution.ID, ChatSetupContribution, WorkbenchPhase.BlockRestore); diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.ts index 40fc87fb900..371bd071268 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.ts @@ -3,14 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { coalesce, compareBy, delta } from '../../../../../base/common/arrays.js'; +import { compareBy, delta } from '../../../../../base/common/arrays.js'; import { CancellationToken } from '../../../../../base/common/cancellation.js'; import { Codicon } from '../../../../../base/common/codicons.js'; import { groupBy } from '../../../../../base/common/collections.js'; import { ErrorNoTelemetry } from '../../../../../base/common/errors.js'; import { Emitter, Event } from '../../../../../base/common/event.js'; import { Iterable } from '../../../../../base/common/iterator.js'; -import { Disposable, DisposableStore, dispose, IDisposable, toDisposable } from '../../../../../base/common/lifecycle.js'; +import { Disposable, DisposableStore, dispose, IDisposable } from '../../../../../base/common/lifecycle.js'; import { LinkedList } from '../../../../../base/common/linkedList.js'; import { ResourceMap } from '../../../../../base/common/map.js'; import { Schemas } from '../../../../../base/common/network.js'; @@ -37,7 +37,7 @@ import { ILifecycleService } from '../../../../services/lifecycle/common/lifecyc import { IMultiDiffSourceResolver, IMultiDiffSourceResolverService, IResolvedMultiDiffSource, MultiDiffEditorItem } from '../../../multiDiffEditor/browser/multiDiffSourceResolverService.js'; import { CellUri, ICellEditOperation } from '../../../notebook/common/notebookCommon.js'; import { INotebookService } from '../../../notebook/common/notebookService.js'; -import { CHAT_EDITING_MULTI_DIFF_SOURCE_RESOLVER_SCHEME, chatEditingAgentSupportsReadonlyReferencesContextKey, chatEditingResourceContextKey, ChatEditingSessionState, IChatEditingService, IChatEditingSession, IChatRelatedFile, IChatRelatedFilesProvider, IModifiedFileEntry, inChatEditingSessionContextKey, IStreamingEdits, ModifiedFileEntryState, parseChatMultiDiffUri } from '../../common/editing/chatEditingService.js'; +import { CHAT_EDITING_MULTI_DIFF_SOURCE_RESOLVER_SCHEME, chatEditingAgentSupportsReadonlyReferencesContextKey, chatEditingResourceContextKey, ChatEditingSessionState, IChatEditingService, IChatEditingSession, IModifiedFileEntry, inChatEditingSessionContextKey, IStreamingEdits, ModifiedFileEntryState, parseChatMultiDiffUri } from '../../common/editing/chatEditingService.js'; import { ChatModel, ICellTextEditOperation, IChatResponseModel, isCellTextEditOperationArray } from '../../common/model/chatModel.js'; import { IChatService } from '../../common/chatService/chatService.js'; import { ChatEditorInput } from '../widgetHosts/editor/chatEditorInput.js'; @@ -57,8 +57,6 @@ export class ChatEditingService extends Disposable implements IChatEditingServic return result; }); - private _chatRelatedFilesProviders = new Map(); - constructor( @IInstantiationService private readonly _instantiationService: IInstantiationService, @IMultiDiffSourceResolverService multiDiffSourceResolverService: IMultiDiffSourceResolverService, @@ -355,34 +353,6 @@ export class ChatEditingService extends Disposable implements IChatEditingServic })); } } - - hasRelatedFilesProviders(): boolean { - return this._chatRelatedFilesProviders.size > 0; - } - - registerRelatedFilesProvider(handle: number, provider: IChatRelatedFilesProvider): IDisposable { - this._chatRelatedFilesProviders.set(handle, provider); - return toDisposable(() => { - this._chatRelatedFilesProviders.delete(handle); - }); - } - - async getRelatedFiles(chatSessionResource: URI, prompt: string, files: URI[], token: CancellationToken): Promise<{ group: string; files: IChatRelatedFile[] }[] | undefined> { - const providers = Array.from(this._chatRelatedFilesProviders.values()); - const result = await Promise.all(providers.map(async provider => { - try { - const relatedFiles = await provider.provideRelatedFiles({ prompt, files }, token); - if (relatedFiles?.length) { - return { group: provider.description, files: relatedFiles }; - } - return undefined; - } catch (e) { - return undefined; - } - })); - - return coalesce(result); - } } /** diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/widget/chatWidget.ts index d202b99918b..d428ee74501 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/chatWidget.ts @@ -435,12 +435,6 @@ export class ChatWidget extends Disposable implements IChatWidget { this._codeBlockModelCollection = this._register(instantiationService.createInstance(CodeBlockModelCollection, undefined)); this.chatSuggestNextWidget = this._register(this.instantiationService.createInstance(ChatSuggestNextWidget)); - this._register(this.configurationService.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration('chat.renderRelatedFiles')) { - this.input.renderChatRelatedFiles(); - } - })); - this._register(autorun(r => { const viewModel = viewModelObs.read(r); const sessions = chatEditingService.editingSessionsObs.read(r); diff --git a/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts index 2a8af368253..bf3b3f67136 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts @@ -10,8 +10,8 @@ import { IHistoryNavigationWidget } from '../../../../../../base/browser/history import { hasModifierKeys, StandardKeyboardEvent } from '../../../../../../base/browser/keyboardEvent.js'; import { ActionViewItem, BaseActionViewItem, IActionViewItemOptions } from '../../../../../../base/browser/ui/actionbar/actionViewItems.js'; import * as aria from '../../../../../../base/browser/ui/aria/aria.js'; -import { Button, ButtonWithIcon } from '../../../../../../base/browser/ui/button/button.js'; -import { createInstantHoverDelegate, getDefaultHoverDelegate } from '../../../../../../base/browser/ui/hover/hoverDelegateFactory.js'; +import { ButtonWithIcon } from '../../../../../../base/browser/ui/button/button.js'; +import { createInstantHoverDelegate } from '../../../../../../base/browser/ui/hover/hoverDelegateFactory.js'; import { renderLabelWithIcons } from '../../../../../../base/browser/ui/iconLabel/iconLabels.js'; import { IAction } from '../../../../../../base/common/actions.js'; import { equals as arraysEqual } from '../../../../../../base/common/arrays.js'; @@ -62,7 +62,6 @@ import { registerAndCreateHistoryNavigationContext } from '../../../../../../pla import { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js'; import { ServiceCollection } from '../../../../../../platform/instantiation/common/serviceCollection.js'; import { IKeybindingService } from '../../../../../../platform/keybinding/common/keybinding.js'; -import { ILabelService } from '../../../../../../platform/label/common/label.js'; import { WorkbenchList } from '../../../../../../platform/list/browser/listService.js'; import { ILogService } from '../../../../../../platform/log/common/log.js'; import { ObservableMemento, observableMemento } from '../../../../../../platform/observable/common/observableMemento.js'; @@ -100,7 +99,6 @@ import { IAgentSessionsService } from '../../agentSessions/agentSessionsService. import { ChatAttachmentModel } from '../../attachments/chatAttachmentModel.js'; import { DefaultChatAttachmentWidget, ElementChatAttachmentWidget, FileAttachmentWidget, ImageAttachmentWidget, NotebookCellOutputChatAttachmentWidget, PasteAttachmentWidget, PromptFileAttachmentWidget, PromptTextAttachmentWidget, SCMHistoryItemAttachmentWidget, SCMHistoryItemChangeAttachmentWidget, SCMHistoryItemChangeRangeAttachmentWidget, TerminalCommandAttachmentWidget, ToolSetOrToolItemAttachmentWidget } from '../../attachments/chatAttachmentWidgets.js'; import { ChatImplicitContexts } from '../../attachments/chatImplicitContext.js'; -import { ChatRelatedFiles } from '../../attachments/chatInputRelatedFilesContrib.js'; import { ImplicitContextAttachmentWidget } from '../../attachments/implicitContextAttachment.js'; import { IChatWidget, ISessionTypePickerDelegate, isIChatResourceViewContext, IWorkspacePickerDelegate } from '../../chat.js'; import { ChatEditingShowChangesAction, ViewAllSessionChangesAction, ViewPreviousEditsAction } from '../../chatEditing/chatEditingActions.js'; @@ -245,11 +243,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge return this._implicitContext; } - private _relatedFiles: ChatRelatedFiles | undefined; - public get relatedFiles(): ChatRelatedFiles | undefined { - return this._relatedFiles; - } - private _hasFileAttachmentContextKey: IContextKey; private readonly _onDidChangeVisibility = this._register(new Emitter()); @@ -272,8 +265,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge private attachedContextContainer!: HTMLElement; private readonly attachedContextDisposables: MutableDisposable = this._register(new MutableDisposable()); - private relatedFilesContainer!: HTMLElement; - private chatEditingSessionWidgetContainer!: HTMLElement; private chatInputTodoListWidgetContainer!: HTMLElement; private chatInputWidgetsContainer!: HTMLElement; @@ -463,7 +454,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge @IThemeService private readonly themeService: IThemeService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IStorageService private readonly storageService: IStorageService, - @ILabelService private readonly labelService: ILabelService, @IChatAgentService private readonly agentService: IChatAgentService, @ISharedWebContentExtractorService private readonly sharedWebExtracterService: ISharedWebContentExtractorService, @IWorkbenchAssignmentService private readonly experimentService: IWorkbenchAssignmentService, @@ -1704,7 +1694,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge dom.h('.chat-attachments-container@attachmentsContainer', [ dom.h('.chat-attachment-toolbar@attachmentToolbar'), dom.h('.chat-attached-context@attachedContextContainer'), - dom.h('.chat-related-files@relatedFilesContainer'), ]), dom.h('.interactive-input-followups@followupsContainer'), ]) @@ -1719,7 +1708,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge dom.h('.chat-input-container@inputContainer', [ dom.h('.chat-attachments-container@attachmentsContainer', [ dom.h('.chat-attachment-toolbar@attachmentToolbar'), - dom.h('.chat-related-files@relatedFilesContainer'), dom.h('.chat-attached-context@attachedContextContainer'), ]), dom.h('.chat-editor-container@editorContainer'), @@ -1744,7 +1732,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge const editorContainer = elements.editorContainer; this.attachmentsContainer = elements.attachmentsContainer; this.attachedContextContainer = elements.attachedContextContainer; - this.relatedFilesContainer = elements.relatedFilesContainer; const toolbarsContainer = elements.inputToolbars; const attachmentToolbarContainer = elements.attachmentToolbar; this.chatEditingSessionWidgetContainer = elements.chatEditingSessionWidgetContainer; @@ -1777,12 +1764,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge this.renderChatEditingSessionState(null); - if (this.options.renderWorkingSet) { - this._relatedFiles = this._register(new ChatRelatedFiles()); - this._register(this._relatedFiles.onDidChange(() => this.renderChatRelatedFiles())); - } - this.renderChatRelatedFiles(); - this.dnd.addOverlay(this.options.dndContainer ?? container, this.options.dndContainer ?? container); const inputScopedContextKeyService = this._register(this.contextKeyService.createScoped(inputContainer)); @@ -2651,62 +2632,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge })); } - async renderChatRelatedFiles() { - const anchor = this.relatedFilesContainer; - dom.clearNode(anchor); - const shouldRender = this.configurationService.getValue('chat.renderRelatedFiles'); - dom.setVisibility(Boolean(this.relatedFiles?.value.length && shouldRender), anchor); - if (!shouldRender || !this.relatedFiles?.value.length) { - return; - } - - const hoverDelegate = getDefaultHoverDelegate('element'); - for (const { uri, description } of this.relatedFiles.value) { - const uriLabel = this._chatEditsActionsDisposables.add(new Button(anchor, { - supportIcons: true, - secondary: true, - hoverDelegate - })); - uriLabel.label = this.labelService.getUriBasenameLabel(uri); - uriLabel.element.classList.add('monaco-icon-label'); - uriLabel.element.title = localize('suggeste.title', "{0} - {1}", this.labelService.getUriLabel(uri, { relative: true }), description ?? ''); - - this._chatEditsActionsDisposables.add(uriLabel.onDidClick(async () => { - group.remove(); // REMOVE asap - await this._attachmentModel.addFile(uri); - this.relatedFiles?.remove(uri); - })); - - const addButton = this._chatEditsActionsDisposables.add(new Button(anchor, { - supportIcons: false, - secondary: true, - hoverDelegate, - ariaLabel: localize('chatEditingSession.addSuggestion', 'Add suggestion {0}', this.labelService.getUriLabel(uri, { relative: true })), - })); - addButton.icon = Codicon.add; - addButton.setTitle(localize('chatEditingSession.addSuggested', 'Add suggestion')); - this._chatEditsActionsDisposables.add(addButton.onDidClick(async () => { - group.remove(); // REMOVE asap - await this._attachmentModel.addFile(uri); - this.relatedFiles?.remove(uri); - })); - - const sep = document.createElement('div'); - sep.classList.add('separator'); - - const group = document.createElement('span'); - group.classList.add('monaco-button-dropdown', 'sidebyside-button'); - group.appendChild(addButton.element); - group.appendChild(sep); - group.appendChild(uriLabel.element); - dom.append(anchor, group); - - this._chatEditsActionsDisposables.add(toDisposable(() => { - group.remove(); - })); - } - } - async renderFollowups(items: IChatFollowup[] | undefined, response: IChatResponseViewModel | undefined): Promise { if (!this.options.renderFollowups) { return; diff --git a/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.ts index a38f9781833..34ec28bad76 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { coalesce } from '../../../../../../../base/common/arrays.js'; -import { raceTimeout } from '../../../../../../../base/common/async.js'; import { decodeBase64 } from '../../../../../../../base/common/buffer.js'; import { CancellationToken, CancellationTokenSource } from '../../../../../../../base/common/cancellation.js'; import { Codicon } from '../../../../../../../base/common/codicons.js'; @@ -47,7 +46,6 @@ import { McpPromptArgumentPick } from '../../../../../mcp/browser/mcpPromptArgum import { IMcpPrompt, IMcpPromptMessage, IMcpServer, IMcpService, McpResourceURI } from '../../../../../mcp/common/mcpTypes.js'; import { searchFilesAndFolders } from '../../../../../search/browser/searchChatContext.js'; import { IChatAgentData, IChatAgentNameService, IChatAgentService, getFullyQualifiedId } from '../../../../common/participants/chatAgents.js'; -import { IChatEditingService } from '../../../../common/editing/chatEditingService.js'; import { getAttachableImageExtension } from '../../../../common/model/chatModel.js'; import { ChatRequestAgentPart, ChatRequestAgentSubcommandPart, ChatRequestSlashPromptPart, ChatRequestTextPart, ChatRequestToolPart, ChatRequestToolSetPart, chatAgentLeader, chatSubcommandLeader, chatVariableLeader } from '../../../../common/requestParser/chatParserTypes.js'; import { IChatSlashCommandService } from '../../../../common/participants/chatSlashCommands.js'; @@ -786,7 +784,6 @@ class BuiltinDynamicCompletions extends Disposable { @ILabelService private readonly labelService: ILabelService, @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, @IChatWidgetService private readonly chatWidgetService: IChatWidgetService, - @IChatEditingService private readonly _chatEditingService: IChatEditingService, @IOutlineModelService private readonly outlineService: IOutlineModelService, @IEditorService private readonly editorService: IEditorService, @IConfigurationService private readonly configurationService: IConfigurationService, @@ -995,19 +992,6 @@ class BuiltinDynamicCompletions extends Disposable { } } - // RELATED FILES - if (widget.input.currentModeKind !== ChatModeKind.Ask && widget.viewModel && widget.viewModel.model.editingSession) { - const relatedFiles = (await raceTimeout(this._chatEditingService.getRelatedFiles(widget.viewModel.sessionResource, widget.getInput(), widget.attachmentModel.fileAttachments, token), 200)) ?? []; - for (const relatedFileGroup of relatedFiles) { - for (const relatedFile of relatedFileGroup.files) { - if (!seen.has(relatedFile.uri)) { - seen.add(relatedFile.uri); - result.suggestions.push(makeCompletionItem(relatedFile.uri, FileKind.FILE, relatedFile.description)); - } - } - } - } - // SEARCH // use file search when having a pattern if (pattern) { diff --git a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css index 7aaa4f0c7b4..404a1ba94e1 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css @@ -957,81 +957,6 @@ have to be updated for changes to the rules above, or to support more deeply nes cursor: default; } -.chat-related-files { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 4px; - max-width: 100%; -} - -.chat-related-files .monaco-button-dropdown .monaco-text-button { - font-size: 11px; - justify-content: left; - width: fit-content; - padding: 0px; - border: none; - height: 18px; -} - -.chat-related-files .monaco-button-dropdown .monaco-text-button span { - font-style: italic; - height: 18px; - opacity: 0.7; -} - -.chat-related-files .monaco-button-dropdown { - border-radius: 4px; - height: 18px; - border: 1px solid var(--vscode-input-border); - border-style: dashed; - align-items: center; - overflow: hidden; - gap: 2px; - padding: 0 4px; -} - -.chat-related-files .monaco-button.codicon.codicon-add { - display: flex; - flex-direction: column; - color: var(--vscode-descriptionForeground); - padding-top: 3px; - margin-left: -4px; - padding-left: 4px; - font-size: 14px; - /* The + codicon is large, make it look more like the x codicon */ - height: calc(100% - 3px); - width: 17px; - outline-offset: -2px !important; -} - -.interactive-session .chat-related-files .monaco-icon-label::before { - padding: 4px 3px 0 2px; -} - -.interactive-session .chat-editing-session .chat-related-files .monaco-button.secondary:first-child { - margin: 3px 0px 3px 3px; - flex-shrink: 0; -} - -.interactive-session .chat-editing-session .chat-related-files .monaco-button.secondary.monaco-icon-label::before { - display: inline-flex; - align-items: center; -} - -.interactive-session .chat-editing-session .chat-related-files .monaco-button.secondary:only-child { - width: 100%; -} - -.interactive-session .chat-editing-session .chat-related-files .monaco-button.secondary.disabled { - cursor: initial; -} - -.interactive-session .chat-editing-session .chat-related-files .monaco-button.secondary .codicon { - font-size: 12px; - margin-left: 4px; -} - .interactive-session .chat-editing-session .chat-editing-session-actions .monaco-button.secondary.monaco-text-button.codicon { cursor: pointer; padding: 2px; @@ -1684,7 +1609,6 @@ have to be updated for changes to the rules above, or to support more deeply nes font-size: 11px; } -.chat-related-files .monaco-button.codicon.codicon-add:hover, .action-item.chat-attached-context-attachment.chat-add-files:hover, .interactive-session .chat-attached-context .chat-attached-context-attachment .monaco-button:hover { cursor: pointer; diff --git a/src/vs/workbench/contrib/chat/common/editing/chatEditingService.ts b/src/vs/workbench/contrib/chat/common/editing/chatEditingService.ts index 53a7e081758..58b49b13fa5 100644 --- a/src/vs/workbench/contrib/chat/common/editing/chatEditingService.ts +++ b/src/vs/workbench/contrib/chat/common/editing/chatEditingService.ts @@ -48,33 +48,6 @@ export interface IChatEditingService { * Creates an editing session with state transferred from the provided session. */ transferEditingSession(chatModel: ChatModel, session: IChatEditingSession): IChatEditingSession; - - //#region related files - - hasRelatedFilesProviders(): boolean; - registerRelatedFilesProvider(handle: number, provider: IChatRelatedFilesProvider): IDisposable; - getRelatedFiles(chatSessionResource: URI, prompt: string, files: URI[], token: CancellationToken): Promise<{ group: string; files: IChatRelatedFile[] }[] | undefined>; - - //#endregion -} - -export interface IChatRequestDraft { - readonly prompt: string; - readonly files: readonly URI[]; -} - -export interface IChatRelatedFileProviderMetadata { - readonly description: string; -} - -export interface IChatRelatedFile { - readonly uri: URI; - readonly description: string; -} - -export interface IChatRelatedFilesProvider { - readonly description: string; - provideRelatedFiles(chatRequest: IChatRequestDraft, token: CancellationToken): Promise; } export interface WorkingSetDisplayMetadata { diff --git a/src/vscode-dts/vscode.proposed.chatEditing.d.ts b/src/vscode-dts/vscode.proposed.chatEditing.d.ts deleted file mode 100644 index 27077caf255..00000000000 --- a/src/vscode-dts/vscode.proposed.chatEditing.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - export interface ChatRequestDraft { - readonly prompt: string; - readonly files: readonly Uri[]; - } - - export interface ChatRelatedFile { - readonly uri: Uri; - readonly description: string; - } - - export interface ChatRelatedFilesProviderMetadata { - readonly description: string; - } - - export interface ChatRelatedFilesProvider { - provideRelatedFiles(chatRequest: ChatRequestDraft, token: CancellationToken): ProviderResult; - } - - export namespace chat { - export function registerRelatedFilesProvider(provider: ChatRelatedFilesProvider, metadata: ChatRelatedFilesProviderMetadata): Disposable; - } -} diff --git a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts index 4ab722c122e..bbdff837f5c 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 11 +// version: 12 declare module 'vscode' {