Path: blob/main/src/vs/workbench/api/browser/mainThreadChatContext.ts
5241 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 { CancellationToken } from '../../../base/common/cancellation.js';6import { Disposable } from '../../../base/common/lifecycle.js';7import { IChatContextItem } from '../../contrib/chat/common/contextContrib/chatContext.js';8import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';9import { ExtHostChatContextShape, ExtHostContext, IChatContextItemDto, IDocumentFilterDto, MainContext, MainThreadChatContextShape } from '../common/extHost.protocol.js';10import { IChatContextService } from '../../contrib/chat/browser/contextContrib/chatContextService.js';11import { URI } from '../../../base/common/uri.js';12import { Proxied } from '../../services/extensions/common/proxyIdentifier.js';1314function reviveContextItem(item: IChatContextItemDto): IChatContextItem {15return {16...item,17resourceUri: item.resourceUri ? URI.revive(item.resourceUri) : undefined18};19}2021function reviveContextItems(items: IChatContextItemDto[]): IChatContextItem[] {22return items.map(reviveContextItem);23}2425@extHostNamedCustomer(MainContext.MainThreadChatContext)26export class MainThreadChatContext extends Disposable implements MainThreadChatContextShape {27private readonly _proxy: Proxied<ExtHostChatContextShape>;28private readonly _providers = new Map<number, { id: string; selector?: IDocumentFilterDto[] }>();2930constructor(31extHostContext: IExtHostContext,32@IChatContextService private readonly _chatContextService: IChatContextService33) {34super();35this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostChatContext);36this._chatContextService.setExecuteCommandCallback((itemHandle) => this._proxy.$executeChatContextItemCommand(itemHandle));37}3839$registerChatWorkspaceContextProvider(handle: number, id: string): void {40this._providers.set(handle, { id });41this._chatContextService.registerChatWorkspaceContextProvider(id, {42provideWorkspaceChatContext: async (token: CancellationToken) => {43const items = await this._proxy.$provideWorkspaceChatContext(handle, token);44return reviveContextItems(items);45}46});47}4849$registerChatExplicitContextProvider(handle: number, id: string): void {50this._providers.set(handle, { id });51this._chatContextService.registerChatExplicitContextProvider(id, {52provideChatContext: async (token: CancellationToken) => {53const items = await this._proxy.$provideExplicitChatContext(handle, token);54return reviveContextItems(items);55},56resolveChatContext: async (context: IChatContextItem, token: CancellationToken) => {57const result = await this._proxy.$resolveExplicitChatContext(handle, context, token);58return reviveContextItem(result);59}60});61}6263$registerChatResourceContextProvider(handle: number, id: string, selector: IDocumentFilterDto[]): void {64this._providers.set(handle, { id, selector });65this._chatContextService.registerChatResourceContextProvider(id, selector, {66provideChatContext: async (resource: URI, withValue: boolean, token: CancellationToken) => {67const result = await this._proxy.$provideResourceChatContext(handle, { resource, withValue }, token);68return result ? reviveContextItem(result) : undefined;69},70resolveChatContext: async (context: IChatContextItem, token: CancellationToken) => {71const result = await this._proxy.$resolveResourceChatContext(handle, context, token);72return reviveContextItem(result);73}74});75}7677$unregisterChatContextProvider(handle: number): void {78const provider = this._providers.get(handle);79if (!provider) {80return;81}82this._chatContextService.unregisterChatContextProvider(provider.id);83this._providers.delete(handle);84}8586$updateWorkspaceContextItems(handle: number, items: IChatContextItemDto[]): void {87const provider = this._providers.get(handle);88if (!provider) {89return;90}91this._chatContextService.updateWorkspaceContextItems(provider.id, reviveContextItems(items));92}9394$executeChatContextItemCommand(itemHandle: number): Promise<void> {95return this._proxy.$executeChatContextItemCommand(itemHandle);96}97}9899100