Path: blob/main/src/vs/workbench/contrib/chat/common/chat.ts
5263 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 { ResourceSet } from '../../../../base/common/map.js';6import { chatEditingSessionIsReady } from './editing/chatEditingService.js';7import { IChatModel } from './model/chatModel.js';8import { isLegacyChatTerminalToolInvocationData, type IChatSessionStats, type IChatTerminalToolInvocationData, type ILegacyChatTerminalToolInvocationData } from './chatService/chatService.js';9import { ChatModeKind } from './constants.js';1011export function checkModeOption(mode: ChatModeKind, option: boolean | ((mode: ChatModeKind) => boolean) | undefined): boolean | undefined {12if (option === undefined) {13return undefined;14}15if (typeof option === 'function') {16return option(mode);17}18return option;19}2021/**22* @deprecated This is the old API shape, we should support this for a while before removing it so23* we don't break existing chats24*/25export function migrateLegacyTerminalToolSpecificData(data: IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData): IChatTerminalToolInvocationData {26if (isLegacyChatTerminalToolInvocationData(data)) {27data = {28kind: 'terminal',29commandLine: {30original: data.command,31toolEdited: undefined,32userEdited: undefined33},34language: data.language35} satisfies IChatTerminalToolInvocationData;36}37return data;38}3940export async function awaitStatsForSession(model: IChatModel): Promise<IChatSessionStats | undefined> {41if (!model.editingSession) {42return undefined;43}4445await chatEditingSessionIsReady(model.editingSession);46await Promise.all(model.editingSession.entries.get().map(entry => entry.getDiffInfo?.()));4748const diffs = model.editingSession.entries.get();49const reduceResult = diffs.reduce((acc, diff) => {50acc.fileUris.add(diff.originalURI);51acc.added += diff.linesAdded?.get() ?? 0;52acc.removed += diff.linesRemoved?.get() ?? 0;53return acc;54}, { fileUris: new ResourceSet(), added: 0, removed: 0 });5556if (reduceResult.fileUris.size > 0 && (reduceResult.added > 0 || reduceResult.removed > 0)) {57return {58fileCount: reduceResult.fileUris.size,59added: reduceResult.added,60removed: reduceResult.removed61};62}63return undefined;64}656667