pub const RETRIEVE_TOOL_NAME: &str = "tokenjuice_retrieve";
pub const LEGACY_RETRIEVE_TOOL_NAME: &str = "retrieve_tool_output";
pub const RECOVERY_TOOL_NAMES: &[&str] = &[RETRIEVE_TOOL_NAME, LEGACY_RETRIEVE_TOOL_NAME];
pub const NEVER_COMPACT_TOOLS: &[&str] = RECOVERY_TOOL_NAMES;
pub fn is_recovery_tool(tool_name: &str) -> bool {
RECOVERY_TOOL_NAMES.contains(&tool_name)
}
pub fn format_marker(hash: &str) -> String {
format!("⟦tj:{hash}⟧")
}
pub fn recovery_footer(hash: &str, original_bytes: usize, lossy: bool) -> String {
let marker = format_marker(hash);
if lossy {
format!(
"\n\n[compacted tool output — this is a PARTIAL view; the full original \
({original_bytes} bytes) is available by calling {RETRIEVE_TOOL_NAME} with \
token \"{hash}\" (marker {marker})]"
)
} else {
format!(
"\n\n[reformatted tool output — no data lost, but layout changed; the exact \
original ({original_bytes} bytes) is available by calling {RETRIEVE_TOOL_NAME} \
with token \"{hash}\" (marker {marker})]"
)
}
}
pub fn parse_markers(text: &str) -> Vec<String> {
let mut out: Vec<String> = Vec::new();
let mut push = |h: &str| {
let h = h.trim();
if !h.is_empty() && !out.iter().any(|e| e == h) {
out.push(h.to_string());
}
};
let mut rest = text;
while let Some(start) = rest.find("⟦tj:") {
let after = &rest[start + "⟦tj:".len()..];
if let Some(end) = after.find('⟧') {
push(&after[..end]);
rest = &after[end..];
} else {
break;
}
}
for needle in [
"retrieve_tool_output(\"",
"tokenjuice_retrieve(\"",
"token \"",
] {
let mut rest = text;
while let Some(start) = rest.find(needle) {
let after = &rest[start + needle.len()..];
if let Some(end) = after.find('"') {
push(&after[..end]);
rest = &after[end..];
} else {
break;
}
}
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn formats_and_parses_canonical() {
let m = format_marker("ab12cd34");
assert_eq!(m, "⟦tj:ab12cd34⟧");
assert_eq!(
parse_markers(&format!("see {m} for more")),
vec!["ab12cd34"]
);
}
#[test]
fn parses_legacy_form() {
let text = "partial; call retrieve_tool_output(\"deadbeef00\") to recover";
assert_eq!(parse_markers(text), vec!["deadbeef00"]);
}
#[test]
fn parses_multiple_dedup() {
let text = "⟦tj:aaa⟧ and ⟦tj:bbb⟧ and again ⟦tj:aaa⟧";
assert_eq!(parse_markers(text), vec!["aaa", "bbb"]);
}
#[test]
fn footer_carries_token() {
let f = recovery_footer("c0ffee", 1234, true);
assert!(f.contains("PARTIAL view"));
assert!(f.contains("c0ffee"));
assert_eq!(parse_markers(&f), vec!["c0ffee"]);
}
}