From 0caca6cf3fe28693b2152b9af31ac3cdb8168f3e Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 12 Jun 2026 18:24:55 +0200 Subject: [PATCH] fix(tui): support slash-separated fuzzy filter tokens --- packages/tui/CHANGELOG.md | 1 + packages/tui/src/fuzzy.ts | 4 ++-- packages/tui/test/fuzzy.test.ts | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index da5cd46c..6405fe69 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixed +- Fixed slash-separated fuzzy queries so provider/model completions remain matchable after insertion. - Fixed WezTerm inline Kitty image rendering so reserved row clears do not erase all but the top strip of tool image previews ([#5618](https://github.com/earendil-works/pi/issues/5618)). ## [0.79.1] - 2026-06-09 diff --git a/packages/tui/src/fuzzy.ts b/packages/tui/src/fuzzy.ts index 35df468a..73c10dcf 100644 --- a/packages/tui/src/fuzzy.ts +++ b/packages/tui/src/fuzzy.ts @@ -94,7 +94,7 @@ export function fuzzyMatch(query: string, text: string): FuzzyMatch { /** * Filter and sort items by fuzzy match quality (best matches first). - * Supports space-separated tokens: all tokens must match. + * Supports whitespace- and slash-separated tokens: all tokens must match. */ export function fuzzyFilter(items: T[], query: string, getText: (item: T) => string): T[] { if (!query.trim()) { @@ -103,7 +103,7 @@ export function fuzzyFilter(items: T[], query: string, getText: (item: T) => const tokens = query .trim() - .split(/\s+/) + .split(/[\s/]+/) .filter((t) => t.length > 0); if (tokens.length === 0) { diff --git a/packages/tui/test/fuzzy.test.ts b/packages/tui/test/fuzzy.test.ts index 7415e963..af4662af 100644 --- a/packages/tui/test/fuzzy.test.ts +++ b/packages/tui/test/fuzzy.test.ts @@ -102,4 +102,11 @@ describe("fuzzyFilter", () => { assert.ok(result.map((r) => r.name).includes("foo")); assert.ok(result.map((r) => r.name).includes("foobar")); }); + + it("matches slash-separated provider/model queries against reordered text", () => { + const item = { id: "gpt-5.5", provider: "openai-codex" }; + const result = fuzzyFilter([item], "openai-codex/gpt-5.5", (model) => `${model.id} ${model.provider}`); + + assert.deepStrictEqual(result, [item]); + }); });