feat(lsp): add Java and Vue language server defaults

This commit is contained in:
Fann Hoo
2026-05-30 09:31:13 +08:00
committed by Hunter Bown
parent f3def32ef9
commit efb63df66e
5 changed files with 70 additions and 7 deletions
+4 -4
View File
@@ -140,10 +140,10 @@ transcripts stay behind bounded handles through `agent_eval`. See
[docs/SUBAGENTS.md](docs/SUBAGENTS.md).
The rest of the surface: LSP diagnostics after every edit (rust-analyzer,
pyright, typescript-language-server, gopls, clangd), RLM sessions for
batched analysis, MCP protocol, HTTP/SSE runtime API, persistent task
queue, ACP adapter for Zed, SWE-bench export, and live cost tracking with
cache hit/miss breakdowns.
pyright, typescript-language-server, gopls, clangd, jdtls,
vue-language-server), RLM sessions for batched analysis, MCP protocol,
HTTP/SSE runtime API, persistent task queue, ACP adapter for Zed,
SWE-bench export, and live cost tracking with cache hit/miss breakdowns.
---
+1 -1
View File
@@ -103,7 +103,7 @@ Fin——关闭思考的廉价 Flash 调用——每轮处理模型自动路由
子智能体并发运行(最多 20 个)。`agent_open` 立即返回;结果以内联完成哨兵形式到达,携带摘要。完整对话记录通过 `agent_eval` 的有界句柄保存。详见 [docs/SUBAGENTS.md](docs/SUBAGENTS.md)。
其余功能面:每次编辑后的 LSP 诊断(rust-analyzer、pyright、typescript-language-server、gopls、clangd)、RLM 会话批量分析、MCP 协议、HTTP/SSE 运行时 API、持久化任务队列、Zed 的 ACP 适配器、SWE-bench 导出、以及带缓存命中/未命中明细的实时成本追踪。
其余功能面:每次编辑后的 LSP 诊断(rust-analyzer、pyright、typescript-language-server、gopls、clangd、jdtls、vue-language-server)、RLM 会话批量分析、MCP 协议、HTTP/SSE 运行时 API、持久化任务队列、Zed 的 ACP 适配器、SWE-bench 导出、以及带缓存命中/未命中明细的实时成本追踪。
---
+7
View File
@@ -543,8 +543,13 @@ default_text_model = "deepseek-ai/deepseek-v4-pro"
# go → gopls serve
# python → pyright-langserver --stdio
# typescript → typescript-language-server --stdio
# java → jdtls
# vue → vue-language-server --stdio
# c, cpp → clangd
#
# Java support uses Eclipse JDT LS via the `jdtls` command. IntelliJ IDEA is
# not required, and installing IntelliJ IDEA alone does not install `jdtls`.
#
# Override the defaults via the `servers` table below.
[lsp]
# enabled = true
@@ -554,6 +559,8 @@ default_text_model = "deepseek-ai/deepseek-v4-pro"
# [lsp.servers]
# rust = ["rust-analyzer"]
# go = ["gopls", "serve"]
# java = ["jdtls"]
# vue = ["vue-language-server", "--stdio"]
# ─────────────────────────────────────────────────────────────────────────────────
# Hooks (optional)
+57 -1
View File
@@ -18,6 +18,8 @@ pub enum Language {
Python,
TypeScript,
JavaScript,
Java,
Vue,
C,
Cpp,
Other,
@@ -34,6 +36,8 @@ impl Language {
Language::Python => "python",
Language::TypeScript => "typescript",
Language::JavaScript => "javascript",
Language::Java => "java",
Language::Vue => "vue",
Language::C => "c",
Language::Cpp => "cpp",
Language::Other => "other",
@@ -42,7 +46,7 @@ impl Language {
/// LSP `languageId` value used in `textDocument/didOpen`. We follow the
/// LSP-spec values: `rust`, `go`, `python`, `typescript`, `javascript`,
/// `c`, `cpp`.
/// `java`, `vue`, `c`, `cpp`.
#[must_use]
pub fn language_id(self) -> &'static str {
match self {
@@ -51,6 +55,8 @@ impl Language {
Language::Python => "python",
Language::TypeScript => "typescript",
Language::JavaScript => "javascript",
Language::Java => "java",
Language::Vue => "vue",
Language::C => "c",
Language::Cpp => "cpp",
Language::Other => "plaintext",
@@ -73,6 +79,8 @@ pub fn detect_language(path: &Path) -> Language {
"py" | "pyi" => Language::Python,
"ts" | "tsx" => Language::TypeScript,
"js" | "jsx" | "mjs" | "cjs" => Language::JavaScript,
"java" => Language::Java,
"vue" => Language::Vue,
"c" | "h" => Language::C,
"cpp" | "cc" | "cxx" | "hpp" | "hxx" | "hh" => Language::Cpp,
_ => Language::Other,
@@ -91,6 +99,8 @@ pub fn server_for(lang: Language) -> Option<(&'static str, &'static [&'static st
Language::TypeScript | Language::JavaScript => {
Some(("typescript-language-server", &["--stdio"]))
}
Language::Java => Some(("jdtls", &[])),
Language::Vue => Some(("vue-language-server", &["--stdio"])),
Language::C | Language::Cpp => Some(("clangd", &[])),
Language::Other => None,
}
@@ -132,6 +142,38 @@ mod tests {
);
}
#[test]
fn detects_java_extension() {
assert_eq!(
detect_language(&PathBuf::from("App.java")),
Language::Java
);
assert_eq!(
detect_language(&PathBuf::from("APP.JAVA")),
Language::Java
);
}
#[test]
fn detects_vue_extension() {
assert_eq!(
detect_language(&PathBuf::from("Component.vue")),
Language::Vue
);
assert_eq!(
detect_language(&PathBuf::from("COMPONENT.VUE")),
Language::Vue
);
}
#[test]
fn language_ids_for_java_and_vue_match_lsp_values() {
assert_eq!(Language::Java.as_key(), "java");
assert_eq!(Language::Java.language_id(), "java");
assert_eq!(Language::Vue.as_key(), "vue");
assert_eq!(Language::Vue.language_id(), "vue");
}
#[test]
fn server_for_rust_is_rust_analyzer() {
let (cmd, args) = server_for(Language::Rust).expect("rust has a server");
@@ -139,6 +181,20 @@ mod tests {
assert!(args.is_empty());
}
#[test]
fn server_for_java_is_jdtls() {
let (cmd, args) = server_for(Language::Java).expect("java has a server");
assert_eq!(cmd, "jdtls");
assert!(args.is_empty());
}
#[test]
fn server_for_vue_is_vue_language_server() {
let (cmd, args) = server_for(Language::Vue).expect("vue has a server");
assert_eq!(cmd, "vue-language-server");
assert_eq!(args, &["--stdio"]);
}
#[test]
fn server_for_other_is_none() {
assert!(server_for(Language::Other).is_none());
+1 -1
View File
@@ -156,7 +156,7 @@ drives turns through Chat Completions.
- `mod.rs` - `LspManager` — lazy per-language transport pool + config
- `client.rs` - `StdioLspTransport` — JSON-RPC over stdio with `didOpen`/`didChange`/`publishDiagnostics`
- `diagnostics.rs` - Diagnostic types, severity, and HTML-block renderer
- `registry.rs` - Language detection and default server map (rust-analyzer, pyright, gopls, clangd, typescript-language-server)
- `registry.rs` - Language detection and default server map (rust-analyzer, pyright, gopls, clangd, typescript-language-server, jdtls, vue-language-server)
- Wired into the engine via `core/engine/lsp_hooks.rs` — called after every successful edit
### Security