| import { PLUGIN_SCHEMA_VERSION } from "../constants.js"; |
| import type { GlobalProviderConfig, GlobalProviderRecord } from "../types.js"; |
|
|
| function compareProviders(left: GlobalProviderRecord, right: GlobalProviderRecord) { |
| return left.name.localeCompare(right.name) || left.id.localeCompare(right.id); |
| } |
|
|
| export function createEmptyConfig(): GlobalProviderConfig { |
| return { |
| schemaVersion: PLUGIN_SCHEMA_VERSION, |
| providers: [], |
| }; |
| } |
|
|
| export function normalizePluginConfig(value: unknown): GlobalProviderConfig { |
| if (!value || typeof value !== "object" || Array.isArray(value)) { |
| return createEmptyConfig(); |
| } |
|
|
| const record = value as Record<string, unknown>; |
| const providers = Array.isArray(record.providers) |
| ? record.providers.filter((provider): provider is GlobalProviderRecord => { |
| return Boolean(provider && typeof provider === "object" && !Array.isArray(provider)); |
| }).map((provider) => ({ |
| ...provider, |
| defaultModel: provider.defaultModel ?? null, |
| modelCatalog: Array.isArray(provider.modelCatalog) ? provider.modelCatalog : [], |
| lastSyncedAt: provider.lastSyncedAt ?? null, |
| lastSyncError: provider.lastSyncError ?? null, |
| })) |
| : []; |
|
|
| return { |
| schemaVersion: typeof record.schemaVersion === "number" ? record.schemaVersion : PLUGIN_SCHEMA_VERSION, |
| providers: [...providers].sort(compareProviders), |
| }; |
| } |
|
|
| export function upsertProvider( |
| config: GlobalProviderConfig, |
| provider: GlobalProviderRecord, |
| ): GlobalProviderConfig { |
| const withoutCurrent = config.providers.filter((existing) => existing.id !== provider.id); |
| return { |
| ...config, |
| providers: [...withoutCurrent, provider].sort(compareProviders), |
| }; |
| } |
|
|
| export function removeProvider( |
| config: GlobalProviderConfig, |
| providerId: string, |
| ): GlobalProviderConfig { |
| return { |
| ...config, |
| providers: config.providers.filter((provider) => provider.id !== providerId), |
| }; |
| } |
|
|