@@ -18,6 +18,7 @@ import (
20 "charm.land/fantasy"
20 "charm.land/fantasy"
21+ "github.com/charmbracelet/crush/internal/config"
21 "github.com/charmbracelet/crush/internal/csync"
22 "github.com/charmbracelet/crush/internal/csync"
22 "github.com/charmbracelet/crush/internal/fsext"
23 "github.com/charmbracelet/crush/internal/fsext"
@@ -100,7 +101,7 @@ func escapeRegexPattern(pattern string) string {
100 return escaped
101 return escaped
103−func NewGrepTool(workingDir string) fantasy.AgentTool {
104+func NewGrepTool(workingDir string, config config.ToolGrep) fantasy.AgentTool {
104 return fantasy.NewAgentTool(
105 return fantasy.NewAgentTool(
105 GrepToolName,
106 GrepToolName,
106 string(grepDescription),
107 string(grepDescription),
@@ -109,7 +110,6 @@ func NewGrepTool(workingDir string) fantasy.AgentTool {
109 return fantasy.NewTextErrorResponse("pattern is required"), nil
110 return fantasy.NewTextErrorResponse("pattern is required"), nil
112− // If literal_text is true, escape the pattern
113 searchPattern := params.Pattern
113 searchPattern := params.Pattern
114 if params.LiteralText {
114 if params.LiteralText {
115 searchPattern = escapeRegexPattern(params.Pattern)
115 searchPattern = escapeRegexPattern(params.Pattern)
@@ -120,7 +120,10 @@ func NewGrepTool(workingDir string) fantasy.AgentTool {
120 searchPath = workingDir
120 searchPath = workingDir
123+ searchCtx, cancel := context.WithTimeout(ctx, config.GetTimeout())
123− matches, truncated, err := searchFiles(ctx, searchPattern, searchPath, params.Include, 100)
126+ matches, truncated, err := searchFiles(searchCtx, searchPattern, searchPath, params.Include, 100)
124 if err != nil {
127 if err != nil {
125 return fantasy.NewTextErrorResponse(fmt.Sprintf("error searching files: %v", err)), nil
128 return fantasy.NewTextErrorResponse(fmt.Sprintf("error searching files: %v", err)), nil