use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
pub const EXPAND_OPEN: &str = "<lc_expand:";
pub const EXPAND_CLOSE: char = '>';
pub 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 fn persist(content: &str) -> Option<String> {
persist_with(content, "proxy")
}
pub fn persist_once(content: &str) -> Option<String> {
if content.len() < MIN_TEE_BYTES
|| crate::core::context_admission::stored::source_authority_required()
{
return None;
}
let path = tee_path(content, "proxy")?;
if std::fs::symlink_metadata(&path).is_ok_and(|meta| meta.file_type().is_file()) {
return Some(path.to_string_lossy().to_string());
}
persist(content)
}
#[cfg_attr(not(test), allow(dead_code))] pub 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 fn persist_json(content: &str) -> Option<String> {
persist_with(content, "json")
}
pub fn persist_tabular(content: &str) -> Option<String> {
persist_with(content, "tbl")
}
pub fn persist_yaml(content: &str) -> Option<String> {
persist_with(content, "yaml")
}
pub fn persist_html(content: &str) -> Option<String> {
persist_with(content, "html")
}
#[cfg(feature = "http-server")]
pub fn persist_tool_definition(content: &str) -> Option<String> {
let path = persist_with_min(content, "tool", 1)?;
Path::new(&path)
.file_name()
.and_then(|name| name.to_str())
.map(str::to_owned)
}
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> {
debug_assert!(
TEE_PREFIXES.contains(&prefix),
"tee prefix {prefix} must be resolvable (add it to TEE_PREFIXES)"
);
if content.len() < min_bytes {
return None;
}
let path = tee_path(content, prefix)?;
let handle = path.to_string_lossy().to_string();
storage::write(&path, content)?;
if let Some(dir) = path.parent() {
maybe_cleanup(dir);
}
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())
}
const TEE_PREFIXES: &[&str] = &["proxy", "conv", "json", "tbl", "yaml", "html", "tool"];
fn canonical_tee_name(name: &str) -> Option<String> {
let stem = name.strip_suffix(".log").unwrap_or(name);
for prefix in TEE_PREFIXES {
if let Some(hash) = stem
.strip_prefix(prefix)
.and_then(|rest| rest.strip_prefix('_'))
{
return is_hex(hash, TEE_HASH_LEN).then(|| format!("{prefix}_{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,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TeeResolveError {
Malformed,
Missing,
Refused(&'static str),
}
pub fn resolve_tee_checked(id: &str) -> Result<PathBuf, TeeResolveError> {
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()))
.ok_or(TeeResolveError::Malformed)?;
let state_dir = crate::core::paths::state_dir().map_err(|_| TeeResolveError::Missing)?;
let tee_dir = state_dir.join("tee");
let path = tee_dir.join(canon);
if std::fs::symlink_metadata(&tee_dir).is_ok_and(|m| m.file_type().is_symlink()) {
return Err(TeeResolveError::Refused(
"tee store is a symlink to another location",
));
}
let link_metadata = std::fs::symlink_metadata(&path).map_err(|error| {
if error.kind() == std::io::ErrorKind::PermissionDenied {
TeeResolveError::Refused("tee metadata read refused by filesystem policy")
} else {
TeeResolveError::Missing
}
})?;
if link_metadata.file_type().is_symlink() {
return Err(TeeResolveError::Refused(
"tee handles cannot resolve through symlinks",
));
}
if !link_metadata.is_file() {
return Err(TeeResolveError::Missing);
}
let canonical_state = std::fs::canonicalize(&state_dir).map_err(|error| {
if error.kind() == std::io::ErrorKind::PermissionDenied {
TeeResolveError::Refused("tee store access refused by filesystem policy")
} else {
TeeResolveError::Missing
}
})?;
let canonical_tee = std::fs::canonicalize(&tee_dir).map_err(|error| {
if error.kind() == std::io::ErrorKind::PermissionDenied {
TeeResolveError::Refused("tee store access refused by filesystem policy")
} else {
TeeResolveError::Missing
}
})?;
if canonical_tee != canonical_state.join("tee") {
return Err(TeeResolveError::Refused(
"tee store resolves outside the state directory",
));
}
let canonical_file = std::fs::canonicalize(&path).map_err(|error| {
if error.kind() == std::io::ErrorKind::PermissionDenied {
TeeResolveError::Refused("tee read refused by filesystem policy")
} else {
TeeResolveError::Missing
}
})?;
if !canonical_file.starts_with(&canonical_tee) {
return Err(TeeResolveError::Refused(
"tee handle resolves outside the tee store",
));
}
if !canonical_file.is_file() {
return Err(TeeResolveError::Missing);
}
Ok(path)
}
pub fn resolve_tee(id: &str) -> Option<PathBuf> {
resolve_tee_checked(id).ok()
}
pub 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 fn inband_locator(handle: &str) -> Option<String> {
crate::core::config::Config::load()
.proxy
.ccr_inband_enabled()
.then(|| inband_marker(handle))
.flatten()
}
pub fn read_tee_file(path: &Path) -> Option<String> {
read_checked_tee(path)
}
pub fn read_tee(id: &str) -> Option<String> {
read_tee_file(&resolve_tee(id)?)
}
pub use storage::{
read as read_checked_tee, read_detailed as read_tee_detailed, write as write_tee,
};
mod storage;
pub const LITELLM_HASH_LEN: usize = 24;
pub fn litellm_hash(content: &str) -> String {
blake3::hash(content.as_bytes()).to_hex()[..LITELLM_HASH_LEN].to_string()
}
#[cfg(feature = "http-server")]
pub 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;
}
read_tee(&hash[..TEE_HASH_LEN])
}
#[cfg(any(test, feature = "test-support"))]
pub mod test_support {
pub fn big(seed: &str) -> String {
format!("{seed}\n").repeat(40)
}
}
#[cfg(test)]
pub(crate) mod tests {
use super::*;
pub(crate) use super::test_support::big;
fn write_gateway_mode(mode: &str) {
let config = crate::core::paths::config_dir_read_only().expect("config directory");
std::fs::create_dir_all(&config).expect("config directory");
std::fs::write(
config.join("config.toml"),
format!("[context_gateway]\nmode = \"{mode}\"\n"),
)
.expect("gateway config");
}
#[test]
fn governed_mode_without_a_pack_neither_serves_nor_writes_an_originless_tee() {
let _data = crate::core::data_dir::isolated_data_dir();
let _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
write_gateway_mode("developer");
let content = big("deploy log line with the marker tee-governed-regression");
let handle = persist(&content).expect("developer mode keeps a recovery copy");
let path = Path::new(&handle);
assert!(
read_tee_detailed(path)
.expect("developer mode serves it")
.contains("tee-governed-regression")
);
write_gateway_mode("governed");
let refusal = read_tee_detailed(path).expect_err("governed mode must not serve it");
assert!(refusal.contains("no source authority"), "{refusal}");
assert!(!refusal.contains("tee-governed-regression"));
assert!(read_tee(&handle).is_none());
assert!(
persist(&big("another originless log line")).is_none(),
"governed mode writes no originless copy"
);
write_gateway_mode("developer");
assert!(read_tee_detailed(path).is_ok(), "developer mode unchanged");
}
#[test]
fn handle_is_content_addressed_and_deterministic() {
let _lock = crate::core::data_dir::test_env_lock();
let _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 persist_html_handle_resolves_in_every_form() {
let _lock = crate::core::data_dir::test_env_lock();
let _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
let content = big("<p>html crush original</p>");
let handle = persist_html(&content).expect("html persisted");
let hash = crate::core::hasher::hash_short(&content);
for form in [
handle.clone(),
format!("html_{hash}.log"),
format!("html_{hash}"),
] {
let resolved = resolve_tee(&form).unwrap_or_else(|| panic!("must resolve {form}"));
assert_eq!(resolved.to_string_lossy(), handle, "form {form}");
}
assert!(
std::fs::read_to_string(&handle)
.unwrap()
.contains("html crush original")
);
}
#[test]
fn canonical_tee_name_covers_every_producer_prefix() {
let hash = "0123456789abcdef";
for prefix in TEE_PREFIXES {
assert_eq!(
canonical_tee_name(&format!("{prefix}_{hash}.log")),
Some(format!("{prefix}_{hash}.log"))
);
}
assert_eq!(canonical_tee_name(&format!("html{hash}")), None);
assert_eq!(canonical_tee_name("html_nothex000000000"), None);
}
#[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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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));
}
#[cfg(feature = "http-server")]
#[test]
fn retrieve_litellm_resolves_persisted_content() {
let _lock = crate::core::data_dir::test_env_lock();
let _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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"));
}
#[cfg(feature = "http-server")]
#[test]
fn retrieve_litellm_is_shape_locked_to_the_guardrail_regex() {
let _lock = crate::core::data_dir::test_env_lock();
let _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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 _community = crate::core::policy::runtime::TestPolicyOverride::set(None);
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());
}
}