defmodule AgentSea.Tool do
@moduledoc """
A callable tool. A tool is a *module* implementing this behaviour —
introspectable, testable, and supervisable. The parameter schema is a
`NimbleOptions` keyword spec (not Zod), used both to validate calls and to
advertise the tool to providers.
"""
@doc "Unique tool name as seen by the model."
@callback name() :: String.t()
@doc "Human/model-readable description of what the tool does."
@callback description() :: String.t()
@doc "NimbleOptions schema describing the tool's parameters."
@callback schema() :: keyword()
@doc "Execute the tool with validated params and an execution context."
@callback run(params :: map(), ctx :: map()) :: {:ok, term()} | {:error, term()}
@doc "Whether a human must approve before execution (HITL). Defaults to false."
@callback needs_approval?() :: boolean()
@optional_callbacks needs_approval?: 0
end