extractDiscoveredToolNames method

Set<String> extractDiscoveredToolNames(
  1. List<ToolSearchMessage> messages
)

Extract tool names from tool_reference blocks in message history.

When dynamic tool loading is enabled, MCP tools are not predeclared. Instead, they are discovered via ToolSearchTool which returns tool_reference blocks.

Implementation

Set<String> extractDiscoveredToolNames(List<ToolSearchMessage> messages) {
  final discovered = <String>{};
  int carriedFromBoundary = 0;

  for (final msg in messages) {
    // Compact boundary carries the pre-compact discovered set.
    if (msg.type == 'system' && msg.subtype == 'compact_boundary') {
      final carried = msg.compactMetadata?['preCompactDiscoveredTools'];
      if (carried is List) {
        for (final name in carried) {
          if (name is String) {
            discovered.add(name);
            carriedFromBoundary++;
          }
        }
      }
      continue;
    }

    if (msg.type != 'user') continue;

    final content = msg.message?['content'];
    if (content is! List) continue;

    for (final block in content) {
      if (block is! Map<String, dynamic>) continue;
      if (isToolResultBlockWithContent(block)) {
        final blockContent = block['content'] as List;
        for (final item in blockContent) {
          if (item is Map<String, dynamic> && isToolReferenceWithName(item)) {
            discovered.add(item['tool_name'] as String);
          }
        }
      }
    }
  }

  if (discovered.isNotEmpty) {
    _logDebug(
      'Dynamic tool loading: found ${discovered.length} discovered tools'
      '${carriedFromBoundary > 0 ? ' ($carriedFromBoundary carried from compact boundary)' : ''}',
    );
  }

  discoveredToolNames.value = discovered;
  return discovered;
}