use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
use serde_json::Value;
const EXPAND_OPEN: &str = "<lc_expand:";
const EXPAND_CLOSE: char = '>';
pub(crate) const MIN_TEE_BYTES: usize = 512;
const CLEANUP_INTERVAL_SECS: u64 = 600;
const TEE_HASH_LEN: usize = 16;
const SHELL_TEE_HASH_LEN: usize = 8;
fn tee_path(content: &str, prefix: &str) -> Option<PathBuf> {
let dir = crate::core::paths::state_dir().ok()?.join("tee");
let hash = crate::core::hasher::hash_short(content);
Some(dir.join(format!("{prefix}_{hash}.log")))
}
fn maybe_cleanup(tee_dir: &Path) {
static LAST: AtomicU64 = AtomicU64::new(0);
let Ok(now) = SystemTime::now().duration_since(UNIX_EPOCH) else {
return;
};
let now = now.as_secs();
let last = LAST.load(Ordering::Relaxed);
if now.saturating_sub(last) < CLEANUP_INTERVAL_SECS {
return;
}
if LAST
.compare_exchange(last, now, Ordering::Relaxed, Ordering::Relaxed)
.is_ok()
{
crate::shell::cleanup_old_tee_logs(tee_dir);
}
}
pub(crate) fn persist(content: &str) -> Option<String> {
persist_with(content, "proxy")
}
#[cfg_attr(not(test), allow(dead_code))] pub(crate) fn persist_conversation(content: &str) -> Option<String> {
let path = persist_with_min(content, "conv", 1)?;
Path::new(&path)
.file_name()
.and_then(|name| name.to_str())
.map(str::to_owned)
}
pub(crate) fn persist_json(content: &str) -> Option<String> {
persist_with(content, "json")
}
pub(crate) fn persist_tabular(content: &str) -> Option<String> {
persist_with(content, "tbl")
}
pub(crate) fn persist_yaml(content: &str) -> Option<String> {
persist_with(content, "yaml")
}
pub(crate) fn persist_html(content: &str) -> Option<String> {
persist_with(content, "html")
}
fn persist_with(content: &str, prefix: &str) -> Option<String> {
persist_with_min(content, prefix, MIN_TEE_BYTES)
}
fn persist_with_min(content: &str, prefix: &str, min_bytes: usize) -> Option<String> {
if content.len() < min_bytes {
return None;
}
let path = tee_path(content, prefix)?;
let handle = path.to_string_lossy().to_string();
if !path.exists() {
if let Some(dir) = path.parent()
&& std::fs::create_dir_all(dir).is_ok()
{
maybe_cleanup(dir);
}
let masked = crate::core::redaction::redact_text(content);
let (redacted, _) = crate::core::secret_detection::scan_and_redact_from_config(&masked);
if std::fs::write(&path, redacted).is_ok() {
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
let _ = std::fs::set_permissions(&path, std::fs::Permissions::from_mode(0o600));
}
}
}
if path.is_file() {
let source_tool = match prefix {
"json" | "tbl" | "yaml" => "ctx_read",
"html" => "ctx_shell",
_ => "proxy",
};
crate::core::relevance_tracker::register_compressed(
handle.clone(),
content,
source_tool,
crate::core::tokens::count_tokens(content),
0,
);
}
Some(handle)
}
fn is_hex(s: &str, len: usize) -> bool {
s.len() == len && s.bytes().all(|b| b.is_ascii_hexdigit())
}
fn canonical_tee_name(name: &str) -> Option<String> {
let stem = name.strip_suffix(".log").unwrap_or(name);
if let Some(hash) = stem.strip_prefix("proxy_") {
return is_hex(hash, TEE_HASH_LEN).then(|| format!("proxy_{hash}.log"));
}
if let Some(hash) = stem.strip_prefix("conv_") {
return is_hex(hash, TEE_HASH_LEN).then(|| format!("conv_{hash}.log"));
}
if let Some(hash) = stem.strip_prefix("json_") {
return is_hex(hash, TEE_HASH_LEN).then(|| format!("json_{hash}.log"));
}
if let Some(hash) = stem.strip_prefix("tbl_") {
return is_hex(hash, TEE_HASH_LEN).then(|| format!("tbl_{hash}.log"));
}
if let Some(hash) = stem.strip_prefix("yaml_") {
return is_hex(hash, TEE_HASH_LEN).then(|| format!("yaml_{hash}.log"));
}
is_hex(stem, TEE_HASH_LEN).then(|| format!("proxy_{stem}.log"))
}
fn is_shell_tee_name(name: &str) -> bool {
let Some(stem) = name.strip_suffix(".log") else {
return false;
};
if !stem
.bytes()
.all(|b| b.is_ascii_alphanumeric() || b == b'_' || b == b'-')
{
return false;
}
match stem.rsplit_once('_') {
Some((slug, hash)) => !slug.is_empty() && is_hex(hash, SHELL_TEE_HASH_LEN),
None => false,
}
}
pub(crate) fn resolve_tee(id: &str) -> Option<PathBuf> {
let name = Path::new(id)
.file_name()
.and_then(|n| n.to_str())
.unwrap_or(id);
let canon =
canonical_tee_name(name).or_else(|| is_shell_tee_name(name).then(|| name.to_string()))?;
let path = crate::core::paths::state_dir()
.ok()?
.join("tee")
.join(canon);
path.is_file().then_some(path)
}
pub(crate) fn inband_marker(handle: &str) -> Option<String> {
let name = Path::new(handle).file_name().and_then(|n| n.to_str())?;
let hash = name.strip_prefix("proxy_")?.strip_suffix(".log")?;
(hash.len() == 16 && hash.bytes().all(|b| b.is_ascii_hexdigit()))
.then(|| format!("{EXPAND_OPEN}{hash}{EXPAND_CLOSE}"))
}
pub(crate) fn inband_locator(handle: &str) -> Option<String> {
crate::core::config::Config::load()
.proxy
.ccr_inband_enabled()
.then(|| inband_marker(handle))
.flatten()
}
fn recover(hash: &str) -> Option<String> {
if hash.len() != 16 || !hash.bytes().all(|b| b.is_ascii_hexdigit()) {
return None;
}
std::fs::read_to_string(resolve_tee(hash)?).ok()
}
pub(crate) const LITELLM_HASH_LEN: usize = 24;
pub(crate) fn litellm_hash(content: &str) -> String {
blake3::hash(content.as_bytes()).to_hex()[..LITELLM_HASH_LEN].to_string()
}
pub(crate) fn retrieve_litellm(hash: &str) -> Option<String> {
if hash.len() != LITELLM_HASH_LEN
|| !hash
.bytes()
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b))
{
return None;
}
std::fs::read_to_string(resolve_tee(&hash[..TEE_HASH_LEN])?).ok()
}
fn splice_str(s: &str) -> Option<String> {
if !s.contains(EXPAND_OPEN) {
return None;
}
let mut out = String::with_capacity(s.len());
let mut rest = s;
let mut changed = false;
while let Some(pos) = rest.find(EXPAND_OPEN) {
let after = &rest[pos + EXPAND_OPEN.len()..];
match after.find(EXPAND_CLOSE) {
Some(end) => {
let hash = &after[..end];
if let Some(original) = recover(hash) {
out.push_str(&rest[..pos]);
out.push_str(&original);
rest = &after[end + EXPAND_CLOSE.len_utf8()..];
changed = true;
} else {
out.push_str(&rest[..pos + EXPAND_OPEN.len()]);
rest = after;
}
}
None => break,
}
}
out.push_str(rest);
changed.then_some(out)
}
pub(crate) fn splice_inband_in_place(value: &mut Value) -> bool {
match value {
Value::String(s) => {
if let Some(spliced) = splice_str(s) {
*s = spliced;
true
} else {
false
}
}
Value::Array(items) => {
let mut changed = false;
for item in items {
changed |= splice_inband_in_place(item);
}
changed
}
Value::Object(map) => {
let mut changed = false;
for (_, v) in map.iter_mut() {
changed |= splice_inband_in_place(v);
}
changed
}
_ => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
fn big(seed: &str) -> String {
format!("{seed}\n").repeat(40)
}
#[test]
fn handle_is_content_addressed_and_deterministic() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("file body line");
let a = persist(&content).expect("persisted");
let b = persist(&content).expect("persisted again");
assert_eq!(
a, b,
"same content must map to the same handle (cache-safe)"
);
assert!(a.contains("proxy_"), "handle is a proxy tee path: {a}");
let other = persist(&big("different body")).expect("persisted");
assert_ne!(a, other, "different content must get a different handle");
}
#[test]
fn persisted_original_is_recoverable() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("recoverable verbatim line");
let handle = persist(&content).expect("persisted");
let on_disk = std::fs::read_to_string(&handle).expect("tee file readable");
assert!(
on_disk.contains("recoverable verbatim line"),
"the verbatim original must be retrievable from the handle"
);
}
#[test]
fn small_content_gets_no_handle() {
let _lock = crate::core::data_dir::test_env_lock();
assert!(
persist("too small to bother").is_none(),
"below MIN_TEE_BYTES there is no handle (the caller keeps its plain stub)"
);
}
#[test]
#[allow(clippy::case_sensitive_file_extension_comparisons)]
fn conversation_handle_is_compact_and_deterministic() {
let _lock = crate::core::data_dir::test_env_lock();
let a = persist_conversation("{\"role\":\"user\",\"content\":\"hello\"}")
.expect("conversation handle");
let b = persist_conversation("{\"role\":\"user\",\"content\":\"hello\"}")
.expect("conversation handle");
assert_eq!(a, b);
assert!(a.starts_with("conv_") && a.ends_with(".log"));
}
#[test]
fn conversation_handle_resolves_short_messages() {
let _lock = crate::core::data_dir::test_env_lock();
let handle = persist_conversation("short conversation message").expect("handle");
assert!(resolve_tee(&handle).is_some());
}
#[test]
fn conversation_original_is_recoverable() {
let _lock = crate::core::data_dir::test_env_lock();
let original = "{\"role\":\"tool\",\"content\":\"recover me\"}";
let handle = persist_conversation(original).expect("handle");
let path = resolve_tee(&handle).expect("resolved handle");
assert_eq!(std::fs::read_to_string(path).unwrap(), original);
}
#[test]
fn resolve_tee_accepts_every_stub_form() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("resolvable tee body");
let handle = persist(&content).expect("persisted");
let hash = crate::core::hasher::hash_short(&content);
for form in [
handle.clone(),
format!("proxy_{hash}.log"),
format!("proxy_{hash}"),
hash.clone(),
] {
let resolved = resolve_tee(&form).unwrap_or_else(|| panic!("must resolve {form}"));
assert_eq!(
resolved.to_string_lossy(),
handle,
"form {form} -> {handle}"
);
}
}
#[test]
fn resolve_tee_rejects_nontee_and_traversal_ids() {
let _lock = crate::core::data_dir::test_env_lock();
assert!(resolve_tee("/etc/passwd").is_none());
assert!(resolve_tee("../../secret").is_none());
assert!(resolve_tee("proxy_nothex0000000.log").is_none());
assert!(resolve_tee("deadbeefdeadbeef").is_none());
}
#[test]
fn persist_json_is_distinct_prefix_and_resolvable() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("json crusher original");
let proxy = persist(&content).expect("proxy persisted");
let json = persist_json(&content).expect("json persisted");
assert!(
json.contains("json_"),
"json handle uses json_ prefix: {json}"
);
assert_ne!(
proxy, json,
"same content gets distinct files per producer prefix"
);
let hash = crate::core::hasher::hash_short(&content);
for form in [
json.clone(),
format!("json_{hash}.log"),
format!("json_{hash}"),
] {
assert_eq!(
resolve_tee(&form)
.expect("json form resolves")
.to_string_lossy(),
json,
"json form {form} -> {json}"
);
}
}
#[test]
fn persist_tabular_is_distinct_prefix_and_resolvable() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("tabular crusher original");
let json = persist_json(&content).expect("json persisted");
let tbl = persist_tabular(&content).expect("tbl persisted");
assert!(
tbl.contains("tbl_"),
"tabular handle uses tbl_ prefix: {tbl}"
);
assert_ne!(
json, tbl,
"same content gets distinct files per producer prefix"
);
let hash = crate::core::hasher::hash_short(&content);
for form in [
tbl.clone(),
format!("tbl_{hash}.log"),
format!("tbl_{hash}"),
] {
assert_eq!(
resolve_tee(&form)
.expect("tbl form resolves")
.to_string_lossy(),
tbl,
"tbl form {form} -> {tbl}"
);
}
}
#[test]
fn persist_yaml_is_distinct_prefix_and_resolvable() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("yaml crusher original");
let tbl = persist_tabular(&content).expect("tbl persisted");
let yaml = persist_yaml(&content).expect("yaml persisted");
assert!(
yaml.contains("yaml_"),
"yaml handle uses yaml_ prefix: {yaml}"
);
assert_ne!(
tbl, yaml,
"same content gets distinct files per producer prefix"
);
let hash = crate::core::hasher::hash_short(&content);
for form in [
yaml.clone(),
format!("yaml_{hash}.log"),
format!("yaml_{hash}"),
] {
assert_eq!(
resolve_tee(&form)
.expect("yaml form resolves")
.to_string_lossy(),
yaml,
"yaml form {form} -> {yaml}"
);
}
}
#[test]
fn resolve_tee_resolves_shell_tee_with_underscored_slug() {
let _lock = crate::core::data_dir::test_env_lock();
let path = crate::shell::save_tee("gh api /repos/foo/bar", &big("api row"))
.expect("shell tee saved");
let name = std::path::Path::new(&path)
.file_name()
.and_then(|n| n.to_str())
.unwrap()
.to_string();
assert!(
is_shell_tee_name(&name),
"save_tee name must be recognized as a shell tee: {name}"
);
for form in [path.clone(), name] {
assert_eq!(
resolve_tee(&form)
.expect("shell tee form resolves")
.to_string_lossy(),
path,
"shell tee form -> {path}"
);
}
}
#[test]
fn resolve_tee_does_not_capture_reference_ids() {
let _lock = crate::core::data_dir::test_env_lock();
assert!(resolve_tee("ref_deadbeefcafef00d").is_none());
assert!(resolve_tee("0123456789abcdef").is_none());
}
#[test]
fn litellm_hash_is_24_lowercase_hex_and_extends_tee_hash() {
let content = big("gateway retrieval body");
let hash = litellm_hash(&content);
assert_eq!(hash.len(), LITELLM_HASH_LEN);
assert!(
hash.bytes()
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b)),
"must match LiteLLM's [a-f0-9]{{24}} class: {hash}"
);
assert_eq!(hash[..16], crate::core::hasher::hash_short(&content));
assert_eq!(hash, litellm_hash(&content));
}
#[test]
fn retrieve_litellm_resolves_persisted_content() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("litellm retrievable original");
persist(&content).expect("persisted");
let recovered =
retrieve_litellm(&litellm_hash(&content)).expect("24-hex hash must resolve");
assert!(recovered.contains("litellm retrievable original"));
}
#[test]
fn retrieve_litellm_is_shape_locked_to_the_guardrail_regex() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("shape locked body");
persist(&content).expect("persisted");
let hash = litellm_hash(&content);
assert!(retrieve_litellm(&hash[..16]).is_none(), "16-hex rejected");
assert!(retrieve_litellm(&hash[..23]).is_none(), "23-hex rejected");
assert!(
retrieve_litellm(&format!("{hash}0")).is_none(),
"25-hex rejected"
);
assert!(
retrieve_litellm(&hash.to_uppercase()).is_none(),
"uppercase rejected (regex class is [a-f0-9])"
);
assert!(
retrieve_litellm("zzzzzzzzzzzzzzzzzzzzzzzz").is_none(),
"non-hex rejected"
);
assert!(retrieve_litellm("../../etc/passwd00000000").is_none());
assert!(retrieve_litellm("0123456789abcdef01234567").is_none());
}
#[test]
fn inband_marker_is_derived_from_handle() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("inband marker body");
let handle = persist(&content).expect("persisted");
let hash = crate::core::hasher::hash_short(&content);
assert_eq!(inband_marker(&handle), Some(format!("<lc_expand:{hash}>")));
assert!(inband_marker("/tmp/not-a-tee.txt").is_none());
}
#[test]
fn splice_replaces_marker_with_verbatim_original() {
let _lock = crate::core::data_dir::test_env_lock();
let content = big("the historical verbatim line");
let handle = persist(&content).expect("persisted");
let marker = inband_marker(&handle).expect("marker");
let mut doc = serde_json::json!({
"messages": [{ "role": "assistant", "content": format!("recall {marker} please") }]
});
assert!(splice_inband_in_place(&mut doc), "a marker must splice");
let spliced = doc["messages"][0]["content"].as_str().unwrap();
assert!(
spliced.contains("the historical verbatim line"),
"verbatim original must be spliced in: {spliced}"
);
assert!(
!spliced.contains("<lc_expand:"),
"the marker must be consumed, not left behind"
);
}
#[test]
fn splice_is_byte_identical_no_op_without_marker() {
let _lock = crate::core::data_dir::test_env_lock();
let mut doc = serde_json::json!({
"messages": [{ "role": "user", "content": "no marker here" }],
"system": "plain"
});
let before = doc.clone();
assert!(
!splice_inband_in_place(&mut doc),
"no marker → must report no change"
);
assert_eq!(
doc, before,
"marker-less body must stay byte-identical (cache-safe)"
);
}
#[test]
fn splice_keeps_unresolvable_marker_verbatim() {
let _lock = crate::core::data_dir::test_env_lock();
let mut doc = serde_json::json!({ "t": "before <lc_expand:deadbeefdeadbeef> after" });
assert!(!splice_inband_in_place(&mut doc));
assert_eq!(
doc["t"].as_str().unwrap(),
"before <lc_expand:deadbeefdeadbeef> after"
);
}
#[test]
fn splice_recurses_and_handles_multiple_markers() {
let _lock = crate::core::data_dir::test_env_lock();
let a = big("first recovered body");
let b = big("second recovered body");
let ma = inband_marker(&persist(&a).unwrap()).unwrap();
let mb = inband_marker(&persist(&b).unwrap()).unwrap();
let mut doc = serde_json::json!({
"contents": [
{ "parts": [{ "text": format!("{ma} and {mb}") }] }
]
});
assert!(splice_inband_in_place(&mut doc));
let text = doc["contents"][0]["parts"][0]["text"].as_str().unwrap();
assert!(text.contains("first recovered body"));
assert!(text.contains("second recovered body"));
assert!(!text.contains("<lc_expand:"));
}
}