refactor(storage): 统一消息存储到 Core 层

问题:Server 端只存储最终文本响应,工具调用的中间消息丢失。

解决方案:
- Agent.chat() 返回 ChatResult,包含完整消息链
- Server SessionManager 简化为只管理会话元数据
- 消息 API 改为从 Core Storage 读取
- 移除 Server 端的消息存储和 addMessage 方法

影响范围:
- core: Agent.chat() 返回类型变更
- server: SessionManager 接口变更,移除消息存储
- server: GET /sessions/:id/messages 从 Core 读取
- server: 移除 POST /sessions/:id/messages 端点
This commit is contained in:
2025-12-15 10:04:22 +08:00
parent a657af9bb7
commit 6342a46e59
14 changed files with 273 additions and 503 deletions
+23 -60
View File
@@ -6,7 +6,7 @@
import { Hono } from 'hono';
import { getSessionManager } from '../session/manager.js';
import { CreateSessionInputSchema, SendMessageInputSchema } from '../types.js';
import { CreateSessionInputSchema } from '../types.js';
export const sessionsRouter = new Hono();
@@ -99,8 +99,10 @@ sessionsRouter.delete('/:id', async (c) => {
/**
* GET /sessions/:id/messages - 获取会话消息
*
* 从 Core 存储读取完整的消息历史(包含 tool-call 和 tool-result
*/
sessionsRouter.get('/:id/messages', (c) => {
sessionsRouter.get('/:id/messages', async (c) => {
const id = c.req.param('id');
if (!sessionManager.exists(id)) {
@@ -113,66 +115,27 @@ sessionsRouter.get('/:id/messages', (c) => {
);
}
const messages = sessionManager.getMessages(id);
// 从 Core Storage 读取消息
const storage = sessionManager.getStorage();
if (!storage) {
return c.json({
success: true,
data: [],
});
}
const projectId = sessionManager.getProjectId(id);
const sessionData = await storage.loadSession(projectId, id);
if (!sessionData) {
return c.json({
success: true,
data: [],
});
}
return c.json({
success: true,
data: messages,
data: sessionData.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 = await 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
);
}
});