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
+178
View File
@@ -0,0 +1,178 @@
/**
* Sessions API Routes
*
* 会话管理相关的 REST API
*/
import { Hono } from 'hono';
import { getSessionManager } from '../session/manager.js';
import { CreateSessionInputSchema, SendMessageInputSchema } from '../types.js';
export const sessionsRouter = new Hono();
const sessionManager = getSessionManager();
/**
* GET /sessions - 列出所有会话
*/
sessionsRouter.get('/', (c) => {
const sessions = sessionManager.list();
return c.json({
success: true,
data: sessions,
});
});
/**
* POST /sessions - 创建新会话
*/
sessionsRouter.post('/', async (c) => {
try {
const body = await c.req.json();
const input = CreateSessionInputSchema.parse(body);
const session = sessionManager.create(input);
return c.json(
{
success: true,
data: session,
},
201
);
} catch (error) {
return c.json(
{
success: false,
error: error instanceof Error ? error.message : 'Invalid input',
},
400
);
}
});
/**
* GET /sessions/:id - 获取单个会话
*/
sessionsRouter.get('/:id', (c) => {
const id = c.req.param('id');
const session = sessionManager.get(id);
if (!session) {
return c.json(
{
success: false,
error: 'Session not found',
},
404
);
}
return c.json({
success: true,
data: session,
});
});
/**
* DELETE /sessions/:id - 删除会话
*/
sessionsRouter.delete('/:id', (c) => {
const id = c.req.param('id');
if (!sessionManager.exists(id)) {
return c.json(
{
success: false,
error: 'Session not found',
},
404
);
}
sessionManager.delete(id);
return c.json({
success: true,
message: 'Session deleted',
});
});
/**
* GET /sessions/:id/messages - 获取会话消息
*/
sessionsRouter.get('/:id/messages', (c) => {
const id = c.req.param('id');
if (!sessionManager.exists(id)) {
return c.json(
{
success: false,
error: 'Session not found',
},
404
);
}
const messages = sessionManager.getMessages(id);
return c.json({
success: true,
data: messages,
});
});
/**
* POST /sessions/:id/messages - 发送消息
*
* 注意: 这个端点仅用于添加消息记录。
* 实际的 AI 对话应该通过 WebSocket 进行。
*/
sessionsRouter.post('/:id/messages', async (c) => {
const id = c.req.param('id');
if (!sessionManager.exists(id)) {
return c.json(
{
success: false,
error: 'Session not found',
},
404
);
}
try {
const body = await c.req.json();
const input = SendMessageInputSchema.parse(body);
const message = sessionManager.addMessage(id, {
role: input.role,
content: input.content,
});
if (!message) {
return c.json(
{
success: false,
error: 'Failed to add message',
},
500
);
}
return c.json(
{
success: true,
data: message,
},
201
);
} catch (error) {
return c.json(
{
success: false,
error: error instanceof Error ? error.message : 'Invalid input',
},
400
);
}
});