File size: 1,941 Bytes
df23150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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),
  };
}