# `Tinkex.SessionManager`
[🔗](https://github.com/North-Shore-AI/tinkex/blob/v0.4.0/lib/tinkex/session_manager.ex#L1)

Manages Tinkex sessions and heartbeats across multiple configs.

# `session_entry`

```elixir
@type session_entry() :: %{
  config: Tinkex.Config.t(),
  last_success_ms: non_neg_integer(),
  last_error: term() | nil,
  failure_count: non_neg_integer()
}
```

# `session_id`

```elixir
@type session_id() :: String.t()
```

# `state`

```elixir
@type state() :: %{
  sessions: %{required(session_id()) =&gt; session_entry()},
  sessions_table: atom(),
  heartbeat_interval_ms: non_neg_integer(),
  heartbeat_warning_after_ms: non_neg_integer(),
  max_failure_count: non_neg_integer() | :infinity,
  max_failure_duration_ms: non_neg_integer() | :infinity,
  session_api: module(),
  timer_ref: reference() | nil
}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `sessions_table`

# `start_link`

Start the SessionManager process.

# `start_session`

```elixir
@spec start_session(Tinkex.Config.t(), GenServer.server()) ::
  {:ok, session_id()} | {:error, term()}
```

Create a new session for the given config.

# `stop_session`

```elixir
@spec stop_session(session_id(), GenServer.server()) :: :ok
```

Stop tracking a session.

This is a synchronous call to ensure the session is removed from heartbeat
tracking before returning. This prevents race conditions where a heartbeat
fires after the caller has shut down but before the session was removed.

---

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