diff --git a/src/tui/components/searchable-select-list.test.ts b/src/tui/components/searchable-select-list.test.ts index 822b79322d81..e68f1c604024 100644 --- a/src/tui/components/searchable-select-list.test.ts +++ b/src/tui/components/searchable-select-list.test.ts @@ -289,6 +289,24 @@ describe("SearchableSelectList", () => { expect(output).toContain("*gpt*"); }); + it("discards compiled regexes from previous searches", () => { + const queryLength = 300; + const list = new SearchableSelectList( + [{ value: "match", label: "a".repeat(queryLength) }], + 5, + mockTheme, + ); + + for (let index = 0; index < queryLength; index += 1) { + list.handleInput("a"); + list.render(queryLength + 10); + } + + const regexCache = (list as unknown as { regexCache: Map }).regexCache; + expect(regexCache.size).toBe(1); + expect(list.render(queryLength + 10).join("\n")).toContain(`*${"a".repeat(queryLength)}*`); + }); + it("shows no match message when filter yields no results", () => { const list = new SearchableSelectList(testItems, 5, mockTheme); diff --git a/src/tui/components/searchable-select-list.ts b/src/tui/components/searchable-select-list.ts index f1e14685b77a..752081fd8366 100644 --- a/src/tui/components/searchable-select-list.ts +++ b/src/tui/components/searchable-select-list.ts @@ -365,6 +365,8 @@ export class SearchableSelectList implements Component { const newValue = this.searchInput.getValue(); if (prevValue !== newValue) { + // Only current-query patterns are reusable; retaining older edits grows without bound. + this.regexCache.clear(); this.updateFilter(); } }