handleToolUseStartPendingMessage method
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;
}
}