ai_agent/utils/plugins/
refresh.rs1#![allow(dead_code)]
3
4use super::cache_utils::clear_all_caches;
5use super::load_plugin_hooks::load_plugin_hooks;
6use super::loader::load_all_plugins;
7use super::lsp_plugin_integration::load_plugin_lsp_servers;
8use super::mcp_plugin_integration::load_plugin_mcp_servers;
9use super::orphaned_plugin_filter::clear_plugin_cache_exclusions;
10
11pub struct RefreshActivePluginsResult {
13 pub enabled_count: usize,
14 pub disabled_count: usize,
15 pub command_count: usize,
16 pub agent_count: usize,
17 pub hook_count: usize,
18 pub mcp_count: usize,
19 pub lsp_count: usize,
20 pub error_count: usize,
21}
22
23pub async fn refresh_active_plugins()
25-> Result<RefreshActivePluginsResult, Box<dyn std::error::Error + Send + Sync>> {
26 log::debug!("refresh_active_plugins: clearing all plugin caches");
27 clear_all_caches();
28 clear_plugin_cache_exclusions();
29
30 let plugin_result = load_all_plugins().await?;
32
33 let enabled = plugin_result.enabled;
34 let disabled = plugin_result.disabled;
35 let errors = plugin_result.errors;
36
37 let mut mcp_count = 0;
39 let mut lsp_count = 0;
40
41 for plugin in &enabled {
42 if plugin.mcp_servers.is_some() {
43 mcp_count += plugin.mcp_servers.as_ref().unwrap().len();
44 } else if let Ok(Some(servers)) = load_plugin_mcp_servers(plugin, &mut Vec::new()).await {
45 mcp_count += servers.len();
46 }
47
48 if plugin.lsp_servers.is_some() {
49 lsp_count += plugin.lsp_servers.as_ref().unwrap().len();
50 } else if let Ok(Some(servers)) = load_plugin_lsp_servers(plugin, &mut Vec::new()).await {
51 lsp_count += servers.len();
52 }
53 }
54
55 let mut hook_load_failed = false;
57 if let Err(e) = load_plugin_hooks().await {
58 hook_load_failed = true;
59 log::error!("refresh_active_plugins: load_plugin_hooks failed: {}", e);
60 }
61
62 let hook_count: usize = enabled
64 .iter()
65 .map(|p| {
66 p.hooks_config.as_ref().map_or(0, |config| {
67 if let Some(obj) = config.as_object() {
68 obj.values()
69 .map(|v| {
70 v.as_array().map_or(0, |arr| {
71 arr.iter()
72 .map(|m| {
73 m.get("hooks")
74 .and_then(|h| h.as_array())
75 .map_or(0, |hooks| hooks.len())
76 })
77 .sum::<usize>()
78 })
79 })
80 .sum::<usize>()
81 } else {
82 0
83 }
84 })
85 })
86 .sum();
87
88 log::debug!(
89 "refresh_active_plugins: {} enabled, 0 commands, 0 agents, {} hooks, {} MCP, {} LSP",
90 enabled.len(),
91 hook_count,
92 mcp_count,
93 lsp_count
94 );
95
96 Ok(RefreshActivePluginsResult {
97 enabled_count: enabled.len(),
98 disabled_count: disabled.len(),
99 command_count: 0,
100 agent_count: 0,
101 hook_count,
102 mcp_count,
103 lsp_count,
104 error_count: errors.len() + if hook_load_failed { 1 } else { 0 },
105 })
106}
107
108fn _merge_plugin_errors(
110 existing: &[crate::plugin::types::PluginError],
111 fresh: &[crate::plugin::types::PluginError],
112) -> Vec<crate::plugin::types::PluginError> {
113 let mut result = existing.to_vec();
114 result.extend(fresh.iter().cloned());
115 result
116}