# `Agentic.Loop.ContextCompression`

Two-tier context compression: truncation for moderate overflow, LLM-based
summarization for severe overflow.

Ported from Homunculus MemoryManager.optimize_context pattern.

## Strategy

- When context is < 2× budget: truncate older messages (keep recent ones intact)
- When context is ≥ 2× budget: use LLM summarization via `llm_chat` callback
- Falls back to truncation on LLM error

# `available?`

Check if LLM-based summarization is available for this context.

# `compress`

```elixir
@spec compress([map()], non_neg_integer(), Agentic.Loop.Context.t()) ::
  {[map()], boolean()}
```

Compress messages to fit within a token budget.

Returns `{compressed_messages, was_summarized}`.

# `estimate_tokens`

```elixir
@spec estimate_tokens([map()]) :: non_neg_integer()
```

Estimate token count for a list of messages.

# `truncate`

```elixir
@spec truncate([map()], non_neg_integer()) :: [map()]
```

Truncate messages to fit within a token budget, keeping system + recent messages.

---

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