BareGit
#pragma once

#include <optional>
#include <string>
#include <variant>
#include <vector>

#include <nlohmann/json.hpp>

struct SystemMessage
{
    std::string content;
};

struct UserMessage
{
    std::string content;
};

struct ToolCall
{
    std::string id;
    std::string name;
    nlohmann::json arguments;
};

struct AssistantMessage
{
    std::optional<std::string> content;
    std::vector<ToolCall> tool_calls;
};

struct ToolResultMessage
{
    std::string tool_call_id;
    std::string content;
};

using Message = std::variant<SystemMessage, UserMessage, AssistantMessage,
                             ToolResultMessage>;

nlohmann::json toJson(const SystemMessage& msg);
nlohmann::json toJson(const UserMessage& msg);
nlohmann::json toJson(const ToolCall& msg);
nlohmann::json toJson(const AssistantMessage& msg);
nlohmann::json toJson(const ToolResultMessage& msg);
nlohmann::json toJson(const Message& msg);

struct Skill
{
    std::string name;
    std::string system_prompt;
    std::vector<std::string> allowed_tools;
};