Skip to content

Commit a4dc6e5

Browse files
authored
Show a "Copilot" menu OOTB (fix microsoft#17904) (microsoft#250305)
1 parent 3bb00b7 commit a4dc6e5

File tree

6 files changed

+105
-7
lines changed

6 files changed

+105
-7
lines changed

src/vs/platform/actions/common/actions.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ export class MenuId {
252252
static readonly ChatTitleBarMenu = new MenuId('ChatTitleBarMenu');
253253
static readonly ChatAttachmentsContext = new MenuId('ChatAttachmentsContext');
254254
static readonly ChatToolOutputResourceToolbar = new MenuId('ChatToolOutputResourceToolbar');
255+
static readonly ChatExplorerMenu = new MenuId('ChatExplorerMenu');
256+
static readonly ChatTextEditorMenu = new MenuId('ChatTextEditorMenu');
257+
static readonly ChatTerminalMenu = new MenuId('ChatTerminalMenu');
255258
static readonly ChatToolOutputResourceContext = new MenuId('ChatToolOutputResourceContext');
256259
static readonly AccessibleView = new MenuId('AccessibleView');
257260
static readonly MultiDiffEditorFileToolbar = new MenuId('MultiDiffEditorFileToolbar');

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

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ import { KeybindingWeight } from '../../../../../platform/keybinding/common/keyb
2727
import { ILogService } from '../../../../../platform/log/common/log.js';
2828
import { AnythingQuickAccessProviderRunOptions } from '../../../../../platform/quickinput/common/quickAccess.js';
2929
import { IQuickInputService, IQuickPickItem, IQuickPickItemWithResource, QuickPickItem } from '../../../../../platform/quickinput/common/quickInput.js';
30-
import { ActiveEditorContext, TextCompareEditorActiveContext } from '../../../../common/contextkeys.js';
30+
import { ActiveEditorContext, ResourceContextKey, TextCompareEditorActiveContext } from '../../../../common/contextkeys.js';
3131
import { EditorResourceAccessor, SideBySideEditor } from '../../../../common/editor.js';
3232
import { IEditorService } from '../../../../services/editor/common/editorService.js';
3333
import { IViewsService } from '../../../../services/views/common/viewsService.js';
34-
import { TEXT_FILE_EDITOR_ID } from '../../../files/common/files.js';
34+
import { ExplorerFolderContext, TEXT_FILE_EDITOR_ID } from '../../../files/common/files.js';
3535
import { AnythingQuickAccessProvider } from '../../../search/browser/anythingQuickAccess.js';
3636
import { isSearchTreeFileMatch, isSearchTreeMatch } from '../../../search/browser/searchTreeModel/searchTreeCommon.js';
3737
import { ISymbolQuickPickItem, SymbolsQuickAccessProvider } from '../../../search/browser/symbolsQuickAccess.js';
@@ -119,6 +119,31 @@ class AttachFileToChatAction extends AttachResourceAction {
119119
group: 'z_chat',
120120
order: 1,
121121
when: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.or(ActiveEditorContext.isEqualTo(TEXT_FILE_EDITOR_ID), TextCompareEditorActiveContext), SearchContext.SearchResultHeaderFocused.negate()),
122+
}, {
123+
id: MenuId.ChatExplorerMenu,
124+
group: 'zContext',
125+
order: 1,
126+
when: ContextKeyExpr.and(
127+
ChatContextKeys.enabled,
128+
ExplorerFolderContext.negate(),
129+
ContextKeyExpr.or(
130+
ResourceContextKey.Scheme.isEqualTo(Schemas.file),
131+
ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)
132+
)
133+
),
134+
}, {
135+
id: MenuId.ChatTextEditorMenu,
136+
group: 'zContext',
137+
order: 2,
138+
when: ContextKeyExpr.and(
139+
ChatContextKeys.enabled,
140+
ContextKeyExpr.or(
141+
ResourceContextKey.Scheme.isEqualTo(Schemas.file),
142+
ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote),
143+
ResourceContextKey.Scheme.isEqualTo(Schemas.untitled),
144+
ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeUserData)
145+
)
146+
)
122147
}]
123148
});
124149
}
@@ -147,6 +172,19 @@ class AttachFolderToChatAction extends AttachResourceAction {
147172
title: localize2('workbench.action.chat.attachFolder.label', "Add Folder to Chat"),
148173
category: CHAT_CATEGORY,
149174
f1: false,
175+
menu: {
176+
id: MenuId.ChatExplorerMenu,
177+
group: 'zContext',
178+
order: 1,
179+
when: ContextKeyExpr.and(
180+
ChatContextKeys.enabled,
181+
ExplorerFolderContext,
182+
ContextKeyExpr.or(
183+
ResourceContextKey.Scheme.isEqualTo(Schemas.file),
184+
ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)
185+
)
186+
)
187+
}
150188
});
151189
}
152190

