# Node Reference

Jido BehaviorTree provides three categories of nodes:

## Composite Nodes

Composite nodes manage the execution of multiple children.

### Sequence

Executes children in order. Succeeds if all succeed, fails if any fails.

```elixir
alias Jido.BehaviorTree.Nodes.Sequence

sequence = Sequence.new([
  ValidateNode.new(),
  ProcessNode.new(),
  SaveNode.new()
])
```

**Behavior:**
- Executes children left to right
- Returns `:failure` immediately if any child fails
- Returns `:running` if a child is still running
- Returns `:success` only when all children succeed

### Selector

Tries children in order until one succeeds. Fails only if all fail.

```elixir
alias Jido.BehaviorTree.Nodes.Selector

selector = Selector.new([
  TryLocalCache.new(),
  TryRemoteAPI.new(),
  UseFallback.new()
])
```

**Behavior:**
- Executes children left to right
- Returns `:success` immediately if any child succeeds
- Returns `:running` if a child is still running
- Returns `:failure` only when all children fail

## Decorator Nodes

Decorator nodes modify the behavior of a single child.

### Inverter

Inverts success/failure of its child.

```elixir
alias Jido.BehaviorTree.Nodes.Inverter

inverter = Inverter.new(IsEnemy.new())
```

**Behavior:**
- `:success` becomes `:failure`
- `:failure` becomes `:success`
- `:running` passes through unchanged

### Succeeder

Always returns success when child completes.

```elixir
alias Jido.BehaviorTree.Nodes.Succeeder

succeeder = Succeeder.new(OptionalAction.new())
```

**Behavior:**
- Both `:success` and `:failure` become `:success`
- `:running` passes through unchanged

### Failer

Always returns failure when child completes.

```elixir
alias Jido.BehaviorTree.Nodes.Failer

failer = Failer.new(SomeAction.new())
```

**Behavior:**
- Both `:success` and `:failure` become `:failure`
- `:running` passes through unchanged

### Repeat

Repeats child N times.

```elixir
alias Jido.BehaviorTree.Nodes.Repeat

repeat = Repeat.new(FlakyAction.new(), 3)
```

**Behavior:**
- Executes child up to N times
- Returns `:failure` immediately if child fails
- Returns `:success` after N successful executions

## Leaf Nodes

Leaf nodes perform actual work and have no children.

### Action

Executes a Jido Action.

```elixir
alias Jido.BehaviorTree.Nodes.Action

action = Action.new(MyApp.Actions.SendEmail, %{
  to: "user@example.com",
  subject: "Hello"
})

# With blackboard reference
action = Action.new(MyApp.Actions.ProcessData, %{
  data: {:from_blackboard, :input_data}
})
```

**Behavior:**
- Runs the action's `run/2` callback
- `{:ok, result}` returns `:success`
- `{:error, reason}` returns `{:error, reason}`

### Wait

Waits for a specified duration.

```elixir
alias Jido.BehaviorTree.Nodes.Wait

wait = Wait.new(1000)  # Wait 1000ms
```

**Behavior:**
- Returns `:running` until duration elapses
- Returns `:success` when complete

### SetBlackboard

Sets values in the blackboard.

```elixir
alias Jido.BehaviorTree.Nodes.SetBlackboard

# Set a single key
node = SetBlackboard.new(:status, :ready)

# Set multiple keys
node = SetBlackboard.new(%{status: :ready, timestamp: DateTime.utc_now()})
```

**Behavior:**
- Always returns `:success`
- Updates the tick's blackboard with the specified values
