feat(server): 实现 LSP 管理 REST API

- 新增 /api/lsp/servers 端点,列出所有语言服务器
- 新增 /api/lsp/servers/:id 端点,获取服务器详情
- 新增 /api/lsp/servers/:id/install 端点,安装服务器
- 新增 /api/lsp/servers/:id/start 端点,启动服务器
- 新增 /api/lsp/servers/:id/stop 端点,停止服务器
- 新增 /api/lsp/diagnostics 端点,获取诊断信息
- 新增 /api/lsp/running 端点,获取运行中服务器列表
- core/lsp 添加 stopServer, getRunningServers, isServerRunning 方法
This commit is contained in:
2025-12-17 10:19:05 +08:00
parent b63b79e51e
commit cfb2175916
6 changed files with 456 additions and 4 deletions
+30 -2
View File
@@ -88,10 +88,38 @@ export type {
} from './permission/index.js';
// LSP
export { initLSP, shutdownLSP } from './lsp/index.js';
export {
initLSP,
shutdownLSP,
getLSPManager,
touchFile,
getDiagnostics,
getFileDiagnostics,
formatDiagnostics,
getFormattedFileDiagnostics,
stopServer,
getRunningServers,
isServerRunning,
listServers,
installServer,
getLanguageId,
isLanguageSupported,
getSupportedExtensions,
getServerConfig,
hasServerConfig,
getSupportedLanguages,
getUniqueServers,
} from './lsp/index.js';
export type {
FileDiagnostic,
ServerConfig,
InstallConfig,
ServerStatus,
} from './lsp/index.js';
export {
printServerList,
installServer,
installAllServers,
showServerInfo,
} from './lsp/cli.js';
+20
View File
@@ -411,4 +411,24 @@ export class LSPClientManager {
getRunningServers(): LanguageId[] {
return Array.from(this.clients.keys());
}
/**
* 停止指定语言的服务器
*/
async stopServer(languageId: LanguageId): Promise<boolean> {
const client = this.clients.get(languageId);
if (!client) {
return false;
}
try {
client.connection.dispose();
client.process.kill();
this.clients.delete(languageId);
return true;
} catch (error) {
console.error(`停止语言服务器失败 (${languageId}):`, error);
return false;
}
}
}
+42 -1
View File
@@ -115,6 +115,36 @@ export async function getFormattedFileDiagnostics(filePath: string): Promise<str
return result;
}
/**
* 停止指定语言的服务器
*/
export async function stopServer(languageId: string): Promise<boolean> {
if (!lspManager) {
return false;
}
return lspManager.stopServer(languageId as import('./language.js').LanguageId);
}
/**
* 获取运行中的服务器列表
*/
export function getRunningServers(): string[] {
if (!lspManager) {
return [];
}
return lspManager.getRunningServers();
}
/**
* 检查服务器是否运行中
*/
export function isServerRunning(languageId: string): boolean {
if (!lspManager) {
return false;
}
return lspManager.isServerRunning(languageId as import('./language.js').LanguageId);
}
/**
* 关闭 LSP 系统
*/
@@ -127,6 +157,17 @@ export async function shutdownLSP(): Promise<void> {
// 导出类型
export type { FileDiagnostic } from './client.js';
export type { ServerConfig, InstallConfig } from './server.js';
export type { ServerStatus } from './cli.js';
// 从 language.js 导出
export { getLanguageId, isLanguageSupported, getSupportedExtensions } from './language.js';
export { getServerConfig, hasServerConfig, getSupportedLanguages } from './server.js';
// 从 server.js 导出
export { getServerConfig, hasServerConfig, getSupportedLanguages, getUniqueServers } from './server.js';
// 从 client.js 导出
export { LSPClientManager } from './client.js';
// 从 cli.js 导出
export { listServers, installServer } from './cli.js';