findSimilar method
Find tools whose names are similar to query (case-insensitive prefix
and substring matching).
Implementation
List<ToolRegistration> findSimilar(String query) {
if (query.isEmpty) return [];
final q = query.toLowerCase();
// Exact match first.
final exact = _tools[query];
if (exact != null) return [exact];
// Prefix matches.
final prefixMatches = _tools.values
.where((r) => r.name.toLowerCase().startsWith(q))
.toList();
if (prefixMatches.isNotEmpty) return prefixMatches;
// Substring matches.
final substringMatches = _tools.values
.where((r) => r.name.toLowerCase().contains(q))
.toList();
if (substringMatches.isNotEmpty) return substringMatches;
// Levenshtein-based fuzzy (simple edit distance for short names).
final scored = <(ToolRegistration, int)>[];
for (final reg in _tools.values) {
final dist = _editDistance(q, reg.name.toLowerCase());
if (dist <= 3) {
scored.add((reg, dist));
}
}
scored.sort((a, b) => a.$2.compareTo(b.$2));
return scored.map((e) => e.$1).toList();
}