| 1 | import 'tool_definition.dart'; |
| 2 | |
| 3 | abstract class ToolProvider { |
| 4 | Future<List<ToolDefinition>> listTools(); |
| 5 | Future<ToolExecutionResult> execute(String name, Map<String, dynamic> args); |
| 6 | } |
| 7 | |
| 8 | class ToolRegistry { |
| 9 | final List<ToolProvider> providers; |
| 10 | |
| 11 | ToolRegistry({required this.providers}); |
| 12 | |
| 13 | Future<List<ToolDefinition>> listTools({Set<String>? allowedTools}) async { |
| 14 | final all = <ToolDefinition>[]; |
| 15 | for (final provider in providers) { |
| 16 | all.addAll(await provider.listTools()); |
| 17 | } |
| 18 | if (allowedTools == null || allowedTools.isEmpty) return all; |
| 19 | return all.where((t) => allowedTools.contains(t.name)).toList(); |
| 20 | } |
| 21 | |
| 22 | Future<ToolExecutionResult> execute( |
| 23 | String name, |
| 24 | Map<String, dynamic> args, |
| 25 | ) async { |
| 26 | for (final provider in providers) { |
| 27 | final tools = await provider.listTools(); |
| 28 | if (tools.any((t) => t.name == name)) { |
| 29 | return provider.execute(name, args); |
| 30 | } |
| 31 | } |
| 32 | return const ToolExecutionResult.failure('Tool not found'); |
| 33 | } |
| 34 | } |