handleToolUseStartPendingMessage method

void handleToolUseStartPendingMessage(
  1. PupauMessage message,
  2. Map<String, dynamic> data
)

Implementation

void handleToolUseStartPendingMessage(
  PupauMessage message,
  Map<String, dynamic> data,
) {
  // Prefer `actorType` tool type whenever present.
  final ToolUsePendingData pending = ToolUsePendingData.fromJson(data);
  if (pending.toolName.trim().isNotEmpty) {
    message.toolName = pending.toolName;
  }
  if (pending.toolUseType != ToolUseType.nativeToolsGeneric) {
    message.toolUseType = pending.toolUseType;
  }
  if (message.showTool == false && message.toolMessage != null) {
    loadingMessage.value = LoadingMessage(
      message: message.toolMessage ?? "",
      loadingType: LoadingType.text,
    );
    update();
    return;
  }
  if (message.toolUseType == ToolUseType.nativeToolsBrowserUse) {
    loadingMessage.value = LoadingMessage(
      message: message.toolName ?? "",
      loadingType: LoadingType.browserUse,
    );
    update();
    return;
  }
  if (message.toolUseAgent != null) {
    loadingMessage.value = LoadingMessage(
      message: "@${message.toolUseAgent!.name}",
      loadingType: LoadingType.tag,
    );
    update();
    return;
  }
  if (message.sourceType == SourceType.event &&
      (message.type == MessageType.toolUseStart ||
          message.type == MessageType.toolPending)) {
    final String name = (message.toolName ?? "").trim();
    if (name.isEmpty) return;
    markToolLoadingStarted(name);
    // TOOL_PENDING means queued; TOOL_USE_START means started. We treat both
    // as "active" until TOOL_USE (source) or TOOL_EVALUATION clear them.
    activeToolLoadings[name] =
        message.toolUseType ?? ToolUseType.nativeToolsGeneric;
    activeToolLoadings.refresh();
    update();
    syncLoadingMessageFromActiveTools();
    return;
  }
}