# `ASM.ProviderFeatures`
[🔗](https://github.com/nshkrdotcom/agent_session_manager/blob/v0.15.0/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

# `capability_manifest`

```elixir
@type capability_manifest() :: %{
  supported?: boolean(),
  lane: atom() | [atom()],
  provider_native?: boolean(),
  common_surface?: boolean(),
  support_state:
    :common | :native | :sdk_local | :event_only | :unsupported | :planned,
  asm_option_keys: [atom()],
  provider_native_option_keys: [atom()],
  event_kinds: [atom()],
  live_example: String.t() | nil,
  notes: [String.t()]
}
```

# `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()]
}
```

# `lane_manifest`

```elixir
@type lane_manifest() :: %{
  provider: ASM.Provider.provider_name(),
  lane: atom(),
  composition_mode: :common_surface_only | :native_extension,
  sdk_available?: boolean(),
  native_namespaces: [module()],
  capabilities: %{optional(atom()) =&gt; capability_manifest()}
}
```

# `manifest`

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

# `permission_manifest`

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

# `capability`

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

# `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()
```

# `lane_manifest`

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

# `lane_manifest!`

```elixir
@spec lane_manifest!(ASM.Provider.t() | ASM.Provider.provider_name(), atom()) ::
  lane_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()
```

# `require_capability`

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

# `support_states`

```elixir
@spec support_states() :: [atom()]
```

# `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*
