fix: clear regex cache on new session to prevent unbounded growth (#2161)

M1xA created

Change summary

internal/agent/tools/grep.go | 11 +++++++++++
internal/ui/model/ui.go      |  2 ++
2 files changed, 13 insertions(+)

Detailed changes

internal/agent/tools/grep.go 🔗

@@ -64,6 +64,17 @@ func (rc *regexCache) get(pattern string) (*regexp.Regexp, error) {
 	return regex, nil
 }
 
+// ResetCache clears compiled regex caches to prevent unbounded growth across sessions.
+func ResetCache() {
+	searchRegexCache.mu.Lock()
+	clear(searchRegexCache.cache)
+	searchRegexCache.mu.Unlock()
+
+	globRegexCache.mu.Lock()
+	clear(globRegexCache.cache)
+	globRegexCache.mu.Unlock()
+}
+
 // Global regex cache instances
 var (
 	searchRegexCache = newRegexCache()

internal/ui/model/ui.go 🔗

@@ -24,6 +24,7 @@ import (
 	tea "charm.land/bubbletea/v2"
 	"charm.land/catwalk/pkg/catwalk"
 	"charm.land/lipgloss/v2"
+	agenttools "github.com/charmbracelet/crush/internal/agent/tools"
 	"github.com/charmbracelet/crush/internal/agent/tools/mcp"
 	"github.com/charmbracelet/crush/internal/app"
 	"github.com/charmbracelet/crush/internal/commands"
@@ -2986,6 +2987,7 @@ func (m *UI) newSession() tea.Cmd {
 	m.promptQueue = 0
 	m.pillsView = ""
 	m.historyReset()
+	agenttools.ResetCache()
 	return tea.Batch(
 		func() tea.Msg {
 			m.com.App.LSPManager.StopAll(context.Background())