defmodule AgentSea.Crew.Delegation.RoundRobin do
@moduledoc """
Cycles through agents by position. The position is supplied via `ctx.counter`
(the coordinator owns and advances it), keeping the strategy pure.
"""
@behaviour AgentSea.Crew.Delegation
alias AgentSea.Crew.Delegation.Result
@impl true
def delegate(_task, [], _ctx), do: {:error, :no_agents}
def delegate(_task, agents, ctx) do
position = rem(Map.get(ctx, :counter, 0), length(agents))
selected = Enum.at(agents, position)
{:ok,
%Result{
selected_agent: selected.name,
confidence: 1.0,
reason: "round-robin position #{position}",
alternatives: agents |> List.delete_at(position) |> Enum.map(& &1.name)
}}
end
end