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 command = input['command'] as String?;
  if (command == null || command.isEmpty) {
    return ToolResult.error('Missing required parameter: command');
  }

  final timeoutMs = input['timeout'] as int?;
  final effectiveTimeout = timeoutMs != null
      ? Duration(milliseconds: timeoutMs)
      : timeout;

  try {
    final result = await ShellExecutor.run(
      command,
      workingDirectory: workingDirectory,
      timeout: effectiveTimeout,
    );

    final stdout = result.stdout.trim();
    final stderr = result.stderr.trim();

    if (result.isTimeout) {
      return ToolResult.error(
        'Command timed out after ${effectiveTimeout.inSeconds}s',
      );
    }

    if (!result.isSuccess) {
      final output = [
        if (stdout.isNotEmpty) stdout,
        if (stderr.isNotEmpty) 'STDERR: $stderr',
        'Exit code: ${result.exitCode}',
      ].join('\n');
      return ToolResult(content: output, isError: true);
    }

    return ToolResult.success(
      [stdout, if (stderr.isNotEmpty) 'STDERR: $stderr'].join('\n'),
    );
  } on TimeoutException {
    return ToolResult.error(
      'Command timed out after ${effectiveTimeout.inSeconds}s',
    );
  } catch (e) {
    return ToolResult.error('Process error: $e');
  }
}