Path: blob/main/src/vs/workbench/api/browser/mainThreadChatCodeMapper.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import { CancellationToken } from '../../../base/common/cancellation.js';5import { Disposable, DisposableMap, IDisposable } from '../../../base/common/lifecycle.js';6import { URI } from '../../../base/common/uri.js';7import { TextEdit } from '../../../editor/common/languages.js';8import { ICodeMapperProvider, ICodeMapperRequest, ICodeMapperResponse, ICodeMapperService } from '../../contrib/chat/common/chatCodeMapperService.js';9import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';10import { ExtHostCodeMapperShape, ExtHostContext, ICodeMapperProgressDto, ICodeMapperRequestDto, MainContext, MainThreadCodeMapperShape } from '../common/extHost.protocol.js';11import { NotebookDto } from './mainThreadNotebookDto.js';1213@extHostNamedCustomer(MainContext.MainThreadCodeMapper)14export class MainThreadChatCodemapper extends Disposable implements MainThreadCodeMapperShape {1516private providers = this._register(new DisposableMap<number, IDisposable>());17private readonly _proxy: ExtHostCodeMapperShape;18private static _requestHandlePool: number = 0;19private _responseMap = new Map<string, ICodeMapperResponse>();2021constructor(22extHostContext: IExtHostContext,23@ICodeMapperService private readonly codeMapperService: ICodeMapperService24) {25super();26this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostCodeMapper);27}2829$registerCodeMapperProvider(handle: number, displayName: string): void {30const impl: ICodeMapperProvider = {31displayName,32mapCode: async (uiRequest: ICodeMapperRequest, response: ICodeMapperResponse, token: CancellationToken) => {33const requestId = String(MainThreadChatCodemapper._requestHandlePool++);34this._responseMap.set(requestId, response);35const extHostRequest: ICodeMapperRequestDto = {36requestId,37codeBlocks: uiRequest.codeBlocks,38chatRequestId: uiRequest.chatRequestId,39chatRequestModel: uiRequest.chatRequestModel,40chatSessionId: uiRequest.chatSessionId,41location: uiRequest.location42};43try {44return await this._proxy.$mapCode(handle, extHostRequest, token).then((result) => result ?? undefined);45} finally {46this._responseMap.delete(requestId);47}48}49};5051const disposable = this.codeMapperService.registerCodeMapperProvider(handle, impl);52this.providers.set(handle, disposable);53}5455$unregisterCodeMapperProvider(handle: number): void {56this.providers.deleteAndDispose(handle);57}5859$handleProgress(requestId: string, data: ICodeMapperProgressDto): Promise<void> {60const response = this._responseMap.get(requestId);61if (response) {62const edits = data.edits;63const resource = URI.revive(data.uri);64if (!edits.length) {65response.textEdit(resource, []);66} else if (edits.every(TextEdit.isTextEdit)) {67response.textEdit(resource, edits);68} else {69response.notebookEdit(resource, edits.map(NotebookDto.fromCellEditOperationDto));70}71}72return Promise.resolve();73}74}757677