type SearchableRecord = Record export interface AgentToolGroup { groupId: string label: string tools: T[] } function normalizeQuery(query: string): string { return query.trim().toLowerCase() } function includesQuery(value: unknown, query: string): boolean { if (value === null || value === undefined) return false return String(value).toLowerCase().includes(query) } export function filterAgentBindingItems(items: T[], query: string): T[] { const q = normalizeQuery(query) if (!q) return items return items.filter((item) => ( includesQuery(item.name, q) || includesQuery(item.rawName, q) || includesQuery(item.description, q) || includesQuery(item.version, q) || includesQuery(item.source, q) || includesQuery(item.group, q) || includesQuery(item.providerName, q) )) } export function filterAgentToolGroups( groups: Array>, query: string, ): Array> { const q = normalizeQuery(query) if (!q) return groups return groups .map((group) => { const groupMatches = includesQuery(group.label, q) || includesQuery(group.groupId, q) const tools = groupMatches ? group.tools : filterAgentBindingItems(group.tools, q) return { ...group, tools } }) .filter((group) => group.tools.length > 0) }