Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/chatAccessibilityService.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { alert, status } from '../../../../base/browser/ui/aria/aria.js';
7
import { Disposable, DisposableMap } from '../../../../base/common/lifecycle.js';
8
import { AccessibilitySignal, IAccessibilitySignalService } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';
9
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
10
import { AccessibilityProgressSignalScheduler } from '../../../../platform/accessibilitySignal/browser/progressAccessibilitySignalScheduler.js';
11
import { IChatAccessibilityService } from './chat.js';
12
import { IChatResponseViewModel } from '../common/chatViewModel.js';
13
import { renderAsPlaintext } from '../../../../base/browser/markdownRenderer.js';
14
import { MarkdownString } from '../../../../base/common/htmlContent.js';
15
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
16
import { AccessibilityVoiceSettingId } from '../../accessibility/browser/accessibilityConfiguration.js';
17
import { IChatElicitationRequest } from '../common/chatService.js';
18
19
const CHAT_RESPONSE_PENDING_ALLOWANCE_MS = 4000;
20
export class ChatAccessibilityService extends Disposable implements IChatAccessibilityService {
21
22
declare readonly _serviceBrand: undefined;
23
24
private _pendingSignalMap: DisposableMap<number, AccessibilityProgressSignalScheduler> = this._register(new DisposableMap());
25
26
private _requestId: number = 0;
27
28
constructor(
29
@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService,
30
@IInstantiationService private readonly _instantiationService: IInstantiationService,
31
@IConfigurationService private readonly _configurationService: IConfigurationService
32
) {
33
super();
34
}
35
acceptRequest(): number {
36
this._requestId++;
37
this._accessibilitySignalService.playSignal(AccessibilitySignal.chatRequestSent, { allowManyInParallel: true });
38
this._pendingSignalMap.set(this._requestId, this._instantiationService.createInstance(AccessibilityProgressSignalScheduler, CHAT_RESPONSE_PENDING_ALLOWANCE_MS, undefined));
39
return this._requestId;
40
}
41
acceptResponse(response: IChatResponseViewModel | string | undefined, requestId: number, isVoiceInput?: boolean): void {
42
this._pendingSignalMap.deleteAndDispose(requestId);
43
const isPanelChat = typeof response !== 'string';
44
const responseContent = typeof response === 'string' ? response : response?.response.toString();
45
this._accessibilitySignalService.playSignal(AccessibilitySignal.chatResponseReceived, { allowManyInParallel: true });
46
if (!response) {
47
return;
48
}
49
const errorDetails = isPanelChat && response.errorDetails ? ` ${response.errorDetails.message}` : '';
50
const plainTextResponse = renderAsPlaintext(new MarkdownString(responseContent));
51
if (!isVoiceInput || this._configurationService.getValue(AccessibilityVoiceSettingId.AutoSynthesize) !== 'on') {
52
status(plainTextResponse + errorDetails);
53
}
54
}
55
acceptElicitation(elicitation: IChatElicitationRequest): void {
56
const title = typeof elicitation.title === 'string' ? elicitation.title : elicitation.title.value;
57
const message = typeof elicitation.message === 'string' ? elicitation.message : elicitation.message.value;
58
alert(title + ' ' + message);
59
this._accessibilitySignalService.playSignal(AccessibilitySignal.chatUserActionRequired, { allowManyInParallel: true });
60
}
61
}
62
63