Skip to content

Commit 8c8e475

Browse files
Copilotmeganrogge
andcommitted
Add aria alert and aria labels for chat elicitation content
Co-authored-by: meganrogge <[email protected]>
1 parent 4270019 commit 8c8e475

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,35 @@ export class ChatAccessibilityProvider implements IListAccessibilityProvider<Cha
127127
fileTreeCountHint = localize('multiFileTreeHint', "{0} file trees ", fileTreeCount);
128128
break;
129129
}
130+
131+
const elicitationCount = element.response.value.filter(v => v.kind === 'elicitation').length ?? 0;
132+
let elicitationCountHint = '';
133+
switch (elicitationCount) {
134+
case 0:
135+
break;
136+
case 1:
137+
elicitationCountHint = localize('singleElicitationHint', "1 user input request ");
138+
break;
139+
default:
140+
elicitationCountHint = localize('multiElicitationHint', "{0} user input requests ", elicitationCount);
141+
break;
142+
}
130143
const codeBlockCount = marked.lexer(element.response.toString()).filter(token => token.type === 'code')?.length ?? 0;
131144
switch (codeBlockCount) {
132145
case 0:
133-
label = accessibleViewHint ? localize('noCodeBlocksHint', "{0}{1}{2}{3} {4}", toolInvocationHint, fileTreeCountHint, tableCountHint, element.response.toString(), accessibleViewHint) : localize('noCodeBlocks', "{0} {1}", fileTreeCountHint, element.response.toString());
146+
label = accessibleViewHint
147+
? localize('noCodeBlocksHint', "{0}{1}{2}{3}{4} {5}", toolInvocationHint, fileTreeCountHint, elicitationCountHint, tableCountHint, element.response.toString(), accessibleViewHint)
148+
: localize('noCodeBlocks', "{0}{1}{2} {3}", fileTreeCountHint, elicitationCountHint, tableCountHint, element.response.toString());
134149
break;
135150
case 1:
136-
label = accessibleViewHint ? localize('singleCodeBlockHint', "{0}{1}1 code block: {2} {3}{4}", toolInvocationHint, fileTreeCountHint, tableCountHint, element.response.toString(), accessibleViewHint) : localize('singleCodeBlock', "{0} 1 code block: {1}", fileTreeCountHint, element.response.toString());
151+
label = accessibleViewHint
152+
? localize('singleCodeBlockHint', "{0}{1}{2}1 code block: {3} {4}{5}", toolInvocationHint, fileTreeCountHint, elicitationCountHint, tableCountHint, element.response.toString(), accessibleViewHint)
153+
: localize('singleCodeBlock', "{0}{1}1 code block: {2} {3}", fileTreeCountHint, elicitationCountHint, tableCountHint, element.response.toString());
137154
break;
138155
default:
139-
label = accessibleViewHint ? localize('multiCodeBlockHint', "{0}{1}{2} code blocks: {3}{4}", toolInvocationHint, fileTreeCountHint, tableCountHint, codeBlockCount, element.response.toString(), accessibleViewHint) : localize('multiCodeBlock', "{0} {1} code blocks", fileTreeCountHint, codeBlockCount, element.response.toString());
156+
label = accessibleViewHint
157+
? localize('multiCodeBlockHint', "{0}{1}{2}{3} code blocks: {4}{5} {6}", toolInvocationHint, fileTreeCountHint, elicitationCountHint, tableCountHint, codeBlockCount, element.response.toString(), accessibleViewHint)
158+
: localize('multiCodeBlock', "{0}{1}{2} code blocks: {3} {4}", fileTreeCountHint, elicitationCountHint, codeBlockCount, tableCountHint, element.response.toString());
140159
break;
141160
}
142161
return label;

src/vs/workbench/contrib/mcp/browser/mcpElicitationService.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { DisposableStore } from '../../../../base/common/lifecycle.js';
1111
import { localize } from '../../../../nls.js';
1212
import { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';
1313
import { IQuickInputService, IQuickPick, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js';
14+
import { alert } from '../../../../base/browser/ui/aria/aria.js';
1415
import { ChatElicitationRequestPart } from '../../chat/browser/chatElicitationRequestPart.js';
1516
import { IChatAccessibilityService } from '../../chat/browser/chat.js';
1617
import { ChatModel } from '../../chat/common/chatModel.js';
@@ -63,6 +64,8 @@ export class McpElicitationService implements IMcpElicitationService {
6364
);
6465
chatModel.acceptResponseProgress(request, part);
6566
this._chatAccessibilityService.acceptElicitation();
67+
// Alert screen readers about the elicitation content
68+
alert(localize('mcp.elicit.alert', 'Request for input: {0}', elicitation.message));
6669
}
6770
} else {
6871
const handle = this._notificationService.notify({

0 commit comments

Comments
 (0)