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