Skip to content

Commit e569089

Browse files
committed
Make link tooltips more user friendly
Part of #260573
1 parent ef9b170 commit e569089

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ConfigurationTarget, IConfigurationService, type IConfigurationValue }
1212
import { TerminalChatAgentToolsSettingId } from '../common/terminalChatAgentToolsConfiguration.js';
1313
import { isPowerShell } from './runInTerminalHelpers.js';
1414

15-
interface IAutoApproveRule {
15+
export interface IAutoApproveRule {
1616
regex: RegExp;
1717
regexCaseInsensitive: RegExp;
1818
sourceText: string;

src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import type { XtermTerminal } from '../../../../terminal/browser/xterm/xtermTerm
2828
import { ITerminalProfileResolverService } from '../../../../terminal/common/terminal.js';
2929
import { getRecommendedToolsOverRunInTerminal } from '../alternativeRecommendation.js';
3030
import { getOutput } from '../bufferOutputPolling.js';
31-
import { CommandLineAutoApprover, type ICommandApprovalResultWithReason } from '../commandLineAutoApprover.js';
31+
import { CommandLineAutoApprover, type IAutoApproveRule, type ICommandApprovalResult, type ICommandApprovalResultWithReason } from '../commandLineAutoApprover.js';
3232
import { BasicExecuteStrategy } from '../executeStrategy/basicExecuteStrategy.js';
3333
import type { ITerminalExecuteStrategy } from '../executeStrategy/executeStrategy.js';
3434
import { NoneExecuteStrategy } from '../executeStrategy/noneExecuteStrategy.js';
@@ -39,6 +39,8 @@ import { ShellIntegrationQuality, ToolTerminalCreator, type IToolTerminal } from
3939
import { Codicon } from '../../../../../../base/common/codicons.js';
4040
import { OutputMonitor } from '../outputMonitor.js';
4141
import type { TerminalNewAutoApproveButtonData } from '../../../../chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolSubPart.js';
42+
import type { SingleOrMany } from '../../../../../../base/common/types.js';
43+
import { asArray } from '../../../../../../base/common/arrays.js';
4244

4345
const TERMINAL_SESSION_STORAGE_KEY = 'chat.terminalSessions';
4446

@@ -253,19 +255,24 @@ export class RunInTerminalTool extends Disposable implements IToolImpl {
253255
}
254256
}
255257

258+
function formatRuleLinks(result: SingleOrMany<{ result: ICommandApprovalResult; rule?: IAutoApproveRule; reason: string }>): string {
259+
return asArray(result).map(e => {
260+
return `[\`${e.rule!.sourceText}\`](settings_${e.rule!.sourceTarget} "${localize('ruleTooltip', 'View rule in settings')}")`;
261+
}).join(', ');
262+
}
256263
if (isAutoApproved) {
257264
switch (autoApproveReason) {
258265
case 'commandLine': {
259266
if (commandLineResult.rule) {
260-
autoApproveInfo = new MarkdownString(`_${localize('autoApprove.rule', 'Auto approved by rule {0}', `[\`${commandLineResult.rule.sourceText}\`](settings_${commandLineResult.rule.sourceTarget})`)}_`);
267+
autoApproveInfo = new MarkdownString(`_${localize('autoApprove.rule', 'Auto approved by rule {0}', formatRuleLinks(commandLineResult))}_`);
261268
}
262269
break;
263270
}
264271
case 'subCommand': {
265272
if (subCommandResults.length === 1) {
266-
autoApproveInfo = new MarkdownString(`_${localize('autoApprove.rule', 'Auto approved by rule {0}', subCommandResults.map(e => `[\`${e.rule!.sourceText}\`](settings_${e.rule!.sourceTarget})`).join(', '))}_`);
273+
autoApproveInfo = new MarkdownString(`_${localize('autoApprove.rule', 'Auto approved by rule {0}', formatRuleLinks(subCommandResults))}_`);
267274
} else if (subCommandResults.length > 1) {
268-
autoApproveInfo = new MarkdownString(`_${localize('autoApprove.rules', 'Auto approved by rules {0}', subCommandResults.map(e => `[\`${e.rule!.sourceText}\`](settings_${e.rule!.sourceTarget})`).join(', '))}_`);
275+
autoApproveInfo = new MarkdownString(`_${localize('autoApprove.rules', 'Auto approved by rules {0}', formatRuleLinks(subCommandResults))}_`);
269276
}
270277
break;
271278
}
@@ -274,16 +281,16 @@ export class RunInTerminalTool extends Disposable implements IToolImpl {
274281
switch (autoApproveReason) {
275282
case 'commandLine': {
276283
if (commandLineResult.rule) {
277-
autoApproveInfo = new MarkdownString(`_${localize('autoApproveDenied.rule', 'Auto approval denied by rule {0}', `[\`${commandLineResult.rule.sourceText}\`](settings_${commandLineResult.rule.sourceTarget})`)}_`);
284+
autoApproveInfo = new MarkdownString(`_${localize('autoApproveDenied.rule', 'Auto approval denied by rule {0}', formatRuleLinks(commandLineResult))}_`);
278285
}
279286
break;
280287
}
281288
case 'subCommand': {
282289
const deniedRules = subCommandResults.filter(e => e.result === 'denied');
283290
if (deniedRules.length === 1) {
284-
autoApproveInfo = new MarkdownString(`_${localize('autoApproveDenied.rule', 'Auto approval denied by rule {0}', deniedRules.map(e => `[\`${e.rule!.sourceText}\`](settings_${e.rule!.sourceTarget})`).join(', '))}_`);
291+
autoApproveInfo = new MarkdownString(`_${localize('autoApproveDenied.rule', 'Auto approval denied by rule {0}', formatRuleLinks(deniedRules))}_`);
285292
} else if (deniedRules.length > 1) {
286-
autoApproveInfo = new MarkdownString(`_${localize('autoApproveDenied.rules', 'Auto approval denied by rules {0}', deniedRules.map(e => `[\`${e.rule!.sourceText}\`](settings_${e.rule!.sourceTarget})`).join(', '))}_`);
293+
autoApproveInfo = new MarkdownString(`_${localize('autoApproveDenied.rules', 'Auto approval denied by rules {0}', formatRuleLinks(deniedRules))}_`);
287294
}
288295
break;
289296
}

0 commit comments

Comments
 (0)