Behaviour for storage backends.
The base behaviour defines conversation and message callbacks that every
adapter must implement. Sub-behaviours (FactStore, ProfileStore) are
optional — adapters implement them to support long-term memory.
Summary
Callbacks
@callback add_message( conversation_id :: String.t(), PhoenixAI.Store.Message.t(), opts :: keyword() ) :: {:ok, PhoenixAI.Store.Message.t()} | {:error, term()}
@callback count_conversations(filters :: keyword(), opts :: keyword()) :: {:ok, non_neg_integer()} | {:error, term()}
@callback get_messages(conversation_id :: String.t(), opts :: keyword()) :: {:ok, [PhoenixAI.Store.Message.t()]} | {:error, term()}
@callback list_conversations(filters :: keyword(), opts :: keyword()) :: {:ok, [PhoenixAI.Store.Conversation.t()]} | {:error, term()}
@callback load_conversation(id :: String.t(), opts :: keyword()) :: {:ok, PhoenixAI.Store.Conversation.t()} | {:error, :not_found | term()}
@callback save_conversation(PhoenixAI.Store.Conversation.t(), opts :: keyword()) :: {:ok, PhoenixAI.Store.Conversation.t()} | {:error, term()}