/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { CancellationTokenSource } from '../../../../base/common/cancellation.js'; import { Event } from '../../../../base/common/event.js'; import { IObservable, ITransaction } from '../../../../base/common/observable.js'; import { URI } from '../../../../base/common/uri.js'; import { TextEdit } from '../../../../editor/common/languages.js'; import { ITextModel } from '../../../../editor/common/model.js'; import { localize } from '../../../../nls.js'; import { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js'; import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js'; import { IChatResponseModel } from './chatModel.js'; export const IChatEditingService = createDecorator('chatEditingService'); export interface IChatEditingService { _serviceBrand: undefined; readonly onDidCreateEditingSession: Event; /** * emitted when a session is created, changed or disposed */ readonly onDidChangeEditingSession: Event; readonly currentEditingSession: IChatEditingSession | null; readonly currentAutoApplyOperation: CancellationTokenSource | null; startOrContinueEditingSession(chatSessionId: string, options?: { silent: boolean }): Promise; addFileToWorkingSet(resource: URI): Promise; triggerEditComputation(responseModel: IChatResponseModel): Promise; getEditingSession(resource: URI): IChatEditingSession | null; } export interface IChatEditingSession { readonly chatSessionId: string; readonly onDidChange: Event; readonly onDidDispose: Event; readonly state: IObservable; readonly workingSet: IObservable; readonly entries: IObservable; readonly isVisible: boolean; show(): Promise; remove(...uris: URI[]): void; accept(...uris: URI[]): Promise; reject(...uris: URI[]): Promise; /** * Will lead to this object getting disposed */ stop(): Promise; } export const enum WorkingSetEntryState { Modified, Accepted, Rejected, Attached, } export interface IModifiedFileEntry { readonly originalURI: URI; readonly originalModel: ITextModel; readonly modifiedURI: URI; readonly state: IObservable; accept(transaction: ITransaction | undefined): Promise; reject(transaction: ITransaction | undefined): Promise; } export interface IChatEditingSessionStream { textEdits(resource: URI, textEdits: TextEdit[], responseModel: IChatResponseModel): void; } export const enum ChatEditingSessionState { Initial = 0, StreamingEdits = 1, Idle = 2, Disposed = 3 } export const CHAT_EDITING_MULTI_DIFF_SOURCE_RESOLVER_SCHEME = 'chat-editing-multi-diff-source'; export const chatEditingWidgetFileStateContextKey = new RawContextKey('chatEditingWidgetFileState', undefined, localize('chatEditingWidgetFileState', "The current state of the file in the chat editing widget")); export const decidedChatEditingResourceContextKey = new RawContextKey('decidedChatEditingResource', []); export const chatEditingResourceContextKey = new RawContextKey('chatEditingResource', undefined); export const inChatEditingSessionContextKey = new RawContextKey('inChatEditingSession', undefined); export const applyingChatEditsContextKey = new RawContextKey('isApplyingChatEdits', undefined);