Jido plugin that replaces Jido.Memory.BasicPlugin with Gralkor-backed
memory. Claims the :__memory__ slot so it is the only memory plugin
attached to the agent.
session_id is the current Jido thread id, read from
agent.state[:__thread__].id. One Jido thread per Gralkor session —
the capture buffer rotates naturally when the thread rotates, and
concurrent agents for the same principal never collide on the buffer.
group_id is sanitize_group_id(agent.id) since memory graph
partitioning is per-principal.
Recall fires on ai.react.query: if a thread is already committed in
agent state, recall Gralkor for the current thread's session; inject
the session id into the signal's tool_context so in-turn tool calls
(e.g. MemorySearch) key on the same session. On the very first
query of a fresh agent, ThreadAgent.append hasn't yet run (the
ReAct strategy calls it inside @start, after the plugin hook), so
there's nothing to recall against — the plugin passes the signal
through unchanged and lets capture establish the session when the
turn completes.
Capture fires on ai.request.completed / ai.request.failed: the
full request trace and assistant answer are normalised via
JidoGralkor.Canonical.to_messages/3 into Gralkor's canonical
[%Gralkor.Message{role, content}] shape and shipped to the server,
which keeps the rolling conversation buffer keyed by session_id.
The <gralkor-memory>…</gralkor-memory> recall envelope this plugin
prepended earlier in the turn is stripped during canonicalisation
so recalled facts don't appear in the episode body and feed back
through Graphiti extraction. Capture is skipped if the thread isn't
present (first-turn failure with nothing committed) or if the
canonical message list is empty.
Gralkor errors raise — the caller sees the real error, per the project's fail-fast rule.
Summary
Functions
Returns metadata for Jido.Discovery integration.
Returns the list of action modules provided by this plugin.
Returns the capabilities provided by this plugin.
Returns the plugin's category.
Returns the Zoi schema for per-agent configuration.
Returns the plugin's description.
Returns the plugin manifest with all metadata.
Returns the plugin's name.
Returns the OTP application for config resolution.
Returns the plugin specification with optional per-agent configuration.
Returns the requirements for this plugin.
Returns the schedules for this plugin.
Returns the Zoi schema for plugin state.
Returns the signal patterns this plugin handles.
Returns the signal routes for this plugin.
Returns whether this plugin is a singleton.
Returns the key used to store plugin state in the agent.
Returns the sensor subscriptions for this plugin.
Returns the plugin's tags.
Returns the plugin's version.
Functions
@spec __plugin_metadata__() :: map()
Returns metadata for Jido.Discovery integration.
This function is used by Jido.Discovery to index plugins
for fast lookup and filtering.
@spec actions() :: [module()]
Returns the list of action modules provided by this plugin.
@spec capabilities() :: [atom()]
Returns the capabilities provided by this plugin.
@spec category() :: String.t() | nil
Returns the plugin's category.
@spec config_schema() :: Zoi.schema() | nil
Returns the Zoi schema for per-agent configuration.
@spec description() :: String.t() | nil
Returns the plugin's description.
@spec manifest() :: Jido.Plugin.Manifest.t()
Returns the plugin manifest with all metadata.
The manifest provides compile-time metadata for discovery and introspection, including capabilities, requirements, signal routes, and schedules.
@spec name() :: String.t()
Returns the plugin's name.
@spec otp_app() :: atom() | nil
Returns the OTP application for config resolution.
@spec plugin_spec(map()) :: Jido.Plugin.Spec.t()
Returns the plugin specification with optional per-agent configuration.
Examples
spec = MyModule.plugin_spec(%{})
spec = MyModule.plugin_spec(%{custom_option: true})
@spec requires() :: [tuple()]
Returns the requirements for this plugin.
@spec schedules() :: [tuple()]
Returns the schedules for this plugin.
@spec schema() :: Zoi.schema() | nil
Returns the Zoi schema for plugin state.
@spec signal_patterns() :: [String.t()]
Returns the signal patterns this plugin handles.
@spec signal_routes() :: [tuple()]
Returns the signal routes for this plugin.
@spec singleton?() :: boolean()
Returns whether this plugin is a singleton.
@spec state_key() :: atom()
Returns the key used to store plugin state in the agent.
@spec subscriptions() :: [tuple()]
Returns the sensor subscriptions for this plugin.
@spec tags() :: [String.t()]
Returns the plugin's tags.
@spec vsn() :: String.t() | nil
Returns the plugin's version.