"""Conversion functions between ADK models and database records.
Implements full-event JSON storage: the entire Event is serialized via
``Event.model_dump(exclude_none=True, mode="json")`` into a single ``event_data``
column, with a small set of indexed scalar columns extracted alongside for
query performance. Reconstruction uses ``Event.model_validate()``.
Also provides scoped-state helpers that normalise ADK state prefixes
(``app:``, ``user:``, ``temp:``) so the shared service layer can split,
filter, and merge state before handing it to backend stores.
"""
from datetime import datetime, timezone
from typing import Any
from google.adk.events.event import Event
from google.adk.sessions import Session
from sqlspec.extensions.adk._types import StoredEvent, StoredSession
__all__ = (
"compute_update_marker",
"event_to_record",
"filter_temp_state",
"merge_scoped_state",
"merge_state",
"record_to_event",
"record_to_session",
"session_to_record",
"split_scoped_state",
"split_state_by_prefix",
)
# ---------------------------------------------------------------------------
# Session converters
# ---------------------------------------------------------------------------
def session_to_record(session: "Session") -> StoredSession:
"""Convert ADK Session to database record.
Args:
session: ADK Session object.
Returns:
StoredSession for database storage.
"""
return StoredSession(
id=session.id,
app_name=session.app_name,
user_id=session.user_id,
state=filter_temp_state(session.state),
# create_time is not exposed by ADK Session; a re-upsert of a restored session will reset this timestamp.
create_time=datetime.now(timezone.utc),
update_time=datetime.fromtimestamp(session.last_update_time, tz=timezone.utc),
)