execute method
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');
}
}