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