From 8a03ab59628b52ba69327dd6837a8a67a5423e41 Mon Sep 17 00:00:00 2001 From: tauraamui Date: Fri, 5 Dec 2025 12:16:54 +0000 Subject: [PATCH] feat: combine default and user set banned list based on toggle --- internal/agent/common_test.go | 2 +- internal/agent/tools/bash.go | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/internal/agent/common_test.go b/internal/agent/common_test.go index 58264e2637f3a44e45d54a66c72ee3b8d6c642a3..f28c615697a59ce962bfdfaabadbf10c2f6f157c 100644 --- a/internal/agent/common_test.go +++ b/internal/agent/common_test.go @@ -190,7 +190,7 @@ func coderAgent(r *vcr.Recorder, env fakeEnv, large, small fantasy.LanguageModel } allTools := []fantasy.AgentTool{ - tools.NewBashTool(env.permissions, env.workingDir, cfg.Options.Attribution, modelName), + tools.NewBashTool(env.permissions, env.workingDir, cfg.Options.Attribution, modelName, cfg.Tools.Bash), tools.NewDownloadTool(env.permissions, env.workingDir, r.GetDefaultClient()), tools.NewEditTool(env.lspClients, env.permissions, env.history, env.workingDir), tools.NewMultiEditTool(env.lspClients, env.permissions, env.history, env.workingDir), diff --git a/internal/agent/tools/bash.go b/internal/agent/tools/bash.go index c3f0bc8cd24a6c4ff7c6f775e357c90b3dc99802..5a0d32c5a02ae174ed7e34cd1c96aac26cfdb92b 100644 --- a/internal/agent/tools/bash.go +++ b/internal/agent/tools/bash.go @@ -66,7 +66,7 @@ type bashDescriptionData struct { ModelName string } -var bannedCommands = []string{ +var defaultBannedCommands = []string{ // Network/Download tools "alias", "aria2c", @@ -140,7 +140,7 @@ var bannedCommands = []string{ } func bashDescription(attribution *config.Attribution, modelName string) string { - bannedCommandsStr := strings.Join(bannedCommands, ", ") + bannedCommandsStr := strings.Join(defaultBannedCommands, ", ") var out bytes.Buffer if err := bashDescriptionTpl.Execute(&out, bashDescriptionData{ BannedCommands: bannedCommandsStr, @@ -154,7 +154,7 @@ func bashDescription(attribution *config.Attribution, modelName string) string { return out.String() } -func blockFuncs() []shell.BlockFunc { +func blockFuncs(bannedCommands []string) []shell.BlockFunc { return []shell.BlockFunc{ shell.CommandsBlocker(bannedCommands), @@ -186,7 +186,23 @@ func blockFuncs() []shell.BlockFunc { } } -func NewBashTool(permissions permission.Service, workingDir string, attribution *config.Attribution, modelName string) fantasy.AgentTool { +func resolveBlockFuncs(cfg config.ToolBash) []shell.BlockFunc { + bannedCommands := cfg.BannedCommands + if !cfg.DisableDefaults { + if len(bannedCommands) == 0 { + return blockFuncs(defaultBannedCommands) + } + bannedCommands = append(bannedCommands, defaultBannedCommands...) + } + return blockFuncs(bannedCommands) +} + +func NewBashTool( + permissions permission.Service, + workingDir string, attribution *config.Attribution, + modelName string, + bashConfig config.ToolBash, +) fantasy.AgentTool { return fantasy.NewAgentTool( BashToolName, string(bashDescription(attribution, modelName)), @@ -237,7 +253,7 @@ func NewBashTool(permissions permission.Service, workingDir string, attribution bgManager := shell.GetBackgroundShellManager() bgManager.Cleanup() // Use background context so it continues after tool returns - bgShell, err := bgManager.Start(context.Background(), execWorkingDir, blockFuncs(), params.Command, params.Description) + bgShell, err := bgManager.Start(context.Background(), execWorkingDir, resolveBlockFuncs(bashConfig), params.Command, params.Description) if err != nil { return fantasy.ToolResponse{}, fmt.Errorf("error starting background shell: %w", err) } @@ -292,7 +308,7 @@ func NewBashTool(permissions permission.Service, workingDir string, attribution // Start with detached context so it can survive if moved to background bgManager := shell.GetBackgroundShellManager() bgManager.Cleanup() - bgShell, err := bgManager.Start(context.Background(), execWorkingDir, blockFuncs(), params.Command, params.Description) + bgShell, err := bgManager.Start(context.Background(), execWorkingDir, blockFuncs(defaultBannedCommands), params.Command, params.Description) if err != nil { return fantasy.ToolResponse{}, fmt.Errorf("error starting shell: %w", err) }