Skip to content

Commit 8ef2f68

Browse files
authored
Chat view unification (#243285)
* Start enabling unified chat mode * Move ChatAgentLocation to avoid import cycle. Update imports * fix more imports * More work * Add ChatMode, make agent mode be session-specific, not global Towards unifying chat views * Fix mode for transferred session and request parser * Fixes * Fix defaultAgent, don't do intent detection * Fixes * Don't show mode picker in other locations * Add chatMode context key * Fix "new edit session" in unified * Update context actions * Update execute actions * Title actions * Update more commands
1 parent 4560f08 commit 8ef2f68

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+471
-283
lines changed

src/vs/workbench/api/browser/mainThreadChatAgents2.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ import { ILogService } from '../../../platform/log/common/log.js';
2424
import { IChatWidgetService } from '../../contrib/chat/browser/chat.js';
2525
import { ChatInputPart } from '../../contrib/chat/browser/chatInputPart.js';
2626
import { AddDynamicVariableAction, IAddDynamicVariableContext } from '../../contrib/chat/browser/contrib/chatDynamicVariables.js';
27-
import { ChatAgentLocation, IChatAgentHistoryEntry, IChatAgentImplementation, IChatAgentRequest, IChatAgentService } from '../../contrib/chat/common/chatAgents.js';
27+
import { IChatAgentHistoryEntry, IChatAgentImplementation, IChatAgentRequest, IChatAgentService } from '../../contrib/chat/common/chatAgents.js';
2828
import { IChatEditingService, IChatRelatedFileProviderMetadata } from '../../contrib/chat/common/chatEditingService.js';
2929
import { ChatRequestAgentPart } from '../../contrib/chat/common/chatParserTypes.js';
3030
import { ChatRequestParser } from '../../contrib/chat/common/chatRequestParser.js';
3131
import { IChatContentInlineReference, IChatContentReference, IChatFollowup, IChatNotebookEdit, IChatProgress, IChatService, IChatTask, IChatWarningMessage } from '../../contrib/chat/common/chatService.js';
32+
import { ChatAgentLocation } from '../../contrib/chat/common/constants.js';
3233
import { IExtHostContext, extHostNamedCustomer } from '../../services/extensions/common/extHostCustomers.js';
3334
import { IExtensionService } from '../../services/extensions/common/extensions.js';
3435
import { Dto } from '../../services/extensions/common/proxyIdentifier.js';

src/vs/workbench/api/common/extHost.protocol.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@ import { WorkspaceTrustRequestOptions } from '../../../platform/workspace/common
5151
import { SaveReason } from '../../common/editor.js';
5252
import { IRevealOptions, ITreeItem, IViewBadge } from '../../common/views.js';
5353
import { CallHierarchyItem } from '../../contrib/callHierarchy/common/callHierarchy.js';
54-
import { ChatAgentLocation, IChatAgentMetadata, IChatAgentRequest, IChatAgentResult, IChatWelcomeMessageContent } from '../../contrib/chat/common/chatAgents.js';
54+
import { IChatAgentMetadata, IChatAgentRequest, IChatAgentResult, IChatWelcomeMessageContent } from '../../contrib/chat/common/chatAgents.js';
5555
import { ICodeMapperRequest, ICodeMapperResult } from '../../contrib/chat/common/chatCodeMapperService.js';
5656
import { IChatRelatedFile, IChatRelatedFileProviderMetadata as IChatRelatedFilesProviderMetadata, IChatRequestDraft } from '../../contrib/chat/common/chatEditingService.js';
5757
import { IChatProgressHistoryResponseContent } from '../../contrib/chat/common/chatModel.js';
5858
import { IChatContentInlineReference, IChatFollowup, IChatNotebookEdit, IChatProgress, IChatResponseErrorDetails, IChatTask, IChatTaskDto, IChatUserActionEvent, IChatVoteAction } from '../../contrib/chat/common/chatService.js';
5959
import { IChatRequestVariableValue } from '../../contrib/chat/common/chatVariables.js';
60+
import { ChatAgentLocation } from '../../contrib/chat/common/constants.js';
6061
import { IChatMessage, IChatResponseFragment, ILanguageModelChatMetadata, ILanguageModelChatSelector, ILanguageModelsChangeEvent } from '../../contrib/chat/common/languageModels.js';
6162
import { IPreparedToolInvocation, IToolData, IToolInvocation, IToolResult } from '../../contrib/chat/common/languageModelToolsService.js';
6263
import { DebugConfigurationProviderTriggerKind, IAdapterDescriptor, IConfig, IDebugSessionReplMode, IDebugTestRunReference, IDebugVisualization, IDebugVisualizationContext, IDebugVisualizationTreeItem, MainThreadDebugVisualization } from '../../contrib/debug/common/debug.js';

src/vs/workbench/api/common/extHostChatAgents2.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,20 @@ import { generateUuid } from '../../../base/common/uuid.js';
2020
import { Location } from '../../../editor/common/languages.js';
2121
import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription } from '../../../platform/extensions/common/extensions.js';
2222
import { ILogService } from '../../../platform/log/common/log.js';
23-
import { ChatAgentLocation, IChatAgentRequest, IChatAgentResult, IChatAgentResultTimings, IChatWelcomeMessageContent } from '../../contrib/chat/common/chatAgents.js';
23+
import { isChatViewTitleActionContext } from '../../contrib/chat/common/chatActions.js';
24+
import { IChatAgentRequest, IChatAgentResult, IChatAgentResultTimings, IChatWelcomeMessageContent } from '../../contrib/chat/common/chatAgents.js';
25+
import { IChatRelatedFile, IChatRequestDraft } from '../../contrib/chat/common/chatEditingService.js';
2426
import { ChatAgentVoteDirection, IChatContentReference, IChatFollowup, IChatResponseErrorDetails, IChatUserActionEvent, IChatVoteAction } from '../../contrib/chat/common/chatService.js';
27+
import { ChatAgentLocation } from '../../contrib/chat/common/constants.js';
2528
import { checkProposedApiEnabled, isProposedApiEnabled } from '../../services/extensions/common/extensions.js';
2629
import { Dto } from '../../services/extensions/common/proxyIdentifier.js';
2730
import { ExtHostChatAgentsShape2, IChatAgentCompletionItem, IChatAgentHistoryEntryDto, IChatProgressDto, IExtensionChatAgentMetadata, IMainContext, MainContext, MainThreadChatAgentsShape2 } from './extHost.protocol.js';
2831
import { CommandsConverter, ExtHostCommands } from './extHostCommands.js';
32+
import { ExtHostDiagnostics } from './extHostDiagnostics.js';
2933
import { ExtHostDocuments } from './extHostDocuments.js';
3034
import { ExtHostLanguageModels } from './extHostLanguageModels.js';
3135
import * as typeConvert from './extHostTypeConverters.js';
3236
import * as extHostTypes from './extHostTypes.js';
33-
import { isChatViewTitleActionContext } from '../../contrib/chat/common/chatActions.js';
34-
import { IChatRelatedFile, IChatRequestDraft } from '../../contrib/chat/common/chatEditingService.js';
35-
import { ExtHostDiagnostics } from './extHostDiagnostics.js';
3637

