GEPA-facing portable tool specification.
The first shipping slice uses this for ReqLLM conversion only. ASM tool-loop support remains capability-gated until the shared CLI tool surface exists.
@type callback() :: (map(), map() -> {:ok, term()} | {:error, term()})
@type t() :: %GEPA.LLM.Tool{ description: String.t(), input_schema: map() | keyword(), metadata: map(), name: String.t(), run: callback() | nil }
@spec new(keyword()) :: t()