diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 0a1ae04748a..7b9f23e2552 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -12,7 +12,7 @@ import { Emitter, Event } from '../../../../base/common/event.js'; import { Lazy } from '../../../../base/common/lazy.js'; import { DisposableStore, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js'; import { MovingAverage } from '../../../../base/common/numbers.js'; -import { autorun, autorunWithStore, derived, IObservable, observableFromEvent, observableSignalFromEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js'; +import { autorun, autorunWithStore, derived, IObservable, observableSignalFromEvent, observableValue, transaction, waitForState } from '../../../../base/common/observable.js'; import { isEqual } from '../../../../base/common/resources.js'; import { StopWatch } from '../../../../base/common/stopwatch.js'; import { assertType } from '../../../../base/common/types.js'; @@ -44,7 +44,7 @@ import { IChatWidgetLocationOptions } from '../../chat/browser/chatWidget.js'; import { ChatModel, ChatRequestRemovalReason, IChatRequestModel, IChatTextEditGroup, IChatTextEditGroupState, IResponse } from '../../chat/common/chatModel.js'; import { IChatService } from '../../chat/common/chatService.js'; import { INotebookEditorService } from '../../notebook/browser/services/notebookEditorService.js'; -import { CTX_INLINE_CHAT_EDITING, CTX_INLINE_CHAT_HAS_AGENT2, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, CTX_INLINE_CHAT_VISIBLE, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseType } from '../common/inlineChat.js'; +import { CTX_INLINE_CHAT_EDITING, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, CTX_INLINE_CHAT_VISIBLE, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseType } from '../common/inlineChat.js'; import { HunkInformation, Session, StashedSession } from './inlineChatSession.js'; import { IInlineChatSession2, IInlineChatSessionService } from './inlineChatSessionService.js'; import { InlineChatError } from './inlineChatSessionServiceImpl.js'; @@ -54,6 +54,7 @@ import { InlineChatZoneWidget } from './inlineChatZoneWidget.js'; import { ChatAgentLocation } from '../../chat/common/constants.js'; import { ChatContextKeys } from '../../chat/common/chatContextKeys.js'; import { IChatEditingService, ModifiedFileEntryState } from '../../chat/common/chatEditingService.js'; +import { observableConfigValue } from '../../../../platform/observable/common/platformObservableUtils.js'; export const enum State { CREATE_SESSION = 'CREATE_SESSION', @@ -111,10 +112,10 @@ export class InlineChatController implements IEditorContribution { constructor( editor: ICodeEditor, - @IContextKeyService contextKeyService: IContextKeyService, + @IConfigurationService configurationService: IConfigurationService, ) { - const inlineChat2 = observableFromEvent(this, Event.filter(contextKeyService.onDidChangeContext, e => e.affectsSome(new Set(CTX_INLINE_CHAT_HAS_AGENT2.keys()))), () => contextKeyService.contextMatchesRules(CTX_INLINE_CHAT_HAS_AGENT2)); + const inlineChat2 = observableConfigValue(InlineChatConfigKeys.EnableV2, false, configurationService); this._delegate = derived(r => { if (inlineChat2.read(r)) { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts index acca853caac..21e1ebbc7b3 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts @@ -7,7 +7,7 @@ import { Emitter, Event } from '../../../../base/common/event.js'; import { DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js'; import { ResourceMap } from '../../../../base/common/map.js'; import { Schemas } from '../../../../base/common/network.js'; -import { autorun } from '../../../../base/common/observable.js'; +import { autorun, observableFromEvent } from '../../../../base/common/observable.js'; import { isEqual } from '../../../../base/common/resources.js'; import { assertType } from '../../../../base/common/types.js'; import { URI } from '../../../../base/common/uri.js'; @@ -20,9 +20,11 @@ import { createTextBufferFactoryFromSnapshot } from '../../../../editor/common/m import { IEditorWorkerService } from '../../../../editor/common/services/editorWorker.js'; import { IModelService } from '../../../../editor/common/services/model.js'; import { ITextModelService } from '../../../../editor/common/services/resolverService.js'; +import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; import { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; import { ILogService } from '../../../../platform/log/common/log.js'; +import { observableConfigValue } from '../../../../platform/observable/common/platformObservableUtils.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { DEFAULT_EDITOR_ASSOCIATION } from '../../../common/editor.js'; import { IEditorService } from '../../../services/editor/common/editorService.js'; @@ -33,7 +35,7 @@ import { IChatAgentService } from '../../chat/common/chatAgents.js'; import { ModifiedFileEntryState } from '../../chat/common/chatEditingService.js'; import { IChatService } from '../../chat/common/chatService.js'; import { ChatAgentLocation } from '../../chat/common/constants.js'; -import { CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_HAS_AGENT2, CTX_INLINE_CHAT_POSSIBLE } from '../common/inlineChat.js'; +import { CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_HAS_AGENT2, CTX_INLINE_CHAT_POSSIBLE, InlineChatConfigKeys } from '../common/inlineChat.js'; import { HunkData, Session, SessionWholeRange, StashedSession, TelemetryData, TelemetryDataClassification } from './inlineChatSession.js'; import { IInlineChatSession2, IInlineChatSessionEndEvent, IInlineChatSessionEvent, IInlineChatSessionService, ISessionKeyComputer } from './inlineChatSessionService.js'; @@ -414,27 +416,29 @@ export class InlineChatEnabler { @IContextKeyService contextKeyService: IContextKeyService, @IChatAgentService chatAgentService: IChatAgentService, @IEditorService editorService: IEditorService, + @IConfigurationService configService: IConfigurationService, ) { this._ctxHasProvider = CTX_INLINE_CHAT_HAS_AGENT.bindTo(contextKeyService); this._ctxHasProvider2 = CTX_INLINE_CHAT_HAS_AGENT2.bindTo(contextKeyService); this._ctxPossible = CTX_INLINE_CHAT_POSSIBLE.bindTo(contextKeyService); - const updateAgent = () => { - const agent = chatAgentService.getDefaultAgent(ChatAgentLocation.Editor); - if (agent?.id === 'github.copilot.editor' || agent?.id === 'setup.editor') { - this._ctxHasProvider.set(true); + const agentObs = observableFromEvent(this, chatAgentService.onDidChangeAgents, () => chatAgentService.getDefaultAgent(ChatAgentLocation.Editor)); + const inlineChat2Obs = observableConfigValue(InlineChatConfigKeys.EnableV2, false, configService); + + this._store.add(autorun(r => { + const v2 = inlineChat2Obs.read(r); + const agent = agentObs.read(r); + if (!agent) { + this._ctxHasProvider.reset(); this._ctxHasProvider2.reset(); - } else if (agent?.id === 'github.copilot.editingSessionEditor') { + } else if (v2) { this._ctxHasProvider.reset(); this._ctxHasProvider2.set(true); } else { - this._ctxHasProvider.reset(); + this._ctxHasProvider.set(true); this._ctxHasProvider2.reset(); } - }; - - this._store.add(chatAgentService.onDidChangeAgents(updateAgent)); - updateAgent(); + })); const updateEditor = () => { const ctrl = editorService.activeEditorPane?.getControl(); diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index 3b6979b8f10..157690e478e 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -18,7 +18,8 @@ export const enum InlineChatConfigKeys { HoldToSpeech = 'inlineChat.holdToSpeech', AccessibleDiffView = 'inlineChat.accessibleDiffView', LineEmptyHint = 'inlineChat.lineEmptyHint', - LineNLHint = 'inlineChat.lineNaturalLanguageHint' + LineNLHint = 'inlineChat.lineNaturalLanguageHint', + EnableV2 = 'inlineChat.enableV2' } Registry.as(Extensions.Configuration).registerConfiguration({ @@ -57,6 +58,12 @@ Registry.as(Extensions.Configuration).registerConfigurat type: 'boolean', tags: ['experimental'], }, + [InlineChatConfigKeys.EnableV2]: { + description: localize('enableV2', "Whether to use the next version of inline chat."), + default: false, + type: 'boolean', + tags: ['preview', 'onExp'], + }, } });