3738
class ChatAgentResponseStream {
3839

src/vs/workbench/api/common/extHostTypeConverters.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import { IMarkerData, IRelatedInformation, MarkerSeverity, MarkerTag } from '../
3939
import { ProgressLocation as MainProgressLocation } from '../../../platform/progress/common/progress.js';
4040
import { DEFAULT_EDITOR_ASSOCIATION, SaveReason } from '../../common/editor.js';
4141
import { IViewBadge } from '../../common/views.js';
42-
import { ChatAgentLocation, IChatAgentRequest, IChatAgentResult } from '../../contrib/chat/common/chatAgents.js';
42+
import { IChatAgentRequest, IChatAgentResult } from '../../contrib/chat/common/chatAgents.js';
4343
import { IChatRequestDraft } from '../../contrib/chat/common/chatEditingService.js';
4444
import { IChatRequestVariableEntry } from '../../contrib/chat/common/chatModel.js';
4545
import { IChatAgentMarkdownContentWithVulnerability, IChatCodeCitation, IChatCommandButton, IChatConfirmation, IChatContentInlineReference, IChatContentReference, IChatFollowup, IChatMarkdownContent, IChatMoveMessage, IChatProgressMessage, IChatResponseCodeblockUriPart, IChatTaskDto, IChatTaskResult, IChatTextEdit, IChatTreeData, IChatUserActionEvent, IChatWarningMessage } from '../../contrib/chat/common/chatService.js';
@@ -62,6 +62,7 @@ import { CommandsConverter } from './extHostCommands.js';
6262
import { getPrivateApiFor } from './extHostTestingPrivateApi.js';
6363
import * as types from './extHostTypes.js';
6464
import { LanguageModelPromptTsxPart, LanguageModelTextPart } from './extHostTypes.js';
65+
import { ChatAgentLocation } from '../../contrib/chat/common/constants.js';
6566

6667
export namespace Command {
6768

src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import { IKeybindingService } from '../../../../../platform/keybinding/common/ke
1515
import { ActiveAuxiliaryContext } from '../../../../common/contextkeys.js';
1616
import { AccessibilityVerbositySettingId } from '../../../accessibility/browser/accessibilityConfiguration.js';
1717
import { INLINE_CHAT_ID } from '../../../inlineChat/common/inlineChat.js';
18-
import { ChatAgentLocation } from '../../common/chatAgents.js';
1918
import { ChatContextKeys } from '../../common/chatContextKeys.js';
19+
import { ChatAgentLocation } from '../../common/constants.js';
2020
import { IChatWidgetService } from '../chat.js';
2121

2222
export class PanelChatAccessibilityHelp implements IAccessibleViewImplementation {

src/vs/workbench/contrib/chat/browser/actions/chatActions.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ import { ACTIVE_GROUP, IEditorService } from '../../../../services/editor/common
3535
import { IHostService } from '../../../../services/host/browser/host.js';
3636
import { IViewsService } from '../../../../services/views/common/viewsService.js';
3737
import { EXTENSIONS_CATEGORY, IExtensionsWorkbenchService } from '../../../extensions/common/extensions.js';
38-
import { ChatAgentLocation, IChatAgentService } from '../../common/chatAgents.js';
38+
import { IChatAgentService } from '../../common/chatAgents.js';
39+
import { ChatAgentLocation } from '../../common/constants.js';
3940
import { ChatContextKeys } from '../../common/chatContextKeys.js';
4041
import { extractAgentAndCommand } from '../../common/chatParserTypes.js';
4142
import { IChatDetail, IChatService } from '../../common/chatService.js';

src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts

+24-15
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import { KeybindingWeight } from '../../../../../platform/keybinding/common/keyb
1515
import { ActiveEditorContext } from '../../../../common/contextkeys.js';
1616
import { IViewsService } from '../../../../services/views/common/viewsService.js';
1717
import { isChatViewTitleActionContext } from '../../common/chatActions.js';
18-
import { ChatAgentLocation } from '../../common/chatAgents.js';
19-
import { ChatContextKeys } from '../../common/chatContextKeys.js';
18+
import { ChatContextKeyExprs, ChatContextKeys } from '../../common/chatContextKeys.js';
2019
import { hasAppliedChatEditsContextKey, hasUndecidedChatEditingResourceContextKey, IChatEditingSession, WorkingSetEntryState } from '../../common/chatEditingService.js';
21-
import { ChatMode } from '../../common/constants.js';
20+
import { IChatService } from '../../common/chatService.js';
21+
import { ChatAgentLocation, ChatMode } from '../../common/constants.js';
2222
import { ChatViewId, EditsViewId, IChatWidget, IChatWidgetService } from '../chat.js';
2323
import { EditingSessionAction } from '../chatEditing/chatEditingActions.js';
2424
import { ctxIsGlobalEditingSession } from '../chatEditing/chatEditingEditorContextKeys.js';
@@ -95,7 +95,9 @@ export function registerNewChatActions() {
9595
},
9696
{
9797
id: MenuId.ViewTitle,
98-
when: ContextKeyExpr.equals('view', ChatViewId),
98+
when: ContextKeyExpr.and(
99+
ChatContextKeys.location.isEqualTo(ChatAgentLocation.Panel),
100+
ChatContextKeys.inUnifiedChat.negate()),
99101
group: 'navigation',
100102
order: -1
101103
}]
@@ -137,7 +139,7 @@ export function registerNewChatActions() {
137139
},
138140
{
139141
id: MenuId.ViewTitle,
140-
when: ContextKeyExpr.equals('view', EditsViewId),
142+
when: ChatContextKeyExprs.inEditsOrUnified,
141143
group: 'navigation',
142144
order: -1
143145
}],
@@ -147,7 +149,7 @@ export function registerNewChatActions() {
147149
mac: {
148150
primary: KeyMod.WinCtrl | KeyCode.KeyL
149151
},
150-
when: ContextKeyExpr.and(ChatContextKeys.inChatSession, ChatContextKeys.location.isEqualTo(ChatAgentLocation.EditingSession))
152+
when: ContextKeyExpr.and(ChatContextKeys.inChatSession, ChatContextKeyExprs.inEditingMode)
151153
}
152154
});
153155
}
@@ -199,6 +201,7 @@ export function registerNewChatActions() {
199201
const widgetService = accessor.get(IChatWidgetService);
200202
const dialogService = accessor.get(IDialogService);
201203
const viewsService = accessor.get(IViewsService);
204+
const chatService = accessor.get(IChatService);
202205

203206
if (!(await this._handleCurrentEditingSession(editingSession, dialogService))) {
204207
return;
@@ -212,8 +215,9 @@ export function registerNewChatActions() {
212215
widget = widgetService.getWidgetBySessionId(context.sessionId);
213216
} else {
214217
// Is running from f1 or keybinding
215-
const chatView = await viewsService.openView(EditsViewId) as ChatViewPane;
216-
widget = chatView.widget;
218+
const view = chatService.unifiedViewEnabled ? ChatViewId : EditsViewId;
219+
const chatView = await viewsService.openView<ChatViewPane>(view);
220+
widget = chatView?.widget;
217221
}
218222

219223
announceChatCleared(accessibilitySignalService);
@@ -256,7 +260,7 @@ export function registerNewChatActions() {
256260
f1: false,
257261
menu: [{
258262
id: MenuId.ChatEditingWidgetToolbar,
259-
when: ContextKeyExpr.and(hasUndecidedChatEditingResourceContextKey.negate(), hasAppliedChatEditsContextKey, ChatContextKeys.editingParticipantRegistered, ChatContextKeys.location.isEqualTo(ChatAgentLocation.EditingSession)),
263+
when: ContextKeyExpr.and(hasUndecidedChatEditingResourceContextKey.negate(), hasAppliedChatEditsContextKey, ChatContextKeys.editingParticipantRegistered, ChatContextKeyExprs.inEditsOrUnified),
260264
group: 'navigation',
261265
order: 0
262266
}]
@@ -348,12 +352,16 @@ export function registerNewChatActions() {
348352
precondition: ChatContextKeys.Setup.hidden.toNegated(),
349353
menu: [{
350354
id: MenuId.ViewTitle,
351-
when: ContextKeyExpr.and(ContextKeyExpr.equals('view', ChatViewId), ChatContextKeys.editingParticipantRegistered,
355+
when: ContextKeyExpr.and(
356+
ContextKeyExpr.equals('view', ChatViewId),
357+
ChatContextKeys.editingParticipantRegistered,
352358
ContextKeyExpr.equals(`view.${EditsViewId}.visible`, false),
353359
ContextKeyExpr.or(
354360
ContextKeyExpr.and(ContextKeyExpr.equals(`workbench.panel.chat.defaultViewContainerLocation`, true), ContextKeyExpr.equals(`workbench.panel.chatEditing.defaultViewContainerLocation`, false)),
355361
ContextKeyExpr.and(ContextKeyExpr.equals(`workbench.panel.chat.defaultViewContainerLocation`, false), ContextKeyExpr.equals(`workbench.panel.chatEditing.defaultViewContainerLocation`, true)),
356-
)),
362+
),
363+
ChatContextKeys.inUnifiedChat.negate()
364+
),
357365
group: 'navigation',
358366
order: 1
359367
}, {
@@ -380,17 +388,18 @@ export function registerNewChatActions() {
380388
async run(accessor: ServicesAccessor, opts?: string | IChatViewOpenOptions) {
381389
opts = typeof opts === 'string' ? { query: opts } : opts;
382390
const viewsService = accessor.get(IViewsService);
383-
const chatView = await viewsService.openView(EditsViewId) as ChatViewPane;
391+
const chatView = await viewsService.openView<ChatViewPane>(EditsViewId)
392+
?? await viewsService.openView<ChatViewPane>(ChatViewId);
384393

385394
if (opts?.query) {
386395
if (opts.isPartialQuery) {
387-
chatView.widget.setInput(opts.query);
396+
chatView?.widget.setInput(opts.query);
388397
} else {
389-
chatView.widget.acceptInput(opts.query);
398+
chatView?.widget.acceptInput(opts.query);
390399
}
391400
}
392401

393-
chatView.widget.focusInput();
402+
chatView?.widget.focusInput();
394403
}
395404
});
396405
}

src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ import { IEditorService } from '../../../../services/editor/common/editorService
2929
import { accessibleViewInCodeBlock } from '../../../accessibility/browser/accessibilityConfiguration.js';
3030
import { reviewEdits } from '../../../inlineChat/browser/inlineChatController.js';
3131
import { ITerminalEditorService, ITerminalGroupService, ITerminalService } from '../../../terminal/browser/terminal.js';
32-
import { ChatAgentLocation } from '../../common/chatAgents.js';
3332
import { ChatContextKeys } from '../../common/chatContextKeys.js';
3433
import { ChatCopyKind, IChatService } from '../../common/chatService.js';
3534
import { IChatResponseViewModel, isResponseVM } from '../../common/chatViewModel.js';
35+
import { ChatAgentLocation } from '../../common/constants.js';
3636
import { IChatCodeBlockContextProviderService, IChatWidgetService } from '../chat.js';
3737
import { DefaultChatTextEditor, ICodeBlockActionContext, ICodeCompareBlockActionContext } from '../codeBlockPart.js';
3838
import { CHAT_CATEGORY } from './chatActions.js';

0 commit comments

Comments
 (0)