use super::ToolApprovalPolicy;
const EVIDENCE_MAX_CHARS: usize = 240;
pub(crate) fn first_candidate(
policy: &ToolApprovalPolicy,
candidates: &[String],
) -> Option<String> {
let custom = &policy.sensitive_path_patterns;
candidates
.iter()
.find(|candidate| {
if custom.is_empty() {
crate::known_paths::is_credential_path(candidate)
} else {
is_candidate(candidate, custom.iter().map(String::as_str))
}
})
.cloned()
}
pub(super) fn bounded_evidence(path: &str) -> String {
crate::text::truncate_start(path, EVIDENCE_MAX_CHARS)
}
fn is_candidate<'a>(candidate: &str, patterns: impl IntoIterator<Item = &'a str>) -> bool {
let normalized = candidate.replace('\\', "/").to_ascii_lowercase();
let basename = normalized.rsplit('/').next().unwrap_or(normalized.as_str());
patterns.into_iter().any(|pattern| {
let pattern = pattern.to_ascii_lowercase();
harn_glob::match_path(&pattern, &normalized)
|| harn_glob::match_path(&pattern, basename)
|| harn_glob::match_name(&pattern, &normalized)
|| harn_glob::match_name(&pattern, basename)
})
}