use serde_json::{Value, json};
pub mod console;
pub mod core;
pub mod session;
pub const TOOL_CATALOG: [&str; 20] = [
"session_list",
"session_status",
"agent_delegate",
"memory_protect",
"circuit_breaker_status",
"hook_event",
"list_recent_errors",
"preview_bug_report",
"report_bug",
"session_new",
"session_stop",
"session_resume",
"session_decommission",
"session_activity",
"session_send",
"console_metrics",
"supervisor_status",
"auto_resume_set",
"config_read",
"config_write",
];
pub fn tool_catalog() -> Vec<Value> {
let mut tools = core::core_tools();
tools.extend(session::session_tools());
tools.extend(console::console_tools());
tools
}
pub(crate) fn tool(name: &str, description: &str, input_schema: Value) -> Value {
json!({
"name": name,
"description": description,
"inputSchema": input_schema,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn catalog_has_expected_tool_count() {
assert_eq!(tool_catalog().len(), 20);
assert_eq!(TOOL_CATALOG.len(), 20);
}
#[test]
fn catalog_names_match_constant() {
let names: Vec<String> = tool_catalog()
.iter()
.map(|t| t["name"].as_str().unwrap().to_string())
.collect();
assert_eq!(names, TOOL_CATALOG);
}
#[test]
fn every_tool_has_input_schema() {
for t in tool_catalog() {
assert!(t["name"].is_string());
assert!(t["description"].is_string());
assert_eq!(t["inputSchema"]["type"], "object");
}
}
#[test]
fn bug_reporting_tools_present() {
let catalog = tool_catalog();
let names: Vec<&str> = catalog.iter().filter_map(|t| t["name"].as_str()).collect();
assert!(names.contains(&"list_recent_errors"), "{names:?}");
assert!(names.contains(&"preview_bug_report"), "{names:?}");
assert!(names.contains(&"report_bug"), "{names:?}");
}
#[test]
fn session_tools_present() {
let catalog = tool_catalog();
let names: Vec<&str> = catalog.iter().filter_map(|t| t["name"].as_str()).collect();
for expected in [
"session_new",
"session_stop",
"session_resume",
"session_decommission",
"session_activity",
"session_send",
] {
assert!(names.contains(&expected), "missing {expected}: {names:?}");
}
}
#[test]
fn console_tools_present() {
let catalog = tool_catalog();
let names: Vec<&str> = catalog.iter().filter_map(|t| t["name"].as_str()).collect();
for expected in [
"console_metrics",
"supervisor_status",
"auto_resume_set",
"config_read",
"config_write",
] {
assert!(names.contains(&expected), "missing {expected}: {names:?}");
}
}
}