feat(app): add searchable model favorites (#172)

Improve draft and live model selectors with search, favorites, and clearer provider context. Keep live agents honest by showing other provider catalogs as browse-only until provider switching exists.

Co-authored-by: David Longman <dlongman@tokentradegames.com>
This commit is contained in:
thatdaveguy1
2026-04-02 22:35:07 +08:00
committed by GitHub
co-authored by David Longman
parent 2d63bc3893
commit 63905950cc
7 changed files with 956 additions and 274 deletions
@@ -1,6 +1,11 @@
import { describe, expect, it } from "vitest";
import { mergeProviderPreferences } from "./use-form-preferences";
import {
buildFavoriteModelKey,
isFavoriteModel,
mergeProviderPreferences,
toggleFavoriteModel,
} from "./use-form-preferences";
describe("mergeProviderPreferences", () => {
it("stores the selected model for a provider", () => {
@@ -55,3 +60,92 @@ describe("mergeProviderPreferences", () => {
});
});
});
describe("favorite model preferences", () => {
it("builds a stable favorite key from provider and model", () => {
expect(buildFavoriteModelKey({ provider: "claude", modelId: "sonnet-4.6" })).toBe(
"claude:sonnet-4.6",
);
});
it("adds a model to favorites without dropping other preferences", () => {
expect(
toggleFavoriteModel({
preferences: {
provider: "claude",
providerPreferences: {
claude: {
model: "claude-sonnet-4-6",
},
},
},
provider: "codex",
modelId: "gpt-5.4",
}),
).toEqual({
provider: "claude",
providerPreferences: {
claude: {
model: "claude-sonnet-4-6",
},
},
favoriteModels: [
{
provider: "codex",
modelId: "gpt-5.4",
},
],
});
});
it("removes a model from favorites when toggled again", () => {
expect(
toggleFavoriteModel({
preferences: {
favoriteModels: [
{
provider: "codex",
modelId: "gpt-5.4",
},
],
},
provider: "codex",
modelId: "gpt-5.4",
}),
).toEqual({
favoriteModels: [],
});
});
it("reports whether a model is favorited", () => {
expect(
isFavoriteModel({
preferences: {
favoriteModels: [
{
provider: "codex",
modelId: "gpt-5.4",
},
],
},
provider: "codex",
modelId: "gpt-5.4",
}),
).toBe(true);
expect(
isFavoriteModel({
preferences: {
favoriteModels: [
{
provider: "codex",
modelId: "gpt-5.4",
},
],
},
provider: "claude",
modelId: "sonnet-4.6",
}),
).toBe(false);
});
});