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 taskId = input['task_id'] as String?;
  final block = input['block'] as bool? ?? true;
  final timeout = (input['timeout'] as num?)?.toInt() ?? 30000;

  if (taskId == null || taskId.isEmpty) {
    return ToolResult.error('Missing required parameter: task_id');
  }

  final task = tasks[taskId];
  if (task == null) {
    return ToolResult.error('Task not found: $taskId');
  }

  if (!block || task.status.isTerminal) {
    return _formatTaskResult(task);
  }

  // Blocking: wait for task completion
  final maxTimeout = timeout.clamp(0, 600000);
  final deadline = DateTime.now().add(Duration(milliseconds: maxTimeout));

  while (!task.status.isTerminal && DateTime.now().isBefore(deadline)) {
    await Future.delayed(const Duration(milliseconds: 100));
  }

  if (!task.status.isTerminal) {
    return ToolResult.success(
      'Task "$taskId" did not complete within ${maxTimeout}ms.\n'
      'Current status: ${task.status.name}\n'
      'Use TaskOutput again to check later.',
      metadata: {'retrieval_status': 'timeout'},
    );
  }

  return _formatTaskResult(task);
}