Skip to main content

zeph_core/agent/
lsp_commands.rs

1// SPDX-FileCopyrightText: 2026 Andrei G <bug-ops>
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use std::fmt::Write as _;
5
6use super::{Agent, error::AgentError};
7use crate::channel::Channel;
8
9impl<C: Channel> Agent<C> {
10    /// Handle the `/lsp` slash command: show LSP hook status and session statistics.
11    ///
12    /// # Errors
13    ///
14    /// Returns an error if the channel send fails.
15    pub async fn handle_lsp_status_command(&mut self) -> Result<(), AgentError> {
16        let mut out = String::new();
17
18        match self.session.lsp_hooks.as_ref() {
19            None => {
20                let _ = writeln!(out, "LSP context injection: disabled");
21                let _ = writeln!(out);
22                let _ = writeln!(
23                    out,
24                    "Enable with `--lsp-context` flag or set `lsp.enabled = true` in config."
25                );
26                let _ = writeln!(
27                    out,
28                    "Requires mcpls configured under [mcp.servers] (install: cargo install mcpls)."
29                );
30            }
31            Some(lsp) => {
32                let available = lsp.is_available().await;
33                let _ = writeln!(out, "LSP context injection: enabled");
34                let _ = writeln!(
35                    out,
36                    "MCP server: {} ({})",
37                    lsp.config.mcp_server_id,
38                    if available {
39                        "connected"
40                    } else {
41                        "not connected"
42                    }
43                );
44                let _ = writeln!(out, "Token budget per turn: {}", lsp.config.token_budget);
45                let _ = writeln!(out);
46                let _ = writeln!(out, "Hooks:");
47                let _ = writeln!(
48                    out,
49                    "  diagnostics-on-save: {}",
50                    if lsp.config.diagnostics.enabled {
51                        "enabled"
52                    } else {
53                        "disabled"
54                    }
55                );
56                let _ = writeln!(
57                    out,
58                    "  hover-on-read:       {}",
59                    if lsp.config.hover.enabled {
60                        "enabled"
61                    } else {
62                        "disabled"
63                    }
64                );
65                let _ = writeln!(out);
66                let stats = lsp.stats();
67                let _ = writeln!(out, "Session statistics:");
68                let _ = writeln!(
69                    out,
70                    "  diagnostics injected: {}",
71                    stats.diagnostics_injected
72                );
73                let _ = writeln!(out, "  hover injected:       {}", stats.hover_injected);
74                let _ = writeln!(
75                    out,
76                    "  notes dropped (budget): {}",
77                    stats.notes_dropped_budget
78                );
79            }
80        }
81
82        self.channel.send(out.trim_end()).await?;
83        Ok(())
84    }
85}