Skip to content

Commit cc59a7f

Browse files
authored
add 'Configure' in context picker for instructions (#251484)
1 parent cb4bf50 commit cc59a7f

File tree

6 files changed

+50
-31
lines changed

6 files changed

+50
-31
lines changed

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { IHostService } from '../../../../services/host/browser/host.js';
2121
import { UntitledTextEditorInput } from '../../../../services/untitled/common/untitledTextEditorInput.js';
2222
import { FileEditorInput } from '../../../files/browser/editors/fileEditorInput.js';
2323
import { NotebookEditorInput } from '../../../notebook/common/notebookEditorInput.js';
24-
import { IChatContextPickService, IChatContextValueItem, IChatContextPickerItem, IChatContextPickerPickItem } from '../chatContextPickService.js';
24+
import { IChatContextPickService, IChatContextValueItem, IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPicker } from '../chatContextPickService.js';
2525
import { IChatEditingService } from '../../common/chatEditingService.js';
2626
import { IChatRequestToolEntry, IChatRequestToolSetEntry, IChatRequestVariableEntry, IImageVariableEntry, OmittedState } from '../../common/chatVariableEntries.js';
2727
import { IToolData, ToolDataSource, ToolSet } from '../../common/languageModelToolsService.js';
@@ -65,10 +65,7 @@ class ToolsContextPickerPick implements IChatContextPickerItem {
6565
readonly icon: ThemeIcon = Codicon.tools;
6666
readonly ordinal = -500;
6767

68-
asPicker(widget: IChatWidget): {
69-
readonly placeholder: string;
70-
readonly picks: Promise<(IChatContextPickerPickItem | IQuickPickSeparator)[]>;
71-
} {
68+
asPicker(widget: IChatWidget): IChatContextPicker {
7269

7370
type Pick = IChatContextPickerPickItem & { toolInfo: { ordinal: number; label: string } };
7471
const items: Pick[] = [];
@@ -198,10 +195,7 @@ class RelatedFilesContextPickerPick implements IChatContextPickerItem {
198195
return this._chatEditingService.hasRelatedFilesProviders() && (Boolean(widget.getInput()) || widget.attachmentModel.fileAttachments.length > 0);
199196
}
200197

201-
asPicker(widget: IChatWidget): {
202-
readonly placeholder: string;
203-
readonly picks: Promise<(IChatContextPickerPickItem | IQuickPickSeparator)[]>;
204-
} {
198+
asPicker(widget: IChatWidget): IChatContextPicker {
205199

206200
const picks = (async () => {
207201
const chatSessionId = widget.viewModel?.sessionId;

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ITextModelService } from '../../../../../editor/common/services/resolve
1919
import { AbstractGotoSymbolQuickAccessProvider, IGotoSymbolQuickPickItem } from '../../../../../editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js';
2020
import { localize, localize2 } from '../../../../../nls.js';
2121
import { Action2, MenuId, registerAction2 } from '../../../../../platform/actions/common/actions.js';
22+
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
2223
import { ContextKeyExpr, IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';
2324
import { IFileService } from '../../../../../platform/files/common/files.js';
2425
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
@@ -420,7 +421,7 @@ export class AttachContextAction extends Action2 {
420421
const quickInputService = accessor.get(IQuickInputService);
421422
const quickChatService = accessor.get(IQuickChatService);
422423
const instantiationService = accessor.get(IInstantiationService);
423-
424+
const commandService = accessor.get(ICommandService);
424425

425426
const providerOptions: AnythingQuickAccessProviderRunOptions = {
426427
additionPicks,
@@ -433,7 +434,7 @@ export class AttachContextAction extends Action2 {
433434
this._handleContextPick(item.item, widget);
434435

435436
} else if (item.item.type === 'pickerPick') {
436-
isDone = await this._handleContextPickerItem(quickInputService, item.item, widget);
437+
isDone = await this._handleContextPickerItem(quickInputService, commandService, item.item, widget);
437438
}
438439

439440
if (!isDone) {
@@ -466,7 +467,6 @@ export class AttachContextAction extends Action2 {
466467
const fileService = accessor.get(IFileService);
467468
const textModelService = accessor.get(ITextModelService);
468469

469-
470470
const toAttach: IChatRequestVariableEntry[] = [];
471471

472472
if (isIQuickPickItemWithResource(pick) && pick.resource) {
@@ -532,7 +532,7 @@ export class AttachContextAction extends Action2 {
532532
}
533533
}
534534

535-
private async _handleContextPickerItem(quickInputService: IQuickInputService, item: IChatContextPickerItem, widget: IChatWidget): Promise<boolean> {
535+
private async _handleContextPickerItem(quickInputService: IQuickInputService, commandService: ICommandService, item: IChatContextPickerItem, widget: IChatWidget): Promise<boolean> {
536536

537537
const pickerConfig = item.asPicker(widget);
538538

@@ -542,7 +542,16 @@ export class AttachContextAction extends Action2 {
542542
label: localize('goBack', 'Go back ↩'),
543543
alwaysShow: true
544544
};
545-
const extraPicks: QuickPickItem[] = [{ type: 'separator' }, goBackItem];
545+
const configureItem = pickerConfig.configure ? {
546+
label: pickerConfig.configure.label,
547+
commandId: pickerConfig.configure.commandId,
548+
alwaysShow: true
549+
} : undefined;
550+
const extraPicks: QuickPickItem[] = [{ type: 'separator' }];
551+
if (configureItem) {
552+
extraPicks.push(configureItem);
553+
}
554+
extraPicks.push(goBackItem);
546555

547556
const qp = store.add(quickInputService.createQuickPick({ useSeparators: true }));
548557

@@ -597,6 +606,10 @@ export class AttachContextAction extends Action2 {
597606
if (selected === goBackItem) {
598607
defer.complete(false);
599608
}
609+
if (selected === configureItem) {
610+
defer.complete(true);
611+
commandService.executeCommand(configureItem.commandId);
612+
}
600613
if (!e.inBackground) {
601614
defer.complete(true);
602615
}

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,25 @@ export interface IChatContextValueItem extends IChatContextItem {
4343

4444
export type ChatContextPick = IChatContextPickerPickItem | IQuickPickSeparator;
4545

46+
export interface IChatContextPicker {
47+
readonly placeholder: string;
48+
/**
49+
* Picks that should either be:
50+
* - A promise that resolves to the picked items
51+
* - A function that maps input query into items to display.
52+
*/
53+
readonly picks: Promise<ChatContextPick[]> | ((query: IObservable<string>, token: CancellationToken) => IObservable<{ busy: boolean; picks: ChatContextPick[] }>);
54+
55+
readonly configure?: {
56+
label: string;
57+
commandId: string;
58+
};
59+
}
60+
4661
export interface IChatContextPickerItem extends IChatContextItem {
4762
readonly type: 'pickerPick';
4863

49-
asPicker(widget: IChatWidget): {
50-
readonly placeholder: string;
51-
/**
52-
* Picks that should either be:
53-
* - A promise that resolves to the picked items
54-
* - A function that maps input query into items to display.
55-
*/
56-
readonly picks: Promise<ChatContextPick[]> | ((query: IObservable<string>, token: CancellationToken) => IObservable<{ busy: boolean; picks: ChatContextPick[] }>);
57-
};
64+
asPicker(widget: IChatWidget): IChatContextPicker;
5865
}
5966

6067
/**

src/vs/workbench/contrib/chat/browser/promptSyntax/attachInstructionsAction.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { ServicesAccessor } from '../../../../../editor/browser/editorExtensions
1616
import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';
1717
import { Action2, MenuId, registerAction2 } from '../../../../../platform/actions/common/actions.js';
1818
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
19-
import { ChatContextPick, IChatContextPickerItem, IChatContextPickerPickItem } from '../chatContextPickService.js';
19+
import { IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPicker } from '../chatContextPickService.js';
2020
import { IQuickPickSeparator } from '../../../../../platform/quickinput/common/quickInput.js';
2121
import { Codicon } from '../../../../../base/common/codicons.js';
2222
import { getCleanPromptName } from '../../common/promptSyntax/config/promptFileLocations.js';
@@ -233,7 +233,7 @@ export class ChatInstructionsPickerPick implements IChatContextPickerItem {
233233
return PromptsConfig.enabled(this.configurationService);
234234
}
235235

236-
asPicker(): { readonly placeholder: string; readonly picks: Promise<ChatContextPick[]> } {
236+
asPicker(): IChatContextPicker {
237237

238238
const picks = this.promptsService.listPromptFiles(PromptsType.instructions, CancellationToken.None).then(value => {
239239

@@ -267,8 +267,13 @@ export class ChatInstructionsPickerPick implements IChatContextPickerItem {
267267

268268
return {
269269
placeholder: localize('placeholder', 'Select instructions files to attach'),
270-
picks
270+
picks,
271+
configure: {
272+
label: localize('configureInstructions', 'Configure Instructions...'),
273+
commandId: CONFIGURE_INSTRUCTIONS_ACTION_ID
274+
}
271275
};
272276
}
273277

278+
274279
}

src/vs/workbench/contrib/markers/browser/markersChatContext.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { ILabelService } from '../../../../platform/label/common/label.js';
1414
import { IMarkerService, MarkerSeverity } from '../../../../platform/markers/common/markers.js';
1515
import { IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js';
1616
import { IWorkbenchContribution } from '../../../common/contributions.js';
17-
import { IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPickService } from '../../chat/browser/chatContextPickService.js';
17+
import { IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPickService, IChatContextPicker } from '../../chat/browser/chatContextPickService.js';
1818
import { IDiagnosticVariableEntryFilterData } from '../../chat/common/chatVariableEntries.js';
1919

2020
class MarkerChatContextPick implements IChatContextPickerItem {
@@ -29,7 +29,7 @@ class MarkerChatContextPick implements IChatContextPickerItem {
2929
@ILabelService private readonly _labelService: ILabelService,
3030
) { }
3131

32-
asPicker(): { readonly placeholder: string; readonly picks: Promise<(IChatContextPickerPickItem | IQuickPickSeparator)[]> } {
32+
asPicker(): IChatContextPicker {
3333

3434
const markers = this._markerService.read({ severities: MarkerSeverity.Error | MarkerSeverity.Warning | MarkerSeverity.Info });
3535
const grouped = groupBy(markers, (a, b) => extUri.compare(a.resource, b.resource));

src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { localize } from '../../../../../../nls.js';
1717
import { Action2, MenuId, registerAction2 } from '../../../../../../platform/actions/common/actions.js';
1818
import { ContextKeyExpr, IContextKey, IContextKeyService } from '../../../../../../platform/contextkey/common/contextkey.js';
1919
import { ServicesAccessor } from '../../../../../../platform/instantiation/common/instantiation.js';
20-
import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from '../../../../../../platform/quickinput/common/quickInput.js';
20+
import { IQuickInputService, IQuickPickItem } from '../../../../../../platform/quickinput/common/quickInput.js';
2121
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../../common/contributions.js';
2222
import { IEditorService } from '../../../../../services/editor/common/editorService.js';
2323
import { IChatWidget, IChatWidgetService, showChatView } from '../../../../chat/browser/chat.js';
@@ -37,7 +37,7 @@ import './cellChatActions.js';
3737
import { CTX_NOTEBOOK_CHAT_HAS_AGENT } from './notebookChatContext.js';
3838
import { IViewsService } from '../../../../../services/views/common/viewsService.js';
3939
import { createNotebookOutputVariableEntry, NOTEBOOK_CELL_OUTPUT_MIME_TYPE_LIST_FOR_CHAT_CONST } from '../../contrib/chat/notebookChatUtils.js';
40-
import { IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPickService } from '../../../../chat/browser/chatContextPickService.js';
40+
import { IChatContextPickerItem, IChatContextPickerPickItem, IChatContextPickService, IChatContextPicker } from '../../../../chat/browser/chatContextPickService.js';
4141
import { Codicon } from '../../../../../../base/common/codicons.js';
4242

4343
const NotebookKernelVariableKey = 'kernelVariable';
@@ -260,7 +260,7 @@ class KernelVariableContextPicker implements IChatContextPickerItem {
260260
return widget.location === ChatAgentLocation.Notebook && Boolean(getNotebookEditorFromEditorPane(this.editorService.activeEditorPane)?.getViewModel()?.notebookDocument);
261261
}
262262

263-
asPicker(): { readonly placeholder: string; readonly picks: Promise<(IChatContextPickerPickItem | IQuickPickSeparator)[]> } {
263+
asPicker(): IChatContextPicker {
264264

265265
const picks = (async () => {
266266

0 commit comments

Comments
 (0)