Skip to main content

ai_agent/utils/plugins/
refresh.rs

1// Source: ~/claudecode/openclaudecode/src/utils/plugins/refresh.ts
2#![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
11/// Result of refreshing active plugins.
12pub 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
23/// Refresh all active plugin components.
24pub 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    // Load all plugins first
31    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    // Populate mcp_servers/lsp_servers on each enabled plugin
38    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    // Load plugin hooks
56    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    // Count hooks from enabled plugins
63    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
108/// Merge fresh plugin-load errors with existing errors.
109fn _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}