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