Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Codicon } from '../../../../../base/common/codicons.js';
7
import { ThemeIcon } from '../../../../../base/common/themables.js';
8
import { localize, localize2 } from '../../../../../nls.js';
9
import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../../platform/actions/common/actions.js';
10
import { ContextKeyExpr, ContextKeyExpression } from '../../../../../platform/contextkey/common/contextkey.js';
11
import { ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';
12
import { ActiveEditorContext } from '../../../../common/contextkeys.js';
13
import { ViewContainerLocation } from '../../../../common/views.js';
14
import { IEditorGroupsService } from '../../../../services/editor/common/editorGroupsService.js';
15
import { ACTIVE_GROUP, AUX_WINDOW_GROUP, IEditorService } from '../../../../services/editor/common/editorService.js';
16
import { IViewsService } from '../../../../services/views/common/viewsService.js';
17
import { isChatViewTitleActionContext } from '../../common/chatActions.js';
18
import { ChatContextKeys } from '../../common/chatContextKeys.js';
19
import { ChatAgentLocation } from '../../common/constants.js';
20
import { ChatViewId, IChatWidgetService } from '../chat.js';
21
import { ChatEditor, IChatEditorOptions } from '../chatEditor.js';
22
import { ChatEditorInput } from '../chatEditorInput.js';
23
import { ChatViewPane } from '../chatViewPane.js';
24
import { CHAT_CATEGORY } from './chatActions.js';
25
26
enum MoveToNewLocation {
27
Editor = 'Editor',
28
Window = 'Window'
29
}
30
31
export function registerMoveActions() {
32
registerAction2(class GlobalMoveToEditorAction extends Action2 {
33
constructor() {
34
super({
35
id: 'workbench.action.chat.openInEditor',
36
title: localize2('chat.openInEditor.label', "Open Chat in Editor"),
37
category: CHAT_CATEGORY,
38
precondition: ChatContextKeys.enabled,
39
f1: true,
40
menu: {
41
id: MenuId.ViewTitle,
42
when: ContextKeyExpr.equals('view', ChatViewId),
43
order: 0,
44
group: '1_open'
45
},
46
});
47
}
48
49
async run(accessor: ServicesAccessor, ...args: any[]) {
50
const context = args[0];
51
executeMoveToAction(accessor, MoveToNewLocation.Editor, isChatViewTitleActionContext(context) ? context.sessionId : undefined);
52
}
53
});
54
55
registerAction2(class GlobalMoveToNewWindowAction extends Action2 {
56
constructor() {
57
super({
58
id: 'workbench.action.chat.openInNewWindow',
59
title: localize2('chat.openInNewWindow.label', "Open Chat in New Window"),
60
category: CHAT_CATEGORY,
61
precondition: ChatContextKeys.enabled,
62
f1: true,
63
menu: {
64
id: MenuId.ViewTitle,
65
when: ContextKeyExpr.equals('view', ChatViewId),
66
order: 0,
67
group: '1_open'
68
},
69
});
70
}
71
72
async run(accessor: ServicesAccessor, ...args: any[]) {
73
const context = args[0];
74
executeMoveToAction(accessor, MoveToNewLocation.Window, isChatViewTitleActionContext(context) ? context.sessionId : undefined);
75
}
76
});
77
78
registerAction2(class GlobalMoveToSidebarAction extends Action2 {
79
constructor() {
80
super({
81
id: 'workbench.action.chat.openInSidebar',
82
title: localize2('interactiveSession.openInSidebar.label', "Open Chat in Side Bar"),
83
category: CHAT_CATEGORY,
84
precondition: ChatContextKeys.enabled,
85
f1: true
86
});
87
}
88
89
async run(accessor: ServicesAccessor, ...args: any[]) {
90
return moveToSidebar(accessor);
91
}
92
});
93
94
function appendOpenChatInViewMenuItem(menuId: MenuId, title: string, icon: ThemeIcon, locationContextKey: ContextKeyExpression) {
95
MenuRegistry.appendMenuItem(menuId, {
96
command: { id: 'workbench.action.chat.openInSidebar', title, icon },
97
when: ContextKeyExpr.and(
98
ActiveEditorContext.isEqualTo(ChatEditorInput.EditorID),
99
locationContextKey
100
),
101
group: menuId === MenuId.CompactWindowEditorTitle ? 'navigation' : undefined,
102
order: 0
103
});
104
}
105
106
[MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].forEach(id => {
107
appendOpenChatInViewMenuItem(id, localize('interactiveSession.openInSecondarySidebar.label', "Open Chat in Secondary Side Bar"), Codicon.layoutSidebarRightDock, ChatContextKeys.panelLocation.isEqualTo(ViewContainerLocation.AuxiliaryBar));
108
appendOpenChatInViewMenuItem(id, localize('interactiveSession.openInPrimarySidebar.label', "Open Chat in Primary Side Bar"), Codicon.layoutSidebarLeftDock, ChatContextKeys.panelLocation.isEqualTo(ViewContainerLocation.Sidebar));
109
appendOpenChatInViewMenuItem(id, localize('interactiveSession.openInPanel.label', "Open Chat in Panel"), Codicon.layoutPanelDock, ChatContextKeys.panelLocation.isEqualTo(ViewContainerLocation.Panel));
110
});
111
}
112
113
async function executeMoveToAction(accessor: ServicesAccessor, moveTo: MoveToNewLocation, _sessionId?: string) {
114
const widgetService = accessor.get(IChatWidgetService);
115
const editorService = accessor.get(IEditorService);
116
117
const widget = (_sessionId ? widgetService.getWidgetBySessionId(_sessionId) : undefined)
118
?? widgetService.lastFocusedWidget;
119
if (!widget || !widget.viewModel || widget.location !== ChatAgentLocation.Panel) {
120
await editorService.openEditor({ resource: ChatEditorInput.getNewEditorUri(), options: { pinned: true, auxiliary: { compact: true, bounds: { width: 640, height: 640 } } } }, moveTo === MoveToNewLocation.Window ? AUX_WINDOW_GROUP : ACTIVE_GROUP);
121
return;
122
}
123
124
const sessionId = widget.viewModel.sessionId;
125
const viewState = widget.getViewState();
126
127
widget.clear();
128
await widget.waitForReady();
129
130
const options: IChatEditorOptions = { target: { sessionId }, pinned: true, viewState, auxiliary: { compact: true, bounds: { width: 640, height: 640 } } };
131
await editorService.openEditor({ resource: ChatEditorInput.getNewEditorUri(), options }, moveTo === MoveToNewLocation.Window ? AUX_WINDOW_GROUP : ACTIVE_GROUP);
132
}
133
134
async function moveToSidebar(accessor: ServicesAccessor): Promise<void> {
135
const viewsService = accessor.get(IViewsService);
136
const editorService = accessor.get(IEditorService);
137
const editorGroupService = accessor.get(IEditorGroupsService);
138
139
const chatEditor = editorService.activeEditorPane;
140
const chatEditorInput = chatEditor?.input;
141
let view: ChatViewPane;
142
if (chatEditor instanceof ChatEditor && chatEditorInput instanceof ChatEditorInput && chatEditorInput.sessionId) {
143
await editorService.closeEditor({ editor: chatEditor.input, groupId: editorGroupService.activeGroup.id });
144
view = await viewsService.openView(ChatViewId) as ChatViewPane;
145
await view.loadSession(chatEditorInput.sessionId, chatEditor.getViewState());
146
} else {
147
view = await viewsService.openView(ChatViewId) as ChatViewPane;
148
}
149
150
view.focus();
151
}
152
153