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