/** * Case-insensitive lookup and comparison utilities for agent/config names. * Used throughout the codebase to allow "Oracle", "oracle", "ORACLE" to work the same. */ /** * Find a value in an object using case-insensitive key matching. * First tries exact match, then falls back to lowercase comparison. */ export function findCaseInsensitive(obj: Record | undefined, key: string): T | undefined { if (!obj) return undefined const exactMatch = obj[key] if (exactMatch !== undefined) return exactMatch const lowerKey = key.toLowerCase() for (const [k, v] of Object.entries(obj)) { if (k.toLowerCase() === lowerKey) return v } return undefined } /** * Check if an array includes a value using case-insensitive comparison. */ export function includesCaseInsensitive(arr: string[], value: string): boolean { const lowerValue = value.toLowerCase() return arr.some((item) => item.toLowerCase() === lowerValue) } /** * Find an element in array using case-insensitive name matching. * Useful for finding agents/categories by name. */ export function findByNameCaseInsensitive( arr: T[], name: string ): T | undefined { const lowerName = name.toLowerCase() return arr.find((item) => item.name.toLowerCase() === lowerName) } /** * Check if two strings are equal (case-insensitive). */ export function equalsIgnoreCase(a: string, b: string): boolean { return a.toLowerCase() === b.toLowerCase() }