use crate::tools::handlers::PlanningWorkflowState;
use super::ToolRegistry;
impl ToolRegistry {
pub fn enable_planning(&self) {
let was_active = self.planning_workflow_state.is_active();
self.planning_workflow_state.enable();
if !was_active {
*self.cached_available_tools.write() = None;
self.tool_catalog_state.note_explicit_refresh("planning_workflow_enabled");
}
}
pub fn disable_planning(&self) {
let was_active = self.planning_workflow_state.is_active();
self.planning_workflow_state.disable();
if was_active {
*self.cached_available_tools.write() = None;
self.tool_catalog_state.note_explicit_refresh("planning_workflow_disabled");
}
}
#[inline]
pub fn is_planning_active(&self) -> bool {
self.planning_workflow_state.is_active()
}
#[inline]
pub fn planning_workflow_state(&self) -> PlanningWorkflowState {
self.planning_workflow_state.clone()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::constants::tools;
use tempfile::TempDir;
#[tokio::test]
async fn enable_planning_short_circuits_when_already_active() {
let temp_dir = TempDir::new().expect("tempdir");
let registry = ToolRegistry::new(temp_dir.path().to_path_buf()).await;
registry.enable_planning();
let after_first = registry.tool_catalog_state().current_epoch();
registry.enable_planning();
let after_second = registry.tool_catalog_state().current_epoch();
assert_eq!(after_first, after_second, "enabling an already-active planning workflow must not bump the epoch");
assert!(registry.is_planning_active());
}
#[tokio::test]
async fn planning_transitions_invalidate_available_tools() {
let temp_dir = TempDir::new().expect("tempdir");
let registry = ToolRegistry::new(temp_dir.path().to_path_buf()).await;
let inactive = registry.available_tools().await;
assert!(!inactive.contains(&tools::CODE_SEARCH.to_string()));
assert!(!inactive.contains(&tools::REQUEST_USER_INPUT.to_string()));
registry.enable_planning();
let active = registry.available_tools().await;
assert!(active.contains(&tools::CODE_SEARCH.to_string()));
assert!(active.contains(&tools::REQUEST_USER_INPUT.to_string()));
registry.disable_planning();
let inactive_again = registry.available_tools().await;
assert!(!inactive_again.contains(&tools::CODE_SEARCH.to_string()));
assert!(!inactive_again.contains(&tools::REQUEST_USER_INPUT.to_string()));
}
}