* @brief Routes a non-meta tool call by its CommandRegistry safety tag. */
| 851 | * @brief Routes a non-meta tool call by its CommandRegistry safety tag. |
| 852 | */ |
| 853 | void AI::Conversation::dispatchByCallSafety(const QString& callId, |
| 854 | const QString& requestedName, |
| 855 | const QJsonObject& arguments) |
| 856 | { |
| 857 | const QString name = m_dispatcher->canonicalToolName(requestedName); |
| 858 | const auto safety = AI::CommandRegistry::instance().safetyOf(name); |
| 859 | qCDebug(serialStudioAI) << "Tool call" << name << "safety=" << static_cast<int>(safety); |
| 860 | |
| 861 | if (safety == Safety::Blocked) { |
| 862 | QJsonObject denial; |
| 863 | denial[QStringLiteral("ok")] = false; |
| 864 | denial[QStringLiteral("error")] = QStringLiteral("blocked"); |
| 865 | appendToolCallCard(callId, name, arguments, CallStatus::Blocked); |
| 866 | recordToolResult(callId, name, denial); |
| 867 | updateToolCallCard(callId, CallStatus::Blocked, denial); |
| 868 | releaseOutstandingToolResult(); |
| 869 | return; |
| 870 | } |
| 871 | |
| 872 | if (safety == Safety::Confirm || safety == Safety::AlwaysConfirm) { |
| 873 | const bool autoApprove = |
| 874 | (safety == Safety::Confirm) && Assistant::instance().autoApproveEdits(); |
| 875 | if (autoApprove) { |
| 876 | appendToolCallCard(callId, name, arguments, CallStatus::Running); |
| 877 | runToolCall(callId, name, arguments, true); |
| 878 | return; |
| 879 | } |
| 880 | |
| 881 | appendToolCallCard(callId, name, arguments, CallStatus::AwaitingConfirm); |
| 882 | PendingCall pending; |
| 883 | pending.name = name; |
| 884 | pending.arguments = arguments; |
| 885 | m_awaitingConfirm.insert(callId, pending); |
| 886 | setAwaitingConfirmation(true); |
| 887 | return; |
| 888 | } |
| 889 | |
| 890 | appendToolCallCard(callId, name, arguments, CallStatus::Running); |
| 891 | runToolCall(callId, name, arguments, true); |
| 892 | } |
| 893 | |
| 894 | /** |
| 895 | * @brief Handles end-of-stream: either continue with tool results or end the turn. |
nothing calls this directly
no test coverage detected