execute method
Execute a tool by name, running pre/post hooks and tracking stats.
Implementation
Future<ToolResult> execute(String name, Map<String, dynamic> input) async {
final reg = _tools[name];
if (reg == null) {
return ToolResult.error('Unknown tool: $name');
}
if (!reg.enabled) {
return ToolResult.error('Tool "$name" is currently disabled');
}
if (reg.restricted) {
return ToolResult.error(
'Tool "$name" is restricted (plan mode may be active)',
);
}
if (!reg.tool.isAvailable) {
return ToolResult.error('Tool "$name" is not available on this platform');
}
// Validate input.
final validation = reg.tool.validateInput(input);
if (!validation.isValid) {
return ToolResult.error(validation.error!);
}
// Pre-hooks.
for (final hook in _preHooks) {
final proceed = await hook(name, input);
if (!proceed) {
return ToolResult.error('Execution blocked by pre-hook');
}
}
// Execute with timing.
final stopwatch = Stopwatch()..start();
ToolResult result;
try {
result = await reg.tool.execute(input);
} catch (e) {
result = ToolResult.error('Tool "$name" error: $e');
}
stopwatch.stop();
// Record stats.
reg.recordExecution(stopwatch.elapsed);
// Emit event.
final event = ToolExecutionEvent(
toolName: name,
category: reg.category,
duration: stopwatch.elapsed,
isError: result.isError,
timestamp: DateTime.now(),
);
_executionController.add(event);
// Post-hooks.
for (final hook in _postHooks) {
hook(event);
}
return result;
}