Skip to content

Commit 3f91d1f

Browse files
committed
Add auto_approve_all_tools config
1 parent 4d50dc2 commit 3f91d1f

6 files changed

Lines changed: 145 additions & 16 deletions

File tree

‎NanoAgent.Tests/Application/Permissions/ToolPermissionEvaluatorTests.cs‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,60 @@ public void Evaluate_Should_DenyEscalatedSandboxRequest_When_JustificationIsMiss
962962
result.ReasonCode.Should().Be("sandbox_justification_required");
963963
}
964964

965+
[Fact]
966+
public void Evaluate_Should_AllowPromptedTools_When_AutoApproveAllToolsIsEnabled()
967+
{
968+
ToolPermissionEvaluator sut = new(
969+
new StubWorkspaceRootProvider(_workspaceRoot),
970+
ApplicationSettingsFactory.CreatePermissionSettings(new ApplicationOptions
971+
{
972+
Permissions = new PermissionSettings
973+
{
974+
AutoApproveAllTools = true
975+
}
976+
}));
977+
978+
PermissionEvaluationResult result = sut.Evaluate(
979+
new ToolPermissionPolicy
980+
{
981+
ApprovalMode = ToolApprovalMode.RequireApproval,
982+
ToolTags = ["custom"]
983+
},
984+
new PermissionEvaluationContext(CreateContext("{}", toolName: "custom__status")));
985+
986+
result.IsAllowed.Should().BeTrue();
987+
result.EffectiveMode.Should().Be(PermissionMode.Allow);
988+
}
989+
990+
[Fact]
991+
public void Evaluate_Should_PreserveBuiltInDenyRules_When_AutoApproveAllToolsIsEnabled()
992+
{
993+
ToolPermissionEvaluator sut = new(
994+
new StubWorkspaceRootProvider(_workspaceRoot),
995+
ApplicationSettingsFactory.CreatePermissionSettings(new ApplicationOptions
996+
{
997+
Permissions = new PermissionSettings
998+
{
999+
AutoApproveAllTools = true
1000+
}
1001+
}));
1002+
1003+
PermissionEvaluationResult result = sut.Evaluate(
1004+
new ToolPermissionPolicy
1005+
{
1006+
ToolTags = ["bash"],
1007+
Shell = new ShellCommandPermissionPolicy
1008+
{
1009+
CommandArgumentName = "command",
1010+
AllowedCommands = ["rm"]
1011+
}
1012+
},
1013+
new PermissionEvaluationContext(CreateContext("""{ "command": "rm -rf ." }""", toolName: AgentToolNames.ShellCommand)));
1014+
1015+
result.Decision.Should().Be(PermissionEvaluationDecision.Denied);
1016+
result.ReasonCode.Should().Be("permission_policy_denied");
1017+
}
1018+
9651019
public void Dispose()
9661020
{
9671021
if (Directory.Exists(_workspaceRoot))

‎NanoAgent.Tests/Infrastructure/Configuration/ApplicationSettingsFactoryTests.cs‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public void PermissionShortcuts_Should_BindFromSnakeCaseConfigurationKeys()
1414
IConfigurationRoot configuration = new ConfigurationBuilder()
1515
.AddInMemoryCollection(new Dictionary<string, string?>
1616
{
17+
["Application:Permissions:auto_approve_all_tools"] = "true",
1718
["Application:Permissions:file_read"] = "Allow",
1819
["Application:Permissions:file_write"] = "Ask",
1920
["Application:Permissions:file_delete"] = "Ask",
@@ -30,6 +31,7 @@ public void PermissionShortcuts_Should_BindFromSnakeCaseConfigurationKeys()
3031
ApplicationOptions options = new();
3132
configuration.GetSection(ApplicationOptions.SectionName).Bind(options);
3233

34+
options.Permissions.AutoApproveAllTools.Should().BeTrue();
3335
options.Permissions.FileRead.Should().Be(PermissionMode.Allow);
3436
options.Permissions.FileWrite.Should().Be(PermissionMode.Ask);
3537
options.Permissions.FileDelete.Should().Be(PermissionMode.Ask);
@@ -109,4 +111,37 @@ public void CreatePermissionSettings_Should_CompileShortcutSettingsIntoRules()
109111
rule.Tools.SequenceEqual(new[] { "bash" }) &&
110112
rule.Patterns.SequenceEqual(new[] { "curl*|*sh*" })).Should().BeTrue();
111113
}
114+
115+
[Fact]
116+
public void CreatePermissionSettings_Should_AddBroadAllowRule_When_AutoApproveAllToolsIsEnabled()
117+
{
118+
PermissionSettings settings = ApplicationSettingsFactory.CreatePermissionSettings(new ApplicationOptions
119+
{
120+
Permissions = new PermissionSettings
121+
{
122+
AutoApproveAllTools = true
123+
}
124+
});
125+
126+
settings.AutoApproveAllTools.Should().BeTrue();
127+
settings.DefaultMode.Should().Be(PermissionMode.Allow);
128+
settings.Rules.Should().Contain(rule =>
129+
rule.Mode == PermissionMode.Allow &&
130+
rule.Tools.Length == 0 &&
131+
rule.Patterns.Length == 0);
132+
133+
int broadAllowIndex = Array.FindIndex(
134+
settings.Rules,
135+
rule => rule.Mode == PermissionMode.Allow &&
136+
rule.Tools.Length == 0 &&
137+
rule.Patterns.Length == 0);
138+
int deniedShellIndex = Array.FindIndex(
139+
settings.Rules,
140+
rule => rule.Mode == PermissionMode.Deny &&
141+
rule.Tools.Contains("bash", StringComparer.OrdinalIgnoreCase) &&
142+
rule.Patterns.Contains("rm -rf*", StringComparer.OrdinalIgnoreCase));
143+
144+
broadAllowIndex.Should().BeGreaterThanOrEqualTo(0);
145+
deniedShellIndex.Should().BeGreaterThan(broadAllowIndex);
146+
}
112147
}

