Skip to content

Commit e319464

Browse files
authored
Update chat's newEditSession command to take an input prompt (microsoft#241796)
* Update chat's newEditSession command to take an input prompt * Use acceptInput instead * PR feedback - making a type and supporting partial queries
1 parent 9f41592 commit e319464

File tree

1 file changed

+55
-17
lines changed

1 file changed

+55
-17
lines changed

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

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ 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';
18+
import { ChatAgentLocation, IChatAgentService } from '../../common/chatAgents.js';
1919
import { ChatContextKeys } from '../../common/chatContextKeys.js';
2020
import { hasAppliedChatEditsContextKey, hasUndecidedChatEditingResourceContextKey, IChatEditingSession, WorkingSetEntryState } from '../../common/chatEditingService.js';
2121
import { ChatViewId, EditsViewId, IChatWidget, IChatWidgetService } from '../chat.js';
@@ -30,6 +30,24 @@ export const ACTION_ID_NEW_CHAT = `workbench.action.chat.newChat`;
3030
export const ACTION_ID_NEW_EDIT_SESSION = `workbench.action.chat.newEditSession`;
3131
export const ChatDoneActionId = 'workbench.action.chat.done';
3232

33+
export interface INewEditSessionActionContext {
34+
/**
35+
* An initial prompt to write to the chat.
36+
*/
37+
inputValue?: string;
38+
39+
/**
40+
* Selects opening in agent mode or not. If not set, the current mode is used.
41+
* This is ignored when coming from a chat view title context.
42+
*/
43+
agentMode?: boolean;
44+
45+
/**
46+
* Whether the inputValue is partial and should wait for further user input. If false or not set, the prompt is sent immediately.
47+
*/
48+
isPartialQuery?: boolean;
49+
}
50+
3351
export function registerNewChatActions() {
3452
registerAction2(class NewChatEditorAction extends Action2 {
3553
constructor() {
@@ -175,34 +193,54 @@ export function registerNewChatActions() {
175193
}
176194

177195
async runEditingSessionAction(accessor: ServicesAccessor, editingSession: IChatEditingSession, chatWidget: IChatWidget, ...args: any[]) {
178-
const context = args[0];
196+
const context: INewEditSessionActionContext | undefined = args[0];
179197
const accessibilitySignalService = accessor.get(IAccessibilitySignalService);
180198
const widgetService = accessor.get(IChatWidgetService);
181199
const dialogService = accessor.get(IDialogService);
182200
const viewsService = accessor.get(IViewsService);
201+
const agentService = accessor.get(IChatAgentService);
202+
183203
if (!(await this._handleCurrentEditingSession(editingSession, dialogService))) {
184204
return;
185205
}
186-
if (isChatViewTitleActionContext(context)) {
206+
207+
const isChatViewTitleAction = isChatViewTitleActionContext(context);
208+
209+
let widget: IChatWidget | undefined;
210+
if (isChatViewTitleAction) {
187211
// Is running in the Chat view title
188-
announceChatCleared(accessibilitySignalService);
189-
const widget = widgetService.getWidgetBySessionId(context.sessionId);
190-
if (widget) {
191-
await editingSession.stop(true);
192-
widget.clear();
193-
widget.attachmentModel.clear();
194-
widget.focusInput();
195-
}
212+
widget = widgetService.getWidgetBySessionId(context.sessionId);
196213
} else {
197214
// Is running from f1 or keybinding
198215
const chatView = await viewsService.openView(EditsViewId) as ChatViewPane;
199-
const widget = chatView.widget;
216+
widget = chatView.widget;
217+
}
200218

201-
announceChatCleared(accessibilitySignalService);
202-
await editingSession.stop(true);
203-
widget.clear();
204-
widget.attachmentModel.clear();
205-
widget.focusInput();
219+
announceChatCleared(accessibilitySignalService);
220+
221+
if (!widget) {
222+
return;
223+
}
224+
225+
await editingSession.stop(true);
226+
widget.clear();
227+
widget.attachmentModel.clear();
228+
widget.focusInput();
229+
230+
if (!context) {
231+
return;
232+
}
233+
234+
if (!isChatViewTitleAction && typeof context.agentMode === 'boolean') {
235+
agentService.toggleToolsAgentMode(context.agentMode);
236+
}
237+
238+
if (context.inputValue) {
239+
if (context.isPartialQuery) {
240+
widget.setInput(context.inputValue);
241+
} else {
242+
widget.acceptInput(context.inputValue);
243+
}
206244
}
207245
}
208246
});

0 commit comments

Comments
 (0)