* feat: Enhance favorites functionality to support model specs
* refactor(FavoritesList): reorder imports based on lenght
* feat: improve favorite modelSpec controller; refactor: useIsActiveItem hook
* refactor: consolidate Favorite type, harden controller, add tests
- Add canonical TUserFavorite type in data-provider, replace three
duplicate definitions (data-service, data-schemas, store/favorites)
- Consolidate FavoritesController spec validation into single block,
add return on 500 paths, add maxlength to mongoose sub-schema
- Fix import order in FavoritesList.tsx, merge namespace type imports
in FavoriteItem.tsx and FavoritesList.tsx
- Add focus-visible:ring-inset on pin buttons to prevent ring clipping
- Add explicit return type and JSDoc on useIsActiveItem hook
- Use props.type for narrowing consistency in FavoriteItem getTypeLabel
- Add 22 backend tests for FavoritesController (spec validation,
typeCount exclusivity, persistence, GET path)
- Add 40 frontend tests: useFavorites spec methods, useIsActiveItem
observer lifecycle, ModelSpecItem pin button, FavoriteItem all three
type branches, FavoritesList spec rendering
* fix: address PR review findings for pin model specs
- Harden backend validation to reject partial cross-type fields
(e.g. spec+endpoint, agentId+model without endpoint)
- Add stale-spec auto-cleanup in FavoritesList mirroring agent cleanup
- Add type="button" to pin buttons in ModelSpecItem/EndpointModelItem
- Fix import order violations in EndpointModelItem and ModelSpecItem
- Remove hollow test, dead key prop, inline trivial helpers
- Fix misleading test description, add onSelectSpec to test mock
- Add return to controller success responses for consistency
- Add 6 backend tests for partial cross-type field validation
* fix: guard stale-spec cleanup against unloaded startupConfig
Prevents race condition where spec favorites are incorrectly deleted
on cold start before startupConfig has loaded. Mirrors the existing
agentsMap === undefined guard pattern used for stale agent cleanup.
Also adds tests for stale-spec cleanup persistence and fixes namespace
import pattern in FavoritesList.spec.tsx.
* fix: replace nested ternaries with if/else in FavoriteItem
Resolves ESLint no-nested-ternary warnings for name and typeLabel
derivations.
---------
Co-authored-by: Danny Avila <danny@librechat.ai>