syncLoadingMessageFromActiveTools method

void syncLoadingMessageFromActiveTools()

Update loadingMessage from activeToolLoadings, supporting multiple concurrent tool loadings.

Implementation

void syncLoadingMessageFromActiveTools() {
  if (activeToolLoadings.isEmpty) {
    // Only reset if we were showing tool loadings; other loading types
    // (dots/text/websearch) are managed separately.
    if (loadingMessage.value.loadingType == LoadingType.toolUse) {
      resetLoadingMessage();
    }
    return;
  }

  final entries = activeToolLoadings.entries.toList();
  final List<ToolLoadingEntry> tools = entries.map((e) {
    final String baseName = e.key;
    final String? status = toolPartialStatuses[baseName];
    final String displayName = status == null
        ? baseName
        : "${baseName.replaceAll("_", " ")} – $status";
    return ToolLoadingEntry(name: displayName, key: baseName, type: e.value);
  }).toList();

  // `message` is primarily used as a fallback label; each tool bubble
  // uses its own `ToolLoadingEntry.name`. When multiple tools are active,
  // we avoid joining names so individual bubbles keep their own titles.
  final String displayMessage = tools.length == 1 ? tools.first.name : "";

  final ToolUseType effectiveType = entries.first.value;

  loadingMessage.value = LoadingMessage(
    message: displayMessage,
    loadingType: LoadingType.toolUse,
    toolUseType: effectiveType,
    tools: tools,
  );
  update();
}