Port for talking to a Gralkor backend from Elixir.
Operations — recall, capture, end_session, memory_add, health_check,
build_indices, build_communities. Every failure is reported as
{:error, reason} so callers can decide how to fail open. Group IDs
are sanitised at the edge (sanitize_group_id/1) to satisfy Gralkor's
RediSearch constraint.
The concrete adapter is resolved from Application.get_env(:gralkor_ex, :client);
defaults to Gralkor.Client.HTTP. Tests swap in Gralkor.Client.InMemory.
Summary
Types
@type group_id() :: String.t()
@type messages() :: [Gralkor.Message.t()]
@type session_id() :: String.t()
Callbacks
@callback build_communities(group_id()) :: {:ok, %{communities: non_neg_integer(), edges: non_neg_integer()}} | {:error, term()}
@callback capture(session_id(), group_id(), messages()) :: :ok | {:error, term()}
@callback end_session(session_id()) :: :ok | {:error, term()}
@callback health_check() :: :ok | {:error, term()}
@callback recall(group_id(), session_id() | nil, query :: String.t()) :: {:ok, String.t() | nil} | {:error, term()}