1- import type { PermissionDecision , PermissionRule , PermissionsConfig , PromptUserFn } from "../core/types.js" ;
1+ import type { PermissionDecision , PermissionRule , PermissionRuleConfig , PermissionsConfig , PromptUserFn } from "../core/types.js" ;
2+ import { loadUserSettings , saveUserSettings } from "../core/config.js" ;
23import { DEFAULT_RULES } from "./rules.js" ;
34
45function globToRegex ( pattern : string ) : RegExp {
@@ -70,12 +71,23 @@ export class PermissionManager {
7071 case "ask" : {
7172 this . onBeforePrompt ?.( ) ;
7273 const preview = this . formatPreview ( toolName , context . args ) ;
73- const result = await this . promptUser ( toolName , preview ) ;
74+ const result = await this . promptUser ( toolName , preview , context . args ) ;
75+ if ( result . persistRule ) {
76+ this . persistRule ( result . persistRule ) ;
77+ this . rules . push ( {
78+ tool : result . persistRule . tool ,
79+ argPattern : result . persistRule . argPattern ? new RegExp ( result . persistRule . argPattern ) : undefined ,
80+ decision : result . persistRule . decision ,
81+ reason : result . persistRule . reason ,
82+ priority : result . persistRule . priority ?? 5 ,
83+ } ) ;
84+ this . rules . sort ( ( a , b ) => b . priority - a . priority ) ;
85+ }
7486 if ( result . rememberForSession ) {
7587 this . sessionGrants . add ( toolName ) ;
7688 }
7789 if ( result . decision === "deny" ) {
78- return { block : true , reason : "Denied by user" } ;
90+ return { block : true , reason : result . denyReason ?? "Denied by user" } ;
7991 }
8092 return undefined ;
8193 }
@@ -94,6 +106,20 @@ export class PermissionManager {
94106 return Array . from ( this . sessionGrants ) ;
95107 }
96108
109+ private persistRule ( rule : PermissionRuleConfig ) : void {
110+ const settings = loadUserSettings ( ) ;
111+ const permissions = ( ( settings . permissions as Record < string , unknown > | undefined ) ?? { } ) ;
112+ const rules = Array . isArray ( permissions . rules ) ? [ ...permissions . rules ] : [ ] ;
113+ rules . push ( rule ) ;
114+ saveUserSettings ( {
115+ ...settings ,
116+ permissions : {
117+ ...permissions ,
118+ rules,
119+ } ,
120+ } ) ;
121+ }
122+
97123 private evaluate ( toolName : string , argsStr : string ) : { decision : PermissionDecision ; reason ?: string } {
98124 for ( const rule of this . rules ) {
99125 if ( rule . tool !== "*" && rule . tool !== toolName ) continue ;
0 commit comments