# `CliSubprocessCore.ProviderFeatures`
[🔗](https://github.com/nshkrdotcom/cli_subprocess_core/blob/v0.7.0/lib/cli_subprocess_core/provider_features.ex#L1)

Canonical provider feature metadata for the built-in CLI profiles.

This module is the public, authoritative source for:

- provider-native permission mode terminology and CLI flag rendering
- provider-local partial features such as Ollama-backed model routing
- decomposed tool capability metadata for normalized observation versus
  unadmitted host execution

# `manifest`

```elixir
@type manifest() :: %{
  provider: atom(),
  permission_modes: %{optional(atom()) =&gt; permission_manifest()},
  partial_features: %{optional(atom()) =&gt; partial_feature_manifest()},
  tool_capabilities: tool_capability_manifest()
}
```

# `partial_feature_manifest`

```elixir
@type partial_feature_manifest() :: %{
  supported?: boolean(),
  activation: map() | nil,
  model_strategy: atom() | nil,
  compatibility: map() | nil,
  notes: [String.t()]
}
```

# `permission_manifest`

```elixir
@type permission_manifest() :: %{
  native_mode: atom(),
  cli_args: [String.t()],
  cli_excerpt: String.t() | nil,
  label: String.t()
}
```

# `tool_capability_key`

```elixir
@type tool_capability_key() ::
  :tool_events
  | :tool_results
  | :host_tools
  | :tool_allowlist
  | :tool_denylist
  | :mcp_servers
  | :provider_builtin_tools
  | :no_tool_mode
```

# `tool_capability_manifest`

```elixir
@type tool_capability_manifest() :: %{
  required(tool_capability_key()) =&gt; tool_capability_value(),
  optional(:notes) =&gt; [String.t()]
}
```

# `tool_capability_value`

```elixir
@type tool_capability_value() :: boolean() | :unknown
```

# `manifest`

```elixir
@spec manifest(atom()) :: {:ok, manifest()} | :error
```

# `manifest!`

```elixir
@spec manifest!(atom()) :: manifest()
```

# `partial_feature`

```elixir
@spec partial_feature(atom(), atom()) :: {:ok, partial_feature_manifest()} | :error
```

# `partial_feature!`

```elixir
@spec partial_feature!(atom(), atom()) :: partial_feature_manifest()
```

# `permission_args`

```elixir
@spec permission_args(atom(), atom() | String.t()) :: [String.t()]
```

# `permission_mode`

```elixir
@spec permission_mode(atom(), atom() | String.t()) ::
  {:ok, permission_manifest()} | :error
```

# `permission_mode!`

```elixir
@spec permission_mode!(atom(), atom() | String.t()) :: permission_manifest()
```

# `require_option`

```elixir
@spec require_option(atom(), atom(), atom(), term()) ::
  :ok | {:error, CliSubprocessCore.ProviderFeatures.Error.t()}
```

Requires a built-in provider feature when its activating option is requested.

`nil` and `false` are not requests. Unsupported and unknown feature states
return a typed `CliSubprocessCore.ProviderFeatures.Error`.

# `tool_capabilities`

```elixir
@spec tool_capabilities(atom()) :: {:ok, tool_capability_manifest()} | :error
```

Returns decomposed tool capability metadata for a built-in provider.

`:tool_events` and `:tool_results` describe normalized observation payloads
emitted by the core provider profiles. They do not imply host-executable tool
registration, provider-native tool configuration, or tool suppression.

# `tool_capabilities!`

```elixir
@spec tool_capabilities!(atom()) :: tool_capability_manifest()
```

# `tool_capability`

```elixir
@spec tool_capability(atom(), tool_capability_key()) ::
  {:ok, tool_capability_value()} | :error
```

# `tool_capability!`

```elixir
@spec tool_capability!(atom(), tool_capability_key()) :: tool_capability_value()
```

# `tool_capability_keys`

```elixir
@spec tool_capability_keys() :: [tool_capability_key(), ...]
```

Returns the required decomposed tool capability keys.

---

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