Path: blob/main/src/vs/workbench/contrib/chat/browser/chatAccessibilityService.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, status } from '../../../../base/browser/ui/aria/aria.js';6import { Disposable, DisposableMap } from '../../../../base/common/lifecycle.js';7import { AccessibilitySignal, IAccessibilitySignalService } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';8import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';9import { AccessibilityProgressSignalScheduler } from '../../../../platform/accessibilitySignal/browser/progressAccessibilitySignalScheduler.js';10import { IChatAccessibilityService } from './chat.js';11import { IChatResponseViewModel } from '../common/chatViewModel.js';12import { renderAsPlaintext } from '../../../../base/browser/markdownRenderer.js';13import { MarkdownString } from '../../../../base/common/htmlContent.js';14import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';15import { AccessibilityVoiceSettingId } from '../../accessibility/browser/accessibilityConfiguration.js';16import { IChatElicitationRequest } from '../common/chatService.js';1718const CHAT_RESPONSE_PENDING_ALLOWANCE_MS = 4000;19export class ChatAccessibilityService extends Disposable implements IChatAccessibilityService {2021declare readonly _serviceBrand: undefined;2223private _pendingSignalMap: DisposableMap<number, AccessibilityProgressSignalScheduler> = this._register(new DisposableMap());2425private _requestId: number = 0;2627constructor(28@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService,29@IInstantiationService private readonly _instantiationService: IInstantiationService,30@IConfigurationService private readonly _configurationService: IConfigurationService31) {32super();33}34acceptRequest(): number {35this._requestId++;36this._accessibilitySignalService.playSignal(AccessibilitySignal.chatRequestSent, { allowManyInParallel: true });37this._pendingSignalMap.set(this._requestId, this._instantiationService.createInstance(AccessibilityProgressSignalScheduler, CHAT_RESPONSE_PENDING_ALLOWANCE_MS, undefined));38return this._requestId;39}40acceptResponse(response: IChatResponseViewModel | string | undefined, requestId: number, isVoiceInput?: boolean): void {41this._pendingSignalMap.deleteAndDispose(requestId);42const isPanelChat = typeof response !== 'string';43const responseContent = typeof response === 'string' ? response : response?.response.toString();44this._accessibilitySignalService.playSignal(AccessibilitySignal.chatResponseReceived, { allowManyInParallel: true });45if (!response) {46return;47}48const errorDetails = isPanelChat && response.errorDetails ? ` ${response.errorDetails.message}` : '';49const plainTextResponse = renderAsPlaintext(new MarkdownString(responseContent));50if (!isVoiceInput || this._configurationService.getValue(AccessibilityVoiceSettingId.AutoSynthesize) !== 'on') {51status(plainTextResponse + errorDetails);52}53}54acceptElicitation(elicitation: IChatElicitationRequest): void {55const title = typeof elicitation.title === 'string' ? elicitation.title : elicitation.title.value;56const message = typeof elicitation.message === 'string' ? elicitation.message : elicitation.message.value;57alert(title + ' ' + message);58this._accessibilitySignalService.playSignal(AccessibilitySignal.chatUserActionRequired, { allowManyInParallel: true });59}60}616263