import type { ModelOption, ProviderGroup } from "../../lib/modelOptions"; import type { ModelSelection, ProviderInstanceId } from "@t3tools/contracts"; export function modelFavoriteKey(provider: ProviderInstanceId, model: string): string { return `${provider}:${model}`; } export function favoritesFirst( models: ReadonlyArray, favoriteKeys: ReadonlySet, ): ReadonlyArray { const favorites: ModelOption[] = []; const others: ModelOption[] = []; for (const model of models) { (favoriteKeys.has(model.key) ? favorites : others).push(model); } return [...favorites, ...others]; } export function modelMatchesCatalogQuery(input: { readonly model: ModelOption; readonly providerLabel: string; readonly query: string; }): boolean { const query = input.query.trim().toLocaleLowerCase(); if (query.length === 0) { return true; } return [ input.model.label, input.model.subtitle, input.model.selection.model, input.providerLabel, ].some((value) => value.toLocaleLowerCase().includes(query)); } export function pendingModelAfterPress(input: { readonly current: ModelOption | null; readonly pressed: ModelOption; readonly pressedIsApplied: boolean; readonly restoreSelection?: (selection: ModelSelection) => ModelSelection; }): ModelOption | null { if (input.pressedIsApplied) { return null; } if (input.current?.key === input.pressed.key) { return input.current; } return input.restoreSelection ? { ...input.pressed, selection: input.restoreSelection(input.pressed.selection) } : input.pressed; } export function canCommitPendingModel( pending: ModelOption, groups: ReadonlyArray, ): boolean { return groups.some((group) => group.models.some( (model) => model.key === pending.key && !model.isUnavailable && !model.isHidden, ), ); } export function providerSectionIsCollapsed(input: { readonly defaultExpanded: boolean; readonly hasExpansionOverride: boolean; readonly isNarrowed: boolean; }): boolean { if (input.isNarrowed) { return false; } return input.defaultExpanded ? input.hasExpansionOverride : !input.hasExpansionOverride; }