Every AgentSessionManager.Core.Event includes schema_version.
Current Contract
Event.to_map/1always writes"schema_version".Event.from_map/1requires"schema_version"to be present."schema_version"must be an integer>= 1.- Missing,
nil, or invalid values return{:error, %Error{code: :validation_error}}.
Writing Events
{:ok, event} =
Event.new(%{
type: :session_created,
session_id: "ses_001"
})
map = Event.to_map(event)
map["schema_version"]
# => 1Event.new/1 defaults to version 1 unless explicitly overridden.
Reading Events
{:ok, event} =
Event.from_map(%{
"id" => "evt_001",
"type" => "session_created",
"session_id" => "ses_001",
"timestamp" => "2025-01-27T12:00:00Z",
"schema_version" => 1
})
event.schema_version
# => 1Invalid input examples:
# Missing schema_version
{:error, error} = Event.from_map(%{
"id" => "evt_002",
"type" => "run_started",
"session_id" => "ses_001",
"timestamp" => "2025-01-27T12:00:00Z"
})
# Non-integer schema_version
{:error, error} = Event.from_map(%{
"id" => "evt_003",
"type" => "run_started",
"session_id" => "ses_001",
"timestamp" => "2025-01-27T12:00:00Z",
"schema_version" => "1"
})Database Storage
Store adapters persist schema version as an integer column:
schema_version INTEGER NOT NULLUse a default at the database layer if needed, but serialized event payloads
must still include schema_version when read via Event.from_map/1.
Adding New Event Fields
When extending the event schema:
- Add the field to
Eventwith a sensible default. - Bump the default version used for new events.
- Update
to_map/1andfrom_map/1. - Add required database migration changes.
- Keep
from_map/1strict aboutschema_version.