use crate::brain::tools::suggest_options::{MAX_OPTIONS, RawSuggestionItem, SuggestionItem};
const MARKER: &str = "<<suggest_options>>";
pub fn extract_leaked_suggestions(text: &str) -> (String, Option<Vec<SuggestionItem>>) {
let Some(start) = text.find(MARKER) else {
return (text.to_string(), None);
};
let inner_start = start + MARKER.len();
let Some(rel_end) = text[inner_start..].find(MARKER) else {
let mut cleaned = String::with_capacity(text.len());
cleaned.push_str(&text[..start]);
cleaned.push_str(&text[inner_start..]);
return (cleaned, None);
};
let tail_start = inner_start + rel_end + MARKER.len();
let inner = text[inner_start..inner_start + rel_end].trim();
let parsed = serde_json::from_str::<Vec<RawSuggestionItem>>(inner)
.ok()
.filter(|items| !items.is_empty())
.map(|items| {
items
.into_iter()
.take(MAX_OPTIONS)
.map(RawSuggestionItem::into_suggestion_item)
.collect::<Vec<SuggestionItem>>()
});
let head = text[..start].trim_end();
let tail = text[tail_start..].trim_start();
let mut cleaned = String::with_capacity(text.len());
cleaned.push_str(head);
if !head.is_empty() && !tail.is_empty() {
cleaned.push_str("\n\n");
}
cleaned.push_str(tail);
(cleaned, parsed)
}