@@ -28,7 +28,7 @@ import type { XtermTerminal } from '../../../../terminal/browser/xterm/xtermTerm
28
28
import { ITerminalProfileResolverService } from '../../../../terminal/common/terminal.js' ;
29
29
import { getRecommendedToolsOverRunInTerminal } from '../alternativeRecommendation.js' ;
30
30
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' ;
32
32
import { BasicExecuteStrategy } from '../executeStrategy/basicExecuteStrategy.js' ;
33
33
import type { ITerminalExecuteStrategy } from '../executeStrategy/executeStrategy.js' ;
34
34
import { NoneExecuteStrategy } from '../executeStrategy/noneExecuteStrategy.js' ;
@@ -39,6 +39,8 @@ import { ShellIntegrationQuality, ToolTerminalCreator, type IToolTerminal } from
39
39
import { Codicon } from '../../../../../../base/common/codicons.js' ;
40
40
import { OutputMonitor } from '../outputMonitor.js' ;
41
41
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' ;
42
44
43
45
const TERMINAL_SESSION_STORAGE_KEY = 'chat.terminalSessions' ;
44
46
@@ -253,20 +255,25 @@ export class RunInTerminalTool extends Disposable implements IToolImpl {
253
255
}
254
256
}
255
257
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
+ }
256
263
if ( isAutoApproved ) {
257
264
switch ( autoApproveReason ) {
258
265
case 'commandLine' : {
259
266
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 ) ) } _` ) ;
261
268
}
262
269
break ;
263
270
}
264
271
case 'subCommand' : {
265
- const uniqueRules = Array . from ( new Set ( subCommandResults . map ( e => `[\` ${ e . rule ! . sourceText } \`](settings_ ${ e . rule ! . sourceTarget } )` ) ) ) ;
272
+ const uniqueRules = Array . from ( new Set ( subCommandResults ) ) ;
266
273
if ( uniqueRules . length === 1 ) {
267
- autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApprove.rule' , 'Auto approved by rule {0}' , uniqueRules [ 0 ] ) } _` ) ;
274
+ autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApprove.rule' , 'Auto approved by rule {0}' , formatRuleLinks ( uniqueRules ) ) } _` ) ;
268
275
} else if ( uniqueRules . length > 1 ) {
269
- autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApprove.rules' , 'Auto approved by rules {0}' , uniqueRules . join ( ', ' ) ) } _` ) ;
276
+ autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApprove.rules' , 'Auto approved by rules {0}' , formatRuleLinks ( uniqueRules ) ) } _` ) ;
270
277
}
271
278
break ;
272
279
}
@@ -275,24 +282,24 @@ export class RunInTerminalTool extends Disposable implements IToolImpl {
275
282
switch ( autoApproveReason ) {
276
283
case 'commandLine' : {
277
284
if ( commandLineResult . rule ) {
278
- autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApproveDenied.rule' , 'Auto approval denied by rule {0}' , `[\` ${ commandLineResult . rule . sourceText } \`](settings_ ${ commandLineResult . rule . sourceTarget } )` ) } _` ) ;
285
+ autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApproveDenied.rule' , 'Auto approval denied by rule {0}' , formatRuleLinks ( commandLineResult ) ) } _` ) ;
279
286
}
280
287
break ;
281
288
}
282
289
case 'subCommand' : {
283
290
const deniedRules = subCommandResults . filter ( e => e . result === 'denied' ) ;
284
- const uniqueRules = Array . from ( new Set ( deniedRules . map ( e => `[\` ${ e . rule ! . sourceText } \`](settings_ ${ e . rule ! . sourceTarget } )` ) ) ) ;
291
+ const uniqueRules = Array . from ( new Set ( deniedRules ) ) ;
285
292
if ( uniqueRules . length === 1 ) {
286
- autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApproveDenied.rule' , 'Auto approval denied by rule {0}' , uniqueRules [ 0 ] ) } _` ) ;
293
+ autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApproveDenied.rule' , 'Auto approval denied by rule {0}' , formatRuleLinks ( uniqueRules ) ) } _` ) ;
287
294
} else if ( uniqueRules . length > 1 ) {
288
- autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApproveDenied.rules' , 'Auto approval denied by rules {0}' , uniqueRules . join ( ', ' ) ) } _` ) ;
295
+ autoApproveInfo = new MarkdownString ( `_${ localize ( 'autoApproveDenied.rules' , 'Auto approval denied by rules {0}' , formatRuleLinks ( uniqueRules ) ) } _` ) ;
289
296
}
290
297
break ;
291
298
}
292
299
}
293
300
}
294
301
295
- // TODO: Surface reason on tool part https://github.com/microsoft/vscode/issues/256780
302
+ // Log detailed auto approval reasoning
296
303
for ( const reason of autoApproveReasons ) {
297
304
this . _logService . info ( `- ${ reason } ` ) ;
298
305
}
0 commit comments