@@ -174,6 +212,20 @@ class AttachSelectionToChatAction extends Action2 {
174212
title: localize2('workbench.action.chat.attachSelection.label', "Add Selection to Chat"),
175213
category: CHAT_CATEGORY,
176214
f1: false,
215+
menu: {
216+
id: MenuId.ChatTextEditorMenu,
217+
group: 'zContext',
218+
order: 1,
219+
when: ContextKeyExpr.and(
220+
ChatContextKeys.enabled,
221+
ContextKeyExpr.or(
222+
ResourceContextKey.Scheme.isEqualTo(Schemas.file),
223+
ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote),
224+
ResourceContextKey.Scheme.isEqualTo(Schemas.untitled),
225+
ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeUserData)
226+
)
227+
)
228+
}
177229
});
178230
}
179231

src/vs/workbench/contrib/chat/browser/chatSetup.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { URI } from '../../../../base/common/uri.js';
2424
import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';
2525
import { MarkdownRenderer } from '../../../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js';
2626
import { localize, localize2 } from '../../../../nls.js';
27-
import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';
27+
import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../platform/actions/common/actions.js';
2828
import { ICommandService } from '../../../../platform/commands/common/commands.js';
2929
import { ConfigurationTarget, IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
3030
import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from '../../../../platform/configuration/common/configurationRegistry.js';
@@ -955,6 +955,7 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
955955

956956
this.registerSetupAgents(context, controller);
957957
this.registerActions(context, requests, controller);
958+
this.registerMenus();
958959
this.registerUrlLinkHandler();
959960
}
960961

@@ -1260,6 +1261,38 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
12601261
registerAction2(EnableOveragesAction);
12611262
}
12621263

1264+
private registerMenus(): void {
1265+
const menuContext = ContextKeyExpr.and(
1266+
// TODO@bpasero this needs to be revisited when the Copilot
1267+
// extension contributes this OOTB where this menu is also
1268+
// defined.
1269+
ChatContextKeys.Setup.installed.negate(),
1270+
ChatContextKeys.Setup.hidden.negate(),
1271+
ChatContextKeys.Setup.disabled.negate()
1272+
);
1273+
1274+
MenuRegistry.appendMenuItem(MenuId.ExplorerContext, {
1275+
submenu: MenuId.ChatExplorerMenu,
1276+
group: '5_copilot',
1277+
title: localize('title4', "Copilot"),
1278+
when: menuContext
1279+
});
1280+
1281+
MenuRegistry.appendMenuItem(MenuId.EditorContext, {
1282+
submenu: MenuId.ChatTextEditorMenu,
1283+
group: '1_copilot',
1284+
title: localize('title4', "Copilot"),
1285+
when: menuContext
1286+
});
1287+
1288+
MenuRegistry.appendMenuItem(MenuId.TerminalInstanceContext, {
1289+
submenu: MenuId.ChatTerminalMenu,
1290+
group: '2_copilot',
1291+
title: localize('title4', "Copilot"),
1292+
when: menuContext
1293+
});
1294+
}
1295+
12631296
private registerUrlLinkHandler(): void {
12641297
this._register(ExtensionUrlHandlerOverrideRegistry.registerHandler({
12651298
canHandleURL: url => {

src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,15 @@ export class StartSessionAction extends Action2 {
6868
primary: KeyMod.CtrlCmd | KeyCode.KeyI
6969
},
7070
icon: START_INLINE_CHAT,
71-
menu: {
71+
menu: [{
7272
id: MenuId.ChatTitleBarMenu,
7373
group: 'a_open',
7474
order: 3,
75-
}
75+
}, {
76+
id: MenuId.ChatTextEditorMenu,
77+
group: 'a_open',
78+
order: 1
79+
}]
7680
});
7781
}
7882
override run(accessor: ServicesAccessor, ...args: any[]): any {

src/vs/workbench/contrib/search/browser/searchActionsFind.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ registerAction2(class ExcludeFolderFromSearchAction extends Action2 {
115115
id: MenuId.SearchContext,
116116
group: 'search',
117117
order: 4,
118-
when: ContextKeyExpr.and(Constants.SearchContext.ResourceFolderFocusKey)
118+
when: Constants.SearchContext.ResourceFolderFocusKey
119119
}
120120
]
121121
});
@@ -250,7 +250,7 @@ registerAction2(class FindInFolderAction extends Action2 {
250250
id: MenuId.ExplorerContext,
251251
group: '4_search',
252252
order: 10,
253-
when: ContextKeyExpr.and(ExplorerFolderContext)
253+
when: ExplorerFolderContext
254254
}
255255
]
256256
});

src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import { Codicon } from '../../../../../base/common/codicons.js';
77
import { KeyCode, KeyMod } from '../../../../../base/common/keyCodes.js';
88
import { localize2 } from '../../../../../nls.js';
9+
import { MenuId } from '../../../../../platform/actions/common/actions.js';
910
import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';
1011
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
1112
import { IChatWidgetService } from '../../../chat/browser/chat.js';
@@ -35,6 +36,11 @@ registerActiveXtermAction({
3536
ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated),
3637
TerminalChatContextKeys.hasChatAgent
3738
),
39+
menu: {
40+
id: MenuId.ChatTerminalMenu,
41+
group: 'copilot',
42+
order: 1
43+
},
3844
run: (_xterm, _accessor, activeInstance, opts?: unknown) => {
3945
if (isDetachedTerminalInstance(activeInstance)) {
4046
return;

0 commit comments

Comments
 (0)