Path: blob/main/src/vs/workbench/api/common/extHostChatOutputRenderer.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*--------------------------------------------------------------------------------------------*/45import type * as vscode from 'vscode';6import { CancellationToken } from '../../../base/common/cancellation.js';7import { ExtHostChatOutputRendererShape, IMainContext, MainContext, MainThreadChatOutputRendererShape } from './extHost.protocol.js';8import { Disposable } from './extHostTypes.js';9import { ExtHostWebviews } from './extHostWebview.js';10import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';11import { VSBuffer } from '../../../base/common/buffer.js';1213export class ExtHostChatOutputRenderer implements ExtHostChatOutputRendererShape {1415private readonly _proxy: MainThreadChatOutputRendererShape;1617private readonly _renderers = new Map</*viewType*/ string, {18readonly renderer: vscode.ChatOutputRenderer;19readonly extension: IExtensionDescription;20}>();2122constructor(23mainContext: IMainContext,24private readonly webviews: ExtHostWebviews,25) {26this._proxy = mainContext.getProxy(MainContext.MainThreadChatOutputRenderer);27}2829registerChatOutputRenderer(extension: IExtensionDescription, viewType: string, renderer: vscode.ChatOutputRenderer): vscode.Disposable {30if (this._renderers.has(viewType)) {31throw new Error(`Chat output renderer already registered for: ${viewType}`);32}3334this._renderers.set(viewType, { extension, renderer });35this._proxy.$registerChatOutputRenderer(viewType, extension.identifier, extension.extensionLocation);3637return new Disposable(() => {38this._renderers.delete(viewType);39this._proxy.$unregisterChatOutputRenderer(viewType);40});41}4243async $renderChatOutput(viewType: string, mime: string, valueData: VSBuffer, webviewHandle: string, token: CancellationToken): Promise<void> {44const entry = this._renderers.get(viewType);45if (!entry) {46throw new Error(`No chat output renderer registered for: ${viewType}`);47}4849const webview = this.webviews.createNewWebview(webviewHandle, {}, entry.extension);50return entry.renderer.renderChatOutput(Object.freeze({ mime, value: valueData.buffer }), webview, {}, token);51}52}535455