‎NanoAgent/Application/Commands/ReplCommands/PermissionCommandSupport.cs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public static string BuildPermissionsSummary(
1818
return
1919
"Permissions:\n" +
2020
$"Default mode: {ToDisplayText(settings.DefaultMode)}\n" +
21+
$"Auto approve all tools: {(settings.AutoApproveAllTools ? "On" : "Off")}\n" +
2122
$"Sandbox mode: {ToDisplayText(settings.SandboxMode)}\n" +
2223
$"Built-in/configured rules: {configuredRuleCount}\n" +
2324
$"Session overrides: {sessionRuleCount}\n" +
@@ -43,6 +44,8 @@ public static string BuildRulesListing(
4344
builder.AppendLine("Effective permission rules:");
4445
builder.Append("Default mode: ");
4546
builder.AppendLine(ToDisplayText(settings.DefaultMode));
47+
builder.Append("Auto approve all tools: ");
48+
builder.AppendLine(settings.AutoApproveAllTools ? "On" : "Off");
4649
builder.Append("Sandbox mode: ");
4750
builder.AppendLine(ToDisplayText(settings.SandboxMode));
4851
builder.AppendLine();

‎NanoAgent/Application/Models/PermissionSettings.cs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ namespace NanoAgent.Application.Models;
44

55
public sealed class PermissionSettings
66
{
7+
[ConfigurationKeyName("auto_approve_all_tools")]
8+
public bool AutoApproveAllTools { get; set; }
9+
710
public PermissionMode DefaultMode { get; set; } = PermissionMode.Ask;
811

912
public PermissionRule[] Rules { get; set; } = [];

‎NanoAgent/Infrastructure/Configuration/ApplicationSettingsFactory.cs‎

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ internal static class ApplicationSettingsFactory
4545
"wget*|*sh*"
4646
];
4747

48-
private static readonly PermissionRule[] BuiltInPermissionRules = CreateBuiltInPermissionRules();
49-
5048
public static ConversationSettings CreateConversationSettings(ApplicationOptions options)
5149
{
5250
ArgumentNullException.ThrowIfNull(options);
@@ -86,7 +84,8 @@ public static PermissionSettings CreatePermissionSettings(ApplicationOptions opt
8684

8785
return new PermissionSettings
8886
{
89-
DefaultMode = configured.DefaultMode,
87+
AutoApproveAllTools = configured.AutoApproveAllTools,
88+
DefaultMode = configured.AutoApproveAllTools ? PermissionMode.Allow : configured.DefaultMode,
9089
FileDelete = configured.FileDelete,
9190
FileRead = configured.FileRead,
9291
FileWrite = configured.FileWrite,
@@ -97,16 +96,20 @@ public static PermissionSettings CreatePermissionSettings(ApplicationOptions opt
9796
Shell = configured.Shell ?? new ShellPermissionSettings(),
9897
ShellDefault = configured.ShellDefault,
9998
ShellSafe = configured.ShellSafe,
100-
Rules = BuiltInPermissionRules
99+
Rules = CreateBuiltInPermissionRules(configured.AutoApproveAllTools)
101100
.Concat(CreateShortcutPermissionRules(configured))
102101
.Concat(configuredRules)
103102
.Select(NormalizeRule)
104103
.ToArray()
105104
};
106105
}
107106

108-
private static PermissionRule[] CreateBuiltInPermissionRules()
107+
private static PermissionRule[] CreateBuiltInPermissionRules(bool autoApproveAllTools)
109108
{
109+
PermissionMode promptableMode = autoApproveAllTools
110+
? PermissionMode.Allow
111+
: PermissionMode.Ask;
112+
110113
return
111114
[
112115
new PermissionRule
@@ -117,7 +120,7 @@ private static PermissionRule[] CreateBuiltInPermissionRules()
117120
new PermissionRule
118121
{
119122
Tools = ["webfetch"],
120-
Mode = PermissionMode.Ask
123+
Mode = promptableMode
121124
},
122125
new PermissionRule
123126
{
@@ -127,55 +130,56 @@ private static PermissionRule[] CreateBuiltInPermissionRules()
127130
new PermissionRule
128131
{
129132
Tools = ["bash"],
130-
Mode = PermissionMode.Ask
133+
Mode = promptableMode
131134
},
132135
new PermissionRule
133136
{
134137
Tools = [AgentToolNames.FileWrite],
135-
Mode = PermissionMode.Ask
138+
Mode = promptableMode
136139
},
137140
new PermissionRule
138141
{
139142
Tools = [AgentToolNames.FileDelete],
140-
Mode = PermissionMode.Ask
143+
Mode = promptableMode
141144
},
142145
new PermissionRule
143146
{
144147
Tools = [AgentToolNames.ApplyPatch],
145-
Mode = PermissionMode.Ask
148+
Mode = promptableMode
146149
},
147150
new PermissionRule
148151
{
149152
Tools = ["edit"],
150-
Mode = PermissionMode.Ask
153+
Mode = promptableMode
151154
},
152155
new PermissionRule
153156
{
154157
Tools = ["agent"],
155-
Mode = PermissionMode.Ask
158+
Mode = promptableMode
156159
},
157160
new PermissionRule
158161
{
159162
Tools = ["task"],
160-
Mode = PermissionMode.Ask
163+
Mode = promptableMode
161164
},
162165
new PermissionRule
163166
{
164167
Tools = ["mcp"],
165-
Mode = PermissionMode.Ask
168+
Mode = promptableMode
166169
},
167170
new PermissionRule
168171
{
169172
Tools = ["external_directory"],
170-
Mode = PermissionMode.Ask
173+
Mode = promptableMode
171174
},
172175
new PermissionRule
173176
{
174177
Tools = ["sandbox"],
175-
Mode = PermissionMode.Ask,
178+
Mode = promptableMode,
176179
Patterns = [ShellCommandSandboxArguments.SandboxEscalationSubject]
177180
},
178181
.. CreateShellCommandRules(PermissionMode.Allow, BuiltInSafeShellCommandPatterns),
182+
.. CreateAutoApproveAllToolsRules(autoApproveAllTools),
179183
new PermissionRule
180184
{
181185
Tools = ["doom_loop"],
@@ -191,6 +195,19 @@ .. CreateShellCommandRules(PermissionMode.Deny, BuiltInDeniedShellCommandPattern
191195
];
192196
}
193197

198+
private static IEnumerable<PermissionRule> CreateAutoApproveAllToolsRules(bool autoApproveAllTools)
199+
{
200+
if (!autoApproveAllTools)
201+
{
202+
yield break;
203+
}
204+
205+
yield return new PermissionRule
206+
{
207+
Mode = PermissionMode.Allow
208+
};
209+
}
210+
194211
private static IEnumerable<PermissionRule> CreateShortcutPermissionRules(PermissionSettings configured)
195212
{
196213
ArgumentNullException.ThrowIfNull(configured);

‎docs/documentation.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ Overrides are session-scoped. For durable policy, edit configuration.
283283
{
284284
"Application": {
285285
"Permissions": {
286+
"auto_approve_all_tools": false,
286287
"file_read": "Allow",
287288
"file_write": "Ask",
288289
"file_delete": "Ask",
@@ -317,6 +318,22 @@ Overrides are session-scoped. For durable policy, edit configuration.
317318

318319
The `network` shortcut applies to built-in `webfetch` tools, including `web_run` and `headless_browser`. `headless_browser` renders pages through an installed Chromium-family browser such as Microsoft Edge, Google Chrome, or Chromium.
319320

321+
### Auto-Approve All Tools
322+
323+
For trusted workspaces, you can disable approval prompts for all tools:
324+
325+
```json
326+
{
327+
"Application": {
328+
"Permissions": {
329+
"auto_approve_all_tools": true
330+
}
331+
}
332+
}
333+
```
334+
335+
This keeps workspace path checks, profile restrictions, sandbox-mode restrictions, and built-in deny rules active. Use explicit `rules` or shortcut settings when you need to override a specific deny policy.
336+
320337
## Workspace Files
321338

322339
Run:

0 commit comments

Comments
 (0)