execute method

Future<ToolResult> execute(
  1. String name,
  2. Map<String, dynamic> input
)

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;
}