use std::sync::Arc;
use crate::capability::CSpace;
use crate::types::AgentId;
#[derive(Debug, Clone)]
pub struct AgentContext {
pub agent_id: AgentId,
pub agent_name: String,
pub cspace: Arc<CSpace>,
}
impl AgentContext {
#[cfg(test)]
pub fn test_fixture(name: &str) -> Self {
let agent_id = AgentId::new_v4();
let mut cspace = CSpace::new(agent_id);
use crate::capability::{Capability, ResourceRef, Rights};
cspace.insert(Capability::kernel(
ResourceRef::Exec {
mode: "shell".into(),
},
Rights::ALL,
));
cspace.insert(Capability::kernel(
ResourceRef::Exec {
mode: "structured".into(),
},
Rights::ALL,
));
cspace.insert(Capability::kernel(
ResourceRef::KernelDomain {
domain: "fs".into(),
},
Rights::ALL,
));
cspace.insert(Capability::kernel(
ResourceRef::KernelDomain {
domain: "agent".into(),
},
Rights::ALL,
));
for tool in [
"bash", "read", "write", "edit", "grep", "find", "ls", "exec",
] {
cspace.insert(Capability::kernel(
ResourceRef::KernelDomain {
domain: tool.into(),
},
Rights::EXECUTE,
));
}
Self {
agent_id,
agent_name: name.to_string(),
cspace: Arc::new(cspace),
}
}
#[cfg(test)]
pub fn test_fixture_with_cspace(name: &str, cspace: CSpace) -> Self {
Self {
agent_id: AgentId::new_v4(),
agent_name: name.to_string(),
cspace: Arc::new(cspace),
}
}
}
impl std::fmt::Display for AgentContext {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "agent:{}:{}", self.agent_name, self.agent_id)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fixture_has_name() {
let ctx = AgentContext::test_fixture("test-agent");
assert_eq!(ctx.agent_name, "test-agent");
assert!(!ctx.agent_id.is_nil());
}
#[test]
fn test_display() {
let ctx = AgentContext::test_fixture("my-agent");
let s = format!("{}", ctx);
assert!(s.starts_with("agent:my-agent:"));
}
}