use std::sync::Arc;
use oxi_sdk::{
EditTool, FindTool, GetSearchResultsTool, GrepTool, LsTool, ReadTool, SearchCache,
ToolRegistry, WebSearchTool, WriteTool,
};
use crate::access_manager::{AccessGate, AgentContext};
use crate::capability::{CSpace, ResourceRef, Rights};
use crate::tools::gated_tool::GatedTool;
use crate::tools::kernel::*;
use crate::tools::{
A2aDelegateTool, A2aQueryTool, A2aSendTool, ExecTool, KnowledgeTool, MemoryReadTool,
MemorySearchTool, MemoryWriteTool,
};
use crate::types::AgentId;
use crate::KernelHandle;
#[cfg(feature = "browser")]
use crate::tools::BrowserTool;
pub fn register_always_on(registry: &ToolRegistry, search_cache: Arc<SearchCache>) {
registry.register(ReadTool::new());
registry.register(WriteTool::new());
registry.register(EditTool::new());
registry.register(GrepTool::new());
registry.register(FindTool::new());
registry.register(LsTool::new());
registry.register(WebSearchTool::new(search_cache.clone()));
registry.register(GetSearchResultsTool::new(search_cache));
}
pub fn register_always_on_gated(
registry: &ToolRegistry,
search_cache: Arc<SearchCache>,
gate: Arc<AccessGate>,
context: AgentContext,
) {
registry.register(GatedTool::new(
ReadTool::new(),
gate.clone(),
context.clone(),
));
registry.register(GatedTool::new(
WriteTool::new(),
gate.clone(),
context.clone(),
));
registry.register(GatedTool::new(
EditTool::new(),
gate.clone(),
context.clone(),
));
registry.register(GatedTool::new(
GrepTool::new(),
gate.clone(),
context.clone(),
));
registry.register(GatedTool::new(
FindTool::new(),
gate.clone(),
context.clone(),
));
registry.register(GatedTool::new(LsTool::new(), gate.clone(), context.clone()));
registry.register(GatedTool::new(
WebSearchTool::new(search_cache.clone()),
gate.clone(),
context.clone(),
));
registry.register(GatedTool::new(
GetSearchResultsTool::new(search_cache),
gate,
context,
));
}
pub fn register_tools_from_cspace(
registry: &ToolRegistry,
kernel: &KernelHandle,
cspace: &CSpace,
search_cache: Arc<SearchCache>,
agent_id: AgentId,
) {
register_always_on(registry, search_cache);
for cap in cspace.iter() {
match &cap.resource {
ResourceRef::Exec { .. } if cap.rights.contains(Rights::EXECUTE) => {
registry.register(ExecTool::from_kernel(kernel));
}
ResourceRef::Browser if cap.rights.contains(Rights::EXECUTE) => {
#[cfg(feature = "browser")]
{
registry.register(BrowserTool::from_kernel(kernel));
}
}
ResourceRef::KernelDomain { domain } => match domain.as_str() {
"memory" => {
if cap.rights.contains(Rights::READ) {
registry.register(MemoryReadTool::from_kernel(kernel));
registry.register(MemorySearchTool::from_kernel(kernel));
}
if cap.rights.contains(Rights::WRITE) {
registry.register(MemoryWriteTool::from_kernel(kernel));
}
}
"space" => registry.register(ProjectTool::from_kernel(kernel)),
"agent" => registry.register(KernelAgentTool::from_kernel(kernel)),
"a2a" => {
registry.register(A2aDelegateTool::from_kernel(kernel, agent_id));
registry.register(A2aSendTool::from_kernel(kernel, agent_id));
registry.register(A2aQueryTool::from_kernel(kernel));
}
"persona" => registry.register(PersonaTool::from_kernel(kernel)),
"program" => {
}
"cron" => registry.register(CronTool::from_kernel(kernel)),
"security" => registry.register(SecurityTool::from_kernel(kernel)),
"budget" => registry.register(BudgetTool::from_kernel(kernel)),
"resource" => registry.register(ResourceTool::from_kernel(kernel)),
"knowledge" => registry.register(KnowledgeTool::from_kernel(kernel)),
"mcp" => { }
_ => {} },
ResourceRef::Skill { .. } => {}
_ => {}
}
}
}
pub fn register_tools_from_cspace_gated(
registry: &ToolRegistry,
kernel: &KernelHandle,
cspace: &CSpace,
search_cache: Arc<SearchCache>,
agent_id: AgentId,
gate: Arc<AccessGate>,
context: AgentContext,
) {
register_always_on_gated(registry, search_cache, gate, context);
for cap in cspace.iter() {
match &cap.resource {
ResourceRef::Exec { .. } if cap.rights.contains(Rights::EXECUTE) => {
registry.register(ExecTool::from_kernel(kernel));
}
ResourceRef::Browser if cap.rights.contains(Rights::EXECUTE) => {
#[cfg(feature = "browser")]
{
registry.register(BrowserTool::from_kernel(kernel));
}
}
ResourceRef::KernelDomain { domain } => match domain.as_str() {
"memory" => {
if cap.rights.contains(Rights::READ) {
registry.register(MemoryReadTool::from_kernel(kernel));
registry.register(MemorySearchTool::from_kernel(kernel));
}
if cap.rights.contains(Rights::WRITE) {
registry.register(MemoryWriteTool::from_kernel(kernel));
}
}
"space" => registry.register(ProjectTool::from_kernel(kernel)),
"agent" => registry.register(KernelAgentTool::from_kernel(kernel)),
"a2a" => {
registry.register(A2aDelegateTool::from_kernel(kernel, agent_id));
registry.register(A2aSendTool::from_kernel(kernel, agent_id));
registry.register(A2aQueryTool::from_kernel(kernel));
}
"persona" => registry.register(PersonaTool::from_kernel(kernel)),
"program" => {}
"cron" => registry.register(CronTool::from_kernel(kernel)),
"security" => registry.register(SecurityTool::from_kernel(kernel)),
"budget" => registry.register(BudgetTool::from_kernel(kernel)),
"resource" => registry.register(ResourceTool::from_kernel(kernel)),
"knowledge" => registry.register(KnowledgeTool::from_kernel(kernel)),
"mcp" => {}
_ => {}
},
ResourceRef::Skill { .. } => {}
_ => {}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn register_always_on_registers_eight_tools() {
let registry = ToolRegistry::new();
let cache = Arc::new(SearchCache::new());
register_always_on(®istry, cache);
let tool_names = registry.names();
assert!(
tool_names.contains(&"read".to_string()),
"read tool should be registered"
);
assert!(
tool_names.contains(&"write".to_string()),
"write tool should be registered"
);
assert!(
tool_names.contains(&"edit".to_string()),
"edit tool should be registered"
);
assert!(
tool_names.contains(&"grep".to_string()),
"grep tool should be registered"
);
assert!(
tool_names.contains(&"find".to_string()),
"find tool should be registered"
);
assert!(
tool_names.contains(&"ls".to_string()),
"ls tool should be registered"
);
assert!(
tool_names.contains(&"web_search".to_string()),
"web_search tool should be registered"
);
assert!(
tool_names.contains(&"get_search_results".to_string()),
"get_search_results tool should be registered"
);
}
}