diff --git a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts index 69f487ee521..de8a7fa95e9 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts @@ -15,7 +15,7 @@ import { IFileService } from '../../../platform/files/common/files.js'; import { extHostCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; import { MainThreadDocuments } from './mainThreadDocuments.js'; import { MainThreadTextEditor } from './mainThreadEditor.js'; -import { MainThreadTextEditors } from './mainThreadEditors.js'; +import { IMainThreadEditorLocator, MainThreadTextEditors } from './mainThreadEditors.js'; import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IModelAddedData, ITextEditorAddData, MainContext } from '../common/extHost.protocol.js'; import { AbstractTextEditor } from '../../browser/parts/editor/textEditor.js'; import { IEditorPane } from '../../common/editor.js'; @@ -274,7 +274,7 @@ class MainThreadDocumentAndEditorStateComputer { } @extHostCustomer -export class MainThreadDocumentsAndEditors { +export class MainThreadDocumentsAndEditors implements IMainThreadEditorLocator { private readonly _toDispose = new DisposableStore(); private readonly _proxy: ExtHostDocumentsAndEditorsShape; diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 8838f2f72d4..b0dcecef9f8 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -227,7 +227,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I rpcProtocol.set(ExtHostContext.ExtHostInteractive, new ExtHostInteractive(rpcProtocol, extHostNotebook, extHostDocumentsAndEditors, extHostCommands, extHostLogService)); const extHostLanguageModelTools = rpcProtocol.set(ExtHostContext.ExtHostLanguageModelTools, new ExtHostLanguageModelTools(rpcProtocol, extHostLanguageModels)); const extHostChatSessions = rpcProtocol.set(ExtHostContext.ExtHostChatSessions, new ExtHostChatSessions(extHostCommands, extHostLanguageModels, rpcProtocol, extHostLogService)); - const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, extHostDocuments, extHostLanguageModels, extHostDiagnostics, extHostLanguageModelTools)); + const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, extHostDocuments, extHostDocumentsAndEditors, extHostLanguageModels, extHostDiagnostics, extHostLanguageModelTools)); const extHostChatContext = rpcProtocol.set(ExtHostContext.ExtHostChatContext, new ExtHostChatContext(rpcProtocol)); const extHostAiRelatedInformation = rpcProtocol.set(ExtHostContext.ExtHostAiRelatedInformation, new ExtHostRelatedInformation(rpcProtocol)); const extHostAiEmbeddingVector = rpcProtocol.set(ExtHostContext.ExtHostAiEmbeddingVector, new ExtHostAiEmbeddingVector(rpcProtocol)); diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index bfe1d77be58..5aa9eaa3398 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -36,6 +36,7 @@ import { ExtHostLanguageModelTools } from './extHostLanguageModelTools.js'; import * as typeConvert from './extHostTypeConverters.js'; import * as extHostTypes from './extHostTypes.js'; import { ICustomAgentQueryOptions, IExternalCustomAgent } from '../../contrib/chat/common/promptSyntax/service/promptsService.js'; +import { ExtHostDocumentsAndEditors } from './extHostDocumentsAndEditors.js'; export class ChatAgentResponseStream { @@ -416,6 +417,7 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS private readonly _logService: ILogService, private readonly _commands: ExtHostCommands, private readonly _documents: ExtHostDocuments, + private readonly _editorsAndDocuments: ExtHostDocumentsAndEditors, private readonly _languageModels: ExtHostLanguageModels, private readonly _diagnostics: ExtHostDiagnostics, private readonly _tools: ExtHostLanguageModelTools @@ -553,7 +555,8 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS if (request.locationData?.type === ChatAgentLocation.EditorInline) { // editor data const document = this._documents.getDocument(request.locationData.document); - location = new extHostTypes.ChatRequestEditorData(document, typeConvert.Selection.to(request.locationData.selection), typeConvert.Range.to(request.locationData.wholeRange)); + const editor = this._editorsAndDocuments.getEditor(request.locationData.id)!; + location = new extHostTypes.ChatRequestEditorData(editor.value, document, typeConvert.Selection.to(request.locationData.selection), typeConvert.Range.to(request.locationData.wholeRange)); } else if (request.locationData?.type === ChatAgentLocation.Notebook) { // notebook data diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 51d171661f6..e73600ecae0 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -3439,6 +3439,7 @@ export enum ChatResponseClearToPreviousToolInvocationReason { export class ChatRequestEditorData implements vscode.ChatRequestEditorData { constructor( + readonly editor: vscode.TextEditor, readonly document: vscode.TextDocument, readonly selection: vscode.Selection, readonly wholeRange: vscode.Range, diff --git a/src/vs/workbench/contrib/chat/common/chatService.ts b/src/vs/workbench/contrib/chat/common/chatService.ts index 61970d9794d..7d82c2a826e 100644 --- a/src/vs/workbench/contrib/chat/common/chatService.ts +++ b/src/vs/workbench/contrib/chat/common/chatService.ts @@ -891,6 +891,7 @@ export interface IChatSendRequestData extends IChatSendRequestResponseState { export interface IChatEditorLocationData { type: ChatAgentLocation.EditorInline; + id: string; document: URI; selection: ISelection; wholeRange: IRange; diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 9d7e255152c..33ade4193ee 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -30,7 +30,7 @@ import { IRange, Range } from '../../../../editor/common/core/range.js'; import { ISelection, Selection, SelectionDirection } from '../../../../editor/common/core/selection.js'; import { IEditorContribution } from '../../../../editor/common/editorCommon.js'; import { TextEdit, VersionedExtensionId } from '../../../../editor/common/languages.js'; -import { IValidEditOperation } from '../../../../editor/common/model.js'; +import { ITextModel, IValidEditOperation } from '../../../../editor/common/model.js'; import { IEditorWorkerService } from '../../../../editor/common/services/editorWorker.js'; import { IMarkerDecorationsService } from '../../../../editor/common/services/markerDecorations.js'; import { DefaultModelSHA1Computer } from '../../../../editor/common/services/modelService.js'; @@ -182,6 +182,11 @@ export class InlineChatController implements IEditorContribution { } } +// TODO@jrieken THIS should be shared with the code in MainThreadEditors +function getEditorId(editor: ICodeEditor, model: ITextModel): string { + return `${editor.getId()},${model.id}`; +} + /** * @deprecated */ @@ -250,6 +255,7 @@ export class InlineChatController1 implements IEditorContribution { assertType(this._session); return { type: ChatAgentLocation.EditorInline, + id: getEditorId(this._editor, this._session.textModelN), selection: this._editor.getSelection(), document: this._session.textModelN.uri, wholeRange: this._session?.wholeRange.trackedInitialRange, @@ -1298,6 +1304,7 @@ export class InlineChatController2 implements IEditorContribution { return { type: ChatAgentLocation.EditorInline, + id: getEditorId(this._editor, this._editor.getModel()), selection: this._editor.getSelection(), document, wholeRange, diff --git a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts index 9407b3a5814..a2b1f7cc32d 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts @@ -30,12 +30,17 @@ declare module 'vscode' { } export class ChatRequestEditorData { + + readonly editor: TextEditor; + //TODO@API should be the editor document: TextDocument; selection: Selection; + + /** @deprecated */ wholeRange: Range; - constructor(document: TextDocument, selection: Selection, wholeRange: Range); + constructor(editor: TextEditor, document: TextDocument, selection: Selection, wholeRange: Range); } export class ChatRequestNotebookData {