Path: blob/main/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingTextModelContentProviders.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 { Schemas } from '../../../../../base/common/network.js';6import { URI } from '../../../../../base/common/uri.js';7import { ITextModel } from '../../../../../editor/common/model.js';8import { IModelService } from '../../../../../editor/common/services/model.js';9import { ITextModelContentProvider } from '../../../../../editor/common/services/resolverService.js';10import { IChatEditingService } from '../../common/chatEditingService.js';1112type ChatEditingTextModelContentQueryData = { kind: 'doc'; documentId: string; chatSessionId: string };1314export class ChatEditingTextModelContentProvider implements ITextModelContentProvider {15public static readonly scheme = Schemas.chatEditingModel;1617public static getFileURI(chatSessionId: string, documentId: string, path: string): URI {18return URI.from({19scheme: ChatEditingTextModelContentProvider.scheme,20path,21query: JSON.stringify({ kind: 'doc', documentId, chatSessionId } satisfies ChatEditingTextModelContentQueryData),22});23}2425constructor(26private readonly _chatEditingService: IChatEditingService,27@IModelService private readonly _modelService: IModelService,28) { }2930async provideTextContent(resource: URI): Promise<ITextModel | null> {31const existing = this._modelService.getModel(resource);32if (existing && !existing.isDisposed()) {33return existing;34}3536const data: ChatEditingTextModelContentQueryData = JSON.parse(resource.query);3738const session = this._chatEditingService.getEditingSession(data.chatSessionId);3940const entry = session?.entries.get().find(candidate => candidate.entryId === data.documentId);41if (!entry) {42return null;43}4445return this._modelService.getModel(entry.originalURI);46}47}4849type ChatEditingSnapshotTextModelContentQueryData = { sessionId: string; requestId: string | undefined; undoStop: string | undefined };5051export class ChatEditingSnapshotTextModelContentProvider implements ITextModelContentProvider {52public static getSnapshotFileURI(chatSessionId: string, requestId: string | undefined, undoStop: string | undefined, path: string): URI {53return URI.from({54scheme: Schemas.chatEditingSnapshotScheme,55path,56query: JSON.stringify({ sessionId: chatSessionId, requestId: requestId ?? '', undoStop: undoStop ?? '' } satisfies ChatEditingSnapshotTextModelContentQueryData),57});58}5960constructor(61private readonly _chatEditingService: IChatEditingService,62@IModelService private readonly _modelService: IModelService,63) { }6465async provideTextContent(resource: URI): Promise<ITextModel | null> {66const existing = this._modelService.getModel(resource);67if (existing && !existing.isDisposed()) {68return existing;69}7071const data: ChatEditingSnapshotTextModelContentQueryData = JSON.parse(resource.query);7273const session = this._chatEditingService.getEditingSession(data.sessionId);74if (!session || !data.requestId) {75return null;76}7778return session.getSnapshotModel(data.requestId, data.undoStop || undefined, resource);79}80}818283