use lean_ctx::core::context_field::TokenBudget;
use lean_ctx::core::context_kernel::providers::KnowledgeProvider;
use lean_ctx::core::context_kernel::types::{CandidateProvider, RetrievalContext};
use lean_ctx::core::knowledge::ProjectKnowledge;
use lean_ctx::core::memory_policy::MemoryPolicy;
#[test]
fn a_fact_whose_source_is_gone_is_not_a_candidate() {
use lean_ctx::core::archive::bindings::{self, Item};
use lean_ctx::core::context_admission::stored::lineage_support::{governed, project, scoped};
let _data = governed();
let _community = lean_ctx::core::policy::runtime::TestPolicyOverride::set(None);
let (_directory, root) = project();
std::fs::write(format!("{root}/auth.rs"), "pub fn verify_rs256() {}\n").expect("source");
let bound = "Tokens are verified with RS256 in the auth module";
let typed = "Deployments are promoted by the release captain on Fridays";
for (key, value) in [("token-check", bound), ("release-duty", typed)] {
let reply = super::handle(
&root,
"remember",
Some("architecture"),
Some(key),
Some(value),
None,
"session-1",
None,
None,
None,
None,
None,
);
assert!(reply.starts_with("Remembered"), "{reply}");
}
let item = Item::KnowledgeFact {
project: &root,
category: "architecture",
key: "token-check",
};
let sources =
bindings::sources_at(&root, &["auth.rs"], "ctx_knowledge").expect("readable source");
assert!(bindings::bind(&item, bound, &root, sources));
let ctx = RetrievalContext {
query: "tokens deployments".to_string(),
task: None,
project_root: root.clone(),
budget: TokenBudget {
total: 1_000,
used: 0,
},
max_candidates: 10,
};
let offered = || {
let candidates = scoped(&root, || KnowledgeProvider::new(&root).candidates(&ctx));
let mut contents: Vec<String> = candidates
.into_iter()
.filter_map(|candidate| candidate.content)
.collect();
contents.sort();
contents
};
assert_eq!(offered(), [typed, bound]);
std::fs::remove_file(format!("{root}/auth.rs")).expect("delete");
assert_eq!(offered(), [typed]);
}
#[test]
fn bound_request_without_project_policy_cannot_load_or_recall_foreign_knowledge() {
let _data = lean_ctx::core::data_dir::isolated_data_dir();
let bound = tempfile::tempdir().unwrap();
let foreign = tempfile::tempdir().unwrap();
let foreign_root = foreign.path().to_str().unwrap();
let mut knowledge = ProjectKnowledge::new(foreign_root);
knowledge.remember(
"decision",
"foreign",
"private other project note",
"local",
0.9,
&MemoryPolicy::default(),
);
knowledge.save().unwrap();
assert!(
lean_ctx::core::policy::runtime::for_project(bound.path())
.unwrap()
.is_none()
);
lean_ctx::core::policy::runtime::REQUEST_PROJECT.sync_scope(
std::cell::RefCell::new(Some(bound.path().to_owned())),
|| {
assert!(ProjectKnowledge::load(foreign_root).is_none());
let response = super::handle(
foreign_root,
"recall",
None,
None,
None,
None,
"local",
None,
None,
None,
None,
None,
);
assert!(response.starts_with("Error:"));
assert!(!response.contains("private other project note"));
},
);
assert_eq!(ProjectKnowledge::load(foreign_root).unwrap().facts.len(), 1);
}