3
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
4
*--------------------------------------------------------------------------------------------*/
5
5
6
- import { basename } from '../../../../../base/common/resources.js' ;
7
6
import { CancellationToken } from '../../../../../base/common/cancellation.js' ;
8
7
import { Codicon } from '../../../../../base/common/codicons.js' ;
8
+ import { MarkdownString } from '../../../../../base/common/htmlContent.js' ;
9
9
import { KeyCode , KeyMod } from '../../../../../base/common/keyCodes.js' ;
10
+ import { basename } from '../../../../../base/common/resources.js' ;
10
11
import { ThemeIcon } from '../../../../../base/common/themables.js' ;
11
12
import { assertType } from '../../../../../base/common/types.js' ;
12
13
import { ServicesAccessor } from '../../../../../editor/browser/editorExtensions.js' ;
14
+ import { EditorContextKeys } from '../../../../../editor/common/editorContextKeys.js' ;
13
15
import { localize , localize2 } from '../../../../../nls.js' ;
14
16
import { Action2 , MenuId , registerAction2 } from '../../../../../platform/actions/common/actions.js' ;
15
17
import { ICommandService } from '../../../../../platform/commands/common/commands.js' ;
@@ -18,22 +20,20 @@ import { ContextKeyExpr, IContextKeyService } from '../../../../../platform/cont
18
20
import { IDialogService } from '../../../../../platform/dialogs/common/dialogs.js' ;
19
21
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js' ;
20
22
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js' ;
21
- import { IChatAgentService , IChatAgentHistoryEntry } from '../../common/chatAgents.js' ;
23
+ import { IRemoteCodingAgentsService } from '../../../remoteCodingAgents/common/remoteCodingAgentsService.js' ;
24
+ import { IChatAgentHistoryEntry , IChatAgentService } from '../../common/chatAgents.js' ;
22
25
import { ChatContextKeys } from '../../common/chatContextKeys.js' ;
23
26
import { toChatHistoryContent } from '../../common/chatModel.js' ;
24
- import { ChatMode2 , IChatMode , validateChatMode2 } from '../../common/chatModes.js' ;
27
+ import { IChatMode , IChatModeService } from '../../common/chatModes.js' ;
25
28
import { chatVariableLeader } from '../../common/chatParserTypes.js' ;
29
+ import { ChatRequestParser } from '../../common/chatRequestParser.js' ;
26
30
import { IChatService } from '../../common/chatService.js' ;
27
- import { ChatAgentLocation , ChatConfiguration , ChatMode , } from '../../common/constants.js' ;
31
+ import { ChatAgentLocation , ChatConfiguration , ChatModeKind , } from '../../common/constants.js' ;
28
32
import { ILanguageModelChatMetadata } from '../../common/languageModels.js' ;
29
33
import { ILanguageModelToolsService } from '../../common/languageModelToolsService.js' ;
30
34
import { IChatWidget , IChatWidgetService } from '../chat.js' ;
31
35
import { getEditingSessionContext } from '../chatEditing/chatEditingActions.js' ;
32
36
import { ACTION_ID_NEW_CHAT , CHAT_CATEGORY , handleCurrentEditingSession , handleModeSwitch } from './chatActions.js' ;
33
- import { EditorContextKeys } from '../../../../../editor/common/editorContextKeys.js' ;
34
- import { IRemoteCodingAgentsService } from '../../../remoteCodingAgents/common/remoteCodingAgentsService.js' ;
35
- import { ChatRequestParser } from '../../common/chatRequestParser.js' ;
36
- import { MarkdownString } from '../../../../../base/common/htmlContent.js' ;
37
37
38
38
export interface IVoiceChatExecuteActionContext {
39
39
readonly disableTimeout ?: boolean ;
@@ -127,7 +127,7 @@ export class ChatSubmitAction extends SubmitAction {
127
127
static readonly ID = 'workbench.action.chat.submit' ;
128
128
129
129
constructor ( ) {
130
- const precondition = ChatContextKeys . chatMode . isEqualTo ( ChatMode . Ask ) ;
130
+ const precondition = ChatContextKeys . chatModeKind . isEqualTo ( ChatModeKind . Ask ) ;
131
131
132
132
super ( {
133
133
id : ChatSubmitAction . ID ,
@@ -164,7 +164,7 @@ export class ChatSubmitAction extends SubmitAction {
164
164
export const ToggleAgentModeActionId = 'workbench.action.chat.toggleAgentMode' ;
165
165
166
166
export interface IToggleChatModeArgs {
167
- mode : IChatMode | ChatMode ;
167
+ modeId : ChatModeKind | string ;
168
168
}
169
169
170
170
class ToggleChatModeAction extends Action2 {
@@ -207,6 +207,7 @@ class ToggleChatModeAction extends Action2 {
207
207
const commandService = accessor . get ( ICommandService ) ;
208
208
const configurationService = accessor . get ( IConfigurationService ) ;
209
209
const instaService = accessor . get ( IInstantiationService ) ;
210
+ const modeService = accessor . get ( IChatModeService ) ;
210
211
211
212
const context = getEditingSessionContext ( accessor , args ) ;
212
213
if ( ! context ?. chatWidget ) {
@@ -216,33 +217,35 @@ class ToggleChatModeAction extends Action2 {
216
217
const arg = args . at ( 0 ) as IToggleChatModeArgs | undefined ;
217
218
const chatSession = context . chatWidget . viewModel ?. model ;
218
219
const requestCount = chatSession ?. getRequests ( ) . length ?? 0 ;
219
- const switchToMode = validateChatMode2 ( arg ?. mode ) ?? this . getNextMode ( context . chatWidget , requestCount , configurationService ) ;
220
+ const switchToMode = ( arg && modeService . findModeById ( arg . modeId ) ) ?? this . getNextMode ( context . chatWidget , requestCount , configurationService , modeService ) ;
220
221
221
- if ( switchToMode . id === context . chatWidget . input . currentMode2 . id ) {
222
+ if ( switchToMode . id === context . chatWidget . input . currentModeObs . get ( ) . id ) {
222
223
return ;
223
224
}
224
225
225
- const chatModeCheck = await instaService . invokeFunction ( handleModeSwitch , context . chatWidget . input . currentMode , switchToMode . kind , requestCount , context . editingSession ) ;
226
+ const chatModeCheck = await instaService . invokeFunction ( handleModeSwitch , context . chatWidget . input . currentModeKind , switchToMode . kind , requestCount , context . editingSession ) ;
226
227
if ( ! chatModeCheck ) {
227
228
return ;
228
229
}
229
230
230
- context . chatWidget . input . setChatMode2 ( switchToMode ) ;
231
+ context . chatWidget . input . setChatMode ( switchToMode . id ) ;
231
232
232
233
if ( chatModeCheck . needToClearSession ) {
233
234
await commandService . executeCommand ( ACTION_ID_NEW_CHAT ) ;
234
235
}
235
236
}
236
237
237
- private getNextMode ( chatWidget : IChatWidget , requestCount : number , configurationService : IConfigurationService ) : IChatMode {
238
- const modes = [ ChatMode2 . Ask ] ;
239
- if ( configurationService . getValue ( ChatConfiguration . Edits2Enabled ) || requestCount === 0 ) {
240
- modes . push ( ChatMode2 . Edit ) ;
241
- }
242
- modes . push ( ChatMode2 . Agent ) ;
243
-
244
- const modeIndex = modes . findIndex ( mode => mode . id === chatWidget . input . currentMode2 . id ) ;
245
- const newMode = modes [ ( modeIndex + 1 ) % modes . length ] ;
238
+ private getNextMode ( chatWidget : IChatWidget , requestCount : number , configurationService : IConfigurationService , modeService : IChatModeService ) : IChatMode {
239
+ const modes = modeService . getModes ( ) ;
240
+ const flat = [
241
+ ...modes . builtin . filter ( mode => {
242
+ return mode . kind !== ChatModeKind . Edit || configurationService . getValue ( ChatConfiguration . Edits2Enabled ) || requestCount === 0 ;
243
+ } ) ,
244
+ ...( modes . custom ?? [ ] ) ,
245
+ ] ;
246
+
247
+ const curModeIndex = flat . findIndex ( mode => mode . id === chatWidget . input . currentModeObs . get ( ) . id ) ;
248
+ const newMode = flat [ ( curModeIndex + 1 ) % flat . length ] ;
246
249
return newMode ;
247
250
}
248
251
}
@@ -269,7 +272,7 @@ export class ToggleRequestPausedAction extends Action2 {
269
272
order : 3.5 ,
270
273
when : ContextKeyExpr . and (
271
274
ChatContextKeys . canRequestBePaused ,
272
- ChatContextKeys . chatMode . isEqualTo ( ChatMode . Agent ) ,
275
+ ChatContextKeys . chatModeKind . isEqualTo ( ChatModeKind . Agent ) ,
273
276
ChatContextKeys . location . isEqualTo ( ChatAgentLocation . Panel ) ,
274
277
ContextKeyExpr . or ( ChatContextKeys . isRequestPaused . negate ( ) , ChatContextKeys . inputHasText . negate ( ) ) ,
275
278
) ,
@@ -378,7 +381,7 @@ export class ChatEditingSessionSubmitAction extends SubmitAction {
378
381
static readonly ID = 'workbench.action.edits.submit' ;
379
382
380
383
constructor ( ) {
381
- const precondition = ChatContextKeys . chatMode . notEqualsTo ( ChatMode . Ask ) ;
384
+ const precondition = ChatContextKeys . chatModeKind . notEqualsTo ( ChatModeKind . Ask ) ;
382
385
383
386
super ( {
384
387
id : ChatEditingSessionSubmitAction . ID ,
@@ -423,7 +426,7 @@ class SubmitWithoutDispatchingAction extends Action2 {
423
426
// without text present - having instructions is enough context for a request
424
427
ContextKeyExpr . or ( ChatContextKeys . inputHasText , ChatContextKeys . hasPromptFile ) ,
425
428
whenNotInProgressOrPaused ,
426
- ChatContextKeys . chatMode . isEqualTo ( ChatMode . Ask ) ,
429
+ ChatContextKeys . chatModeKind . isEqualTo ( ChatModeKind . Ask ) ,
427
430
) ;
428
431
429
432
super ( {
@@ -442,7 +445,7 @@ class SubmitWithoutDispatchingAction extends Action2 {
442
445
id : MenuId . ChatExecuteSecondary ,
443
446
group : 'group_1' ,
444
447
order : 2 ,
445
- when : ChatContextKeys . chatMode . isEqualTo ( ChatMode . Ask ) ,
448
+ when : ChatContextKeys . chatModeKind . isEqualTo ( ChatModeKind . Ask ) ,
446
449
}
447
450
]
448
451
} ) ;
0 commit comments