Spaces:
Runtime error
Runtime error
| import { getFeatureFlagOverride } from "@/lib/db/featureFlags"; | |
| import { | |
| FEATURE_FLAG_DEFINITIONS, | |
| type FeatureFlagDefinition, | |
| } from "@/shared/constants/featureFlagDefinitions"; | |
| /** | |
| * Resolve the effective value of a feature flag. | |
| * Priority: DB override > process.env > definition.defaultValue | |
| */ | |
| export function resolveFeatureFlag(key: string): string { | |
| const dbOverride = getFeatureFlagOverride(key); | |
| if (dbOverride !== undefined) return dbOverride; | |
| const envValue = process.env[key]; | |
| if (envValue !== undefined && envValue !== "") return envValue; | |
| const definition = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === key); | |
| return definition?.defaultValue ?? "false"; | |
| } | |
| /** | |
| * Check if a boolean feature flag is enabled. | |
| * Treats "true", "1", "yes" as enabled. | |
| */ | |
| export function isFeatureFlagEnabled(key: string): boolean { | |
| const value = resolveFeatureFlag(key); | |
| return value === "true" || value === "1" || value === "yes"; | |
| } | |
| /** | |
| * Resolve all feature flags with their effective values and sources. | |
| */ | |
| export function resolveAllFeatureFlags(): Array<{ | |
| key: string; | |
| effectiveValue: string; | |
| source: "db" | "env" | "default"; | |
| definition: FeatureFlagDefinition; | |
| }> { | |
| return FEATURE_FLAG_DEFINITIONS.map((definition) => { | |
| const dbOverride = getFeatureFlagOverride(definition.key); | |
| if (dbOverride !== undefined) { | |
| return { key: definition.key, effectiveValue: dbOverride, source: "db", definition }; | |
| } | |
| const envValue = process.env[definition.key]; | |
| if (envValue !== undefined && envValue !== "") { | |
| return { key: definition.key, effectiveValue: envValue, source: "env", definition }; | |
| } | |
| return { | |
| key: definition.key, | |
| effectiveValue: definition.defaultValue, | |
| source: "default", | |
| definition, | |
| }; | |
| }); | |
| } | |
| // Backward-compatible wrappers | |
| export function isRequireApiKeyEnabled(): boolean { | |
| try { | |
| return isFeatureFlagEnabled("REQUIRE_API_KEY"); | |
| } catch (error) { | |
| console.error( | |
| "[featureFlags] Failed to resolve REQUIRE_API_KEY, defaulting to required:", | |
| error instanceof Error ? error.message : error | |
| ); | |
| return true; | |
| } | |
| } | |
| export function isCcCompatibleProviderEnabled(): boolean { | |
| return isFeatureFlagEnabled("ENABLE_CC_COMPATIBLE_PROVIDER"); | |
| } | |
| export function isApiKeyRevealEnabledFlag(): boolean { | |
| try { | |
| return isFeatureFlagEnabled("ALLOW_API_KEY_REVEAL"); | |
| } catch (error) { | |
| console.error( | |
| "[featureFlags] Failed to resolve ALLOW_API_KEY_REVEAL, defaulting to disabled:", | |
| error instanceof Error ? error.message : error | |
| ); | |
| return false; | |
| } | |
| } | |
| export function isModelCatalogNamesEnabled(): boolean { | |
| return isFeatureFlagEnabled("MODEL_CATALOG_INCLUDE_NAMES"); | |
| } | |
| export type ModelsCatalogPrefixMode = "dual" | "alias" | "canonical"; | |
| export function getModelsCatalogPrefixMode(): ModelsCatalogPrefixMode { | |
| const value = resolveFeatureFlag("MODELS_CATALOG_PREFIX_MODE"); | |
| if (value === "alias" || value === "canonical") return value; | |
| return "dual"; | |
| } | |
| export function isArenaEloSyncEnabled(): boolean { | |
| return isFeatureFlagEnabled("ARENA_ELO_SYNC_ENABLED"); | |
| } | |
| export function isControlPlaneProxyDirectFallbackEnabled(): boolean { | |
| try { | |
| return isFeatureFlagEnabled("OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK"); | |
| } catch (error) { | |
| console.error( | |
| "[featureFlags] Failed to resolve OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK, defaulting to disabled:", | |
| error instanceof Error ? error.message : error | |
| ); | |
| return false; | |
| } | |
| } | |