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 prompt = input['prompt'] as String?;
  final description = input['description'] as String?;
  final subagentType = input['subagent_type'] as String?;
  final modelOverride = input['model'] as String?;
  final runInBackground = input['run_in_background'] as bool? ?? false;

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

  // Resolve agent definition
  final effectiveType = subagentType ?? 'general-purpose';
  final agentDef = _resolveAgent(effectiveType);
  if (agentDef == null) {
    return ToolResult.error(
      'Unknown agent type: $effectiveType. '
      'Available: ${_availableAgentTypes().join(", ")}',
    );
  }

  // Resolve model
  final model = modelOverride ?? agentDef.model;

  // Resolve available tools for this agent
  final agentTools = _resolveAgentTools(agentDef);

  final agentId = 'agent_${DateTime.now().millisecondsSinceEpoch}';
  final startTime = DateTime.now();

  if (runInBackground) {
    // Launch async and return immediately
    _launchBackground(
      agentId: agentId,
      prompt: prompt,
      description: description,
      agentDef: agentDef,
      tools: agentTools,
      model: model,
    );

    return ToolResult.success(
      'Agent launched in background.\n'
      'Agent ID: $agentId\n'
      'Type: ${agentDef.agentType}\n'
      'Description: $description',
      metadata: {'status': 'async_launched', 'agentId': agentId},
    );
  }

  // Synchronous execution
  try {
    final result = await _runAgent(
      agentId: agentId,
      prompt: prompt,
      description: description,
      agentDef: agentDef,
      tools: agentTools,
      model: model,
    );

    final duration = DateTime.now().difference(startTime).inMilliseconds;

    return ToolResult.success(
      result.content,
      metadata: {
        'status': 'completed',
        'agentId': agentId,
        'totalToolUseCount': result.totalToolUseCount,
        'totalDurationMs': duration,
        'totalTokens': result.usage.totalTokens,
      },
    );
  } catch (e) {
    return ToolResult.error('Agent error: $e');
  }
}