execute method

  1. @override
Future<ToolResult> execute(
  1. Map<String, dynamic> input
)
override

Execute the tool with the given input.

Implementation

@override
Future<ToolResult> execute(Map<String, dynamic> input) async {
  final pattern = input['pattern'] as String?;
  if (pattern == null || pattern.isEmpty) {
    return ToolResult.error('Missing required parameter: pattern');
  }

  final searchPath = input['path'] as String? ?? Directory.current.path;
  final dir = Directory(searchPath);

  if (!await dir.exists()) {
    return ToolResult.error('Directory not found: $searchPath');
  }

  try {
    // Extract extension from glob pattern
    final ext = _extractExtension(pattern);
    final matches = <_FileMatch>[];

    await for (final entity in dir.list(recursive: true)) {
      if (entity is! File) continue;
      if (_shouldSkip(entity.path)) continue;

      if (ext != null && !entity.path.endsWith(ext)) continue;
      if (ext == null && !_simpleGlobMatch(entity.path, pattern)) continue;

      final stat = await entity.stat();
      matches.add(_FileMatch(entity.path, stat.modified));

      if (matches.length >= 500) break;
    }

    // Sort by modification time (newest first)
    matches.sort((a, b) => b.modified.compareTo(a.modified));

    if (matches.isEmpty) {
      return ToolResult.success('No files matching pattern: $pattern');
    }

    return ToolResult.success(matches.map((m) => m.path).join('\n'));
  } catch (e) {
    return ToolResult.error('Glob error: $e');
  }
}