* @brief Folds a provider-sanitized tool name (dots/colons as '_') back to its canonical form. */
| 2111 | * @brief Folds a provider-sanitized tool name (dots/colons as '_') back to its canonical form. |
| 2112 | */ |
| 2113 | QString AI::ToolDispatcher::canonicalToolName(const QString& name) const |
| 2114 | { |
| 2115 | if (isAssistantTool(name) || isFsTool(name) || API::CommandRegistry::instance().hasCommand(name)) |
| 2116 | return name; |
| 2117 | |
| 2118 | static const auto kReverse = []() { |
| 2119 | QHash<QString, QString> map; |
| 2120 | const auto add = [&map](const QString& canonical) { |
| 2121 | QString key = canonical; |
| 2122 | key.replace(QChar('.'), QChar('_')); |
| 2123 | key.replace(QChar(':'), QChar('_')); |
| 2124 | map.insert(key, canonical); |
| 2125 | }; |
| 2126 | for (const auto& def : assistantToolDefs()) |
| 2127 | add(def.name); |
| 2128 | |
| 2129 | for (const auto& def : fsToolDefs()) |
| 2130 | add(def.name); |
| 2131 | |
| 2132 | const auto& commands = API::CommandRegistry::instance().commands(); |
| 2133 | for (auto it = commands.constBegin(); it != commands.constEnd(); ++it) |
| 2134 | add(it.value().name); |
| 2135 | |
| 2136 | return map; |
| 2137 | }(); |
| 2138 | |
| 2139 | const auto it = kReverse.constFind(name); |
| 2140 | if (it != kReverse.constEnd()) |
| 2141 | return it.value(); |
| 2142 | |
| 2143 | if (name.startsWith(QStringLiteral("meta_"))) |
| 2144 | return QStringLiteral("meta.") + name.mid(5); |
| 2145 | |
| 2146 | return name; |
| 2147 | } |
| 2148 | |
| 2149 | /** |
| 2150 | * @brief Returns the metadata block for a single command, or an empty object. |
no test coverage detected