use crate::provider::{ContentPart, Message, Role};
const RESET_MARKER_PREFIX: &str = "[CONTEXT RESET]";
pub(super) fn last_user_index(messages: &[Message]) -> Option<usize> {
messages
.iter()
.enumerate()
.rev()
.find(|(_, m)| matches!(m.role, Role::User))
.map(|(i, _)| i)
}
pub(super) fn build_reset_summary_message(summary: &str) -> Message {
Message {
role: Role::Assistant,
content: vec![ContentPart::Text {
text: format!(
"{RESET_MARKER_PREFIX}\nEverything older than the current user turn was \
compressed into the summary below. Recent turns were \
intentionally discarded — call `session_recall` if you need \
a specific dropped detail.\n\n{summary}"
),
}],
}
}
pub(super) fn latest_reset_marker_index(messages: &[Message]) -> Option<usize> {
messages
.iter()
.enumerate()
.rev()
.find(|(_, msg)| message_has_reset_marker(msg))
.map(|(idx, _)| idx)
}
fn message_has_reset_marker(msg: &Message) -> bool {
msg.content.iter().any(|part| match part {
ContentPart::Text { text } => text.starts_with(RESET_MARKER_PREFIX),
ContentPart::ToolResult { content, .. } => content.starts_with(RESET_MARKER_PREFIX),
_ => false,
})
}
#[cfg(test)]
mod tests;