# `Raxol.AgentClientProtocol.Schema.ClientTypes.PermissionOptionKind`
[🔗](https://github.com/DROOdotFOO/raxol-agent/blob/raxol_agent_client_protocol-v0.1.0/packages/raxol_agent_client_protocol/lib/raxol/agent_client_protocol/schema/client_types.ex#L251)

Hint about the nature of a `PermissionOption`, so clients can choose
appropriate icons/UI treatment.

Unlike `ToolKind`/`ToolCallStatus` elsewhere in this schema layer, decode
here is deliberately **not** infallible-with-a-default: the ACP schema
documents no default for this enum (no `x-deserialize-default-on-error`),
and silently coercing an unrecognized permission-option kind to some
arbitrary member (e.g. `:reject_once`) would misrepresent a
safety-relevant value rather than gracefully degrade one. An unrecognized
wire value is a decode error instead.

Ported from the MIT `f1729/agent_client_protocol` (c) 2025 f1729; see NOTICE.md.

# `t`

```elixir
@type t() :: :allow_once | :allow_always | :reject_once | :reject_always
```

# `from_json`

```elixir
@spec from_json(term()) ::
  {:ok, t()} | {:error, {:invalid_permission_option_kind, term()}}
```

Total: never raises. An unrecognized wire value is an error, not a silently-coerced default.

# `to_json`

```elixir
@spec to_json(t()) :: String.t()
```

---

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