#pragma once
#include <format>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include <mw/error.hpp>
#include <nlohmann/json.hpp>
#include "task.hpp"
class Tool
{
public:
virtual ~Tool() = default;
virtual std::string name() const = 0;
virtual std::string description() const = 0;
virtual nlohmann::json parametersSchema() const = 0;
virtual Task<mw::E<std::string>>
execute(const nlohmann::json& arguments) = 0;
};
class ToolRegistry
{
public:
mw::E<void> registerTool(std::unique_ptr<Tool> tool);
mw::E<void> registerToolWithNamespace(const std::string& ns,
std::unique_ptr<Tool> tool);
Tool* getTool(const std::string& name) const;
std::vector<Tool*> getAllTools() const;
private:
std::unordered_map<std::string, std::unique_ptr<Tool>> tools_;
};