feat: 重构为 Monorepo 架构并实现 HTTP Server

架构变更:
- 采用 pnpm workspaces 实现 Monorepo 结构
- 将现有代码迁移到 packages/core
- 新增 packages/server HTTP 服务层

Server 功能:
- REST API: 会话管理、工具管理、配置管理
- WebSocket: 实时双向通信支持
- SSE: 服务端事件推送
- Hono + Bun 作为运行时

API 端点:
- GET/POST /api/sessions - 会话 CRUD
- GET/POST /api/sessions/:id/messages - 消息管理
- GET /api/sessions/:id/events - SSE 事件流
- WS /api/ws/:sessionId - WebSocket 连接
- GET/POST /api/tools - 工具管理
- GET/PUT /api/config - 配置管理
This commit is contained in:
2025-12-12 10:42:20 +08:00
parent 59dbed926e
commit 5e32375f0e
301 changed files with 3281 additions and 43 deletions
+195
View File
@@ -0,0 +1,195 @@
import { describe, it, expect } from 'vitest';
import {
getServerConfig,
hasServerConfig,
getSupportedLanguages,
getAllServerConfigs,
getUniqueServers,
} from '../../../src/lsp/server.js';
describe('LSP Server - 语言服务器配置', () => {
describe('getServerConfig - 获取服务器配置', () => {
it('返回 TypeScript 配置', () => {
const config = getServerConfig('typescript');
expect(config).toBeDefined();
expect(config?.command).toBe('typescript-language-server');
expect(config?.args).toContain('--stdio');
expect(config?.displayName).toBe('TypeScript');
});
it('返回 JavaScript 配置(共用 TypeScript', () => {
const config = getServerConfig('javascript');
expect(config).toBeDefined();
expect(config?.command).toBe('typescript-language-server');
});
it('返回 Python 配置', () => {
const config = getServerConfig('python');
expect(config).toBeDefined();
expect(config?.command).toBe('pyright-langserver');
expect(config?.install.npm).toBe('pyright');
});
it('返回 Go 配置', () => {
const config = getServerConfig('go');
expect(config).toBeDefined();
expect(config?.command).toBe('gopls');
expect(config?.install.go).toContain('gopls');
});
it('返回 Rust 配置', () => {
const config = getServerConfig('rust');
expect(config).toBeDefined();
expect(config?.command).toBe('rust-analyzer');
expect(config?.install.rustup).toBe('rust-analyzer');
});
it('返回 C/C++ 配置', () => {
const cConfig = getServerConfig('c');
const cppConfig = getServerConfig('cpp');
expect(cConfig?.command).toBe('clangd');
expect(cppConfig?.command).toBe('clangd');
});
it('返回 Vue 配置', () => {
const config = getServerConfig('vue');
expect(config).toBeDefined();
expect(config?.command).toBe('vue-language-server');
});
it('返回 HTML/CSS/JSON 配置', () => {
expect(getServerConfig('html')?.command).toBe('vscode-html-language-server');
expect(getServerConfig('css')?.command).toBe('vscode-css-language-server');
expect(getServerConfig('json')?.command).toBe('vscode-json-language-server');
});
it('不支持的语言返回 undefined', () => {
const config = getServerConfig('unknown' as any);
expect(config).toBeUndefined();
});
});
describe('hasServerConfig - 检查服务器配置', () => {
it('已配置的语言返回 true', () => {
expect(hasServerConfig('typescript')).toBe(true);
expect(hasServerConfig('python')).toBe(true);
expect(hasServerConfig('go')).toBe(true);
expect(hasServerConfig('rust')).toBe(true);
});
it('未配置的语言返回 false', () => {
expect(hasServerConfig('unknown' as any)).toBe(false);
});
});
describe('getSupportedLanguages - 获取支持的语言', () => {
it('返回所有支持的语言 ID', () => {
const languages = getSupportedLanguages();
expect(Array.isArray(languages)).toBe(true);
expect(languages.length).toBeGreaterThan(0);
expect(languages).toContain('typescript');
expect(languages).toContain('javascript');
expect(languages).toContain('python');
expect(languages).toContain('go');
expect(languages).toContain('rust');
});
});
describe('getAllServerConfigs - 获取所有配置', () => {
it('返回所有服务器配置对象', () => {
const configs = getAllServerConfigs();
expect(typeof configs).toBe('object');
expect(configs.typescript).toBeDefined();
expect(configs.python).toBeDefined();
});
});
describe('getUniqueServers - 获取唯一服务器列表', () => {
it('返回去重后的服务器列表', () => {
const servers = getUniqueServers();
expect(Array.isArray(servers)).toBe(true);
// typescript-language-server 被多个语言共用
const tsServer = servers.find((s) => s.id === 'typescript-language-server');
expect(tsServer).toBeDefined();
expect(tsServer?.languages).toContain('typescript');
expect(tsServer?.languages).toContain('javascript');
});
it('每个服务器包含必要字段', () => {
const servers = getUniqueServers();
for (const server of servers) {
expect(server.id).toBeDefined();
expect(server.config).toBeDefined();
expect(server.languages).toBeDefined();
expect(Array.isArray(server.languages)).toBe(true);
expect(server.languages.length).toBeGreaterThan(0);
}
});
it('clangd 被 C 和 C++ 共用', () => {
const servers = getUniqueServers();
const clangd = servers.find((s) => s.id === 'clangd');
expect(clangd).toBeDefined();
expect(clangd?.languages).toContain('c');
expect(clangd?.languages).toContain('cpp');
});
it('vscode-css-language-server 被 CSS/SCSS/Less 共用', () => {
const servers = getUniqueServers();
const cssServer = servers.find((s) => s.id === 'vscode-css-language-server');
expect(cssServer).toBeDefined();
expect(cssServer?.languages).toContain('css');
expect(cssServer?.languages).toContain('scss');
expect(cssServer?.languages).toContain('less');
});
});
describe('安装配置', () => {
it('TypeScript 服务器有 npm 安装配置', () => {
const config = getServerConfig('typescript');
expect(config?.install.npm).toContain('typescript-language-server');
});
it('Python 服务器有多种安装方式', () => {
const config = getServerConfig('python');
expect(config?.install.npm).toBe('pyright');
expect(config?.install.pip).toBe('pyright');
});
it('Go 服务器有 go install 配置', () => {
const config = getServerConfig('go');
expect(config?.install.go).toContain('gopls');
});
it('Rust 服务器有 rustup 和 brew 安装配置', () => {
const config = getServerConfig('rust');
expect(config?.install.rustup).toBe('rust-analyzer');
expect(config?.install.brew).toBe('rust-analyzer');
});
it('Ruby 服务器有 gem 安装配置', () => {
const config = getServerConfig('ruby');
expect(config?.install.gem).toBe('solargraph');
});
});
});