Path: blob/main/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.ts
4780 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IKeyMods, IQuickPickDidAcceptEvent, IQuickPickSeparator } from '../../../../../platform/quickinput/common/quickInput.js';6import { PickerQuickAccessProvider, IPickerQuickAccessItem, TriggerAction } from '../../../../../platform/quickinput/browser/pickerQuickAccess.js';7import { localize } from '../../../../../nls.js';8import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';9import { IMatch, matchesFuzzy } from '../../../../../base/common/filters.js';10import { ThemeIcon } from '../../../../../base/common/themables.js';11import { IAgentSessionsService } from './agentSessionsService.js';12import { AgentSessionsSorter, groupAgentSessions } from './agentSessionsViewer.js';13import { IAgentSession } from './agentSessionsModel.js';14import { openSession } from './agentSessionsOpener.js';15import { ICommandService } from '../../../../../platform/commands/common/commands.js';16import { AGENT_SESSION_DELETE_ACTION_ID, AGENT_SESSION_RENAME_ACTION_ID } from './agentSessions.js';17import { archiveButton, deleteButton, getSessionButtons, getSessionDescription, renameButton, unarchiveButton } from './agentSessionsPicker.js';1819export const AGENT_SESSIONS_QUICK_ACCESS_PREFIX = 'agent ';2021export class AgentSessionsQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {2223private readonly sorter = new AgentSessionsSorter();2425constructor(26@IAgentSessionsService private readonly agentSessionsService: IAgentSessionsService,27@IInstantiationService private readonly instantiationService: IInstantiationService,28@ICommandService private readonly commandService: ICommandService,29) {30super(AGENT_SESSIONS_QUICK_ACCESS_PREFIX, {31canAcceptInBackground: true,32noResultsPick: {33label: localize('noAgentSessionResults', "No matching agent sessions")34}35});36}3738protected async _getPicks(filter: string): Promise<(IQuickPickSeparator | IPickerQuickAccessItem)[]> {39const picks: Array<IPickerQuickAccessItem | IQuickPickSeparator> = [];4041const sessions = this.agentSessionsService.model.sessions.sort(this.sorter.compare.bind(this.sorter));42const groupedSessions = groupAgentSessions(sessions);4344for (const group of groupedSessions.values()) {45if (group.sessions.length > 0) {46picks.push({ type: 'separator', label: group.label });4748for (const session of group.sessions) {49const highlights = matchesFuzzy(filter, session.label, true);50if (highlights) {51picks.push(this.toPickItem(session, highlights));52}53}54}55}5657return picks;58}5960private toPickItem(session: IAgentSession, highlights: IMatch[]): IPickerQuickAccessItem {61const description = getSessionDescription(session);62const buttons = getSessionButtons(session);6364return {65label: session.label,66description,67highlights: { label: highlights },68iconClass: ThemeIcon.asClassName(session.icon),69buttons,70trigger: async (buttonIndex) => {71const button = buttons[buttonIndex];72switch (button) {73case renameButton:74await this.commandService.executeCommand(AGENT_SESSION_RENAME_ACTION_ID, session);75return TriggerAction.REFRESH_PICKER;76case deleteButton:77await this.commandService.executeCommand(AGENT_SESSION_DELETE_ACTION_ID, session);78return TriggerAction.REFRESH_PICKER;79case archiveButton:80case unarchiveButton: {81const newArchivedState = !session.isArchived();82session.setArchived(newArchivedState);83return TriggerAction.REFRESH_PICKER;84}85default:86return TriggerAction.NO_ACTION;87}88},89accept: (keyMods: IKeyMods, event: IQuickPickDidAcceptEvent) => {90this.instantiationService.invokeFunction(openSession, session, {91sideBySide: event.inBackground,92editorOptions: {93preserveFocus: event.inBackground,94pinned: event.inBackground95}96});97}98};99}100}101102103