Path: blob/main/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts
3296 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 { alert } from '../../../../../base/browser/ui/aria/aria.js';6import { localize } from '../../../../../nls.js';7import { Action2, registerAction2 } from '../../../../../platform/actions/common/actions.js';8import { ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';9import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';10import { KeyCode, KeyMod } from '../../../../../base/common/keyCodes.js';11import { IChatWidgetService } from '../chat.js';12import { ChatContextKeys } from '../../common/chatContextKeys.js';13import { isResponseVM } from '../../common/chatViewModel.js';14import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../../../../../platform/accessibility/common/accessibility.js';1516export const ACTION_ID_FOCUS_CHAT_CONFIRMATION = 'workbench.action.chat.focusConfirmation';1718class AnnounceChatConfirmationAction extends Action2 {19constructor() {20super({21id: ACTION_ID_FOCUS_CHAT_CONFIRMATION,22title: { value: localize('focusChatConfirmation', 'Focus Chat Confirmation'), original: 'Focus Chat Confirmation' },23category: { value: localize('chat.category', 'Chat'), original: 'Chat' },24precondition: ChatContextKeys.enabled,25f1: true,26keybinding: {27weight: KeybindingWeight.WorkbenchContrib,28primary: KeyMod.CtrlCmd | KeyCode.KeyA | KeyMod.Shift,29when: CONTEXT_ACCESSIBILITY_MODE_ENABLED30}31});32}3334async run(accessor: ServicesAccessor): Promise<void> {35const chatWidgetService = accessor.get(IChatWidgetService);36const lastFocusedWidget = chatWidgetService.lastFocusedWidget;3738if (!lastFocusedWidget) {39alert(localize('noChatSession', 'No active chat session found.'));40return;41}4243const viewModel = lastFocusedWidget.viewModel;44if (!viewModel) {45alert(localize('chatNotReady', 'Chat interface not ready.'));46return;47}4849// Check for active confirmations in the chat responses50let firstConfirmationElement: HTMLElement | undefined;5152const lastResponse = viewModel.getItems()[viewModel.getItems().length - 1];53if (isResponseVM(lastResponse)) {54const confirmationWidgets = lastFocusedWidget.domNode.querySelectorAll('.chat-confirmation-widget-container');55if (confirmationWidgets.length > 0) {56firstConfirmationElement = confirmationWidgets[0] as HTMLElement;57}58}5960if (firstConfirmationElement) {61firstConfirmationElement.focus();62} else {63alert(localize('noConfirmationRequired', 'No chat confirmation required'));64}65}66}6768export function registerChatAccessibilityActions(): void {69registerAction2(AnnounceChatConfirmationAction);70}717273