use super::model::*;
use crate::types::*;
pub(super) fn session_id_from_loop_id(loop_id: &str) -> String {
match loop_id.find('.') {
Some(pos) => loop_id[..pos].to_string(),
None => loop_id.to_string(),
}
}
pub(super) fn loop_id_of(event: &AgentEvent) -> Option<&str> {
match event {
AgentEvent::TurnStart { loop_id, .. } => Some(loop_id),
AgentEvent::MessageStart { loop_id, .. } => Some(loop_id),
AgentEvent::MessageEnd { loop_id, .. } => Some(loop_id),
AgentEvent::ToolExecutionStart { loop_id, .. } => Some(loop_id),
AgentEvent::ToolExecutionUpdate { loop_id, .. } => Some(loop_id),
AgentEvent::ProgressMessage { loop_id, .. } if !loop_id.is_empty() => Some(loop_id),
AgentEvent::InputRejected { loop_id, .. } if !loop_id.is_empty() => Some(loop_id),
AgentEvent::CompactionStarted { loop_id, .. } => Some(loop_id),
AgentEvent::CompactionEnded { loop_id, .. } => Some(loop_id),
AgentEvent::PrunApplied { loop_id, .. } => Some(loop_id),
_ => None,
}
}
pub(super) fn config_segment_from_loop_id(loop_id: &str) -> Option<String> {
let first = loop_id.find('.')?;
let after = &loop_id[first + 1..];
let last = after.rfind('.')?;
Some(after[..last].to_string())
}
pub(super) fn extract_config_snapshot(
messages: &[AgentMessage],
loop_id: &str,
) -> Option<LoopConfigSnapshot> {
messages.iter().find_map(|m| {
if let AgentMessage::Llm(LlmMessage {
message: Message::Assistant {
model, provider, ..
},
..
}) = m
{
Some(LoopConfigSnapshot {
model: model.clone(),
provider: provider.clone(),
config_id: config_segment_from_loop_id(loop_id),
name: None,
api: None,
base_url: None,
reasoning: None,
context_window: None,
max_tokens: None,
thinking_level: None,
temperature: None,
})
} else {
None
}
})
}