@@ -50,6 +50,7 @@ type permissionService struct {
50 autoApproveSessions []string
50 autoApproveSessions []string
51 autoApproveSessionsMu sync.RWMutex
51 autoApproveSessionsMu sync.RWMutex
53+ allowedTools []string
55func (s *permissionService) GrantPersistent(permission PermissionRequest) {
56func (s *permissionService) GrantPersistent(permission PermissionRequest) {
@@ -82,6 +83,12 @@ func (s *permissionService) Request(opts CreatePermissionRequest) bool {
82 return true
83 return true
86+ // Check if the tool/action combination is in the allowlist
87+ commandKey := opts.ToolName + ":" + opts.Action
88+ if slices.Contains(s.allowedTools, commandKey) || slices.Contains(s.allowedTools, opts.ToolName) {
85 s.autoApproveSessionsMu.RLock()
92 s.autoApproveSessionsMu.RLock()
86 autoApprove := slices.Contains(s.autoApproveSessions, opts.SessionID)
93 autoApprove := slices.Contains(s.autoApproveSessions, opts.SessionID)
87 s.autoApproveSessionsMu.RUnlock()
94 s.autoApproveSessionsMu.RUnlock()
@@ -130,11 +137,12 @@ func (s *permissionService) AutoApproveSession(sessionID string) {
130 s.autoApproveSessionsMu.Unlock()
137 s.autoApproveSessionsMu.Unlock()
133−func NewPermissionService(workingDir string, skip bool) Service {
140+func NewPermissionService(workingDir string, skip bool, allowedTools []string) Service {
134 return &permissionService{
141 return &permissionService{
135 Broker: pubsub.NewBroker[PermissionRequest](),
142 Broker: pubsub.NewBroker[PermissionRequest](),
136 workingDir: workingDir,
143 workingDir: workingDir,
137 sessionPermissions: make([]PermissionRequest, 0),
144 sessionPermissions: make([]PermissionRequest, 0),
138 skip: skip,
145 skip: skip,
146+ allowedTools: allowedTools,