# `ReqManagedAgents.Provisioner`
[🔗](https://github.com/cash-mckeeman/req_managed_agents/blob/v0.12.0/req_managed_agents/lib/req_managed_agents/provisioner.ex#L1)

Hash-keyed provision cache. `ensure/3` returns a cached provider `handle` for a given
`{provider, spec}`, calling `provider.provision/2` only on a miss. The handle is the
durable artifact; where the `{hash → handle}` mapping lives is pluggable via the
`ReqManagedAgents.Provisioner.Store` behaviour (`:store` option) — in-process ETS by
default, or a persistent store (e.g. `Store.File`) for reuse across OS processes.

# `ensure`

```elixir
@spec ensure(module(), ReqManagedAgents.Provider.spec(), keyword()) ::
  {:ok, ReqManagedAgents.Provider.handle()} | {:error, term()}
```

# `ensure_agent`

# `ensure_environment`

# `evict`

```elixir
@spec evict(
  ReqManagedAgents.Provider.handle(),
  keyword()
) :: :ok
```

Drop any cache entry whose value is `handle` (called after teardown). With a
persistent store (e.g. `Store.File`) the handle must be JSON-encodable —
same constraint as `ensure/3`'s store writes; non-encodable values raise.

# `prune_agents`

# `prune_environments`

# `resolve`

# `resolve_agent`

# `tag`

# `tag_agent`

---

*Consult [api-reference.md](api-reference.md) for complete listing*
