d950ff6a74
Changelog: - https://github.com/charmbracelet/crush/releases/tag/v0.82.0 - https://github.com/charmbracelet/crush/releases/tag/v0.83.0 - https://github.com/charmbracelet/crush/releases/tag/v0.84.0 Reported by: GitHub (watch releases)
111 lines
6.1 KiB
Plaintext
111 lines
6.1 KiB
Plaintext
--- internal/agent/common_test.go.orig 1979-11-29 15:00:00 UTC
|
|
+++ internal/agent/common_test.go
|
|
@@ -167,7 +167,7 @@ func coderAgent(r *vcr.Recorder, env fakeEnv, large, s
|
|
}
|
|
|
|
allTools := []fantasy.AgentTool{
|
|
- tools.NewBashTool(env.permissions, env.workingDir, cfg.Config().Options.Attribution, modelName),
|
|
+ tools.NewBashTool(env.permissions, env.workingDir, cfg.Config().Options.Attribution, modelName, cfg.Config().Options.DisableCommandBlocking),
|
|
tools.NewDownloadTool(env.permissions, env.workingDir, r.GetDefaultClient()),
|
|
tools.NewEditTool(nil, env.permissions, env.history, *env.filetracker, env.workingDir),
|
|
tools.NewMultiEditTool(nil, env.permissions, env.history, *env.filetracker, env.workingDir),
|
|
--- internal/agent/coordinator.go.orig 1979-11-29 15:00:00 UTC
|
|
+++ internal/agent/coordinator.go
|
|
@@ -656,7 +656,7 @@ func (c *coordinator) buildTools(ctx context.Context,
|
|
|
|
allTools = append(
|
|
allTools,
|
|
- tools.NewBashTool(c.permissions, c.cfg.WorkingDir(), c.cfg.Config().Options.Attribution, modelID),
|
|
+ tools.NewBashTool(c.permissions, c.cfg.WorkingDir(), c.cfg.Config().Options.Attribution, modelID, c.cfg.Config().Options.DisableCommandBlocking),
|
|
tools.NewCrushInfoTool(c.cfg, c.lspManager, c.allSkills, c.activeSkills, c.skillTracker),
|
|
tools.NewCrushLogsTool(logFile),
|
|
tools.NewJobOutputTool(),
|
|
--- internal/agent/tools/bash.go.orig 1979-11-29 15:00:00 UTC
|
|
+++ internal/agent/tools/bash.go
|
|
@@ -145,8 +145,11 @@ var bannedCommands = []string{
|
|
"ufw",
|
|
}
|
|
|
|
-func bashDescription(attribution *config.Attribution, modelID string) string {
|
|
+func bashDescription(attribution *config.Attribution, modelID string, disableBlocking bool) string {
|
|
bannedCommandsStr := strings.Join(bannedCommands, ", ")
|
|
+ if disableBlocking {
|
|
+ bannedCommandsStr = "none"
|
|
+ }
|
|
var out bytes.Buffer
|
|
if err := bashDescriptionTpl.Execute(&out, bashDescriptionData{
|
|
BannedCommands: bannedCommandsStr,
|
|
@@ -162,7 +165,10 @@ func bashDescription(attribution *config.Attribution,
|
|
return out.String()
|
|
}
|
|
|
|
-func blockFuncs() []shell.BlockFunc {
|
|
+func blockFuncs(disableBlocking bool) []shell.BlockFunc {
|
|
+ if disableBlocking {
|
|
+ return nil
|
|
+ }
|
|
return []shell.BlockFunc{
|
|
shell.CommandsBlocker(bannedCommands),
|
|
|
|
@@ -194,10 +200,10 @@ func blockFuncs() []shell.BlockFunc {
|
|
}
|
|
}
|
|
|
|
-func NewBashTool(permissions permission.Service, workingDir string, attribution *config.Attribution, modelID string) fantasy.AgentTool {
|
|
+func NewBashTool(permissions permission.Service, workingDir string, attribution *config.Attribution, modelID string, disableBlocking bool) fantasy.AgentTool {
|
|
return fantasy.NewAgentTool(
|
|
BashToolName,
|
|
- string(bashDescription(attribution, modelID)),
|
|
+ string(bashDescription(attribution, modelID, disableBlocking)),
|
|
func(ctx context.Context, params BashParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
|
|
if params.Command == "" {
|
|
return fantasy.NewTextErrorResponse("missing command"), nil
|
|
@@ -251,7 +257,7 @@ func NewBashTool(permissions permission.Service, worki
|
|
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, blockFuncs(disableBlocking), params.Command, params.Description)
|
|
if err != nil {
|
|
return fantasy.ToolResponse{}, fmt.Errorf("error starting background shell: %w", err)
|
|
}
|
|
@@ -306,7 +312,7 @@ func NewBashTool(permissions permission.Service, worki
|
|
// 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(disableBlocking), params.Command, params.Description)
|
|
if err != nil {
|
|
return fantasy.ToolResponse{}, fmt.Errorf("error starting shell: %w", err)
|
|
}
|
|
--- internal/agent/tools/bash_test.go.orig 1979-11-29 15:00:00 UTC
|
|
+++ internal/agent/tools/bash_test.go
|
|
@@ -117,7 +117,7 @@ func newBashToolForTest(workingDir string) fantasy.Age
|
|
func newBashToolForTest(workingDir string) fantasy.AgentTool {
|
|
permissions := &mockBashPermissionService{Broker: pubsub.NewBroker[permission.PermissionRequest]()}
|
|
attribution := &config.Attribution{TrailerStyle: config.TrailerStyleNone}
|
|
- return NewBashTool(permissions, workingDir, attribution, "test-model")
|
|
+ return NewBashTool(permissions, workingDir, attribution, "test-model", false)
|
|
}
|
|
|
|
func newBashToolWithRecordingPerms(workingDir string, allow bool) (fantasy.AgentTool, *recordingPermissionService) {
|
|
@@ -126,7 +126,7 @@ func newBashToolWithRecordingPerms(workingDir string,
|
|
allow: allow,
|
|
}
|
|
attribution := &config.Attribution{TrailerStyle: config.TrailerStyleNone}
|
|
- return NewBashTool(perms, workingDir, attribution, "test-model"), perms
|
|
+ return NewBashTool(perms, workingDir, attribution, "test-model", false), perms
|
|
}
|
|
|
|
func TestBashTool_ChainedCommandsRequirePermission(t *testing.T) {
|
|
--- internal/config/config.go.orig 1979-11-29 15:00:00 UTC
|
|
+++ internal/config/config.go
|
|
@@ -281,6 +281,7 @@ type Options struct {
|
|
Debug bool `json:"debug,omitempty" jsonschema:"description=Enable debug logging,default=false"`
|
|
DebugLSP bool `json:"debug_lsp,omitempty" jsonschema:"description=Enable debug logging for LSP servers,default=false"`
|
|
DisableAutoSummarize bool `json:"disable_auto_summarize,omitempty" jsonschema:"description=Disable automatic conversation summarization,default=false"`
|
|
+ DisableCommandBlocking bool `json:"disable_command_blocking,omitempty" jsonschema:"description=Disable blocking of potentially dangerous commands (unsafe),default=false"`
|
|
// DataDirectory is where Crush keeps per-project state such as
|
|
// the SQLite database and workspace overrides. Relative paths are
|
|
// resolved against the working directory; absolute paths are used
|