diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index f3ec2cf87..5bcb83087 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -102,13 +102,11 @@ func NewAgentInstance( toolsRegistry.Register(tools.NewListDirTool(workspace, readRestrict, allowReadPaths)) } if cfg.Tools.IsToolEnabled("exec") { - execTool, err := tools.NewExecToolWithDenyPaths(workspace, restrict, [][]*regexp.Regexp{allowReadPaths}, denyWritePaths, cfg) + execTool, err := tools.NewExecToolWithConfig(workspace, restrict, cfg, allowReadPaths) if err != nil { logger.ErrorCF("agent", "Failed to initialize exec tool; continuing without exec", map[string]any{"error": err.Error()}) - execTool = nil - } - if execTool != nil { + } else { toolsRegistry.Register(execTool) } } diff --git a/pkg/agent/loop_test.go b/pkg/agent/loop_test.go index 90025df3e..b22a5aebc 100644 --- a/pkg/agent/loop_test.go +++ b/pkg/agent/loop_test.go @@ -3693,8 +3693,8 @@ func TestProcessMessage_MessageToolPublishesOutboundWithTurnMetadata(t *testing. if err != nil { t.Fatalf("processMessage() error = %v", err) } - if response == "" { - t.Fatal("expected processMessage() to return a final loop response") + if response != "" { + t.Fatalf("expected empty loop response when tool handles delivery, got %q", response) } select { diff --git a/pkg/tools/integration/message.go b/pkg/tools/integration/message.go index 98d87bcb3..68912fdd5 100644 --- a/pkg/tools/integration/message.go +++ b/pkg/tools/integration/message.go @@ -137,7 +137,8 @@ func (t *MessageTool) Execute(ctx context.Context, args map[string]any) *ToolRes // Silent: user already received the message directly return &ToolResult{ - ForLLM: fmt.Sprintf("Message sent to %s:%s", channel, chatID), - Silent: true, + ForLLM: fmt.Sprintf("Message sent to %s:%s", channel, chatID), + Silent: true, + ResponseHandled: true, } }