pub mod advisor;
pub mod agent;
mod agent_output;
mod coding;
pub(crate) mod mcp;
mod notification_format;
#[cfg(test)]
#[path = "notification_format_tests.rs"]
mod notification_format_tests;
pub(crate) mod process;
pub mod rho;
mod sdk_features;
pub(crate) use sdk_features::message_parent_bundle;
pub mod sdk_registry;
pub mod skill;
#[cfg(debug_assertions)]
pub(crate) mod tui_fixture;
pub mod web;
pub(crate) mod workflow;
mod workflow_output;
pub(crate) mod workflow_tracker;
pub(crate) fn canonical_tool_names() -> &'static [&'static str] {
static NAMES: std::sync::LazyLock<Vec<&'static str>> = std::sync::LazyLock::new(|| {
let mut names = vec![
"advisor",
"agent",
"agents",
"bash",
"fetch_content",
"get_search_content",
"glob",
"grep",
"list_dir",
"message_parent",
"powershell",
"process",
"questionnaire",
"read_file",
"rho",
"skill",
"web_search",
"workflow",
"workflow_command",
"write",
];
names.extend(
rho_tools::EditFormat::ALL
.iter()
.copied()
.map(rho_tools::EditFormat::tool_name),
);
names.sort_unstable();
names.dedup();
names
});
NAMES.as_slice()
}
pub(crate) fn canonical_tool_is_mutating(name: &str) -> Option<bool> {
match name {
"agent" | "agents" | "bash" | "powershell" | "process" | "rho" | "workflow"
| "workflow_command" | "write" => Some(true),
name if rho_tools::EditFormat::is_edit_tool_name(name) => Some(true),
"advisor" | "fetch_content" | "get_search_content" | "glob" | "grep" | "list_dir"
| "message_parent" | "questionnaire" | "read_file" | "skill" | "web_search" => Some(false),
_ => None,
}
}
#[cfg(test)]
pub(crate) const HOST_ONLY_TOOL_NAMES: &[&str] = &["workflow_command"];
#[cfg(test)]
pub(crate) const DELEGATED_OPT_IN_TOOL_NAMES: &[&str] = &["message_parent"];
#[cfg(test)]
#[path = "app_owned_opt_in_tests.rs"]
mod app_owned_opt_in_tests;