Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/common/extHostChatOutputRenderer.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
6
import type * as vscode from 'vscode';
7
import { CancellationToken } from '../../../base/common/cancellation.js';
8
import { ExtHostChatOutputRendererShape, IMainContext, MainContext, MainThreadChatOutputRendererShape } from './extHost.protocol.js';
9
import { Disposable } from './extHostTypes.js';
10
import { ExtHostWebviews } from './extHostWebview.js';
11
import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
12
import { VSBuffer } from '../../../base/common/buffer.js';
13
14
export class ExtHostChatOutputRenderer implements ExtHostChatOutputRendererShape {
15
16
private readonly _proxy: MainThreadChatOutputRendererShape;
17
18
private readonly _renderers = new Map</*viewType*/ string, {
19
readonly renderer: vscode.ChatOutputRenderer;
20
readonly extension: IExtensionDescription;
21
}>();
22
23
constructor(
24
mainContext: IMainContext,
25
private readonly webviews: ExtHostWebviews,
26
) {
27
this._proxy = mainContext.getProxy(MainContext.MainThreadChatOutputRenderer);
28
}
29
30
registerChatOutputRenderer(extension: IExtensionDescription, viewType: string, renderer: vscode.ChatOutputRenderer): vscode.Disposable {
31
if (this._renderers.has(viewType)) {
32
throw new Error(`Chat output renderer already registered for: ${viewType}`);
33
}
34
35
this._renderers.set(viewType, { extension, renderer });
36
this._proxy.$registerChatOutputRenderer(viewType, extension.identifier, extension.extensionLocation);
37
38
return new Disposable(() => {
39
this._renderers.delete(viewType);
40
this._proxy.$unregisterChatOutputRenderer(viewType);
41
});
42
}
43
44
async $renderChatOutput(viewType: string, mime: string, valueData: VSBuffer, webviewHandle: string, token: CancellationToken): Promise<void> {
45
const entry = this._renderers.get(viewType);
46
if (!entry) {
47
throw new Error(`No chat output renderer registered for: ${viewType}`);
48
}
49
50
const webview = this.webviews.createNewWebview(webviewHandle, {}, entry.extension);
51
return entry.renderer.renderChatOutput(Object.freeze({ mime, value: valueData.buffer }), webview, {}, token);
52
}
53
}
54
55