use objectiveai_sdk::agent::InlineAgentBaseWithFallbacksOrRemoteCommitOptional;
use sqlx::Row as _;
use super::super::{Error, Pool};
#[derive(Debug, Clone)]
pub struct SessionLookup {
pub agent: InlineAgentBaseWithFallbacksOrRemoteCommitOptional,
pub continuation: Option<String>,
}
pub async fn lookup_session(
pool: &Pool,
agent_instance_hierarchy: &str,
) -> Result<Option<SessionLookup>, Error> {
let Some((_, response_id)) = agent_instance_hierarchy.rsplit_once('-') else {
return Ok(None);
};
let row = sqlx::query(
"SELECT req.body AS request_body, cont.continuation AS continuation \
FROM logs.agent_completion_requests req \
LEFT JOIN agent_continuations cont \
ON cont.agent_instance_hierarchy = $2 \
WHERE req.response_id = $1",
)
.bind(response_id)
.bind(agent_instance_hierarchy)
.fetch_optional(&**pool)
.await?;
let Some(row) = row else { return Ok(None) };
let request_body: serde_json::Value = row.try_get("request_body")?;
let continuation: Option<String> = row.try_get("continuation")?;
let agent_value = request_body.get("agent").cloned().ok_or_else(|| {
Error::InvalidData(format!(
"agent_completion_requests.body missing `agent` field for response_id {response_id}",
))
})?;
let agent: InlineAgentBaseWithFallbacksOrRemoteCommitOptional =
serde_json::from_value(agent_value)?;
Ok(Some(SessionLookup { agent, continuation }))
}