# `ASM.ProviderFeatures`
[🔗](https://github.com/nshkrdotcom/agent_session_manager/blob/v0.9.2/lib/asm/provider_features.ex#L1)

Public provider feature manifests for ASM.

This module exposes two related surfaces:

- provider-native permission mode metadata inherited from
  `CliSubprocessCore.ProviderFeatures`
- ASM common features that are only supported by some providers, such as the
  common Ollama surface

# `common_feature_manifest`

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

# `manifest`

```elixir
@type manifest() :: %{
  provider: ASM.Provider.provider_name(),
  permission_modes: %{optional(atom()) =&gt; permission_manifest()},
  common_features: %{optional(atom()) =&gt; common_feature_manifest()}
}
```

# `permission_manifest`

```elixir
@type permission_manifest() ::
  CliSubprocessCore.ProviderFeatures.permission_manifest()
```

# `common_feature`

```elixir
@spec common_feature(ASM.Provider.t() | ASM.Provider.provider_name(), atom()) ::
  {:ok, common_feature_manifest()} | {:error, ASM.Error.t()}
```

# `common_feature!`

```elixir
@spec common_feature!(ASM.Provider.t() | ASM.Provider.provider_name(), atom()) ::
  common_feature_manifest()
```

# `manifest`

```elixir
@spec manifest(ASM.Provider.t() | ASM.Provider.provider_name()) ::
  {:ok, manifest()} | {:error, ASM.Error.t()}
```

# `manifest!`

```elixir
@spec manifest!(ASM.Provider.t() | ASM.Provider.provider_name()) :: manifest()
```

# `permission_mode`

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

# `permission_mode!`

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

# `supports_common_feature?`

```elixir
@spec supports_common_feature?(
  ASM.Provider.t() | ASM.Provider.provider_name(),
  atom()
) :: boolean()
```

---

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