# `ClaudeAgentSDK.Permission.Update`
[🔗](https://github.com/nshkrdotcom/claude_agent_sdk/blob/v0.15.0/lib/claude_agent_sdk/permission/update.ex#L1)

Permission update types for configuring permissions via the control protocol.

These types match the TypeScript/Python SDK permission update structures and can
be used to programmatically update tool permissions in sessions.

## Update Types

- `:add_rules` - Add new permission rules
- `:replace_rules` - Replace existing permission rules
- `:remove_rules` - Remove specific permission rules
- `:set_mode` - Change the permission mode
- `:add_directories` - Add directories to allowed paths
- `:remove_directories` - Remove directories from allowed paths

## Destinations

Permission updates can target different storage locations:

- `:user_settings` - User-level settings (persistent)
- `:project_settings` - Project-level settings (persistent)
- `:local_settings` - Local directory settings (persistent)
- `:session` - Session-only settings (temporary)

## Examples

    # Add a rule to allow Bash commands in session
    update = Update.add_rules(
      rules: [RuleValue.new("Bash", "echo *")],
      behavior: :allow,
      destination: :session
    )

    # Set permission mode for the session
    update = Update.set_mode(:accept_edits, destination: :session)

# `behavior`

```elixir
@type behavior() :: :allow | :deny | :ask
```

Permission behavior for rules.

# `destination`

```elixir
@type destination() :: :user_settings | :project_settings | :local_settings | :session
```

Destination for permission updates.

# `t`

```elixir
@type t() :: %ClaudeAgentSDK.Permission.Update{
  behavior: behavior() | nil,
  destination: destination() | nil,
  directories: [String.t()] | nil,
  mode: ClaudeAgentSDK.Permission.permission_mode() | nil,
  rules: [ClaudeAgentSDK.Permission.RuleValue.t()] | nil,
  type: update_type()
}
```

Permission update struct.

# `update_type`

```elixir
@type update_type() ::
  :add_rules
  | :replace_rules
  | :remove_rules
  | :set_mode
  | :add_directories
  | :remove_directories
```

Permission update type.

# `add_directories`

```elixir
@spec add_directories(
  [String.t()],
  keyword()
) :: t()
```

Creates an add_directories update.

# `add_rules`

```elixir
@spec add_rules(keyword()) :: t()
```

Creates an add_rules update.

# `new`

```elixir
@spec new(
  update_type(),
  keyword()
) :: t()
```

Creates a new permission update.

## Parameters

- `type` - Update type (:add_rules, :replace_rules, :remove_rules, :set_mode, :add_directories, :remove_directories)
- `opts` - Options for the update (rules, behavior, mode, directories, destination)

## Examples

    Update.new(:add_rules,
      rules: [RuleValue.new("Bash", "echo *")],
      behavior: :allow,
      destination: :session
    )

# `remove_directories`

```elixir
@spec remove_directories(
  [String.t()],
  keyword()
) :: t()
```

Creates a remove_directories update.

# `remove_rules`

```elixir
@spec remove_rules(keyword()) :: t()
```

Creates a remove_rules update.

# `replace_rules`

```elixir
@spec replace_rules(keyword()) :: t()
```

Creates a replace_rules update.

# `set_mode`

```elixir
@spec set_mode(
  ClaudeAgentSDK.Permission.permission_mode(),
  keyword()
) :: t()
```

Creates a set_mode update.

# `to_map`

```elixir
@spec to_map(t()) :: map()
```

Converts a permission update to a map for the control protocol.

## Examples

    iex> update = Update.add_rules(
    ...>   rules: [RuleValue.new("Bash", "echo *")],
    ...>   behavior: :allow,
    ...>   destination: :session
    ...> )
    iex> Update.to_map(update)
    %{
      "type" => "addRules",
      "rules" => [%{"toolName" => "Bash", "ruleContent" => "echo *"}],
      "behavior" => "allow",
      "destination" => "session"
    }

---

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